Title: [222735] trunk
Revision
222735
Author
[email protected]
Date
2017-10-02 12:48:37 -0700 (Mon, 02 Oct 2017)

Log Message

[WPE][GTK] Crash in webkit_web_resource_get_data_finish()
https://bugs.webkit.org/show_bug.cgi?id=177107

Reviewed by Michael Catanzaro.

Source/WebKit:

Handle errors in webkit_web_resource_get_data() callback.

* UIProcess/API/glib/WebKitWebResource.cpp:
(resourceDataCallback):
(webkit_web_resource_get_data):

Tools:

Add a test case to check we handle errors when webkit_web_resource_get_data() fails.

* TestWebKitAPI/Tests/WebKitGLib/TestResources.cpp:
(webViewloadChanged):
(testWebResourceGetDataError):
(beforeAll):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (222734 => 222735)


--- trunk/Source/WebKit/ChangeLog	2017-10-02 19:40:45 UTC (rev 222734)
+++ trunk/Source/WebKit/ChangeLog	2017-10-02 19:48:37 UTC (rev 222735)
@@ -1,3 +1,16 @@
+2017-10-02  Carlos Garcia Campos  <[email protected]>
+
+        [WPE][GTK] Crash in webkit_web_resource_get_data_finish()
+        https://bugs.webkit.org/show_bug.cgi?id=177107
+
+        Reviewed by Michael Catanzaro.
+
+        Handle errors in webkit_web_resource_get_data() callback.
+
+        * UIProcess/API/glib/WebKitWebResource.cpp:
+        (resourceDataCallback):
+        (webkit_web_resource_get_data):
+
 2017-10-02  Olivier Blin  <[email protected]>
 
         [WPE] Fix UIProcess build with GStreamer and without VIDEO

Modified: trunk/Source/WebKit/UIProcess/API/glib/WebKitWebResource.cpp (222734 => 222735)


--- trunk/Source/WebKit/UIProcess/API/glib/WebKitWebResource.cpp	2017-10-02 19:40:45 UTC (rev 222734)
+++ trunk/Source/WebKit/UIProcess/API/glib/WebKitWebResource.cpp	2017-10-02 19:48:37 UTC (rev 222735)
@@ -342,8 +342,13 @@
 };
 WEBKIT_DEFINE_ASYNC_DATA_STRUCT(ResourceGetDataAsyncData)
 
-static void resourceDataCallback(API::Data* wkData, GTask* task)
+static void resourceDataCallback(API::Data* wkData, CallbackBase::Error error, GTask* task)
 {
+    if (error != CallbackBase::Error::None) {
+        // This fails when the page is closed or frame is destroyed, so we can just cancel the operation.
+        g_task_return_new_error(task, G_IO_ERROR, G_IO_ERROR_CANCELLED, _("Operation was cancelled"));
+        return;
+    }
     ResourceGetDataAsyncData* data = ""
     data->webData = wkData;
     g_task_return_boolean(task, TRUE);
@@ -365,16 +370,16 @@
 {
     g_return_if_fail(WEBKIT_IS_WEB_RESOURCE(resource));
 
-    GTask* task = g_task_new(resource, cancellable, callback, userData);
-    g_task_set_task_data(task, createResourceGetDataAsyncData(), reinterpret_cast<GDestroyNotify>(destroyResourceGetDataAsyncData));
+    GRefPtr<GTask> task = adoptGRef(g_task_new(resource, cancellable, callback, userData));
+    g_task_set_task_data(task.get(), createResourceGetDataAsyncData(), reinterpret_cast<GDestroyNotify>(destroyResourceGetDataAsyncData));
     if (resource->priv->isMainResource)
-        resource->priv->frame->getMainResourceData([task](API::Data* data, CallbackBase::Error) {
-            resourceDataCallback(data, adoptGRef(task).get());
+        resource->priv->frame->getMainResourceData([task = WTFMove(task)](API::Data* data, CallbackBase::Error error) {
+            resourceDataCallback(data, error, task.get());
         });
     else {
         String url = ""
-        resource->priv->frame->getResourceData(API::URL::create(url).ptr(), [task](API::Data* data, CallbackBase::Error) {
-            resourceDataCallback(data, adoptGRef(task).get());
+        resource->priv->frame->getResourceData(API::URL::create(url).ptr(), [task = WTFMove(task)](API::Data* data, CallbackBase::Error error) {
+            resourceDataCallback(data, error, task.get());
         });
     }
 }

Modified: trunk/Tools/ChangeLog (222734 => 222735)


--- trunk/Tools/ChangeLog	2017-10-02 19:40:45 UTC (rev 222734)
+++ trunk/Tools/ChangeLog	2017-10-02 19:48:37 UTC (rev 222735)
@@ -1,3 +1,17 @@
+2017-10-02  Carlos Garcia Campos  <[email protected]>
+
+        [WPE][GTK] Crash in webkit_web_resource_get_data_finish()
+        https://bugs.webkit.org/show_bug.cgi?id=177107
+
+        Reviewed by Michael Catanzaro.
+
+        Add a test case to check we handle errors when webkit_web_resource_get_data() fails.
+
+        * TestWebKitAPI/Tests/WebKitGLib/TestResources.cpp:
+        (webViewloadChanged):
+        (testWebResourceGetDataError):
+        (beforeAll):
+
 2017-10-02  Alex Christensen  <[email protected]>
 
         Fix build after r222715

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestResources.cpp (222734 => 222735)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestResources.cpp	2017-10-02 19:40:45 UTC (rev 222734)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitGLib/TestResources.cpp	2017-10-02 19:48:37 UTC (rev 222735)
@@ -536,6 +536,36 @@
         test->checkResourceData(WEBKIT_WEB_RESOURCE(item->data));
 }
 
+static void webViewloadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent, GMainLoop* mainLoop)
+{
+    if (loadEvent != WEBKIT_LOAD_FINISHED)
+        return;
+    g_signal_handlers_disconnect_by_func(webView, reinterpret_cast<void*>(webViewloadChanged), mainLoop);
+    g_main_loop_quit(mainLoop);
+}
+
+static void testWebResourceGetDataError(Test* test, gconstpointer)
+{
+    GRefPtr<GMainLoop> mainLoop = adoptGRef(g_main_loop_new(nullptr, FALSE));
+    GRefPtr<WebKitWebView> webView = WEBKIT_WEB_VIEW(webkit_web_view_new_with_context(test->m_webContext.get()));
+    webkit_web_view_load_html(webView.get(), "<html></html>", nullptr);
+    g_signal_connect(webView.get(), "load-changed", G_CALLBACK(webViewloadChanged), mainLoop.get());
+    g_main_loop_run(mainLoop.get());
+
+    auto* resource = webkit_web_view_get_main_resource(webView.get());
+    test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(resource));
+    webkit_web_resource_get_data(resource, nullptr, [](GObject* source, GAsyncResult* result, gpointer userData) {
+        size_t dataSize;
+        GUniqueOutPtr<GError> error;
+        auto* data = "" result, &dataSize, &error.outPtr());
+        g_assert(!data);
+        g_assert_error(error.get(), G_IO_ERROR, G_IO_ERROR_CANCELLED);
+        g_main_loop_quit(static_cast<GMainLoop*>(userData));
+    }, mainLoop.get());
+    webView = nullptr;
+    g_main_loop_run(mainLoop.get());
+}
+
 static void testWebViewResourcesHistoryCache(SingleResourceLoadTest* test, gconstpointer)
 {
     CString _javascript_URI = kServer->getURIForPath("/_javascript_.html");
@@ -864,6 +894,7 @@
     SingleResourceLoadTest::add("WebKitWebResource", "suggested-filename", testWebResourceSuggestedFilename);
     ResourceURITrackingTest::add("WebKitWebResource", "active-uri", testWebResourceActiveURI);
     ResourcesTest::add("WebKitWebResource", "get-data", testWebResourceGetData);
+    Test::add("WebKitWebResource", "get-data-error", testWebResourceGetDataError);
     SingleResourceLoadTest::add("WebKitWebView", "history-cache", testWebViewResourcesHistoryCache);
     SendRequestTest::add("WebKitWebPage", "send-request", testWebResourceSendRequest);
 #if SOUP_CHECK_VERSION(2, 49, 91)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to