Diff
Modified: releases/WebKitGTK/webkit-2.0/Source/WebKit2/ChangeLog (144901 => 144902)
--- releases/WebKitGTK/webkit-2.0/Source/WebKit2/ChangeLog 2013-03-06 09:59:22 UTC (rev 144901)
+++ releases/WebKitGTK/webkit-2.0/Source/WebKit2/ChangeLog 2013-03-06 10:36:17 UTC (rev 144902)
@@ -1,3 +1,28 @@
+2013-03-06 Xan Lopez <x...@igalia.com>
+
+ [GTK] When the WebProcess crashes, a signal should be emitted
+ https://bugs.webkit.org/show_bug.cgi?id=105180
+
+ Reviewed by Carlos Garcia Campos.
+
+ Emit a "web-process-crashed" signal when the WebProcess crashes. This
+ is useful, for example, to show an error page in a web browser
+ like Chrome does.
+
+ * UIProcess/API/gtk/WebKitLoaderClient.cpp:
+ (processDidCrash):
+ (attachLoaderClientToView):
+ * UIProcess/API/gtk/WebKitWebContext.cpp:
+ (webkitWebContextWebProcessCrashed):
+ * UIProcess/API/gtk/WebKitWebContextPrivate.h:
+ * UIProcess/API/gtk/tests/TestWebExtensions.cpp:
+ (testWebExtensionGetTitle):
+ (webProcessCrashedCallback):
+ (testWebExtensionAbortProcess):
+ (beforeAll):
+ * UIProcess/API/gtk/tests/WebExtensionTest.cpp:
+ (methodCallCallback):
+
2013-03-06 Carlos Garcia Campos <cgar...@igalia.com>
[GTK] Add WebKitWebViewGroup to WebKit2 GTK+ API
Modified: releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp (144901 => 144902)
--- releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp 2013-03-06 09:59:22 UTC (rev 144901)
+++ releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp 2013-03-06 10:36:17 UTC (rev 144902)
@@ -24,6 +24,7 @@
#include "WebKit2GtkAuthenticationDialog.h"
#include "WebKitBackForwardListPrivate.h"
#include "WebKitURIResponsePrivate.h"
+#include "WebKitWebContextPrivate.h"
#include "WebKitWebViewBasePrivate.h"
#include "WebKitWebViewPrivate.h"
#include <wtf/gobject/GOwnPtr.h>
@@ -134,6 +135,11 @@
webkitWebViewHandleAuthenticationChallenge(WEBKIT_WEB_VIEW(clientInfo), toImpl(authenticationChallenge));
}
+static void processDidCrash(WKPageRef page, const void* clientInfo)
+{
+ webkitWebContextWebProcessCrashed(webkit_web_view_get_context(WEBKIT_WEB_VIEW(clientInfo)));
+}
+
void attachLoaderClientToView(WebKitWebView* webView)
{
WKPageLoaderClient wkLoaderClient = {
@@ -160,7 +166,7 @@
didChangeProgress, // didFinishProgress
0, // didBecomeUnresponsive
0, // didBecomeResponsive
- 0, // processDidCrash
+ processDidCrash,
didChangeBackForwardList,
0, // shouldGoToBackForwardListItem
0, // didFailToInitializePlugin
Modified: releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp (144901 => 144902)
--- releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp 2013-03-06 09:59:22 UTC (rev 144901)
+++ releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp 2013-03-06 10:36:17 UTC (rev 144902)
@@ -79,6 +79,7 @@
enum {
DOWNLOAD_STARTED,
+ WEB_PROCESS_CRASHED,
LAST_SIGNAL
};
@@ -170,6 +171,19 @@
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
WEBKIT_TYPE_DOWNLOAD);
+
+ /**
+ * WebKitWebContext::web-process-crashed:
+ * @context: the #WebKitWebContext
+ *
+ * This signal is emitted when the web process crashes.
+ */
+ signals[WEB_PROCESS_CRASHED] = g_signal_new("web-process-crashed",
+ G_TYPE_FROM_CLASS(gObjectClass),
+ G_SIGNAL_RUN_LAST,
+ 0, 0, 0,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
}
static CString injectedBundleDirectory()
@@ -820,6 +834,11 @@
g_signal_emit(context, signals[DOWNLOAD_STARTED], 0, download);
}
+void webkitWebContextWebProcessCrashed(WebKitWebContext* context)
+{
+ g_signal_emit(context, signals[WEB_PROCESS_CRASHED], 0);
+}
+
WebContext* webkitWebContextGetContext(WebKitWebContext* context)
{
g_assert(WEBKIT_IS_WEB_CONTEXT(context));
Modified: releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/WebKitWebContextPrivate.h (144901 => 144902)
--- releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/WebKitWebContextPrivate.h 2013-03-06 09:59:22 UTC (rev 144901)
+++ releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/WebKitWebContextPrivate.h 2013-03-06 10:36:17 UTC (rev 144902)
@@ -47,5 +47,6 @@
void webkitWebContextWebViewDestroyed(WebKitWebContext*, WebKitWebView*);
WebKitWebView* webkitWebContextGetWebViewForPage(WebKitWebContext*, WebKit::WebPageProxy*);
WebKitWebViewGroup* webkitWebContextGetDefaultWebViewGroup(WebKitWebContext*);
+void webkitWebContextWebProcessCrashed(WebKitWebContext*);
#endif // WebKitWebContextPrivate_h
Modified: releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/TestWebExtensions.cpp (144901 => 144902)
--- releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/TestWebExtensions.cpp 2013-03-06 09:59:22 UTC (rev 144901)
+++ releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/TestWebExtensions.cpp 2013-03-06 10:36:17 UTC (rev 144902)
@@ -25,7 +25,7 @@
static WebKitTestBus* bus;
-static void testWebExtension(WebViewTest* test, gconstpointer)
+static void testWebExtensionGetTitle(WebViewTest* test, gconstpointer)
{
test->loadHtml("<html><head><title>WebKitGTK+ Web Extensions Test</title></head><body></body></html>", 0);
test->waitUntilLoadFinished();
@@ -54,7 +54,8 @@
{
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()),
+ GDBusConnection* connection = g_dbus_proxy_get_connection(proxy.get());
+ guint id = g_dbus_connection_signal_subscribe(connection,
0,
"org.webkit.gtk.WebExtensionTest",
"DocumentLoaded",
@@ -68,8 +69,35 @@
test->loadHtml("<html><head><title>WebKitGTK+ Web Extensions Test</title></head><body></body></html>", 0);
g_main_loop_run(test->m_mainLoop);
+ g_dbus_connection_signal_unsubscribe(connection, id);
}
+static void webProcessCrashedCallback(WebKitWebContext* context, WebViewTest* test)
+{
+ test->quitMainLoop();
+}
+
+static void testWebKitWebContextProcessCrashed(WebViewTest* test, gconstpointer)
+{
+ test->loadHtml("<html></html>", 0);
+ test->waitUntilLoadFinished();
+
+ g_signal_connect(webkit_web_context_get_default(), "web-process-crashed",
+ G_CALLBACK(webProcessCrashedCallback), test);
+
+ GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy("org.webkit.gtk.WebExtensionTest",
+ "/org/webkit/gtk/WebExtensionTest", "org.webkit.gtk.WebExtensionTest", test->m_mainLoop));
+
+ GRefPtr<GVariant> result = adoptGRef(g_dbus_proxy_call_sync(
+ proxy.get(),
+ "AbortProcess",
+ 0,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, 0, 0));
+ g_assert(!result);
+ 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);
@@ -77,8 +105,9 @@
if (!bus->run())
return;
- WebViewTest::add("WebKitWebExtension", "dom-document-title", testWebExtension);
+ WebViewTest::add("WebKitWebExtension", "dom-document-title", testWebExtensionGetTitle);
WebViewTest::add("WebKitWebExtension", "document-loaded-signal", testDocumentLoadedSignal);
+ WebViewTest::add("WebKitWebContext", "web-process-crashed", testWebKitWebContextProcessCrashed);
}
void afterAll()
Modified: releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp (144901 => 144902)
--- releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp 2013-03-06 09:59:22 UTC (rev 144901)
+++ releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp 2013-03-06 10:36:17 UTC (rev 144902)
@@ -20,6 +20,7 @@
#include "config.h"
#include <gio/gio.h>
+#include <stdlib.h>
#include <string.h>
#include <webkit2/webkit-web-extension.h>
#include <wtf/gobject/GOwnPtr.h>
@@ -35,6 +36,8 @@
" <signal name='URIChanged'>"
" <arg type='s' name='uri' direction='out'/>"
" </signal>"
+ " <method name='AbortProcess'>"
+ " </method>"
" </interface>"
"</node>";
@@ -106,6 +109,8 @@
WebKitDOMDocument* document = webkit_web_page_get_dom_document(page);
GOwnPtr<char> title(webkit_dom_document_get_title(document));
g_dbus_method_invocation_return_value(invocation, g_variant_new("(s)", title.get()));
+ } else if (!g_strcmp0(methodName, "AbortProcess")) {
+ abort();
}
}