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)