Diff
Modified: trunk/Source/WebKit2/ChangeLog (148664 => 148665)
--- trunk/Source/WebKit2/ChangeLog 2013-04-18 10:27:08 UTC (rev 148664)
+++ trunk/Source/WebKit2/ChangeLog 2013-04-18 10:35:37 UTC (rev 148665)
@@ -1,3 +1,29 @@
+2013-04-18 Xan Lopez <x...@igalia.com>
+
+ [GTK] When the WebProcess crashes, a signal should be emitted
+ https://bugs.webkit.org/show_bug.cgi?id=105180
+
+ 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.
+
+ Reviewed Carlos Garcia Campos.
+
+ * UIProcess/API/gtk/WebKitLoaderClient.cpp:
+ (processDidCrash):
+ (attachLoaderClientToView):
+ * UIProcess/API/gtk/WebKitWebContextPrivate.h:
+ * UIProcess/API/gtk/WebKitWebView.cpp:
+ (webkit_web_view_class_init):
+ (webkitWebViewWebProcessCrashed):
+ * UIProcess/API/gtk/tests/TestWebExtensions.cpp:
+ (testWebExtensionGetTitle):
+ (webProcessCrashedCallback):
+ (testWebKitWebViewProcessCrashed):
+ (beforeAll):
+ * UIProcess/API/gtk/tests/WebExtensionTest.cpp:
+ (methodCallCallback):
+
2013-04-18 Kenneth Rohde Christiansen <kenn...@webkit.org>
[EFL][WK2] Add tooltip API to the WKView client
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp (148664 => 148665)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp 2013-04-18 10:27:08 UTC (rev 148664)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitLoaderClient.cpp 2013-04-18 10:35:37 UTC (rev 148665)
@@ -133,6 +133,11 @@
webkitWebViewHandleAuthenticationChallenge(WEBKIT_WEB_VIEW(clientInfo), toImpl(authenticationChallenge));
}
+static void processDidCrash(WKPageRef page, const void* clientInfo)
+{
+ webkitWebViewWebProcessCrashed(WEBKIT_WEB_VIEW(clientInfo));
+}
+
void attachLoaderClientToView(WebKitWebView* webView)
{
WKPageLoaderClient wkLoaderClient = {
@@ -159,7 +164,7 @@
didChangeProgress, // didFinishProgress
0, // didBecomeUnresponsive
0, // didBecomeResponsive
- 0, // processDidCrash
+ processDidCrash,
didChangeBackForwardList,
0, // shouldGoToBackForwardListItem
0, // didFailToInitializePlugin
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp (148664 => 148665)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp 2013-04-18 10:27:08 UTC (rev 148664)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp 2013-04-18 10:35:37 UTC (rev 148665)
@@ -117,6 +117,8 @@
INSECURE_CONTENT_DETECTED,
+ WEB_PROCESS_CRASHED,
+
LAST_SIGNAL
};
@@ -1298,6 +1300,25 @@
g_cclosure_marshal_VOID__ENUM,
G_TYPE_NONE, 1,
WEBKIT_TYPE_INSECURE_CONTENT_EVENT);
+
+ /**
+ * WebKitWebView::web-process-crashed:
+ * @web_view: the #WebKitWebView
+ *
+ * This signal is emitted when the web process crashes.
+ *
+ * Returns: %TRUE to stop other handlers from being invoked for the event.
+ * %FALSE to propagate the event further.
+ */
+ signals[WEB_PROCESS_CRASHED] = g_signal_new(
+ "web-process-crashed",
+ G_TYPE_FROM_CLASS(webViewClass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET(WebKitWebViewClass, web_process_crashed),
+ g_signal_accumulator_true_handled,
+ 0,
+ webkit_marshal_BOOLEAN__VOID,
+ G_TYPE_BOOLEAN, 0);
}
static void webkitWebViewSetIsLoading(WebKitWebView* webView, bool isLoading)
@@ -3027,3 +3048,10 @@
return cairo_surface_reference(static_cast<GetSnapshotAsyncData*>(g_simple_async_result_get_op_res_gpointer(simple))->snapshot.get());
}
+
+void webkitWebViewWebProcessCrashed(WebKitWebView* webView)
+{
+ gboolean returnValue;
+ g_signal_emit(webView, signals[WEB_PROCESS_CRASHED], 0, &returnValue);
+}
+
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h (148664 => 148665)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h 2013-04-18 10:27:08 UTC (rev 148664)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h 2013-04-18 10:35:37 UTC (rev 148665)
@@ -238,6 +238,7 @@
WebKitFormSubmissionRequest *request);
void (* insecure_content_detected) (WebKitWebView *web_view,
WebKitInsecureContentEvent event);
+ gboolean (* web_process_crashed) (WebKitWebView *web_view);
/* Padding for future expansion */
void (*_webkit_reserved0) (void);
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h (148664 => 148665)
--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h 2013-04-18 10:27:08 UTC (rev 148664)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h 2013-04-18 10:35:37 UTC (rev 148665)
@@ -59,5 +59,6 @@
void webkitWebViewSubmitFormRequest(WebKitWebView*, WebKitFormSubmissionRequest*);
void webkitWebViewHandleAuthenticationChallenge(WebKitWebView*, WebKit::AuthenticationChallengeProxy*);
void webkitWebViewInsecureContentDetected(WebKitWebView*, WebKitInsecureContentEvent);
+void webkitWebViewWebProcessCrashed(WebKitWebView*);
#endif // WebKitWebViewPrivate_h
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestWebExtensions.cpp (148664 => 148665)
--- trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestWebExtensions.cpp 2013-04-18 10:27:08 UTC (rev 148664)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestWebExtensions.cpp 2013-04-18 10:35:37 UTC (rev 148665)
@@ -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();
@@ -72,6 +72,34 @@
g_dbus_connection_signal_unsubscribe(connection, id);
}
+static gboolean webProcessCrashedCallback(WebKitWebView*, WebViewTest* test)
+{
+ test->quitMainLoop();
+
+ return FALSE;
+}
+
+static void testWebKitWebViewProcessCrashed(WebViewTest* test, gconstpointer)
+{
+ test->loadHtml("<html></html>", 0);
+ test->waitUntilLoadFinished();
+
+ g_signal_connect(test->m_webView, "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);
@@ -79,8 +107,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("WebKitWebView", "web-process-crashed", testWebKitWebViewProcessCrashed);
}
void afterAll()
Modified: trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp (148664 => 148665)
--- trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp 2013-04-18 10:27:08 UTC (rev 148664)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp 2013-04-18 10:35:37 UTC (rev 148665)
@@ -20,6 +20,8 @@
#include "config.h"
#include <gio/gio.h>
+#include <stdlib.h>
+
#include <webkit2/webkit-web-extension.h>
#include <wtf/gobject/GOwnPtr.h>
@@ -30,6 +32,8 @@
" <arg type='t' name='pageID' direction='in'/>"
" <arg type='s' name='title' direction='out'/>"
" </method>"
+ " <method name='AbortProcess'>"
+ " </method>"
" <signal name='DocumentLoaded'/>"
" </interface>"
"</node>";
@@ -73,6 +77,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();
}
}