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,