Title: [148665] trunk/Source/WebKit2
Revision
148665
Author
x...@webkit.org
Date
2013-04-18 03:35:37 -0700 (Thu, 18 Apr 2013)

Log Message

[GTK] When the WebProcess crashes, a signal should be emitted
https://bugs.webkit.org/show_bug.cgi?id=105180

Reviewed 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/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):

Modified Paths

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();
     }
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to