Title: [144609] releases/WebKitGTK/webkit-2.0/Source/WebKit2
Revision
144609
Author
carlo...@webkit.org
Date
2013-03-04 01:37:39 -0800 (Mon, 04 Mar 2013)

Log Message

[GTK][WK2] Add document-loaded signal to WebKitWebPage
https://bugs.webkit.org/show_bug.cgi?id=110614

Patch by Manuel Rego Casasnovas <r...@igalia.com> on 2013-03-04
Reviewed by Carlos Garcia Campos.

Add a new signal document-loaded to WebKitWebPage that will be emitted
when the DOM document has been loaded.

* UIProcess/API/gtk/tests/TestWebExtensions.cpp:
(documentLoadedCallback):
(testDocumentLoadedSignal):
(beforeAll): Add test for document-loaded signal.
* UIProcess/API/gtk/tests/WebExtensionTest.cpp:
(documentLoadedCallback):
(pageCreatedCallback):
(methodCallCallback): Add new D-Bus signal DocumentLoaded in order to
test document-loaded signal.
* WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp:
(webkit_web_page_class_init):
(webkitWebPageCreate): Add document-loaded signal and emit it when
didFinishDocumentLoadForFrame is called.

Modified Paths

Diff

Modified: releases/WebKitGTK/webkit-2.0/Source/WebKit2/ChangeLog (144608 => 144609)


--- releases/WebKitGTK/webkit-2.0/Source/WebKit2/ChangeLog	2013-03-04 09:36:45 UTC (rev 144608)
+++ releases/WebKitGTK/webkit-2.0/Source/WebKit2/ChangeLog	2013-03-04 09:37:39 UTC (rev 144609)
@@ -1,3 +1,27 @@
+2013-03-04  Manuel Rego Casasnovas  <r...@igalia.com>
+
+        [GTK][WK2] Add document-loaded signal to WebKitWebPage
+        https://bugs.webkit.org/show_bug.cgi?id=110614
+
+        Reviewed by Carlos Garcia Campos.
+
+        Add a new signal document-loaded to WebKitWebPage that will be emitted
+        when the DOM document has been loaded.
+
+        * UIProcess/API/gtk/tests/TestWebExtensions.cpp:
+        (documentLoadedCallback):
+        (testDocumentLoadedSignal):
+        (beforeAll): Add test for document-loaded signal.
+        * UIProcess/API/gtk/tests/WebExtensionTest.cpp:
+        (documentLoadedCallback):
+        (pageCreatedCallback):
+        (methodCallCallback): Add new D-Bus signal DocumentLoaded in order to
+        test document-loaded signal.
+        * WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp:
+        (webkit_web_page_class_init):
+        (webkitWebPageCreate): Add document-loaded signal and emit it when
+        didFinishDocumentLoadForFrame is called.
+
 2013-02-26  Manuel Rego Casasnovas  <r...@igalia.com>
 
         [WK2][GTK] REGRESSION (r143463): unit test failure in WebKit2APITests/TestContextMenu

Modified: releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/TestWebExtensions.cpp (144608 => 144609)


--- releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/TestWebExtensions.cpp	2013-03-04 09:36:45 UTC (rev 144608)
+++ releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/TestWebExtensions.cpp	2013-03-04 09:37:39 UTC (rev 144609)
@@ -45,6 +45,31 @@
     g_assert_cmpstr(title, ==, "WebKitGTK+ Web Extensions Test");
 }
 
+static void documentLoadedCallback(GDBusConnection*, const char*, const char*, const char*, const char*, GVariant*, WebViewTest* test)
+{
+    g_main_loop_quit(test->m_mainLoop);
+}
+
+static void testDocumentLoadedSignal(WebViewTest* test, gconstpointer)
+{
+    GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy("org.webkit.gtk.WebExtensionTest",
+        "/org/webkit/gtk/WebExtensionTest", "org.webkit.gtk.WebExtensionTest", test->m_mainLoop));
+    guint id = g_dbus_connection_signal_subscribe(g_dbus_proxy_get_connection(proxy.get()),
+        0,
+        "org.webkit.gtk.WebExtensionTest",
+        "DocumentLoaded",
+        "/org/webkit/gtk/WebExtensionTest",
+        0,
+        G_DBUS_SIGNAL_FLAGS_NONE,
+        reinterpret_cast<GDBusSignalCallback>(documentLoadedCallback),
+        test,
+        0);
+    g_assert(id);
+
+    test->loadHtml("<html><head><title>WebKitGTK+ Web Extensions Test</title></head><body></body></html>", 0);
+    g_main_loop_run(test->m_mainLoop);
+}
+
 void beforeAll()
 {
     webkit_web_context_set_web_extensions_directory(webkit_web_context_get_default(), WEBKIT_TEST_WEB_EXTENSIONS_DIR);
@@ -53,6 +78,7 @@
         return;
 
     WebViewTest::add("WebKitWebExtension", "dom-document-title", testWebExtension);
+    WebViewTest::add("WebKitWebExtension", "document-loaded-signal", testDocumentLoadedSignal);
 }
 
 void afterAll()

Modified: releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp (144608 => 144609)


--- releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp	2013-03-04 09:36:45 UTC (rev 144608)
+++ releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp	2013-03-04 09:37:39 UTC (rev 144609)
@@ -30,11 +30,29 @@
     "   <arg type='t' name='pageID' direction='in'/>"
     "   <arg type='s' name='title' direction='out'/>"
     "  </method>"
+    "  <signal name='DocumentLoaded'/>"
     " </interface>"
     "</node>";
 
-static void methodCallCallback(GDBusConnection*, const char* sender, const char* objectPath, const char* interfaceName, const char* methodName, GVariant* parameters, GDBusMethodInvocation* invocation, gpointer userData)
+static void documentLoadedCallback(WebKitWebPage*, gpointer userData)
 {
+    bool ok = g_dbus_connection_emit_signal(G_DBUS_CONNECTION(userData),
+        0,
+        "/org/webkit/gtk/WebExtensionTest",
+        "org.webkit.gtk.WebExtensionTest",
+        "DocumentLoaded",
+        0,
+        0);
+    g_assert(ok);
+}
+
+static void pageCreatedCallback(WebKitWebExtension*, WebKitWebPage* webPage, gpointer userData)
+{
+    g_signal_connect(webPage, "document-loaded", G_CALLBACK(documentLoadedCallback), userData);
+}
+
+static void methodCallCallback(GDBusConnection* connection, const char* sender, const char* objectPath, const char* interfaceName, const char* methodName, GVariant* parameters, GDBusMethodInvocation* invocation, gpointer userData)
+{
     if (g_strcmp0(interfaceName, "org.webkit.gtk.WebExtensionTest"))
         return;
 
@@ -78,6 +96,8 @@
         &error.outPtr());
     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);
 }
 
 extern "C" void webkit_web_extension_initialize(WebKitWebExtension* extension)

Modified: releases/WebKitGTK/webkit-2.0/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp (144608 => 144609)


--- releases/WebKitGTK/webkit-2.0/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp	2013-03-04 09:36:45 UTC (rev 144608)
+++ releases/WebKitGTK/webkit-2.0/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp	2013-03-04 09:37:39 UTC (rev 144609)
@@ -33,12 +33,25 @@
 using namespace WebKit;
 using namespace WebCore;
 
+enum {
+    DOCUMENT_LOADED,
+
+    LAST_SIGNAL
+};
+
 struct _WebKitWebPagePrivate {
     WebPage* webPage;
 };
 
+static guint signals[LAST_SIGNAL] = { 0, };
+
 WEBKIT_DEFINE_TYPE(WebKitWebPage, webkit_web_page, G_TYPE_OBJECT)
 
+static void didFinishDocumentLoadForFrame(WKBundlePageRef, WKBundleFrameRef, WKTypeRef*, const void *clientInfo)
+{
+    g_signal_emit(WEBKIT_WEB_PAGE(clientInfo), signals[DOCUMENT_LOADED], 0);
+}
+
 static void didInitiateLoadForResource(WKBundlePageRef page, WKBundleFrameRef frame, uint64_t identifier, WKURLRequestRef request, bool pageLoadIsProvisional, const void*)
 {
     ImmutableDictionary::MapType message;
@@ -100,6 +113,23 @@
 
 static void webkit_web_page_class_init(WebKitWebPageClass* klass)
 {
+    /**
+     * WebKitWebPage::document-loaded:
+     * @web_page: the #WebKitWebPage on which the signal is emitted
+     *
+     * This signal is emitted when the DOM document of a #WebKitWebPage has been
+     * loaded.
+     *
+     * You can wait for this signal to get the DOM document with
+     * webkit_web_page_get_dom_document().
+     */
+    signals[DOCUMENT_LOADED] = g_signal_new(
+        "document-loaded",
+        G_TYPE_FROM_CLASS(klass),
+        G_SIGNAL_RUN_LAST,
+        0, 0, 0,
+        g_cclosure_marshal_VOID__OBJECT,
+        G_TYPE_NONE, 0);
 }
 
 WebKitWebPage* webkitWebPageCreate(WebPage* webPage)
@@ -107,6 +137,43 @@
     WebKitWebPage* page = WEBKIT_WEB_PAGE(g_object_new(WEBKIT_TYPE_WEB_PAGE, NULL));
     page->priv->webPage = webPage;
 
+    WKBundlePageLoaderClient loaderClient = {
+        kWKBundlePageResourceLoadClientCurrentVersion,
+        page,
+        0, // didStartProvisionalLoadForFrame
+        0, // didReceiveServerRedirectForProvisionalLoadForFrame
+        0, // didFailProvisionalLoadWithErrorForFrame
+        0, // didCommitLoadForFrame
+        didFinishDocumentLoadForFrame,
+        0, // didFinishLoadForFrame,
+        0, // didFailLoadWithErrorForFrame
+        0, // didSameDocumentNavigationForFrame
+        0, // didReceiveTitleForFrame
+        0, // didFirstLayoutForFrame
+        0, // didFirstVisuallyNonEmptyLayoutForFrame
+        0, // didRemoveFrameFromHierarchy
+        0, // didDisplayInsecureContentForFrame
+        0, // didRunInsecureContentForFrame
+        0, // didClearWindowObjectForFrame
+        0, // didCancelClientRedirectForFrame
+        0, // willPerformClientRedirectForFrame
+        0, // didHandleOnloadEventsForFrame
+        0, // didLayoutForFrame
+        0, // didNewFirstVisuallyNonEmptyLayout
+        0, // didDetectXSSForFrame
+        0, // shouldGoToBackForwardListItem
+        0, // globalObjectIsAvailableForFrame
+        0, // willDisconnectDOMWindowExtensionFromGlobalObject
+        0, // didReconnectDOMWindowExtensionToGlobalObject
+        0, // willDestroyGlobalObjectForDOMWindowExtension
+        0, // didFinishProgress
+        0, // shouldForceUniversalAccessFromLocalURL
+        0, // didReceiveIntentForFrame_unavailable
+        0, // registerIntentServiceForFrame_unavailable
+        0 // didLayout
+    };
+    WKBundlePageSetPageLoaderClient(toAPI(webPage), &loaderClient);
+
     WKBundlePageResourceLoadClient resourceLoadClient = {
         kWKBundlePageResourceLoadClientCurrentVersion,
         page,
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to