<!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>[210574] 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/210574">210574</a></dd>
<dt>Author</dt> <dd>mcatanzaro@igalia.com</dd>
<dt>Date</dt> <dd>2017-01-10 19:56:12 -0800 (Tue, 10 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] No way for applications to set notification permissions without waiting for permission request
https://bugs.webkit.org/show_bug.cgi?id=163366

Reviewed by Carlos Garcia Campos.

Source/WebKit2:

Websites can check the Notification.permission DOM property to check if they have permission
to show notifications *without triggering a permission request*. But the WebKitGTK+ API has
no way to affirmatively indicate notifications are allowed without a permission request. The
only way is via the permission request API, which is too late. It's a problem for Epiphany.
For example, open the Riot Matrix client in a web app; you will immediately see an info bar
informing the user that Riot does not have permission to send desktop notifications, even
though Epiphany automatically grants notification permission in web app mode when requested.
This problem is not exclusive to web apps; there is simply no way for notification
permission to be set correctly prior to a permission request for it. Fix this by introducing
a webkit_web_context_initialize_notification_permissions() API, and add a signal
WebKitWebContext::initialize-notification-permissions to indicate when it should be called.

* UIProcess/API/gtk/WebKitNotificationProvider.cpp:
(notificationPermissionsCallback):
(WebKitNotificationProvider::create):
(WebKitNotificationProvider::WebKitNotificationProvider):
(WebKitNotificationProvider::notificationPermissions):
(WebKitNotificationProvider::setNotificationPermissions):
* UIProcess/API/gtk/WebKitNotificationProvider.h:
* UIProcess/API/gtk/WebKitSecurityOrigin.cpp:
(webkitSecurityOriginGetSecurityOrigin):
* UIProcess/API/gtk/WebKitSecurityOriginPrivate.h:
* UIProcess/API/gtk/WebKitWebContext.cpp:
(webkitWebContextConstructed):
(webkit_web_context_class_init):
(addOriginToMap):
(webkit_web_context_initialize_notification_permissions):
(webkitWebContextInitializeNotificationPermissions):
* UIProcess/API/gtk/WebKitWebContext.h:
* UIProcess/API/gtk/WebKitWebContextPrivate.h:
* UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt:

Tools:

* TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebView.cpp:
(testWebViewNotification):
(setInitialNotificationPermissionsAllowedCallback):
(setInitialNotificationPermissionsDisallowedCallback):
(testWebViewNotificationInitialPermissionAllowed):
(testWebViewNotificationInitialPermissionDisallowed):
(beforeAll):
* TestWebKitAPI/gtk/WebKit2Gtk/TestMain.h:
* TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.cpp:
(WebViewTest::WebViewTest):
(WebViewTest::initializeWebView):
* TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitNotificationProvidercpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNotificationProvider.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitNotificationProviderh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNotificationProvider.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitSecurityOrigincpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitSecurityOrigin.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitSecurityOriginPrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitSecurityOriginPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebContextcpp">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebContexth">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkWebKitWebContextPrivateh">trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContextPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPIgtkdocswebkit2gtk40sectionstxt">trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebKit2GtkTestWebKitWebViewcpp">trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebView.cpp</a></li>
<li><a href="#trunkToolsTestWebKitAPIgtkWebKit2GtkTestMainh">trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/TestMain.h</a></li>
<li><a href="#trunkToolsTestWebKitAPIgtkWebKit2GtkWebViewTestcpp">trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.cpp</a></li>
<li><a href="#trunkToolsTestWebKitAPIgtkWebKit2GtkWebViewTesth">trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Source/WebKit2/ChangeLog        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -1,3 +1,42 @@
</span><ins>+2017-01-10  Michael Catanzaro  &lt;mcatanzaro@igalia.com&gt;
+
+        [GTK] No way for applications to set notification permissions without waiting for permission request
+        https://bugs.webkit.org/show_bug.cgi?id=163366
+
+        Reviewed by Carlos Garcia Campos.
+
+        Websites can check the Notification.permission DOM property to check if they have permission
+        to show notifications *without triggering a permission request*. But the WebKitGTK+ API has
+        no way to affirmatively indicate notifications are allowed without a permission request. The
+        only way is via the permission request API, which is too late. It's a problem for Epiphany.
+        For example, open the Riot Matrix client in a web app; you will immediately see an info bar
+        informing the user that Riot does not have permission to send desktop notifications, even
+        though Epiphany automatically grants notification permission in web app mode when requested.
+        This problem is not exclusive to web apps; there is simply no way for notification
+        permission to be set correctly prior to a permission request for it. Fix this by introducing
+        a webkit_web_context_initialize_notification_permissions() API, and add a signal
+        WebKitWebContext::initialize-notification-permissions to indicate when it should be called.
+
+        * UIProcess/API/gtk/WebKitNotificationProvider.cpp:
+        (notificationPermissionsCallback):
+        (WebKitNotificationProvider::create):
+        (WebKitNotificationProvider::WebKitNotificationProvider):
+        (WebKitNotificationProvider::notificationPermissions):
+        (WebKitNotificationProvider::setNotificationPermissions):
+        * UIProcess/API/gtk/WebKitNotificationProvider.h:
+        * UIProcess/API/gtk/WebKitSecurityOrigin.cpp:
+        (webkitSecurityOriginGetSecurityOrigin):
+        * UIProcess/API/gtk/WebKitSecurityOriginPrivate.h:
+        * UIProcess/API/gtk/WebKitWebContext.cpp:
+        (webkitWebContextConstructed):
+        (webkit_web_context_class_init):
+        (addOriginToMap):
+        (webkit_web_context_initialize_notification_permissions):
+        (webkitWebContextInitializeNotificationPermissions):
+        * UIProcess/API/gtk/WebKitWebContext.h:
+        * UIProcess/API/gtk/WebKitWebContextPrivate.h:
+        * UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt:
+
</ins><span class="cx"> 2017-01-10  Keith Rollin  &lt;krollin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Record/replay: fix range used for fuzzy matching
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitNotificationProvidercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNotificationProvider.cpp (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNotificationProvider.cpp        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNotificationProvider.cpp        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -28,8 +28,10 @@
</span><span class="cx"> #include &quot;WebKitNotificationProvider.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #include &quot;APIArray.h&quot;
</span><ins>+#include &quot;APIDictionary.h&quot;
</ins><span class="cx"> #include &quot;WKNotificationManager.h&quot;
</span><span class="cx"> #include &quot;WebKitNotificationPrivate.h&quot;
</span><ins>+#include &quot;WebKitWebContextPrivate.h&quot;
</ins><span class="cx"> #include &quot;WebKitWebViewPrivate.h&quot;
</span><span class="cx"> #include &quot;WebNotificationManagerProxy.h&quot;
</span><span class="cx"> #include &quot;WebPageProxy.h&quot;
</span><span class="lines">@@ -52,6 +54,11 @@
</span><span class="cx">     toNotificationProvider(clientInfo)-&gt;cancel(*toImpl(notification));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static WKDictionaryRef notificationPermissionsCallback(const void* clientInfo)
+{
+    return toAPI(toNotificationProvider(clientInfo)-&gt;notificationPermissions().leakRef());
+}
+
</ins><span class="cx"> static void clearNotificationsCallback(WKArrayRef notificationIDs, const void* clientInfo)
</span><span class="cx"> {
</span><span class="cx">     toNotificationProvider(clientInfo)-&gt;clearNotifications(toImpl(notificationIDs));
</span><span class="lines">@@ -61,13 +68,14 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Ref&lt;WebKitNotificationProvider&gt; WebKitNotificationProvider::create(WebNotificationManagerProxy* notificationManager)
</del><ins>+Ref&lt;WebKitNotificationProvider&gt; WebKitNotificationProvider::create(WebNotificationManagerProxy* notificationManager, WebKitWebContext* webContext)
</ins><span class="cx"> {
</span><del>-    return adoptRef(*new WebKitNotificationProvider(notificationManager));
</del><ins>+    return adoptRef(*new WebKitNotificationProvider(notificationManager, webContext));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-WebKitNotificationProvider::WebKitNotificationProvider(WebNotificationManagerProxy* notificationManager)
-    : m_notificationManager(notificationManager)
</del><ins>+WebKitNotificationProvider::WebKitNotificationProvider(WebNotificationManagerProxy* notificationManager, WebKitWebContext* webContext)
+    : m_webContext(webContext)
+    , m_notificationManager(notificationManager)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(notificationManager);
</span><span class="cx"> 
</span><span class="lines">@@ -81,7 +89,7 @@
</span><span class="cx">         0, // didDestroyNotificationCallback,
</span><span class="cx">         0, // addNotificationManagerCallback,
</span><span class="cx">         0, // removeNotificationManagerCallback,
</span><del>-        0, // notificationPermissionsCallback,
</del><ins>+        notificationPermissionsCallback,
</ins><span class="cx">         clearNotificationsCallback,
</span><span class="cx">     };
</span><span class="cx"> 
</span><span class="lines">@@ -152,3 +160,14 @@
</span><span class="cx">     for (const auto&amp; item : notificationIDs-&gt;elementsOfType&lt;API::UInt64&gt;())
</span><span class="cx">         cancelNotificationByID(item-&gt;value());
</span><span class="cx"> }
</span><ins>+
+RefPtr&lt;API::Dictionary&gt; WebKitNotificationProvider::notificationPermissions()
+{
+    webkitWebContextInitializeNotificationPermissions(m_webContext);
+    return m_notificationPermissions;
+}
+
+void WebKitNotificationProvider::setNotificationPermissions(HashMap&lt;String, RefPtr&lt;API::Object&gt;&gt;&amp;&amp; permissionsMap)
+{
+    m_notificationPermissions = API::Dictionary::create(WTFMove(permissionsMap));
+}
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitNotificationProviderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNotificationProvider.h (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNotificationProvider.h        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitNotificationProvider.h        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -22,6 +22,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;WebKitPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitNotification.h&quot;
</span><ins>+#include &quot;WebKitWebContext.h&quot;
</ins><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/Ref.h&gt;
</span><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="lines">@@ -35,14 +36,17 @@
</span><span class="cx"> class WebKitNotificationProvider : public RefCounted&lt;WebKitNotificationProvider&gt; {
</span><span class="cx"> public:
</span><span class="cx">     virtual ~WebKitNotificationProvider();
</span><del>-    static Ref&lt;WebKitNotificationProvider&gt; create(WebNotificationManagerProxy*);
</del><ins>+    static Ref&lt;WebKitNotificationProvider&gt; create(WebNotificationManagerProxy*, WebKitWebContext*);
</ins><span class="cx"> 
</span><span class="cx">     void show(WebPageProxy*, const WebNotification&amp;);
</span><span class="cx">     void cancel(const WebNotification&amp;);
</span><span class="cx">     void clearNotifications(const API::Array*);
</span><span class="cx"> 
</span><ins>+    RefPtr&lt;API::Dictionary&gt; notificationPermissions();
+    void setNotificationPermissions(HashMap&lt;String, RefPtr&lt;API::Object&gt;&gt;&amp;&amp;);
+
</ins><span class="cx"> private:
</span><del>-    WebKitNotificationProvider(WebNotificationManagerProxy*);
</del><ins>+    WebKitNotificationProvider(WebNotificationManagerProxy*, WebKitWebContext*);
</ins><span class="cx"> 
</span><span class="cx">     void cancelNotificationByID(uint64_t);
</span><span class="cx">     static void notificationCloseCallback(WebKitNotification*, WebKitNotificationProvider*);
</span><span class="lines">@@ -50,6 +54,8 @@
</span><span class="cx"> 
</span><span class="cx">     void withdrawAnyPreviousNotificationMatchingTag(const CString&amp;);
</span><span class="cx"> 
</span><ins>+    WebKitWebContext* m_webContext;
+    RefPtr&lt;API::Dictionary&gt; m_notificationPermissions;
</ins><span class="cx">     RefPtr&lt;WebNotificationManagerProxy&gt; m_notificationManager;
</span><span class="cx">     HashMap&lt;uint64_t, GRefPtr&lt;WebKitNotification&gt;&gt; m_notifications;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitSecurityOrigincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitSecurityOrigin.cpp (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitSecurityOrigin.cpp        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitSecurityOrigin.cpp        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -70,6 +70,12 @@
</span><span class="cx">     return origin;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+WebCore::SecurityOrigin&amp; webkitSecurityOriginGetSecurityOrigin(WebKitSecurityOrigin* origin)
+{
+    ASSERT(origin);
+    return origin-&gt;securityOrigin.get();
+}
+
</ins><span class="cx"> /**
</span><span class="cx">  * webkit_security_origin_new:
</span><span class="cx">  * @protocol: The protocol for the new origin
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitSecurityOriginPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitSecurityOriginPrivate.h (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitSecurityOriginPrivate.h        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitSecurityOriginPrivate.h        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -30,3 +30,4 @@
</span><span class="cx"> #include &lt;WebCore/SecurityOrigin.h&gt;
</span><span class="cx"> 
</span><span class="cx"> WebKitSecurityOrigin* webkitSecurityOriginCreate(Ref&lt;WebCore::SecurityOrigin&gt;&amp;&amp;);
</span><ins>+WebCore::SecurityOrigin&amp; webkitSecurityOriginGetSecurityOrigin(WebKitSecurityOrigin*);
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> #include &quot;WebKitPluginPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitSecurityManagerPrivate.h&quot;
</span><ins>+#include &quot;WebKitSecurityOriginPrivate.h&quot;
</ins><span class="cx"> #include &quot;WebKitSettingsPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitURISchemeRequestPrivate.h&quot;
</span><span class="cx"> #include &quot;WebKitUserContentManagerPrivate.h&quot;
</span><span class="lines">@@ -110,6 +111,7 @@
</span><span class="cx"> enum {
</span><span class="cx">     DOWNLOAD_STARTED,
</span><span class="cx">     INITIALIZE_WEB_EXTENSIONS,
</span><ins>+    INITIALIZE_NOTIFICATION_PERMISSIONS,
</ins><span class="cx"> 
</span><span class="cx">     LAST_SIGNAL
</span><span class="cx"> };
</span><span class="lines">@@ -285,7 +287,7 @@
</span><span class="cx">     priv-&gt;geolocationProvider = WebKitGeolocationProvider::create(priv-&gt;processPool-&gt;supplement&lt;WebGeolocationManagerProxy&gt;());
</span><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(NOTIFICATIONS)
</span><del>-    priv-&gt;notificationProvider = WebKitNotificationProvider::create(priv-&gt;processPool-&gt;supplement&lt;WebNotificationManagerProxy&gt;());
</del><ins>+    priv-&gt;notificationProvider = WebKitNotificationProvider::create(priv-&gt;processPool-&gt;supplement&lt;WebNotificationManagerProxy&gt;(), webContext);
</ins><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -386,6 +388,30 @@
</span><span class="cx">             nullptr, nullptr,
</span><span class="cx">             g_cclosure_marshal_VOID__VOID,
</span><span class="cx">             G_TYPE_NONE, 0);
</span><ins>+
+    /**
+     * WebKitWebContext::initialize-notification-permissions:
+     * @context: the #WebKitWebContext
+     *
+     * This signal is emitted when a #WebKitWebContext needs to set
+     * initial notification permissions for a web process. It is emitted
+     * when a new web process is about to be launched, and signals the
+     * most appropriate moment to use
+     * webkit_web_context_initialize_notification_permissions(). If no
+     * notification permissions have changed since the last time this
+     * signal was emitted, then there is no need to call
+     * webkit_web_context_initialize_notification_permissions() again.
+     *
+     * Since: 2.16
+     */
+    signals[INITIALIZE_NOTIFICATION_PERMISSIONS] =
+        g_signal_new(&quot;initialize-notification-permissions&quot;,
+            G_TYPE_FROM_CLASS(gObjectClass),
+            G_SIGNAL_RUN_LAST,
+            G_STRUCT_OFFSET(WebKitWebContextClass, initialize_notification_permissions),
+            nullptr, nullptr,
+            g_cclosure_marshal_VOID__VOID,
+            G_TYPE_NONE, 0);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static gpointer createDefaultWebContext(gpointer)
</span><span class="lines">@@ -1218,6 +1244,54 @@
</span><span class="cx">     return context-&gt;priv-&gt;processCountLimit;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static void addOriginToMap(WebKitSecurityOrigin* origin, HashMap&lt;String, RefPtr&lt;API::Object&gt;&gt;* map, bool allowed)
+{
+    String string = webkitSecurityOriginGetSecurityOrigin(origin).toString();
+    if (string != &quot;null&quot;)
+        map-&gt;set(string, API::Boolean::create(allowed));
+}
+
+/**
+ * webkit_web_context_initialize_notification_permissions:
+ * @context: the #WebKitWebContext
+ * @allowed_origins: (element-type WebKitSecurityOrigin): a #GList of security origins
+ * @disallowed_origins: (element-type WebKitSecurityOrigin): a #GList of security origins
+ *
+ * Sets initial desktop notification permissions for the @context.
+ * @allowed_origins and @disallowed_origins must each be #GList of
+ * #WebKitSecurityOrigin objects representing origins that will,
+ * respectively, either always or never have permission to show desktop
+ * notifications. No #WebKitNotificationPermissionRequest will ever be
+ * generated for any of the security origins represented in
+ * @allowed_origins or @disallowed_origins. This function is necessary
+ * because some webpages proactively check whether they have permission
+ * to display notifications without ever creating a permission request.
+ *
+ * This function only affects web processes that have not already been
+ * created. The best time to call it is when handling
+ * #WebKitWebContext::initialize-notification-permissions so as to
+ * ensure that new web processes receive the most recent set of
+ * permissions.
+ *
+ * Since: 2.16
+ */
+void webkit_web_context_initialize_notification_permissions(WebKitWebContext* context, GList* allowedOrigins, GList* disallowedOrigins)
+{
+    HashMap&lt;String, RefPtr&lt;API::Object&gt;&gt; map;
+    g_list_foreach(allowedOrigins, [](gpointer data, gpointer userData) {
+        addOriginToMap(static_cast&lt;WebKitSecurityOrigin*&gt;(data), static_cast&lt;HashMap&lt;String, RefPtr&lt;API::Object&gt;&gt;*&gt;(userData), true);
+    }, &amp;map);
+    g_list_foreach(disallowedOrigins, [](gpointer data, gpointer userData) {
+        addOriginToMap(static_cast&lt;WebKitSecurityOrigin*&gt;(data), static_cast&lt;HashMap&lt;String, RefPtr&lt;API::Object&gt;&gt;*&gt;(userData), false);
+    }, &amp;map);
+    context-&gt;priv-&gt;notificationProvider-&gt;setNotificationPermissions(WTFMove(map));
+}
+
+void webkitWebContextInitializeNotificationPermissions(WebKitWebContext* context)
+{
+    g_signal_emit(context, signals[INITIALIZE_NOTIFICATION_PERMISSIONS], 0);
+}
+
</ins><span class="cx"> WebKitDownload* webkitWebContextGetOrCreateDownload(DownloadProxy* downloadProxy)
</span><span class="cx"> {
</span><span class="cx">     GRefPtr&lt;WebKitDownload&gt; download = downloadsMap().get(downloadProxy);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -128,9 +128,10 @@
</span><span class="cx"> struct _WebKitWebContextClass {
</span><span class="cx">     GObjectClass parent;
</span><span class="cx"> 
</span><del>-    void (* download_started)          (WebKitWebContext *context,
-                                        WebKitDownload   *download);
-    void (* initialize_web_extensions) (WebKitWebContext *context);
</del><ins>+    void (* download_started)                    (WebKitWebContext *context,
+                                                  WebKitDownload   *download);
+    void (* initialize_web_extensions)           (WebKitWebContext *context);
+    void (* initialize_notification_permissions) (WebKitWebContext *context);
</ins><span class="cx"> 
</span><span class="cx">     void (*_webkit_reserved0) (void);
</span><span class="cx">     void (*_webkit_reserved1) (void);
</span><span class="lines">@@ -137,7 +138,6 @@
</span><span class="cx">     void (*_webkit_reserved2) (void);
</span><span class="cx">     void (*_webkit_reserved3) (void);
</span><span class="cx">     void (*_webkit_reserved4) (void);
</span><del>-    void (*_webkit_reserved5) (void);
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> WEBKIT_API GType
</span><span class="lines">@@ -264,6 +264,12 @@
</span><span class="cx"> WEBKIT_API WebKitProcessModel
</span><span class="cx"> webkit_web_context_get_process_model                (WebKitWebContext              *context);
</span><span class="cx"> 
</span><ins>+WEBKIT_API void
+webkit_web_context_initialize_notification_permissions
+                                                    (WebKitWebContext              *context,
+                                                     GList                         *allowed_origins,
+                                                     GList                         *disallowed_origins);
+
</ins><span class="cx"> G_END_DECLS
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPIgtkWebKitWebContextPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContextPrivate.h (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContextPrivate.h        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContextPrivate.h        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -48,5 +48,6 @@
</span><span class="cx"> void webkitWebContextWebViewDestroyed(WebKitWebContext*, WebKitWebView*);
</span><span class="cx"> WebKitWebView* webkitWebContextGetWebViewForPage(WebKitWebContext*, WebKit::WebPageProxy*);
</span><span class="cx"> GVariant* webkitWebContextInitializeWebExtensions(WebKitWebContext*);
</span><ins>+void webkitWebContextInitializeNotificationPermissions(WebKitWebContext*);
</ins><span class="cx"> 
</span><span class="cx"> #endif // WebKitWebContextPrivate_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 (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -59,6 +59,7 @@
</span><span class="cx"> webkit_web_context_allow_tls_certificate_for_host
</span><span class="cx"> webkit_web_context_get_process_model
</span><span class="cx"> webkit_web_context_set_process_model
</span><ins>+webkit_web_context_initialize_notification_permissions
</ins><span class="cx"> 
</span><span class="cx"> &lt;SUBSECTION URI Scheme&gt;
</span><span class="cx"> WebKitURISchemeRequestCallback
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Tools/ChangeLog        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2017-01-10  Michael Catanzaro  &lt;mcatanzaro@igalia.com&gt;
+
+        [GTK] No way for applications to set notification permissions without waiting for permission request
+        https://bugs.webkit.org/show_bug.cgi?id=163366
+
+        Reviewed by Carlos Garcia Campos.
+
+        * TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebView.cpp:
+        (testWebViewNotification):
+        (setInitialNotificationPermissionsAllowedCallback):
+        (setInitialNotificationPermissionsDisallowedCallback):
+        (testWebViewNotificationInitialPermissionAllowed):
+        (testWebViewNotificationInitialPermissionDisallowed):
+        (beforeAll):
+        * TestWebKitAPI/gtk/WebKit2Gtk/TestMain.h:
+        * TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.cpp:
+        (WebViewTest::WebViewTest):
+        (WebViewTest::initializeWebView):
+        * TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.h:
+
</ins><span class="cx"> 2017-01-10  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         MobileMiniBrowser tests don't work by default
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebKit2GtkTestWebKitWebViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebView.cpp (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebView.cpp        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebKitWebView.cpp        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -632,8 +632,18 @@
</span><span class="cx"> 
</span><span class="cx"> class NotificationWebViewTest: public WebViewTest {
</span><span class="cx"> public:
</span><del>-    MAKE_GLIB_TEST_FIXTURE(NotificationWebViewTest);
</del><ins>+    MAKE_GLIB_TEST_FIXTURE_WITH_SETUP_TEARDOWN(NotificationWebViewTest, setup, teardown);
</ins><span class="cx"> 
</span><ins>+    static void setup()
+    {
+        WebViewTest::shouldInitializeWebViewInConstructor = false;
+    }
+
+    static void teardown()
+    {
+        WebViewTest::shouldInitializeWebViewInConstructor = true;
+    }
+
</ins><span class="cx">     enum NotificationEvent {
</span><span class="cx">         None,
</span><span class="cx">         Permission,
</span><span class="lines">@@ -647,6 +657,7 @@
</span><span class="cx">     static gboolean permissionRequestCallback(WebKitWebView*, WebKitPermissionRequest *request, NotificationWebViewTest* test)
</span><span class="cx">     {
</span><span class="cx">         g_assert(WEBKIT_IS_NOTIFICATION_PERMISSION_REQUEST(request));
</span><ins>+        g_assert(test-&gt;m_isExpectingPermissionRequest);
</ins><span class="cx">         test-&gt;assertObjectIsDeletedWhenTestFinishes(G_OBJECT(request));
</span><span class="cx"> 
</span><span class="cx">         test-&gt;m_event = Permission;
</span><span class="lines">@@ -699,10 +710,9 @@
</span><span class="cx">         g_main_loop_quit(test-&gt;m_mainLoop);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    NotificationWebViewTest()
-        : m_notification(nullptr)
-        , m_event(None)
</del><ins>+    void initialize()
</ins><span class="cx">     {
</span><ins>+        initializeWebView();
</ins><span class="cx">         g_signal_connect(m_webView, &quot;permission-request&quot;, G_CALLBACK(permissionRequestCallback), this);
</span><span class="cx">         g_signal_connect(m_webView, &quot;show-notification&quot;, G_CALLBACK(showNotificationCallback), this);
</span><span class="cx">         webkit_user_content_manager_register_script_message_handler(m_userContentManager.get(), &quot;notifications&quot;);
</span><span class="lines">@@ -716,9 +726,18 @@
</span><span class="cx">         webkit_user_content_manager_unregister_script_message_handler(m_userContentManager.get(), &quot;notifications&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    bool hasPermission()
+    {
+        auto* result = runJavaScriptAndWaitUntilFinished(&quot;Notification.permission;&quot;, nullptr);
+        g_assert(result);
+        GUniquePtr&lt;char&gt; value(javascriptResultToCString(result));
+        return !g_strcmp0(value.get(), &quot;granted&quot;);
+    }
+
</ins><span class="cx">    void requestPermissionAndWaitUntilGiven()
</span><span class="cx">     {
</span><span class="cx">         m_event = None;
</span><ins>+        m_isExpectingPermissionRequest = true;
</ins><span class="cx">         webkit_web_view_run_javascript(m_webView, &quot;Notification.requestPermission();&quot;, nullptr, nullptr, nullptr);
</span><span class="cx">         g_main_loop_run(m_mainLoop);
</span><span class="cx">     }
</span><span class="lines">@@ -769,18 +788,24 @@
</span><span class="cx">         g_main_loop_run(m_mainLoop);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    NotificationEvent m_event;
-    WebKitNotification* m_notification;
</del><ins>+    NotificationEvent m_event { None };
+    WebKitNotification* m_notification { nullptr };
+    bool m_isExpectingPermissionRequest { false };
+    bool m_hasPermission { false };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> static void testWebViewNotification(NotificationWebViewTest* test, gconstpointer)
</span><span class="cx"> {
</span><ins>+    test-&gt;initialize();
+
</ins><span class="cx">     // Notifications don't work with local or special schemes.
</span><span class="cx">     test-&gt;loadURI(gServer-&gt;getURIForPath(&quot;/&quot;).data());
</span><span class="cx">     test-&gt;waitUntilLoadFinished();
</span><ins>+    g_assert(!test-&gt;hasPermission());
</ins><span class="cx"> 
</span><span class="cx">     test-&gt;requestPermissionAndWaitUntilGiven();
</span><span class="cx">     g_assert(test-&gt;m_event == NotificationWebViewTest::Permission);
</span><ins>+    g_assert(test-&gt;hasPermission());
</ins><span class="cx"> 
</span><span class="cx">     static const char* title = &quot;This is a notification&quot;;
</span><span class="cx">     static const char* body = &quot;This is the body.&quot;;
</span><span class="lines">@@ -818,6 +843,45 @@
</span><span class="cx">     g_assert(test-&gt;m_event == NotificationWebViewTest::Closed);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static void setInitialNotificationPermissionsAllowedCallback(WebKitWebContext* context, NotificationWebViewTest* test)
+{
+    GUniquePtr&lt;char&gt; baseURI(soup_uri_to_string(gServer-&gt;baseURI(), FALSE));
+    GList* allowedOrigins = g_list_prepend(nullptr, webkit_security_origin_new_for_uri(baseURI.get()));
+    webkit_web_context_initialize_notification_permissions(test-&gt;m_webContext.get(), allowedOrigins, nullptr);
+    g_list_free_full(allowedOrigins, reinterpret_cast&lt;GDestroyNotify&gt;(webkit_security_origin_unref));
+}
+
+static void setInitialNotificationPermissionsDisallowedCallback(WebKitWebContext* context, NotificationWebViewTest* test)
+{
+    GUniquePtr&lt;char&gt; baseURI(soup_uri_to_string(gServer-&gt;baseURI(), FALSE));
+    GList* disallowedOrigins = g_list_prepend(nullptr, webkit_security_origin_new_for_uri(baseURI.get()));
+    webkit_web_context_initialize_notification_permissions(test-&gt;m_webContext.get(), nullptr, disallowedOrigins);
+    g_list_free_full(disallowedOrigins, reinterpret_cast&lt;GDestroyNotify&gt;(webkit_security_origin_unref));
+}
+
+static void testWebViewNotificationInitialPermissionAllowed(NotificationWebViewTest* test, gconstpointer)
+{
+    g_signal_connect(test-&gt;m_webContext.get(), &quot;initialize-notification-permissions&quot;, G_CALLBACK(setInitialNotificationPermissionsAllowedCallback), test);
+    test-&gt;initialize();
+
+    test-&gt;loadURI(gServer-&gt;getURIForPath(&quot;/&quot;).data());
+    test-&gt;waitUntilLoadFinished();
+    g_assert(test-&gt;hasPermission());
+
+    test-&gt;requestNotificationAndWaitUntilShown(&quot;This is a notification&quot;, &quot;This is the body.&quot;);
+    g_assert(test-&gt;m_event == NotificationWebViewTest::Shown);
+}
+
+static void testWebViewNotificationInitialPermissionDisallowed(NotificationWebViewTest* test, gconstpointer)
+{
+    g_signal_connect(test-&gt;m_webContext.get(), &quot;initialize-notification-permissions&quot;, G_CALLBACK(setInitialNotificationPermissionsDisallowedCallback), test);
+    test-&gt;initialize();
+
+    test-&gt;loadURI(gServer-&gt;getURIForPath(&quot;/&quot;).data());
+    test-&gt;waitUntilLoadFinished();
+    g_assert(!test-&gt;hasPermission());
+}
+
</ins><span class="cx"> static void testWebViewIsPlayingAudio(IsPlayingAudioWebViewTest* test, gconstpointer)
</span><span class="cx"> {
</span><span class="cx">     // The web view must be realized for the video to start playback and
</span><span class="lines">@@ -915,6 +979,8 @@
</span><span class="cx">     SnapshotWebViewTest::add(&quot;WebKitWebView&quot;, &quot;snapshot&quot;, testWebViewSnapshot);
</span><span class="cx">     WebViewTest::add(&quot;WebKitWebView&quot;, &quot;page-visibility&quot;, testWebViewPageVisibility);
</span><span class="cx">     NotificationWebViewTest::add(&quot;WebKitWebView&quot;, &quot;notification&quot;, testWebViewNotification);
</span><ins>+    NotificationWebViewTest::add(&quot;WebKitWebView&quot;, &quot;notification-initial-permission-allowed&quot;, testWebViewNotificationInitialPermissionAllowed);
+    NotificationWebViewTest::add(&quot;WebKitWebView&quot;, &quot;notification-initial-permission-disallowed&quot;, testWebViewNotificationInitialPermissionDisallowed);
</ins><span class="cx">     IsPlayingAudioWebViewTest::add(&quot;WebKitWebView&quot;, &quot;is-playing-audio&quot;, testWebViewIsPlayingAudio);
</span><span class="cx">     WebViewTest::add(&quot;WebKitWebView&quot;, &quot;background-color&quot;, testWebViewBackgroundColor);
</span><span class="cx">     WebViewTest::add(&quot;WebKitWebView&quot;, &quot;preferred-size&quot;, testWebViewPreferredSize);
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPIgtkWebKit2GtkTestMainh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/TestMain.h (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/TestMain.h        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/TestMain.h        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -43,6 +43,25 @@
</span><span class="cx">         g_test_add(testPath.get(), ClassName, 0, ClassName::setUp, testFunc, ClassName::tearDown); \
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+#define MAKE_GLIB_TEST_FIXTURE_WITH_SETUP_TEARDOWN(ClassName, setup, teardown) \
+    static void setUp(ClassName* fixture, gconstpointer data) \
+    { \
+        if (setup) \
+            setup(); \
+        new (fixture) ClassName; \
+    } \
+    static void tearDown(ClassName* fixture, gconstpointer data) \
+    { \
+        fixture-&gt;~ClassName(); \
+        if (teardown) \
+            teardown(); \
+    } \
+    static void add(const char* suiteName, const char* testName, void (*testFunc)(ClassName*, const void*)) \
+    { \
+        GUniquePtr&lt;gchar&gt; testPath(g_strdup_printf(&quot;/webkit2/%s/%s&quot;, suiteName, testName)); \
+        g_test_add(testPath.get(), ClassName, 0, ClassName::setUp, testFunc, ClassName::tearDown); \
+    }
+
</ins><span class="cx"> #define ASSERT_CMP_CSTRING(s1, cmp, s2) \
</span><span class="cx">     do {                                                                 \
</span><span class="cx">         CString __s1 = (s1);                                             \
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPIgtkWebKit2GtkWebViewTestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.cpp (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.cpp        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.cpp        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -24,19 +24,15 @@
</span><span class="cx"> #include &lt;JavaScriptCore/JSRetainPtr.h&gt;
</span><span class="cx"> #include &lt;WebCore/GUniquePtrGtk.h&gt;
</span><span class="cx"> 
</span><ins>+bool WebViewTest::shouldInitializeWebViewInConstructor = true;
+
</ins><span class="cx"> WebViewTest::WebViewTest()
</span><span class="cx">     : m_userContentManager(adoptGRef(webkit_user_content_manager_new()))
</span><del>-    , m_webView(WEBKIT_WEB_VIEW(g_object_ref_sink(g_object_new(WEBKIT_TYPE_WEB_VIEW, &quot;web-context&quot;, m_webContext.get(), &quot;user-content-manager&quot;, m_userContentManager.get(), nullptr))))
</del><span class="cx">     , m_mainLoop(g_main_loop_new(nullptr, TRUE))
</span><del>-    , m_parentWindow(nullptr)
-    , m_javascriptResult(nullptr)
-    , m_resourceDataSize(0)
-    , m_surface(nullptr)
-    , m_expectedWebProcessCrash(false)
</del><span class="cx"> {
</span><del>-    assertObjectIsDeletedWhenTestFinishes(G_OBJECT(m_webView));
</del><ins>+    if (shouldInitializeWebViewInConstructor)
+        initializeWebView();
</ins><span class="cx">     assertObjectIsDeletedWhenTestFinishes(G_OBJECT(m_userContentManager.get()));
</span><del>-    g_signal_connect(m_webView, &quot;web-process-crashed&quot;, G_CALLBACK(WebViewTest::webProcessCrashed), this);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> WebViewTest::~WebViewTest()
</span><span class="lines">@@ -51,6 +47,15 @@
</span><span class="cx">     g_main_loop_unref(m_mainLoop);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebViewTest::initializeWebView()
+{
+    g_assert(!m_webView);
+    m_webView = WEBKIT_WEB_VIEW(g_object_ref_sink(g_object_new(WEBKIT_TYPE_WEB_VIEW, &quot;web-context&quot;, m_webContext.get(), &quot;user-content-manager&quot;, m_userContentManager.get(), nullptr)));
+    assertObjectIsDeletedWhenTestFinishes(G_OBJECT(m_webView));
+
+    g_signal_connect(m_webView, &quot;web-process-crashed&quot;, G_CALLBACK(WebViewTest::webProcessCrashed), this);
+}
+
</ins><span class="cx"> gboolean WebViewTest::webProcessCrashed(WebKitWebView*, WebViewTest* test)
</span><span class="cx"> {
</span><span class="cx">     if (test-&gt;m_expectedWebProcessCrash) {
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPIgtkWebKit2GtkWebViewTesth"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.h (210573 => 210574)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.h        2017-01-11 02:26:47 UTC (rev 210573)
+++ trunk/Tools/TestWebKitAPI/gtk/WebKit2Gtk/WebViewTest.h        2017-01-11 03:56:12 UTC (rev 210574)
</span><span class="lines">@@ -31,6 +31,9 @@
</span><span class="cx">     WebViewTest();
</span><span class="cx">     virtual ~WebViewTest();
</span><span class="cx"> 
</span><ins>+    static bool shouldInitializeWebViewInConstructor;
+    void initializeWebView();
+
</ins><span class="cx">     virtual void loadURI(const char* uri);
</span><span class="cx">     virtual void loadHtml(const char* html, const char* baseURI);
</span><span class="cx">     virtual void loadPlainText(const char* plainText);
</span><span class="lines">@@ -81,17 +84,17 @@
</span><span class="cx">     static gboolean webProcessCrashed(WebKitWebView*, WebViewTest*);
</span><span class="cx"> 
</span><span class="cx">     GRefPtr&lt;WebKitUserContentManager&gt; m_userContentManager;
</span><del>-    WebKitWebView* m_webView;
</del><ins>+    WebKitWebView* m_webView { nullptr };
</ins><span class="cx">     GMainLoop* m_mainLoop;
</span><span class="cx">     CString m_activeURI;
</span><del>-    GtkWidget* m_parentWindow;
</del><ins>+    GtkWidget* m_parentWindow { nullptr };
</ins><span class="cx">     CString m_expectedTitle;
</span><del>-    WebKitJavascriptResult* m_javascriptResult;
-    GError** m_javascriptError;
-    GUniquePtr&lt;char&gt; m_resourceData;
-    size_t m_resourceDataSize;
-    cairo_surface_t* m_surface;
-    bool m_expectedWebProcessCrash;
</del><ins>+    WebKitJavascriptResult* m_javascriptResult { nullptr };
+    GError** m_javascriptError { nullptr };
+    GUniquePtr&lt;char&gt; m_resourceData { nullptr };
+    size_t m_resourceDataSize { 0 };
+    cairo_surface_t* m_surface { nullptr };
+    bool m_expectedWebProcessCrash { false };
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     void doMouseButtonEvent(GdkEventType, int, int, unsigned, unsigned);
</span></span></pre>
</div>
</div>

</body>
</html>