diff options
Diffstat (limited to 'Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebExtensions.cpp')
-rw-r--r-- | Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebExtensions.cpp | 130 |
1 files changed, 101 insertions, 29 deletions
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebExtensions.cpp b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebExtensions.cpp index b02cdfd03..fa4ab2d6c 100644 --- a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebExtensions.cpp +++ b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestWebExtensions.cpp @@ -21,19 +21,24 @@ #include "WebKitTestBus.h" #include "WebViewTest.h" -#include <wtf/gobject/GRefPtr.h> +#include <wtf/glib/GRefPtr.h> static const char* webExtensionsUserData = "Web Extensions user data"; static WebKitTestBus* bus; static GUniquePtr<char> scriptDialogResult; +#define INPUT_ID "input-id" +#define FORM_ID "form-id" +#define FORM2_ID "form2-id" + static void testWebExtensionGetTitle(WebViewTest* test, gconstpointer) { test->loadHtml("<html><head><title>WebKitGTK+ Web Extensions Test</title></head><body></body></html>", 0); test->waitUntilLoadFinished(); - GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy("org.webkit.gtk.WebExtensionTest", - "/org/webkit/gtk/WebExtensionTest" , "org.webkit.gtk.WebExtensionTest", test->m_mainLoop)); + GUniquePtr<char> extensionBusName(g_strdup_printf("org.webkit.gtk.WebExtensionTest%u", Test::s_webExtensionID)); + GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy(extensionBusName.get(), + "/org/webkit/gtk/WebExtensionTest", "org.webkit.gtk.WebExtensionTest", test->m_mainLoop)); GRefPtr<GVariant> result = adoptGRef(g_dbus_proxy_call_sync( proxy.get(), "GetTitle", @@ -54,7 +59,8 @@ static void documentLoadedCallback(GDBusConnection*, const char*, const char*, c static void testDocumentLoadedSignal(WebViewTest* test, gconstpointer) { - GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy("org.webkit.gtk.WebExtensionTest", + GUniquePtr<char> extensionBusName(g_strdup_printf("org.webkit.gtk.WebExtensionTest%u", Test::s_webExtensionID)); + GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy(extensionBusName.get(), "/org/webkit/gtk/WebExtensionTest", "org.webkit.gtk.WebExtensionTest", test->m_mainLoop)); GDBusConnection* connection = g_dbus_proxy_get_connection(proxy.get()); guint id = g_dbus_connection_signal_subscribe(connection, @@ -86,10 +92,13 @@ static void testWebKitWebViewProcessCrashed(WebViewTest* test, gconstpointer) test->loadHtml("<html></html>", 0); test->waitUntilLoadFinished(); - g_signal_connect(test->m_webView, "web-process-crashed", + g_signal_connect_after(test->m_webView, "web-process-crashed", G_CALLBACK(webProcessCrashedCallback), test); - GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy("org.webkit.gtk.WebExtensionTest", + test->m_expectedWebProcessCrash = true; + + GUniquePtr<char> extensionBusName(g_strdup_printf("org.webkit.gtk.WebExtensionTest%u", Test::s_webExtensionID)); + GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy(extensionBusName.get(), "/org/webkit/gtk/WebExtensionTest", "org.webkit.gtk.WebExtensionTest", test->m_mainLoop)); GRefPtr<GVariant> result = adoptGRef(g_dbus_proxy_call_sync( @@ -100,6 +109,7 @@ static void testWebKitWebViewProcessCrashed(WebViewTest* test, gconstpointer) -1, 0, 0)); g_assert(!result); g_main_loop_run(test->m_mainLoop); + test->m_expectedWebProcessCrash = false; } static void testWebExtensionWindowObjectCleared(WebViewTest* test, gconstpointer) @@ -152,7 +162,8 @@ static void testWebExtensionIsolatedWorld(WebViewTest* test, gconstpointer) "document.getElementById('console').innerHTML = top.foo;\n" "window.open = function () { alert('Isolated World'); }\n" "document.open(1, 2, 3);"; - GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy("org.webkit.gtk.WebExtensionTest", + GUniquePtr<char> extensionBusName(g_strdup_printf("org.webkit.gtk.WebExtensionTest%u", Test::s_webExtensionID)); + GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy(extensionBusName.get(), "/org/webkit/gtk/WebExtensionTest" , "org.webkit.gtk.WebExtensionTest", test->m_mainLoop)); g_dbus_proxy_call(proxy.get(), "RunJavaScriptInIsolatedWorld", @@ -173,49 +184,110 @@ static void testWebExtensionIsolatedWorld(WebViewTest* test, gconstpointer) g_signal_handler_disconnect(test->m_webView, scriptDialogID); } -static void testWebExtensionInitializationUserData(WebViewTest* test, gconstpointer) +static gboolean permissionRequestCallback(WebKitWebView*, WebKitPermissionRequest* request, WebViewTest* test) { - test->loadHtml("<html></html>", 0); - test->waitUntilLoadFinished(); + if (!WEBKIT_IS_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(request)) + return FALSE; + + test->assertObjectIsDeletedWhenTestFinishes(G_OBJECT(request)); + WebKitInstallMissingMediaPluginsPermissionRequest* missingPluginsRequest = WEBKIT_INSTALL_MISSING_MEDIA_PLUGINS_PERMISSION_REQUEST(request); + g_assert(webkit_install_missing_media_plugins_permission_request_get_description(missingPluginsRequest)); + webkit_permission_request_deny(request); + test->quitMainLoop(); + + return TRUE; +} - GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy("org.webkit.gtk.WebExtensionTest", +static void testInstallMissingPluginsPermissionRequest(WebViewTest* test, gconstpointer) +{ + GUniquePtr<char> extensionBusName(g_strdup_printf("org.webkit.gtk.WebExtensionTest%u", Test::s_webExtensionID)); + GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy(extensionBusName.get(), "/org/webkit/gtk/WebExtensionTest", "org.webkit.gtk.WebExtensionTest", test->m_mainLoop)); + GRefPtr<GVariant> result = adoptGRef(g_dbus_proxy_call_sync(proxy.get(), "RemoveAVPluginsFromGSTRegistry", + nullptr, G_DBUS_CALL_FLAGS_NONE, -1, nullptr, nullptr)); - GRefPtr<GVariant> result = adoptGRef(g_dbus_proxy_call_sync( - proxy.get(), - "GetInitializationUserData", - nullptr, - G_DBUS_CALL_FLAGS_NONE, - -1, 0, 0)); - g_assert(result); + test->showInWindowAndWaitUntilMapped(); - const gchar* userData = nullptr; - g_variant_get(result.get(), "(&s)", &userData); - g_assert_cmpstr(userData, ==, webExtensionsUserData); + gulong permissionRequestSignalID = g_signal_connect(test->m_webView, "permission-request", G_CALLBACK(permissionRequestCallback), test); + // FIXME: the base URI needs to finish with / to work, that shouldn't happen. + GUniquePtr<char> baseURI(g_strconcat("file://", Test::getResourcesDir(Test::WebKit2Resources).data(), "/", nullptr)); + test->loadHtml("<html><body><video src=\"test.mp4\" autoplay></video></body></html>", baseURI.get()); + g_main_loop_run(test->m_mainLoop); + g_signal_handler_disconnect(test->m_webView, permissionRequestSignalID); } -static void initializeWebExtensions(WebKitWebContext* context, gpointer) +static void didAssociateFormControlsCallback(GDBusConnection*, const char*, const char*, const char*, const char*, GVariant* result, WebViewTest* test) { - webkit_web_context_set_web_extensions_directory(context, WEBKIT_TEST_WEB_EXTENSIONS_DIR); - webkit_web_context_set_web_extensions_initialization_user_data(context, - g_variant_new("&s", webExtensionsUserData)); + const char* formIds; + g_variant_get(result, "(&s)", &formIds); + g_assert(!g_strcmp0(formIds, FORM_ID FORM2_ID) || !g_strcmp0(formIds, INPUT_ID)); + + test->quitMainLoop(); } -void beforeAll() +static void testWebExtensionFormControlsAssociated(WebViewTest* test, gconstpointer) { - g_signal_connect(webkit_web_context_get_default(), - "initialize-web-extensions", G_CALLBACK(initializeWebExtensions), nullptr); + GUniquePtr<char> extensionBusName(g_strdup_printf("org.webkit.gtk.WebExtensionTest%u", Test::s_webExtensionID)); + GRefPtr<GDBusProxy> proxy = adoptGRef(bus->createProxy(extensionBusName.get(), + "/org/webkit/gtk/WebExtensionTest", "org.webkit.gtk.WebExtensionTest", test->m_mainLoop)); + GDBusConnection* connection = g_dbus_proxy_get_connection(proxy.get()); + guint id = g_dbus_connection_signal_subscribe(connection, + nullptr, + "org.webkit.gtk.WebExtensionTest", + "FormControlsAssociated", + "/org/webkit/gtk/WebExtensionTest", + nullptr, + G_DBUS_SIGNAL_FLAGS_NONE, + reinterpret_cast<GDBusSignalCallback>(didAssociateFormControlsCallback), + test, + nullptr); + g_assert(id); + + test->loadHtml("<!DOCTYPE html><head><title>WebKitGTK+ Web Extensions Test</title></head><div id=\"placeholder\"/>", 0); + test->waitUntilLoadFinished(); + + static const char* addFormScript = + "var input = document.createElement(\"input\");" + "input.id = \"" INPUT_ID "\";" + "input.type = \"password\";" + "var form = document.createElement(\"form\");" + "form.id = \"" FORM_ID "\";" + "form.appendChild(input);" + "var form2 = document.createElement(\"form\");" + "form2.id = \"" FORM2_ID "\";" + "var placeholder = document.getElementById(\"placeholder\");" + "placeholder.appendChild(form);" + "placeholder.appendChild(form2);"; + + webkit_web_view_run_javascript(test->m_webView, addFormScript, nullptr, nullptr, nullptr); + g_main_loop_run(test->m_mainLoop); + + static const char* moveFormElementScript = + "var form = document.getElementById(\"" FORM_ID "\");" + "var form2 = document.getElementById(\"" FORM2_ID "\");" + "var input = document.getElementById(\"" INPUT_ID "\");" + "form.removeChild(input);" + "form2.appendChild(input);"; + + webkit_web_view_run_javascript(test->m_webView, moveFormElementScript, nullptr, nullptr, nullptr); + g_main_loop_run(test->m_mainLoop); + g_dbus_connection_signal_unsubscribe(connection, id); +} + +void beforeAll() +{ bus = new WebKitTestBus(); if (!bus->run()) return; - WebViewTest::add("WebKitWebContext", "initialization-user-data", testWebExtensionInitializationUserData); WebViewTest::add("WebKitWebExtension", "dom-document-title", testWebExtensionGetTitle); WebViewTest::add("WebKitWebExtension", "document-loaded-signal", testDocumentLoadedSignal); WebViewTest::add("WebKitWebView", "web-process-crashed", testWebKitWebViewProcessCrashed); WebViewTest::add("WebKitWebExtension", "window-object-cleared", testWebExtensionWindowObjectCleared); WebViewTest::add("WebKitWebExtension", "isolated-world", testWebExtensionIsolatedWorld); + WebViewTest::add("WebKitWebView", "install-missing-plugins-permission-request", testInstallMissingPluginsPermissionRequest); + WebViewTest::add("WebKitWebExtension", "form-controls-associated-signal", testWebExtensionFormControlsAssociated); } void afterAll() |