<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[188121] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/188121">188121</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-08-07 02:51:20 -0700 (Fri, 07 Aug 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GStreamer] Do not automatically show PackageKit codec installation notifications
https://bugs.webkit.org/show_bug.cgi?id=135973

Reviewed by Philippe Normand.

Source/WebCore:

Add description parameter to requestInstallMissingPlugins() that
will be used by the API layer.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::requestInstallMissingPlugins):
* html/HTMLMediaElement.h:
* page/ChromeClient.h:
* platform/graphics/MediaPlayer.h:
(WebCore::MediaPlayerClient::requestInstallMissingPlugins):
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::handleMessage):

Source/WebKit2:

Add InstallMissingMediaPluginsPermissionRequest to ask the API
layer whether to allow or deny the installation of missing media
plugins. And add a GTK+ implementation based on current permission
request API. Replace the
PageClientImpl::createGstInstallPluginsContext() with
decicePolicyForInstallMissingMediaPluginsPermissionRequest() that
passes the InstallMissingMediaPluginsPermissionRequest object to
the API layer. The allow method receives the
GstInstallPluginsContext now, so that it can be created by the API implementation.

* PlatformEfl.cmake:
* PlatformGTK.cmake:
* UIProcess/API/gtk/PageClientImpl.cpp:
(WebKit::PageClientImpl::decicePolicyForInstallMissingMediaPluginsPermissionRequest):
* UIProcess/API/gtk/PageClientImpl.h:
* UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.cpp: Added.
(createGstInstallPluginsContext):
(webkitInstallMissingMediaPluginsPermissionRequestAllow):
(webkitInstallMissingMediaPluginsPermissionRequestDeny):
(webkit_permission_request_interface_init):
(webkitInstallMissingMediaPluginsPermissionRequestDispose):
(webkit_install_missing_media_plugins_permission_request_class_init):
(webkitInstallMissingMediaPluginsPermissionRequestCreate):
(webkit_install_missing_media_plugins_permission_request_get_description):
* UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.h: Added.
* UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequestPrivate.h: Added.
* UIProcess/API/gtk/WebKitWebView.cpp:
(webkitWebViewRequestInstallMissingMediaPlugins):
* UIProcess/API/gtk/WebKitWebViewPrivate.h:
* UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt:
* UIProcess/API/gtk/docs/webkit2gtk-4.0.types:
* UIProcess/API/gtk/docs/webkit2gtk-docs.sgml:
* UIProcess/API/gtk/webkit2.h:
* UIProcess/PageClient.h:
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* UIProcess/efl/WebViewEfl.h:
* UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.cpp: Copied from Source/WebKit2/UIProcess/gstreamer/WebPageProxyGStreamer.cpp.
(WebKit::InstallMissingMediaPluginsPermissionRequest::InstallMissingMediaPluginsPermissionRequest):
(WebKit::InstallMissingMediaPluginsPermissionRequest::~InstallMissingMediaPluginsPermissionRequest):
(WebKit::InstallMissingMediaPluginsPermissionRequest::allow):
(WebKit::InstallMissingMediaPluginsPermissionRequest::deny):
(WebKit::InstallMissingMediaPluginsPermissionRequest::didEndRequestInstallMissingMediaPlugins):
* UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.h: Copied from Source/WebKit2/WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp.
(WebKit::InstallMissingMediaPluginsPermissionRequest::create):
(WebKit::InstallMissingMediaPluginsPermissionRequest::page):
(WebKit::InstallMissingMediaPluginsPermissionRequest::details):
(WebKit::InstallMissingMediaPluginsPermissionRequest::description):
* UIProcess/gstreamer/WebPageProxyGStreamer.cpp:
(WebKit::WebPageProxy::requestInstallMissingMediaPlugins):
* WebProcess/WebCoreSupport/WebChromeClient.cpp:
(WebKit::WebChromeClient::requestInstallMissingMediaPlugins):
* WebProcess/WebCoreSupport/WebChromeClient.h:
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp:
(WebKit::WebPage::requestInstallMissingMediaPlugins):

Tools:

Handle the missing media plugins installation permission request
in MiniBrowser and add a test case for the new API.

* MiniBrowser/gtk/BrowserWindow.c:
(webViewDecidePermissionRequest):
* TestWebKitAPI/Tests/WebKit2Gtk/CMakeLists.txt:
* TestWebKitAPI/Tests/WebKit2Gtk/TestWebExtensions.cpp:
(permissionRequestCallback):
(testInstallMissingPluginsPermissionRequest):
(beforeAll):
* TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp:
(methodCallCallback):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementcpp">trunk/Source/WebCore/html/HTMLMediaElement.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlHTMLMediaElementh">trunk/Source/WebCore/html/HTMLMediaElement.h</a></li>
<li><a href="#trunkSourceWebCorepageChromeClienth">trunk/Source/WebCore/page/ChromeClient.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsMediaPlayerh">trunk/Source/WebCore/platform/graphics/MediaPlayer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamercpp">trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2PlatformEflcmake">trunk/Source/WebKit2/PlatformEfl.cmake</a></li>
<li><a href="#trunkSourceWebKit2PlatformGTKcmake">trunk/Source/WebKit2/PlatformGTK.cmake</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkPageClientImplcpp">trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkPageClientImplh">trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitGeolocationPermissionRequestcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitGeolocationPermissionRequest.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitNotificationPermissionRequestcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNotificationPermissionRequest.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitUserMediaPermissionRequestcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserMediaPermissionRequest.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewPrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtk40sectionstxt">trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtk40types">trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0.types</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtkdocssgml">trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkwebkit2h">trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessPageClienth">trunk/Source/WebKit2/UIProcess/PageClient.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxyh">trunk/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxymessagesin">trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in</a></li>
<li><a href="#trunkSourceWebKit2UIProcesseflWebViewEflh">trunk/Source/WebKit2/UIProcess/efl/WebViewEfl.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessgstreamerWebPageProxyGStreamercpp">trunk/Source/WebKit2/UIProcess/gstreamer/WebPageProxyGStreamer.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClientcpp">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClienth">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPageWebPageh">trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebPagegstreamerWebPageGStreamercpp">trunk/Source/WebKit2/WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsMiniBrowsergtkBrowserWindowc">trunk/Tools/MiniBrowser/gtk/BrowserWindow.c</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2GtkCMakeListstxt">trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/CMakeLists.txt</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2GtkTestWebExtensionscpp">trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebExtensions.cpp</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2GtkWebExtensionTestcpp">trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitInstallMissingMediaPluginsPermissionRequestcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitInstallMissingMediaPluginsPermissionRequesth">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitInstallMissingMediaPluginsPermissionRequestPrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequestPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessgstreamerInstallMissingMediaPluginsPermissionRequestcpp">trunk/Source/WebKit2/UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessgstreamerInstallMissingMediaPluginsPermissionRequesth">trunk/Source/WebKit2/UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebCore/ChangeLog        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2015-08-07  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GStreamer] Do not automatically show PackageKit codec installation notifications
+        https://bugs.webkit.org/show_bug.cgi?id=135973
+
+        Reviewed by Philippe Normand.
+
+        Add description parameter to requestInstallMissingPlugins() that
+        will be used by the API layer.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::requestInstallMissingPlugins):
+        * html/HTMLMediaElement.h:
+        * page/ChromeClient.h:
+        * platform/graphics/MediaPlayer.h:
+        (WebCore::MediaPlayerClient::requestInstallMissingPlugins):
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+        (WebCore::MediaPlayerPrivateGStreamer::handleMessage):
+
</ins><span class="cx"> 2015-08-07  Doug Russell  &lt;d_russell@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         AX: Bug 147737 is causing test failures in Mavericks WK1
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.cpp        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -6132,12 +6132,12 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if USE(GSTREAMER)
</span><del>-void HTMLMediaElement::requestInstallMissingPlugins(const String&amp; details, MediaPlayerRequestInstallMissingPluginsCallback&amp; callback)
</del><ins>+void HTMLMediaElement::requestInstallMissingPlugins(const String&amp; details, const String&amp; description, MediaPlayerRequestInstallMissingPluginsCallback&amp; callback)
</ins><span class="cx"> {
</span><span class="cx">     if (!document().page())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    document().page()-&gt;chrome().client().requestInstallMissingMediaPlugins(details, callback);
</del><ins>+    document().page()-&gt;chrome().client().requestInstallMissingMediaPlugins(details, description, callback);
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlHTMLMediaElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/HTMLMediaElement.h        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -615,7 +615,7 @@
</span><span class="cx">     virtual VideoFullscreenMode mediaPlayerFullscreenMode() const override final { return fullscreenMode(); }
</span><span class="cx"> 
</span><span class="cx"> #if USE(GSTREAMER)
</span><del>-    virtual void requestInstallMissingPlugins(const String&amp;, MediaPlayerRequestInstallMissingPluginsCallback&amp;) override final;
</del><ins>+    virtual void requestInstallMissingPlugins(const String&amp; details, const String&amp; description, MediaPlayerRequestInstallMissingPluginsCallback&amp;) override final;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     void pendingActionTimerFired();
</span></span></pre></div>
<a id="trunkSourceWebCorepageChromeClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/ChromeClient.h (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/ChromeClient.h        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebCore/page/ChromeClient.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -457,7 +457,7 @@
</span><span class="cx"> #if ENABLE(VIDEO)
</span><span class="cx">     virtual void mediaDocumentNaturalSizeChanged(const WebCore::IntSize&amp;) { }
</span><span class="cx"> #if USE(GSTREAMER)
</span><del>-    virtual void requestInstallMissingMediaPlugins(const String&amp; /*details*/, MediaPlayerRequestInstallMissingPluginsCallback&amp;) { };
</del><ins>+    virtual void requestInstallMissingMediaPlugins(const String&amp; /*details*/, const String&amp; /*description*/, MediaPlayerRequestInstallMissingPluginsCallback&amp;) { };
</ins><span class="cx"> #endif
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsMediaPlayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/MediaPlayer.h (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/MediaPlayer.h        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayer.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -284,7 +284,7 @@
</span><span class="cx">     virtual Vector&lt;String&gt; mediaPlayerPreferredAudioCharacteristics() const { return Vector&lt;String&gt;(); }
</span><span class="cx"> 
</span><span class="cx"> #if USE(GSTREAMER)
</span><del>-    virtual void requestInstallMissingPlugins(const String&amp;, MediaPlayerRequestInstallMissingPluginsCallback&amp;) { };
</del><ins>+    virtual void requestInstallMissingPlugins(const String&amp;, const String&amp;, MediaPlayerRequestInstallMissingPluginsCallback&amp;) { };
</ins><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsgstreamerMediaPlayerPrivateGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -1027,7 +1027,6 @@
</span><span class="cx">         break;
</span><span class="cx">     case GST_MESSAGE_ELEMENT:
</span><span class="cx">         if (gst_is_missing_plugin_message(message)) {
</span><del>-            GUniquePtr&lt;char&gt; detail(gst_missing_plugin_message_get_installer_detail(message));
</del><span class="cx">             if (gst_install_plugins_supported()) {
</span><span class="cx">                 m_missingPluginsCallback = MediaPlayerRequestInstallMissingPluginsCallback::create([this](uint32_t result) {
</span><span class="cx">                     m_missingPluginsCallback = nullptr;
</span><span class="lines">@@ -1037,7 +1036,9 @@
</span><span class="cx">                     changePipelineState(GST_STATE_READY);
</span><span class="cx">                     changePipelineState(GST_STATE_PAUSED);
</span><span class="cx">                 });
</span><del>-                m_player-&gt;client().requestInstallMissingPlugins(String::fromUTF8(detail.get()), *m_missingPluginsCallback);
</del><ins>+                GUniquePtr&lt;char&gt; detail(gst_missing_plugin_message_get_installer_detail(message));
+                GUniquePtr&lt;char&gt; description(gst_missing_plugin_message_get_description(message));
+                m_player-&gt;client().requestInstallMissingPlugins(String::fromUTF8(detail.get()), String::fromUTF8(description.get()), *m_missingPluginsCallback);
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> #if ENABLE(VIDEO_TRACK) &amp;&amp; USE(GSTREAMER_MPEGTS)
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/ChangeLog        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -1,3 +1,67 @@
</span><ins>+2015-08-07  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GStreamer] Do not automatically show PackageKit codec installation notifications
+        https://bugs.webkit.org/show_bug.cgi?id=135973
+
+        Reviewed by Philippe Normand.
+
+        Add InstallMissingMediaPluginsPermissionRequest to ask the API
+        layer whether to allow or deny the installation of missing media
+        plugins. And add a GTK+ implementation based on current permission
+        request API. Replace the
+        PageClientImpl::createGstInstallPluginsContext() with
+        decicePolicyForInstallMissingMediaPluginsPermissionRequest() that
+        passes the InstallMissingMediaPluginsPermissionRequest object to
+        the API layer. The allow method receives the
+        GstInstallPluginsContext now, so that it can be created by the API implementation.
+
+        * PlatformEfl.cmake:
+        * PlatformGTK.cmake:
+        * UIProcess/API/gtk/PageClientImpl.cpp:
+        (WebKit::PageClientImpl::decicePolicyForInstallMissingMediaPluginsPermissionRequest):
+        * UIProcess/API/gtk/PageClientImpl.h:
+        * UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.cpp: Added.
+        (createGstInstallPluginsContext):
+        (webkitInstallMissingMediaPluginsPermissionRequestAllow):
+        (webkitInstallMissingMediaPluginsPermissionRequestDeny):
+        (webkit_permission_request_interface_init):
+        (webkitInstallMissingMediaPluginsPermissionRequestDispose):
+        (webkit_install_missing_media_plugins_permission_request_class_init):
+        (webkitInstallMissingMediaPluginsPermissionRequestCreate):
+        (webkit_install_missing_media_plugins_permission_request_get_description):
+        * UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.h: Added.
+        * UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequestPrivate.h: Added.
+        * UIProcess/API/gtk/WebKitWebView.cpp:
+        (webkitWebViewRequestInstallMissingMediaPlugins):
+        * UIProcess/API/gtk/WebKitWebViewPrivate.h:
+        * UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt:
+        * UIProcess/API/gtk/docs/webkit2gtk-4.0.types:
+        * UIProcess/API/gtk/docs/webkit2gtk-docs.sgml:
+        * UIProcess/API/gtk/webkit2.h:
+        * UIProcess/PageClient.h:
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        * UIProcess/efl/WebViewEfl.h:
+        * UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.cpp: Copied from Source/WebKit2/UIProcess/gstreamer/WebPageProxyGStreamer.cpp.
+        (WebKit::InstallMissingMediaPluginsPermissionRequest::InstallMissingMediaPluginsPermissionRequest):
+        (WebKit::InstallMissingMediaPluginsPermissionRequest::~InstallMissingMediaPluginsPermissionRequest):
+        (WebKit::InstallMissingMediaPluginsPermissionRequest::allow):
+        (WebKit::InstallMissingMediaPluginsPermissionRequest::deny):
+        (WebKit::InstallMissingMediaPluginsPermissionRequest::didEndRequestInstallMissingMediaPlugins):
+        * UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.h: Copied from Source/WebKit2/WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp.
+        (WebKit::InstallMissingMediaPluginsPermissionRequest::create):
+        (WebKit::InstallMissingMediaPluginsPermissionRequest::page):
+        (WebKit::InstallMissingMediaPluginsPermissionRequest::details):
+        (WebKit::InstallMissingMediaPluginsPermissionRequest::description):
+        * UIProcess/gstreamer/WebPageProxyGStreamer.cpp:
+        (WebKit::WebPageProxy::requestInstallMissingMediaPlugins):
+        * WebProcess/WebCoreSupport/WebChromeClient.cpp:
+        (WebKit::WebChromeClient::requestInstallMissingMediaPlugins):
+        * WebProcess/WebCoreSupport/WebChromeClient.h:
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp:
+        (WebKit::WebPage::requestInstallMissingMediaPlugins):
+
</ins><span class="cx"> 2015-08-06  Beth Dakin  &lt;bdakin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         TextIndicator can have stale contentImage data and crash
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformEflcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/PlatformEfl.cmake (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/PlatformEfl.cmake        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/PlatformEfl.cmake        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -183,6 +183,7 @@
</span><span class="cx">     UIProcess/efl/WebUIPopupMenuClient.cpp
</span><span class="cx">     UIProcess/efl/WebViewEfl.cpp
</span><span class="cx"> 
</span><ins>+    UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.cpp
</ins><span class="cx">     UIProcess/gstreamer/WebPageProxyGStreamer.cpp
</span><span class="cx"> 
</span><span class="cx">     UIProcess/soup/WebCookieManagerProxySoup.cpp
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformGTKcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/PlatformGTK.cmake (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/PlatformGTK.cmake        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/PlatformGTK.cmake        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -169,6 +169,9 @@
</span><span class="cx">     UIProcess/API/gtk/WebKitHitTestResultPrivate.h
</span><span class="cx">     UIProcess/API/gtk/WebKitInjectedBundleClient.cpp
</span><span class="cx">     UIProcess/API/gtk/WebKitInjectedBundleClient.h
</span><ins>+    UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.cpp
+    UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.h
+    UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequestPrivate.h
</ins><span class="cx">     UIProcess/API/gtk/WebKitJavascriptResult.cpp
</span><span class="cx">     UIProcess/API/gtk/WebKitJavascriptResult.h
</span><span class="cx">     UIProcess/API/gtk/WebKitJavascriptResultPrivate.h
</span><span class="lines">@@ -290,6 +293,7 @@
</span><span class="cx"> 
</span><span class="cx">     UIProcess/cairo/BackingStoreCairo.cpp
</span><span class="cx"> 
</span><ins>+    UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.cpp
</ins><span class="cx">     UIProcess/gstreamer/WebPageProxyGStreamer.cpp
</span><span class="cx"> 
</span><span class="cx">     UIProcess/gtk/DragAndDropHandler.cpp
</span><span class="lines">@@ -393,6 +397,7 @@
</span><span class="cx">     ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitForwardDeclarations.h
</span><span class="cx">     ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitGeolocationPermissionRequest.h
</span><span class="cx">     ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitHitTestResult.h
</span><ins>+    ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.h
</ins><span class="cx">     ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitJavascriptResult.h
</span><span class="cx">     ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitMimeInfo.h
</span><span class="cx">     ${WEBKIT2_DIR}/UIProcess/API/gtk/WebKitNavigationAction.h
</span><span class="lines">@@ -500,6 +505,7 @@
</span><span class="cx">     &quot;${WEBKIT2_DIR}/UIProcess/API/gtk&quot;
</span><span class="cx">     &quot;${WEBKIT2_DIR}/UIProcess/Network/CustomProtocols/soup&quot;
</span><span class="cx">     &quot;${WEBKIT2_DIR}/UIProcess/Plugins/gtk&quot;
</span><ins>+    &quot;${WEBKIT2_DIR}/UIProcess/gstreamer&quot;
</ins><span class="cx">     &quot;${WEBKIT2_DIR}/UIProcess/gtk&quot;
</span><span class="cx">     &quot;${WEBKIT2_DIR}/UIProcess/soup&quot;
</span><span class="cx">     &quot;${WEBKIT2_DIR}/WebProcess/InjectedBundle/API/gtk&quot;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkPageClientImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -44,14 +44,9 @@
</span><span class="cx"> #include &lt;WebCore/Cursor.h&gt;
</span><span class="cx"> #include &lt;WebCore/EventNames.h&gt;
</span><span class="cx"> #include &lt;WebCore/GtkUtilities.h&gt;
</span><del>-#include &lt;WebCore/PlatformDisplay.h&gt;
</del><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><del>-#if PLATFORM(X11)
-#include &lt;gdk/gdkx.h&gt;
-#endif
-
</del><span class="cx"> using namespace WebCore;
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="lines">@@ -448,17 +443,15 @@
</span><span class="cx">     g_object_unref(m_viewWidget);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-GUniquePtr&lt;GstInstallPluginsContext&gt; PageClientImpl::createGstInstallPluginsContext()
</del><ins>+#if ENABLE(VIDEO)
+bool PageClientImpl::decicePolicyForInstallMissingMediaPluginsPermissionRequest(InstallMissingMediaPluginsPermissionRequest&amp; request)
</ins><span class="cx"> {
</span><del>-#if PLATFORM(X11)
-    if (PlatformDisplay::sharedDisplay().type() == PlatformDisplay::Type::X11) {
-        GUniquePtr&lt;GstInstallPluginsContext&gt; context(gst_install_plugins_context_new());
-        gst_install_plugins_context_set_xid(context.get(), GDK_WINDOW_XID(gtk_widget_get_window(m_viewWidget)));
-        return context;
-    }
-#endif
</del><ins>+    if (!WEBKIT_IS_WEB_VIEW(m_viewWidget))
+        return false;
</ins><span class="cx"> 
</span><del>-    return nullptr;
</del><ins>+    webkitWebViewRequestInstallMissingMediaPlugins(WEBKIT_WEB_VIEW(m_viewWidget), request);
+    return true;
</ins><span class="cx"> }
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkPageClientImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/PageClientImpl.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -142,7 +142,9 @@
</span><span class="cx">     virtual void refView() override;
</span><span class="cx">     virtual void derefView() override;
</span><span class="cx"> 
</span><del>-    virtual GUniquePtr&lt;GstInstallPluginsContext&gt; createGstInstallPluginsContext() override;
</del><ins>+#if ENABLE(VIDEO)
+    virtual bool decicePolicyForInstallMissingMediaPluginsPermissionRequest(InstallMissingMediaPluginsPermissionRequest&amp;) override;
+#endif
</ins><span class="cx"> 
</span><span class="cx">     // Members of PageClientImpl class
</span><span class="cx">     GtkWidget* m_viewWidget;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitGeolocationPermissionRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitGeolocationPermissionRequest.cpp (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitGeolocationPermissionRequest.cpp        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitGeolocationPermissionRequest.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -35,6 +35,9 @@
</span><span class="cx">  * WebKitGeolocationPermissionRequest represents a request for
</span><span class="cx">  * permission to decide whether WebKit should provide the user's
</span><span class="cx">  * location to a website when requested throught the Geolocation API.
</span><ins>+ *
+ * When a WebKitGeolocationPermissionRequest is not handled by the user,
+ * it is denied by default.
</ins><span class="cx">  */
</span><span class="cx"> 
</span><span class="cx"> static void webkit_permission_request_interface_init(WebKitPermissionRequestIface*);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitInstallMissingMediaPluginsPermissionRequestcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.cpp (0 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.cpp                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -0,0 +1,166 @@
</span><ins>+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;WebKitInstallMissingMediaPluginsPermissionRequest.h&quot;
+
+#include &quot;WebKitInstallMissingMediaPluginsPermissionRequestPrivate.h&quot;
+#include &quot;WebKitPermissionRequest.h&quot;
+#include &quot;WebPageProxy.h&quot;
+
+#if ENABLE(VIDEO)
+#include &lt;WebCore/PlatformDisplay.h&gt;
+#include &lt;gtk/gtk.h&gt;
+#if PLATFORM(X11)
+#include &lt;gdk/gdkx.h&gt;
+#endif
+#endif
+
+using namespace WebKit;
+using namespace WebCore;
+
+/**
+ * SECTION: WebKitInstallMissingMediaPluginsPermissionRequest
+ * @Short_description: A permission request for installing missing media plugins
+ * @Title: WebKitInstallMissingMediaPluginsPermissionRequest
+ * @See_also: #WebKitPermissionRequest, #WebKitWebView
+ *
+ * WebKitInstallMissingMediaPluginsPermissionRequest represents a request for
+ * permission to decide whether WebKit should try to start a helper application to
+ * install missing media plugins when the media backend couldn't play a media because
+ * the required plugins were not available.
+ *
+ * When a WebKitInstallMissingMediaPluginsPermissionRequest is not handled by the user,
+ * it is allowed by default.
+ *
+ * Since: 2.10
+ */
+
+static void webkit_permission_request_interface_init(WebKitPermissionRequestIface*);
+
+struct _WebKitInstallMissingMediaPluginsPermissionRequestPrivate {
+#if ENABLE(VIDEO)
+    RefPtr&lt;InstallMissingMediaPluginsPermissionRequest&gt; request;
+#endif
+    CString description;
+    bool madeDecision;
+};
+
+WEBKIT_DEFINE_TYPE_WITH_CODE(
+    WebKitInstallMissingMediaPluginsPermissionRequest, webkit_install_missing_media_plugins_permission_request, G_TYPE_OBJECT,
+    G_IMPLEMENT_INTERFACE(WEBKIT_TYPE_PERMISSION_REQUEST, webkit_permission_request_interface_init))
+
+#if ENABLE(VIDEO)
+static GUniquePtr&lt;GstInstallPluginsContext&gt; createGstInstallPluginsContext(GtkWidget* widget)
+{
+#if PLATFORM(X11)
+    if (PlatformDisplay::sharedDisplay().type() == PlatformDisplay::Type::X11) {
+        GUniquePtr&lt;GstInstallPluginsContext&gt; context(gst_install_plugins_context_new());
+        gst_install_plugins_context_set_xid(context.get(), GDK_WINDOW_XID(gtk_widget_get_window(widget)));
+        return context;
+    }
+#endif
+
+    return nullptr;
+}
+#endif
+
+static void webkitInstallMissingMediaPluginsPermissionRequestAllow(WebKitPermissionRequest* request)
+{
+    ASSERT(WEBKIT_IS_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(request));
+
+    WebKitInstallMissingMediaPluginsPermissionRequestPrivate* priv = WEBKIT_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(request)-&gt;priv;
+
+    // Only one decision at a time.
+    if (priv-&gt;madeDecision)
+        return;
+#if ENABLE(VIDEO)
+    priv-&gt;request-&gt;allow(createGstInstallPluginsContext(priv-&gt;request-&gt;page().viewWidget()));
+#endif
+    priv-&gt;madeDecision = true;
+}
+
+static void webkitInstallMissingMediaPluginsPermissionRequestDeny(WebKitPermissionRequest* request)
+{
+    ASSERT(WEBKIT_IS_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(request));
+
+    WebKitInstallMissingMediaPluginsPermissionRequestPrivate* priv = WEBKIT_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(request)-&gt;priv;
+
+    // Only one decision at a time.
+    if (priv-&gt;madeDecision)
+        return;
+
+#if ENABLE(VIDEO)
+    priv-&gt;request-&gt;deny();
+#endif
+    priv-&gt;madeDecision = true;
+}
+
+static void webkit_permission_request_interface_init(WebKitPermissionRequestIface* iface)
+{
+    iface-&gt;allow = webkitInstallMissingMediaPluginsPermissionRequestAllow;
+    iface-&gt;deny = webkitInstallMissingMediaPluginsPermissionRequestDeny;
+}
+
+static void webkitInstallMissingMediaPluginsPermissionRequestDispose(GObject* object)
+{
+    // Default behaviour when no decision has been made is allowing the request for backwards compatibility.
+    webkitInstallMissingMediaPluginsPermissionRequestDeny(WEBKIT_PERMISSION_REQUEST(object));
+    G_OBJECT_CLASS(webkit_install_missing_media_plugins_permission_request_parent_class)-&gt;dispose(object);
+}
+
+static void webkit_install_missing_media_plugins_permission_request_class_init(WebKitInstallMissingMediaPluginsPermissionRequestClass* klass)
+{
+    GObjectClass* objectClass = G_OBJECT_CLASS(klass);
+    objectClass-&gt;dispose = webkitInstallMissingMediaPluginsPermissionRequestDispose;
+}
+
+#if ENABLE(VIDEO)
+WebKitInstallMissingMediaPluginsPermissionRequest* webkitInstallMissingMediaPluginsPermissionRequestCreate(InstallMissingMediaPluginsPermissionRequest&amp; request)
+{
+    WebKitInstallMissingMediaPluginsPermissionRequest* permissionRequest = WEBKIT_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(g_object_new(WEBKIT_TYPE_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST, nullptr));
+    permissionRequest-&gt;priv-&gt;request = &amp;request;
+    return permissionRequest;
+}
+#endif
+
+/**
+ * webkit_install_missing_media_plugins_permission_request_get_description:
+ * @request: a #WebKitInstallMissingMediaPluginsPermissionRequest
+ *
+ * Gets the description about the missing plugins provided by the media backend when a media couldn't be played.
+ *
+ * Returns: a string with the description provided by the media backend.
+ *
+ * Since: 2.10
+ */
+const char* webkit_install_missing_media_plugins_permission_request_get_description(WebKitInstallMissingMediaPluginsPermissionRequest* request)
+{
+    g_return_val_if_fail(WEBKIT_IS_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(request), nullptr);
+
+#if ENABLE(VIDEO)
+    if (!request-&gt;priv-&gt;description.isNull())
+        return request-&gt;priv-&gt;description.data();
+
+    const auto&amp; description = request-&gt;priv-&gt;request-&gt;description();
+    ASSERT(!details.isEmpty());
+    request-&gt;priv-&gt;description = request-&gt;priv-&gt;request-&gt;description().utf8();
+#endif
+    return request-&gt;priv-&gt;description.data();
+}
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitInstallMissingMediaPluginsPermissionRequesth"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.h (0 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.h                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequest.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -0,0 +1,66 @@
</span><ins>+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#if !defined(__WEBKIT2_H_INSIDE__) &amp;&amp; !defined(WEBKIT2_COMPILATION)
+#error &quot;Only &lt;webkit2/webkit2.h&gt; can be included directly.&quot;
+#endif
+
+#ifndef WebKitInstallMissingMediaPluginsPermissionRequest_h
+#define WebKitInstallMissingMediaPluginsPermissionRequest_h
+
+#include &lt;glib-object.h&gt;
+#include &lt;webkit2/WebKitDefines.h&gt;
+
+G_BEGIN_DECLS
+
+#define WEBKIT_TYPE_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST            (webkit_install_missing_media_plugins_permission_request_get_type())
+#define WEBKIT_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST, WebKitInstallMissingMediaPluginsPermissionRequest))
+#define WEBKIT_IS_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST))
+#define WEBKIT_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),  WEBKIT_TYPE_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST, WebKitInstallMissingMediaPluginsPermissionRequestClass))
+#define WEBKIT_IS_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),  WEBKIT_TYPE_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST))
+#define WEBKIT_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj),  WEBKIT_TYPE_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST, WebKitInstallMissingMediaPluginsPermissionRequestClass))
+
+typedef struct _WebKitInstallMissingMediaPluginsPermissionRequest        WebKitInstallMissingMediaPluginsPermissionRequest;
+typedef struct _WebKitInstallMissingMediaPluginsPermissionRequestClass   WebKitInstallMissingMediaPluginsPermissionRequestClass;
+typedef struct _WebKitInstallMissingMediaPluginsPermissionRequestPrivate WebKitInstallMissingMediaPluginsPermissionRequestPrivate;
+
+struct _WebKitInstallMissingMediaPluginsPermissionRequest {
+    GObject parent;
+
+    WebKitInstallMissingMediaPluginsPermissionRequestPrivate *priv;
+};
+
+struct _WebKitInstallMissingMediaPluginsPermissionRequestClass {
+    GObjectClass parent_class;
+
+    void (*_webkit_reserved0) (void);
+    void (*_webkit_reserved1) (void);
+    void (*_webkit_reserved2) (void);
+    void (*_webkit_reserved3) (void);
+};
+
+WEBKIT_API GType
+webkit_install_missing_media_plugins_permission_request_get_type        (void);
+
+WEBKIT_API const gchar *
+webkit_install_missing_media_plugins_permission_request_get_description (WebKitInstallMissingMediaPluginsPermissionRequest *request);
+
+G_END_DECLS
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitInstallMissingMediaPluginsPermissionRequestPrivateh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequestPrivate.h (0 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequestPrivate.h                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitInstallMissingMediaPluginsPermissionRequestPrivate.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+/*
+ * Copyright (C) 2012 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef WebKitInstallMissingMediaPluginsPermissionRequestPrivate_h
+#define WebKitInstallMissingMediaPluginsPermissionRequestPrivate_h
+
+#include &quot;InstallMissingMediaPluginsPermissionRequest.h&quot;
+#include &quot;WebKitInstallMissingMediaPluginsPermissionRequest.h&quot;
+#include &quot;WebKitPrivate.h&quot;
+
+#if ENABLE(VIDEO)
+WebKitInstallMissingMediaPluginsPermissionRequest* webkitInstallMissingMediaPluginsPermissionRequestCreate(WebKit::InstallMissingMediaPluginsPermissionRequest&amp;);
+#endif
+
+#endif // WebKitInstallMissingMediaPluginsPermissionRequestPrivate_h
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitNotificationPermissionRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNotificationPermissionRequest.cpp (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNotificationPermissionRequest.cpp        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNotificationPermissionRequest.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -35,6 +35,11 @@
</span><span class="cx">  * WebKitNotificationPermissionRequest represents a request for
</span><span class="cx">  * permission to decide whether WebKit should provide the user with
</span><span class="cx">  * notifications through the Web Notification API.
</span><ins>+ *
+ * When a WebKitNotificationPermissionRequest is not handled by the user,
+ * it is denied by default.
+ *
+ * Since: 2.8
</ins><span class="cx">  */
</span><span class="cx"> 
</span><span class="cx"> static void webkit_permission_request_interface_init(WebKitPermissionRequestIface*);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitUserMediaPermissionRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserMediaPermissionRequest.cpp (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserMediaPermissionRequest.cpp        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitUserMediaPermissionRequest.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -36,6 +36,9 @@
</span><span class="cx">  * permission to decide whether WebKit should be allowed to access the user's
</span><span class="cx">  * audio and video source devices when requested throught the getUserMedia API.
</span><span class="cx">  *
</span><ins>+ * When a WebKitUserMediaPermissionRequest is not handled by the user,
+ * it is denied by default.
+ *
</ins><span class="cx">  * Since: 2.8
</span><span class="cx">  */
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx"> #include &quot;WebKitFormClient.h&quot;
</span><span class="cx"> #include &quot;WebKitFullscreenClient.h&quot;
</span><span class="cx"> #include &quot;WebKitHitTestResultPrivate.h&quot;
</span><ins>+#include &quot;WebKitInstallMissingMediaPluginsPermissionRequestPrivate.h&quot;
</ins><span class="cx"> #include &quot;WebKitJavascriptResultPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitLoaderClient.h&quot;
</span><span class="cx"> #include &quot;WebKitMarshal.h&quot;
</span><span class="lines">@@ -1351,9 +1352,10 @@
</span><span class="cx">      * request has not been handled, webkit_permission_request_deny()
</span><span class="cx">      * will be the default action.
</span><span class="cx">      *
</span><del>-     * By default, if the signal is not handled,
-     * webkit_permission_request_deny() will be called over the
-     * #WebKitPermissionRequest.
</del><ins>+     * If the signal is not handled, the @request will be completed automatically
+     * by the specific #WebKitPermissionRequest that could allow or deny it. Check the
+     * documentation of classes implementing #WebKitPermissionRequest interface to know
+     * their default action.
</ins><span class="cx">      *
</span><span class="cx">      * Returns: %TRUE to stop other handlers from being invoked for the event.
</span><span class="cx">      *   %FALSE to propagate the event further.
</span><span class="lines">@@ -2145,6 +2147,16 @@
</span><span class="cx">     webkitEditorStateChanged(webView-&gt;priv-&gt;editorState.get(), getPage(webView)-&gt;editorState());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void webkitWebViewRequestInstallMissingMediaPlugins(WebKitWebView* webView, InstallMissingMediaPluginsPermissionRequest&amp; request)
+{
+#if ENABLE(VIDEO)
+    GRefPtr&lt;WebKitInstallMissingMediaPluginsPermissionRequest&gt; installMediaPluginsPermissionRequest = adoptGRef(webkitInstallMissingMediaPluginsPermissionRequestCreate(request));
+    webkitWebViewMakePermissionRequest(webView, WEBKIT_PERMISSION_REQUEST(installMediaPluginsPermissionRequest.get()));
+#else
+    ASSERT_NOT_REACHED();
+#endif
+}
+
</ins><span class="cx"> /**
</span><span class="cx">  * webkit_web_view_new:
</span><span class="cx">  *
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebViewPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> #ifndef WebKitWebViewPrivate_h
</span><span class="cx"> #define WebKitWebViewPrivate_h
</span><span class="cx"> 
</span><ins>+#include &quot;InstallMissingMediaPluginsPermissionRequest.h&quot;
</ins><span class="cx"> #include &quot;WebContextMenuItemData.h&quot;
</span><span class="cx"> #include &quot;WebHitTestResult.h&quot;
</span><span class="cx"> #include &quot;WebImage.h&quot;
</span><span class="lines">@@ -63,5 +64,6 @@
</span><span class="cx"> void webkitWebViewWebProcessCrashed(WebKitWebView*);
</span><span class="cx"> void webkitWebViewIsPlayingAudioChanged(WebKitWebView*);
</span><span class="cx"> void webkitWebViewSelectionDidChange(WebKitWebView*);
</span><ins>+void webkitWebViewRequestInstallMissingMediaPlugins(WebKitWebView*, WebKit::InstallMissingMediaPluginsPermissionRequest&amp;);
</ins><span class="cx"> 
</span><span class="cx"> #endif // WebKitWebViewPrivate_h
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtk40sectionstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -593,6 +593,25 @@
</span><span class="cx"> &lt;/SECTION&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;SECTION&gt;
</span><ins>+&lt;FILE&gt;WebKitInstallMissingMediaPluginsPermissionRequest&lt;/FILE&gt;
+WebKitInstallMissingMediaPluginsPermissionRequest
+webkit_install_missing_media_plugins_permission_request_get_description
+
+&lt;SUBSECTION Standard&gt;
+WebKitInstallMissingMediaPluginsPermissionRequestClass
+WEBKIT_TYPE_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST
+WEBKIT_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST
+WEBKIT_IS_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST
+WEBKIT_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST_CLASS
+WEBKIT_IS_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST_CLASS
+WEBKIT_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST_GET_CLASS
+
+&lt;SUBSECTION Private&gt;
+WebKitInstallMissingMediaPluginsPermissionRequestPrivate
+webkit_install_missing_media_plugins_permission_request_get_type
+&lt;/SECTION&gt;
+
+&lt;SECTION&gt;
</ins><span class="cx"> &lt;FILE&gt;WebKitNavigationAction&lt;/FILE&gt;
</span><span class="cx"> WebKitNavigationAction
</span><span class="cx"> webkit_navigation_action_copy
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtk40types"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0.types (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0.types        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0.types        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -31,3 +31,4 @@
</span><span class="cx"> webkit_web_hit_test_result_get_type
</span><span class="cx"> webkit_website_data_manager_get_type
</span><span class="cx"> webkit_editor_state_get_type
</span><ins>+webkit_install_missing_media_plugins_permission_request_get_type
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtkdocssgml"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-docs.sgml        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -23,6 +23,7 @@
</span><span class="cx">     &lt;xi:include href=&quot;xml/WebKitDownload.xml&quot;/&gt;
</span><span class="cx">     &lt;xi:include href=&quot;xml/WebKitPermissionRequest.xml&quot;/&gt;
</span><span class="cx">     &lt;xi:include href=&quot;xml/WebKitGeolocationPermissionRequest.xml&quot;/&gt;
</span><ins>+    &lt;xi:include href=&quot;xml/WebKitInstallMissingMediaPluginsPermissionRequest.xml&quot;/&gt;
</ins><span class="cx">     &lt;xi:include href=&quot;xml/WebKitNavigationAction.xml&quot;/&gt;
</span><span class="cx">     &lt;xi:include href=&quot;xml/WebKitUserMediaPermissionRequest.xml&quot;/&gt;
</span><span class="cx">     &lt;xi:include href=&quot;xml/WebKitPolicyDecision.xml&quot;/&gt;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkwebkit2h"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/webkit2.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -48,6 +48,7 @@
</span><span class="cx"> #include &lt;webkit2/WebKitFormSubmissionRequest.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitGeolocationPermissionRequest.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitHitTestResult.h&gt;
</span><ins>+#include &lt;webkit2/WebKitInstallMissingMediaPluginsPermissionRequest.h&gt;
</ins><span class="cx"> #include &lt;webkit2/WebKitJavascriptResult.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitMimeInfo.h&gt;
</span><span class="cx"> #include &lt;webkit2/WebKitNavigationAction.h&gt;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessPageClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/PageClient.h (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/PageClient.h        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/PageClient.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -34,10 +34,6 @@
</span><span class="cx"> #include &lt;WebCore/EditorClient.h&gt;
</span><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> 
</span><del>-#if USE(GSTREAMER)
-#include &lt;WebCore/GUniquePtrGStreamer.h&gt;
-#endif
-
</del><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx"> #include &quot;PluginComplexTextInputState.h&quot;
</span><span class="cx"> 
</span><span class="lines">@@ -79,6 +75,10 @@
</span><span class="cx"> class WebFullScreenManagerProxyClient;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+#if USE(GSTREAMER)
+class InstallMissingMediaPluginsPermissionRequest;
+#endif
+
</ins><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx"> struct ColorSpaceData;
</span><span class="cx"> #endif
</span><span class="lines">@@ -341,7 +341,7 @@
</span><span class="cx">     virtual void derefView() = 0;
</span><span class="cx"> 
</span><span class="cx"> #if USE(GSTREAMER)
</span><del>-    virtual GUniquePtr&lt;GstInstallPluginsContext&gt; createGstInstallPluginsContext() = 0;
</del><ins>+    virtual bool decicePolicyForInstallMissingMediaPluginsPermissionRequest(InstallMissingMediaPluginsPermissionRequest&amp;) = 0;
</ins><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -1478,7 +1478,7 @@
</span><span class="cx"> #if ENABLE(VIDEO)
</span><span class="cx">     void mediaDocumentNaturalSizeChanged(const WebCore::IntSize&amp;);
</span><span class="cx"> #if USE(GSTREAMER)
</span><del>-    void requestInstallMissingMediaPlugins(const String&amp; details);
</del><ins>+    void requestInstallMissingMediaPlugins(const String&amp; details, const String&amp; description);
</ins><span class="cx"> #endif
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxymessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -453,6 +453,6 @@
</span><span class="cx">     FixedLayoutSizeDidChange(WebCore::IntSize fixedLayoutSize)
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(VIDEO) &amp;&amp; USE(GSTREAMER)
</span><del>-    RequestInstallMissingMediaPlugins(String details)
</del><ins>+    RequestInstallMissingMediaPlugins(String details, String description)
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcesseflWebViewEflh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/efl/WebViewEfl.h (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/efl/WebViewEfl.h        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/efl/WebViewEfl.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -98,7 +98,7 @@
</span><span class="cx">     virtual void derefView() override final { }
</span><span class="cx"> 
</span><span class="cx"> #if USE(GSTREAMER)
</span><del>-    virtual GUniquePtr&lt;GstInstallPluginsContext&gt; createGstInstallPluginsContext() override final { return nullptr; };
</del><ins>+    virtual bool decicePolicyForInstallMissingMediaPluginsPermissionRequest(InstallMissingMediaPluginsPermissionRequest&amp;) override final { return false; };
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessgstreamerInstallMissingMediaPluginsPermissionRequestcppfromrev188120trunkSourceWebKit2UIProcessgstreamerWebPageProxyGStreamercpp"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebKit2/UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.cpp (from rev 188120, trunk/Source/WebKit2/UIProcess/gstreamer/WebPageProxyGStreamer.cpp) (0 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.cpp                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -0,0 +1,83 @@
</span><ins>+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;InstallMissingMediaPluginsPermissionRequest.h&quot;
+
+#if ENABLE(VIDEO) &amp;&amp; USE(GSTREAMER)
+#include &quot;WebPageMessages.h&quot;
+#include &quot;WebPageProxy.h&quot;
+#include &lt;wtf/text/CString.h&gt;
+
+namespace WebKit {
+
+InstallMissingMediaPluginsPermissionRequest::InstallMissingMediaPluginsPermissionRequest(WebPageProxy&amp; page,  const String&amp; details, const String&amp; description)
+    : m_page(&amp;page)
+    , m_details(details)
+    , m_description(description)
+{
+}
+
+InstallMissingMediaPluginsPermissionRequest::~InstallMissingMediaPluginsPermissionRequest()
+{
+}
+
+void InstallMissingMediaPluginsPermissionRequest::allow(GUniquePtr&lt;GstInstallPluginsContext&gt;&amp;&amp; context)
+{
+    if (!m_page-&gt;isValid())
+        return;
+
+    CString detail = m_details.utf8();
+    const char* detailArray[2] = { detail.data(), nullptr };
+    ref();
+    GstInstallPluginsReturn result = gst_install_plugins_async(detailArray, context.get(), [](GstInstallPluginsReturn result, gpointer userData) {
+        RefPtr&lt;InstallMissingMediaPluginsPermissionRequest&gt; request = adoptRef(static_cast&lt;InstallMissingMediaPluginsPermissionRequest*&gt;(userData));
+        request-&gt;didEndRequestInstallMissingMediaPlugins(static_cast&lt;uint32_t&gt;(result));
+        }, this);
+
+    if (result != GST_INSTALL_PLUGINS_STARTED_OK) {
+        // If the installer didn't start, the callback will not be called, so remove the ref manually.
+        deref();
+        didEndRequestInstallMissingMediaPlugins(static_cast&lt;uint32_t&gt;(result));
+        WTFLogAlways(&quot;Missing GStreamer Plugin: %s\n&quot;, detail.data());
+    }
+}
+
+void InstallMissingMediaPluginsPermissionRequest::deny()
+{
+    didEndRequestInstallMissingMediaPlugins(static_cast&lt;uint32_t&gt;(GST_INSTALL_PLUGINS_USER_ABORT));
+}
+
+void InstallMissingMediaPluginsPermissionRequest::didEndRequestInstallMissingMediaPlugins(uint32_t result)
+{
+    if (!m_page-&gt;isValid())
+        return;
+
+    m_page-&gt;send(Messages::WebPage::DidEndRequestInstallMissingMediaPlugins(result));
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(VIDEO) &amp;&amp; USE(GSTREAMER)
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessgstreamerInstallMissingMediaPluginsPermissionRequesthfromrev188120trunkSourceWebKit2WebProcessWebPagegstreamerWebPageGStreamercpp"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebKit2/UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.h (from rev 188120, trunk/Source/WebKit2/WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp) (0 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.h                                (rev 0)
+++ trunk/Source/WebKit2/UIProcess/gstreamer/InstallMissingMediaPluginsPermissionRequest.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -0,0 +1,67 @@
</span><ins>+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef InstallMissingMediaPluginsPermissionRequest_h
+#define InstallMissingMediaPluginsPermissionRequest_h
+
+#if ENABLE(VIDEO) &amp;&amp; USE(GSTREAMER)
+#include &lt;WebCore/GUniquePtrGStreamer.h&gt;
+#include &lt;wtf/RefCounted.h&gt;
+#include &lt;wtf/RefPtr.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+namespace WebKit {
+
+class WebPageProxy;
+
+class InstallMissingMediaPluginsPermissionRequest : public RefCounted&lt;InstallMissingMediaPluginsPermissionRequest&gt; {
+public:
+    static Ref&lt;InstallMissingMediaPluginsPermissionRequest&gt; create(WebPageProxy&amp; page, const String&amp; details, const String&amp; description)
+    {
+        return adoptRef(*new InstallMissingMediaPluginsPermissionRequest(page, details, description));
+    }
+    ~InstallMissingMediaPluginsPermissionRequest();
+
+    void allow(GUniquePtr&lt;GstInstallPluginsContext&gt;&amp;&amp; = nullptr);
+    void deny();
+
+    WebPageProxy&amp; page() const { return *m_page; }
+    const String&amp; details() const { return m_details; }
+    const String&amp; description() const { return m_description; }
+
+private:
+    InstallMissingMediaPluginsPermissionRequest(WebPageProxy&amp;, const String&amp; details, const String&amp; description);
+
+    void didEndRequestInstallMissingMediaPlugins(uint32_t result);
+
+    RefPtr&lt;WebPageProxy&gt; m_page;
+    String m_details;
+    String m_description;
+};
+
+} // namespace WebKit
+
+#endif // ENABLE(VIDEO) &amp;&amp; USE(GSTREAMER)
+#endif // InstallMissingMediaPluginsPermissionRequest_h
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessgstreamerWebPageProxyGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/gstreamer/WebPageProxyGStreamer.cpp (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/gstreamer/WebPageProxyGStreamer.cpp        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/UIProcess/gstreamer/WebPageProxyGStreamer.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -27,30 +27,18 @@
</span><span class="cx"> #include &quot;WebPageProxy.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(VIDEO) &amp;&amp; USE(GSTREAMER)
</span><del>-
</del><ins>+#include &quot;InstallMissingMediaPluginsPermissionRequest.h&quot;
</ins><span class="cx"> #include &quot;PageClient.h&quot;
</span><del>-#include &quot;WebPageMessages.h&quot;
</del><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><del>-void WebPageProxy::requestInstallMissingMediaPlugins(const String&amp; details)
</del><ins>+void WebPageProxy::requestInstallMissingMediaPlugins(const String&amp; details, const String&amp; description)
</ins><span class="cx"> {
</span><del>-    CString detail = details.utf8();
-    const char* detailArray[2] = { detail.data(), nullptr };
-    ref();
-    GUniquePtr&lt;GstInstallPluginsContext&gt; context = m_pageClient.createGstInstallPluginsContext();
-    GstInstallPluginsReturn result = gst_install_plugins_async(detailArray, context.get(), [](GstInstallPluginsReturn result, gpointer userData) {
-        RefPtr&lt;WebPageProxy&gt; page = adoptRef(static_cast&lt;WebPageProxy*&gt;(userData));
-        if (page-&gt;isValid())
-            page-&gt;send(Messages::WebPage::DidEndRequestInstallMissingMediaPlugins(static_cast&lt;uint32_t&gt;(result)));
-    }, this);
</del><ins>+    RefPtr&lt;InstallMissingMediaPluginsPermissionRequest&gt; request = InstallMissingMediaPluginsPermissionRequest::create(*this, details, description);
+    if (m_pageClient.decicePolicyForInstallMissingMediaPluginsPermissionRequest(*request))
+        return;
</ins><span class="cx"> 
</span><del>-    if (result != GST_INSTALL_PLUGINS_STARTED_OK) {
-        // If the installer didn't start, the callback will not be called, so remove the ref manually.
-        deref();
-        send(Messages::WebPage::DidEndRequestInstallMissingMediaPlugins(static_cast&lt;uint32_t&gt;(result)));
-        WTFLogAlways(&quot;Missing GStreamer Plugin: %s\n&quot;, detail.data());
-    }
</del><ins>+    request-&gt;deny();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -1170,9 +1170,9 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #if USE(GSTREAMER)
</span><del>-void WebChromeClient::requestInstallMissingMediaPlugins(const String&amp; details, WebCore::MediaPlayerRequestInstallMissingPluginsCallback&amp; callback)
</del><ins>+void WebChromeClient::requestInstallMissingMediaPlugins(const String&amp; details, const String&amp; description, WebCore::MediaPlayerRequestInstallMissingPluginsCallback&amp; callback)
</ins><span class="cx"> {
</span><del>-    m_page-&gt;requestInstallMissingMediaPlugins(details, callback);
</del><ins>+    m_page-&gt;requestInstallMissingMediaPlugins(details, description, callback);
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> #endif // ENABLE(VIDEO)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebChromeClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebChromeClient.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -327,7 +327,7 @@
</span><span class="cx"> #if ENABLE(VIDEO)
</span><span class="cx">     virtual void mediaDocumentNaturalSizeChanged(const WebCore::IntSize&amp;) override;
</span><span class="cx"> #if USE(GSTREAMER)
</span><del>-    virtual void requestInstallMissingMediaPlugins(const String&amp;, WebCore::MediaPlayerRequestInstallMissingPluginsCallback&amp;) override;
</del><ins>+    virtual void requestInstallMissingMediaPlugins(const String&amp; /*details*/, const String&amp; /*description*/, WebCore::MediaPlayerRequestInstallMissingPluginsCallback&amp;) override;
</ins><span class="cx"> #endif
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPageWebPageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/WebProcess/WebPage/WebPage.h        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -909,7 +909,7 @@
</span><span class="cx"> #if ENABLE(VIDEO)
</span><span class="cx">     void mediaDocumentNaturalSizeChanged(const WebCore::IntSize&amp;);
</span><span class="cx"> #if USE(GSTREAMER)
</span><del>-    void requestInstallMissingMediaPlugins(const String&amp; details, WebCore::MediaPlayerRequestInstallMissingPluginsCallback&amp;);
</del><ins>+    void requestInstallMissingMediaPlugins(const String&amp; details, const String&amp; description, WebCore::MediaPlayerRequestInstallMissingPluginsCallback&amp;);
</ins><span class="cx"> #endif
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebPagegstreamerWebPageGStreamercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Source/WebKit2/WebProcess/WebPage/gstreamer/WebPageGStreamer.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -34,7 +34,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><del>-void WebPage::requestInstallMissingMediaPlugins(const String&amp; details, WebCore::MediaPlayerRequestInstallMissingPluginsCallback&amp; callback)
</del><ins>+void WebPage::requestInstallMissingMediaPlugins(const String&amp; details, const String&amp; description, WebCore::MediaPlayerRequestInstallMissingPluginsCallback&amp; callback)
</ins><span class="cx"> {
</span><span class="cx">     if (m_installMediaPluginsCallback) {
</span><span class="cx">         callback.complete(GST_INSTALL_PLUGINS_INSTALL_IN_PROGRESS);
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     m_installMediaPluginsCallback = &amp;callback;
</span><del>-    send(Messages::WebPageProxy::RequestInstallMissingMediaPlugins(details));
</del><ins>+    send(Messages::WebPageProxy::RequestInstallMissingMediaPlugins(details, description));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPage::didEndRequestInstallMissingMediaPlugins(uint32_t result)
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Tools/ChangeLog        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2015-08-07  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [GStreamer] Do not automatically show PackageKit codec installation notifications
+        https://bugs.webkit.org/show_bug.cgi?id=135973
+
+        Reviewed by Philippe Normand.
+
+        Handle the missing media plugins installation permission request
+        in MiniBrowser and add a test case for the new API.
+
+        * MiniBrowser/gtk/BrowserWindow.c:
+        (webViewDecidePermissionRequest):
+        * TestWebKitAPI/Tests/WebKit2Gtk/CMakeLists.txt:
+        * TestWebKitAPI/Tests/WebKit2Gtk/TestWebExtensions.cpp:
+        (permissionRequestCallback):
+        (testInstallMissingPluginsPermissionRequest):
+        (beforeAll):
+        * TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp:
+        (methodCallCallback):
+
</ins><span class="cx"> 2015-08-06  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, reduce the duration of a Lock unit test. It was timing out.
</span></span></pre></div>
<a id="trunkToolsMiniBrowsergtkBrowserWindowc"></a>
<div class="modfile"><h4>Modified: trunk/Tools/MiniBrowser/gtk/BrowserWindow.c (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/MiniBrowser/gtk/BrowserWindow.c        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Tools/MiniBrowser/gtk/BrowserWindow.c        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -454,6 +454,10 @@
</span><span class="cx">                 dialog_message = &quot;audio&quot;;
</span><span class="cx">         } else if (is_for_video_device)
</span><span class="cx">             dialog_message = &quot;video&quot;;
</span><ins>+    } else if (WEBKIT_IS_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(request)) {
+        dialog_title = &quot;Media plugin missing request&quot;;
+        dialog_message_format = &quot;The media backend was unable to find a plugin to play the requested media:\n%s.\nAllow to search and install the missing plugin?&quot;;
+        dialog_message = webkit_install_missing_media_plugins_permission_request_get_description(WEBKIT_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(request));
</ins><span class="cx">     } else
</span><span class="cx">         return FALSE;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2GtkCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/CMakeLists.txt (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/CMakeLists.txt        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/CMakeLists.txt        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> include_directories(SYSTEM
</span><span class="cx">     ${ATSPI_INCLUDE_DIRS}
</span><span class="cx">     ${GLIB_INCLUDE_DIRS}
</span><ins>+    ${GSTREAMER_INCLUDE_DIRS}
</ins><span class="cx">     ${GTK3_INCLUDE_DIRS}
</span><span class="cx">     ${GTK_UNIX_PRINT_INCLUDE_DIRS}
</span><span class="cx">     ${LIBSOUP_INCLUDE_DIRS}
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2GtkTestWebExtensionscpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebExtensions.cpp (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebExtensions.cpp        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebExtensions.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -180,6 +180,36 @@
</span><span class="cx">     g_signal_handler_disconnect(test-&gt;m_webView, scriptDialogID);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static gboolean permissionRequestCallback(WebKitWebView*, WebKitPermissionRequest* request, WebViewTest* test)
+{
+    if (!WEBKIT_IS_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(request))
+        return FALSE;
+
+    test-&gt;assertObjectIsDeletedWhenTestFinishes(G_OBJECT(request));
+    WebKitInstallMissingMediaPluginsPermissionRequest* missingPluginsRequest = WEBKIT_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(request);
+    g_assert(webkit_install_missing_media_plugins_permission_request_get_description(missingPluginsRequest));
+    webkit_permission_request_deny(request);
+    test-&gt;quitMainLoop();
+}
+
+static void testInstallMissingPluginsPermissionRequest(WebViewTest* test, gconstpointer)
+{
+    GUniquePtr&lt;char&gt; extensionBusName(g_strdup_printf(&quot;org.webkit.gtk.WebExtensionTest%u&quot;, Test::s_webExtensionID));
+    GRefPtr&lt;GDBusProxy&gt; proxy = adoptGRef(bus-&gt;createProxy(extensionBusName.get(),
+        &quot;/org/webkit/gtk/WebExtensionTest&quot;, &quot;org.webkit.gtk.WebExtensionTest&quot;, test-&gt;m_mainLoop));
+    GRefPtr&lt;GVariant&gt; result = adoptGRef(g_dbus_proxy_call_sync(proxy.get(), &quot;RemoveAVPluginsFromGSTRegistry&quot;,
+        nullptr, G_DBUS_CALL_FLAGS_NONE, -1, nullptr, nullptr));
+
+    test-&gt;showInWindowAndWaitUntilMapped();
+
+    gulong permissionRequestSignalID = g_signal_connect(test-&gt;m_webView, &quot;permission-request&quot;, G_CALLBACK(permissionRequestCallback), test);
+    // FIXME: the base URI needs to finish with / to work, that shouldn't happen.
+    GUniquePtr&lt;char&gt; baseURI(g_strconcat(&quot;file://&quot;, Test::getResourcesDir(Test::WebKit2Resources).data(), &quot;/&quot;, nullptr));
+    test-&gt;loadHtml(&quot;&lt;html&gt;&lt;body&gt;&lt;video src=\&quot;test.mp4\&quot; autoplay&gt;&lt;/video&gt;&lt;/body&gt;&lt;/html&gt;&quot;, baseURI.get());
+    g_main_loop_run(test-&gt;m_mainLoop);
+    g_signal_handler_disconnect(test-&gt;m_webView, permissionRequestSignalID);
+}
+
</ins><span class="cx"> void beforeAll()
</span><span class="cx"> {
</span><span class="cx">     bus = new WebKitTestBus();
</span><span class="lines">@@ -191,6 +221,7 @@
</span><span class="cx">     WebViewTest::add(&quot;WebKitWebView&quot;, &quot;web-process-crashed&quot;, testWebKitWebViewProcessCrashed);
</span><span class="cx">     WebViewTest::add(&quot;WebKitWebExtension&quot;, &quot;window-object-cleared&quot;, testWebExtensionWindowObjectCleared);
</span><span class="cx">     WebViewTest::add(&quot;WebKitWebExtension&quot;, &quot;isolated-world&quot;, testWebExtensionIsolatedWorld);
</span><ins>+    WebViewTest::add(&quot;WebKitWebView&quot;, &quot;install-missing-plugins-permission-request&quot;, testInstallMissingPluginsPermissionRequest);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void afterAll()
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2GtkWebExtensionTestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp (188120 => 188121)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp        2015-08-07 08:32:21 UTC (rev 188120)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp        2015-08-07 09:51:20 UTC (rev 188121)
</span><span class="lines">@@ -22,6 +22,7 @@
</span><span class="cx"> #include &lt;JavaScriptCore/JSContextRef.h&gt;
</span><span class="cx"> #include &lt;JavaScriptCore/JSRetainPtr.h&gt;
</span><span class="cx"> #include &lt;gio/gio.h&gt;
</span><ins>+#include &lt;gst/gst.h&gt;
</ins><span class="cx"> #include &lt;stdlib.h&gt;
</span><span class="cx"> #include &lt;string.h&gt;
</span><span class="cx"> #include &lt;webkit2/webkit-web-extension.h&gt;
</span><span class="lines">@@ -52,6 +53,8 @@
</span><span class="cx">     &quot;  &lt;method name='GetProcessIdentifier'&gt;&quot;
</span><span class="cx">     &quot;   &lt;arg type='u' name='identifier' direction='out'/&gt;&quot;
</span><span class="cx">     &quot;  &lt;/method&gt;&quot;
</span><ins>+    &quot;  &lt;method name='RemoveAVPluginsFromGSTRegistry'&gt;&quot;
+    &quot;  &lt;/method&gt;&quot;
</ins><span class="cx">     &quot;  &lt;signal name='DocumentLoaded'/&gt;&quot;
</span><span class="cx">     &quot;  &lt;signal name='URIChanged'&gt;&quot;
</span><span class="cx">     &quot;   &lt;arg type='s' name='uri' direction='out'/&gt;&quot;
</span><span class="lines">@@ -301,6 +304,17 @@
</span><span class="cx">     } else if (!g_strcmp0(methodName, &quot;GetProcessIdentifier&quot;)) {
</span><span class="cx">         g_dbus_method_invocation_return_value(invocation,
</span><span class="cx">             g_variant_new(&quot;(u)&quot;, static_cast&lt;guint32&gt;(getCurrentProcessID())));
</span><ins>+    } else if (!g_strcmp0(methodName, &quot;RemoveAVPluginsFromGSTRegistry&quot;)) {
+        gst_init(nullptr, nullptr);
+        static const char* avPlugins[] = { &quot;libav&quot;, &quot;omx&quot;, &quot;vaapi&quot;, nullptr };
+        GstRegistry* registry = gst_registry_get();
+        for (unsigned i = 0; avPlugins[i]; ++i) {
+            if (GstPlugin* plugin = gst_registry_find_plugin(registry, avPlugins[i])) {
+                gst_registry_remove_plugin(registry, plugin);
+                gst_object_unref(plugin);
+            }
+        }
+        g_dbus_method_invocation_return_value(invocation, nullptr);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>