Modified: releases/WebKitGTK/webkit-2.24/Source/WebKit/ChangeLog (243992 => 243993)
--- releases/WebKitGTK/webkit-2.24/Source/WebKit/ChangeLog 2019-04-08 10:23:39 UTC (rev 243992)
+++ releases/WebKitGTK/webkit-2.24/Source/WebKit/ChangeLog 2019-04-08 10:23:44 UTC (rev 243993)
@@ -1,3 +1,26 @@
+2019-03-28 Michael Catanzaro <mcatanz...@igalia.com>
+
+ [WPE][GTK] webkit_web_resource_get_data_finish can return NULL without setting error
+ https://bugs.webkit.org/show_bug.cgi?id=186276
+
+ Reviewed by Carlos Garcia Campos.
+
+ Currently it's possible for webkit_web_resource_get_data_finish() to return NULL without
+ setting the error parameter. This is illegal because it is an API guarantee (and a GObject
+ convention) that if an error parameter exists, it should be set whenever a function call
+ returns NULL. Epiphany correctly dereferences the error in this case without checking if it
+ is NULL, because it knows it does not have to, and crashes. Fix this. We'll return a byte
+ array of length 1 containing a NUL character. This isn't great, but there's not really any
+ better solution without deprecating the API or returning an error code to indicate an empty
+ resource, and it at least fixes the Epiphany crash.
+
+ This does not fix bug #186276, in which this function incorrectly returns no data when it
+ ought to. But that is a different bug. Now, at least we won't crash when no data is
+ available.
+
+ * UIProcess/API/glib/WebKitWebResource.cpp:
+ (resourceDataCallback):
+
2019-04-03 Michael Catanzaro <mcatanz...@igalia.com>
Get rid of HTMLInputElement::setEditingValue
Modified: releases/WebKitGTK/webkit-2.24/Source/WebKit/UIProcess/API/glib/WebKitWebResource.cpp (243992 => 243993)
--- releases/WebKitGTK/webkit-2.24/Source/WebKit/UIProcess/API/glib/WebKitWebResource.cpp 2019-04-08 10:23:39 UTC (rev 243992)
+++ releases/WebKitGTK/webkit-2.24/Source/WebKit/UIProcess/API/glib/WebKitWebResource.cpp 2019-04-08 10:23:44 UTC (rev 243993)
@@ -351,6 +351,8 @@
}
ResourceGetDataAsyncData* data = ""
data->webData = wkData;
+ if (!wkData->bytes())
+ data->webData = API::Data::create(reinterpret_cast<const unsigned char*>(""), 1);
g_task_return_boolean(task, TRUE);
}
Modified: releases/WebKitGTK/webkit-2.24/Tools/TestWebKitAPI/Tests/WebKitGLib/TestResources.cpp (243992 => 243993)
--- releases/WebKitGTK/webkit-2.24/Tools/TestWebKitAPI/Tests/WebKitGLib/TestResources.cpp 2019-04-08 10:23:39 UTC (rev 243992)
+++ releases/WebKitGTK/webkit-2.24/Tools/TestWebKitAPI/Tests/WebKitGLib/TestResources.cpp 2019-04-08 10:23:44 UTC (rev 243993)
@@ -536,11 +536,11 @@
test->checkResourceData(WEBKIT_WEB_RESOURCE(item->data));
}
-static void webViewloadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent, GMainLoop* mainLoop)
+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_signal_handlers_disconnect_by_func(webView, reinterpret_cast<void*>(webViewLoadChanged), mainLoop);
g_main_loop_quit(mainLoop);
}
@@ -549,7 +549,7 @@
GRefPtr<GMainLoop> mainLoop = adoptGRef(g_main_loop_new(nullptr, FALSE));
GRefPtr<WebKitWebView> webView = WEBKIT_WEB_VIEW(Test::createWebView(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_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());
@@ -566,6 +566,29 @@
g_main_loop_run(mainLoop.get());
}
+static void testWebResourceGetDataEmpty(Test* test, gconstpointer)
+{
+ GRefPtr<GMainLoop> mainLoop = adoptGRef(g_main_loop_new(nullptr, FALSE));
+ GRefPtr<WebKitWebView> webView = WEBKIT_WEB_VIEW(Test::createWebView(test->m_webContext.get()));
+ webkit_web_view_load_html(webView.get(), "", 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_nonnull(data);
+ g_assert_cmpuint(dataSize, ==, 1);
+ g_assert_cmpint(data[0], ==, '\0');
+ g_assert_no_error(error.get());
+ g_main_loop_quit(static_cast<GMainLoop*>(userData));
+ }, mainLoop.get());
+ g_main_loop_run(mainLoop.get());
+}
+
static void testWebViewResourcesHistoryCache(SingleResourceLoadTest* test, gconstpointer)
{
CString _javascript_URI = kServer->getURIForPath("/_javascript_.html");
@@ -897,6 +920,7 @@
ResourceURITrackingTest::add("WebKitWebResource", "active-uri", testWebResourceActiveURI);
ResourcesTest::add("WebKitWebResource", "get-data", testWebResourceGetData);
Test::add("WebKitWebResource", "get-data-error", testWebResourceGetDataError);
+ Test::add("WebKitWebResource", "get-data-empty", testWebResourceGetDataEmpty);
SingleResourceLoadTest::add("WebKitWebView", "history-cache", testWebViewResourcesHistoryCache);
SendRequestTest::add("WebKitWebPage", "send-request", testWebResourceSendRequest);
#if SOUP_CHECK_VERSION(2, 49, 91)