Title: [160904] trunk/Source/WebKit2
Revision
160904
Author
carlo...@webkit.org
Date
2013-12-20 04:11:45 -0800 (Fri, 20 Dec 2013)

Log Message

[GTK] Some unit tests using web extensions fail when run alone
https://bugs.webkit.org/show_bug.cgi?id=126002

Reviewed by Gustavo Noronha Silva.

The problem is that the page is created before the dbus connection
has been established, and we are connecting to web-page-created
signal once we have a valid dbus connection. We should connect to
the signal before connecting to dbus and queue any request to emit
a dbus signal until the connection is set. This also fixes the
WebExtensions tests when using the network process because a new
web process is launched for every test case.

* UIProcess/API/gtk/tests/WebExtensionTest.cpp:
(DelayedSignal::DelayedSignal): Helper struct to queue signal
emissions requested before the dbus connection has been
established.
(emitDocumentLoaded): Emit the dbus DocumentLoaded signal.
(documentLoadedCallback): Queue the signal emission if we still
don't have a connection or call emitDocumentLoaded otherwise.
(emitURIChanged): Emit the dbus URIChanged signal.
(uriChangedCallback): Queue the signal emission if we still don't
have a connection or call emitURIChanged otherwise.
(pageCreatedCallback): Pass the web extension as user data to
document-loaded and uri-changed callbacks.
(busAcquiredCallback): Set the connection as user data of the web
extension and process any delayed signal emission pending.
(webkit_web_extension_initialize): Connect to web-page-create
signal before connecting to dbus.

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (160903 => 160904)


--- trunk/Source/WebKit2/ChangeLog	2013-12-20 11:52:17 UTC (rev 160903)
+++ trunk/Source/WebKit2/ChangeLog	2013-12-20 12:11:45 UTC (rev 160904)
@@ -1,3 +1,35 @@
+2013-12-20  Carlos Garcia Campos  <cgar...@igalia.com>
+
+        [GTK] Some unit tests using web extensions fail when run alone
+        https://bugs.webkit.org/show_bug.cgi?id=126002
+
+        Reviewed by Gustavo Noronha Silva.
+
+        The problem is that the page is created before the dbus connection
+        has been established, and we are connecting to web-page-created
+        signal once we have a valid dbus connection. We should connect to
+        the signal before connecting to dbus and queue any request to emit
+        a dbus signal until the connection is set. This also fixes the
+        WebExtensions tests when using the network process because a new
+        web process is launched for every test case.
+
+        * UIProcess/API/gtk/tests/WebExtensionTest.cpp:
+        (DelayedSignal::DelayedSignal): Helper struct to queue signal
+        emissions requested before the dbus connection has been
+        established.
+        (emitDocumentLoaded): Emit the dbus DocumentLoaded signal.
+        (documentLoadedCallback): Queue the signal emission if we still
+        don't have a connection or call emitDocumentLoaded otherwise.
+        (emitURIChanged): Emit the dbus URIChanged signal.
+        (uriChangedCallback): Queue the signal emission if we still don't
+        have a connection or call emitURIChanged otherwise.
+        (pageCreatedCallback): Pass the web extension as user data to
+        document-loaded and uri-changed callbacks.
+        (busAcquiredCallback): Set the connection as user data of the web
+        extension and process any delayed signal emission pending.
+        (webkit_web_extension_initialize): Connect to web-page-create
+        signal before connecting to dbus.
+
 2013-12-19  Benjamin Poulain  <bpoul...@apple.com>
 
         [WK2][iOS] Enable multiprocess by default

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp (160903 => 160904)


--- trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp	2013-12-20 11:52:17 UTC (rev 160903)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp	2013-12-20 12:11:45 UTC (rev 160904)
@@ -25,8 +25,12 @@
 #include <stdlib.h>
 #include <string.h>
 #include <webkit2/webkit-web-extension.h>
+#include <wtf/Deque.h>
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
 #include <wtf/gobject/GOwnPtr.h>
 #include <wtf/gobject/GRefPtr.h>
+#include <wtf/text/CString.h>
 
 static const char introspectionXML[] =
     "<node>"
@@ -48,9 +52,33 @@
     " </interface>"
     "</node>";
 
-static void documentLoadedCallback(WebKitWebPage*, gpointer userData)
+typedef enum {
+    DocumentLoadedSignal,
+    URIChangedSignal,
+} DelayedSignalType;
+
+struct DelayedSignal {
+    DelayedSignal(DelayedSignalType type)
+        : type(type)
+    {
+    }
+
+    DelayedSignal(DelayedSignalType type, const char* uri)
+        : type(type)
+        , uri(uri)
+    {
+    }
+
+    DelayedSignalType type;
+    CString uri;
+};
+
+Deque<OwnPtr<DelayedSignal>> delayedSignalsQueue;
+
+static void emitDocumentLoaded(GDBusConnection* connection)
 {
-    bool ok = g_dbus_connection_emit_signal(G_DBUS_CONNECTION(userData),
+    bool ok = g_dbus_connection_emit_signal(
+        connection,
         0,
         "/org/webkit/gtk/WebExtensionTest",
         "org.webkit.gtk.WebExtensionTest",
@@ -60,19 +88,37 @@
     g_assert(ok);
 }
 
-static void uriChangedCallback(WebKitWebPage* webPage, GParamSpec* pspec, gpointer userData)
+static void documentLoadedCallback(WebKitWebPage*, WebKitWebExtension* extension)
 {
+    gpointer data = "" "dbus-connection");
+    if (data)
+        emitDocumentLoaded(G_DBUS_CONNECTION(data));
+    else
+        delayedSignalsQueue.append(adoptPtr(new DelayedSignal(DocumentLoadedSignal)));
+}
+
+static void emitURIChanged(GDBusConnection* connection, const char* uri)
+{
     bool ok = g_dbus_connection_emit_signal(
-        G_DBUS_CONNECTION(userData),
+        connection,
         0,
         "/org/webkit/gtk/WebExtensionTest",
         "org.webkit.gtk.WebExtensionTest",
         "URIChanged",
-        g_variant_new("(s)", webkit_web_page_get_uri(webPage)),
+        g_variant_new("(s)", uri),
         0);
     g_assert(ok);
 }
 
+static void uriChangedCallback(WebKitWebPage* webPage, GParamSpec* pspec, WebKitWebExtension* extension)
+{
+    gpointer data = "" "dbus-connection");
+    if (data)
+        emitURIChanged(G_DBUS_CONNECTION(data), webkit_web_page_get_uri(webPage));
+    else
+        delayedSignalsQueue.append(adoptPtr(new DelayedSignal(URIChangedSignal, webkit_web_page_get_uri(webPage))));
+}
+
 static gboolean sendRequestCallback(WebKitWebPage*, WebKitURIRequest* request, WebKitURIResponse*, gpointer)
 {
     const char* requestURI = webkit_uri_request_get_uri(request);
@@ -92,10 +138,10 @@
     return FALSE;
 }
 
-static void pageCreatedCallback(WebKitWebExtension*, WebKitWebPage* webPage, gpointer userData)
+static void pageCreatedCallback(WebKitWebExtension* extension, WebKitWebPage* webPage, gpointer)
 {
-    g_signal_connect(webPage, "document-loaded", G_CALLBACK(documentLoadedCallback), userData);
-    g_signal_connect(webPage, "notify::uri", G_CALLBACK(uriChangedCallback), userData);
+    g_signal_connect(webPage, "document-loaded", G_CALLBACK(documentLoadedCallback), extension);
+    g_signal_connect(webPage, "notify::uri", G_CALLBACK(uriChangedCallback), extension);
     g_signal_connect(webPage, "send-request", G_CALLBACK(sendRequestCallback), 0);
 }
 
@@ -191,12 +237,25 @@
     if (!registrationID)
         g_warning("Failed to register object: %s\n", error->message);
 
-    g_signal_connect(WEBKIT_WEB_EXTENSION(userData), "page-created", G_CALLBACK(pageCreatedCallback), connection);
-    g_signal_connect(webkit_script_world_get_default(), "window-object-cleared", G_CALLBACK(windowObjectCleared), 0);
+    g_object_set_data(G_OBJECT(userData), "dbus-connection", connection);
+    while (delayedSignalsQueue.size()) {
+        OwnPtr<DelayedSignal> delayedSignal = delayedSignalsQueue.takeFirst();
+        switch (delayedSignal->type) {
+        case DocumentLoadedSignal:
+            emitDocumentLoaded(connection);
+            break;
+        case URIChangedSignal:
+            emitURIChanged(connection, delayedSignal->uri.data());
+            break;
+        }
+    }
 }
 
 extern "C" void webkit_web_extension_initialize(WebKitWebExtension* extension)
 {
+    g_signal_connect(extension, "page-created", G_CALLBACK(pageCreatedCallback), extension);
+    g_signal_connect(webkit_script_world_get_default(), "window-object-cleared", G_CALLBACK(windowObjectCleared), 0);
+
     g_bus_own_name(
         G_BUS_TYPE_SESSION,
         "org.webkit.gtk.WebExtensionTest",
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to