summaryrefslogtreecommitdiff
path: root/Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2015-05-20 09:56:07 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2015-05-20 09:56:07 +0000
commit41386e9cb918eed93b3f13648cbef387e371e451 (patch)
treea97f9d7bd1d9d091833286085f72da9d83fd0606 /Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp
parente15dd966d523731101f70ccf768bba12435a0208 (diff)
downloadWebKitGtk-tarball-41386e9cb918eed93b3f13648cbef387e371e451.tar.gz
webkitgtk-2.4.9webkitgtk-2.4.9
Diffstat (limited to 'Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp')
-rw-r--r--Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp136
1 files changed, 37 insertions, 99 deletions
diff --git a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp
index 38c7d9412..757532f7a 100644
--- a/Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp
+++ b/Tools/TestWebKitAPI/Tests/WebKit2Gtk/WebExtensionTest.cpp
@@ -22,21 +22,17 @@
#include <JavaScriptCore/JSContextRef.h>
#include <JavaScriptCore/JSRetainPtr.h>
#include <gio/gio.h>
-#include <gst/gst.h>
#include <stdlib.h>
#include <string.h>
#include <webkit2/webkit-web-extension.h>
#include <wtf/Deque.h>
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
#include <wtf/ProcessID.h>
-#include <wtf/glib/GRefPtr.h>
-#include <wtf/glib/GUniquePtr.h>
+#include <wtf/gobject/GRefPtr.h>
+#include <wtf/gobject/GUniquePtr.h>
#include <wtf/text/CString.h>
-#define WEBKIT_DOM_USE_UNSTABLE_API
-#include <webkitdom/WebKitDOMWebKitNamespace.h>
-#include <webkitdom/WebKitDOMUserMessageHandlersNamespace.h>
-#include <webkitdom/WebKitDOMUserMessageHandler.h>
-
static const char introspectionXML[] =
"<node>"
" <interface name='org.webkit.gtk.WebExtensionTest'>"
@@ -50,11 +46,12 @@ static const char introspectionXML[] =
" <arg type='t' name='pageID' direction='in'/>"
" <arg type='s' name='script' direction='in'/>"
" </method>"
+ " <method name='GetInitializationUserData'>"
+ " <arg type='s' name='userData' direction='out'/>"
+ " </method>"
" <method name='GetProcessIdentifier'>"
" <arg type='u' name='identifier' direction='out'/>"
" </method>"
- " <method name='RemoveAVPluginsFromGSTRegistry'>"
- " </method>"
" <signal name='DocumentLoaded'/>"
" <signal name='URIChanged'>"
" <arg type='s' name='uri' direction='out'/>"
@@ -62,6 +59,8 @@ static const char introspectionXML[] =
" </interface>"
"</node>";
+static GRefPtr<GVariant> initializationUserData;
+
typedef enum {
DocumentLoadedSignal,
@@ -84,7 +83,7 @@ struct DelayedSignal {
CString uri;
};
-Deque<DelayedSignal> delayedSignalsQueue;
+Deque<OwnPtr<DelayedSignal>> delayedSignalsQueue;
static void emitDocumentLoaded(GDBusConnection* connection)
{
@@ -99,24 +98,13 @@ static void emitDocumentLoaded(GDBusConnection* connection)
g_assert(ok);
}
-static void documentLoadedCallback(WebKitWebPage* webPage, WebKitWebExtension* extension)
+static void documentLoadedCallback(WebKitWebPage*, WebKitWebExtension* extension)
{
- // FIXME: Too much code just to send a message, we need convenient custom API for this.
- WebKitDOMDocument* document = webkit_web_page_get_dom_document(webPage);
- GRefPtr<WebKitDOMDOMWindow> window = adoptGRef(webkit_dom_document_get_default_view(document));
- if (WebKitDOMWebKitNamespace* webkit = webkit_dom_dom_window_get_webkit_namespace(window.get())) {
- WebKitDOMUserMessageHandlersNamespace* messageHandlers = webkit_dom_webkit_namespace_get_message_handlers(webkit);
- if (WebKitDOMUserMessageHandler* handler = webkit_dom_user_message_handlers_namespace_get_handler(messageHandlers, "dom"))
- webkit_dom_user_message_handler_post_message(handler, "DocumentLoaded", nullptr);
- }
-
- webkit_dom_dom_window_webkit_message_handlers_post_message(window.get(), "dom-convenience", "DocumentLoaded");
-
gpointer data = g_object_get_data(G_OBJECT(extension), "dbus-connection");
if (data)
emitDocumentLoaded(G_DBUS_CONNECTION(data));
else
- delayedSignalsQueue.append(DelayedSignal(DocumentLoadedSignal));
+ delayedSignalsQueue.append(adoptPtr(new DelayedSignal(DocumentLoadedSignal)));
}
static void emitURIChanged(GDBusConnection* connection, const char* uri)
@@ -138,7 +126,7 @@ static void uriChangedCallback(WebKitWebPage* webPage, GParamSpec* pspec, WebKit
if (data)
emitURIChanged(G_DBUS_CONNECTION(data), webkit_web_page_get_uri(webPage));
else
- delayedSignalsQueue.append(DelayedSignal(URIChangedSignal, webkit_web_page_get_uri(webPage)));
+ delayedSignalsQueue.append(adoptPtr(new DelayedSignal(URIChangedSignal, webkit_web_page_get_uri(webPage))));
}
static gboolean sendRequestCallback(WebKitWebPage*, WebKitURIRequest* request, WebKitURIResponse* redirectResponse, gpointer)
@@ -171,67 +159,11 @@ static gboolean sendRequestCallback(WebKitWebPage*, WebKitURIRequest* request, W
return FALSE;
}
-static GVariant* serializeContextMenu(WebKitContextMenu* menu)
-{
- GVariantBuilder builder;
- g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
- GList* items = webkit_context_menu_get_items(menu);
- for (GList* it = items; it; it = g_list_next(it))
- g_variant_builder_add(&builder, "u", webkit_context_menu_item_get_stock_action(WEBKIT_CONTEXT_MENU_ITEM(it->data)));
- return g_variant_builder_end(&builder);
-}
-
-static GVariant* serializeNode(WebKitDOMNode* node)
-{
- GVariantBuilder builder;
- g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
- g_variant_builder_add(&builder, "{sv}", "Name", g_variant_new_take_string(webkit_dom_node_get_node_name(node)));
- g_variant_builder_add(&builder, "{sv}", "Type", g_variant_new_uint32(webkit_dom_node_get_node_type(node)));
- g_variant_builder_add(&builder, "{sv}", "Contents", g_variant_new_take_string(webkit_dom_node_get_text_content(node)));
- WebKitDOMNode* parent = webkit_dom_node_get_parent_node(node);
- g_variant_builder_add(&builder, "{sv}", "Parent", parent ? g_variant_new_take_string(webkit_dom_node_get_node_name(parent)) : g_variant_new_string("ROOT"));
- return g_variant_builder_end(&builder);
-}
-
-static gboolean contextMenuCallback(WebKitWebPage* page, WebKitContextMenu* menu, WebKitWebHitTestResult* hitTestResult, gpointer)
-{
- const char* pageURI = webkit_web_page_get_uri(page);
- if (!g_strcmp0(pageURI, "ContextMenuTestDefault")) {
- webkit_context_menu_set_user_data(menu, serializeContextMenu(menu));
- return FALSE;
- }
-
- if (!g_strcmp0(pageURI, "ContextMenuTestCustom")) {
- // Remove Back and Forward, and add Inspector action.
- webkit_context_menu_remove(menu, webkit_context_menu_first(menu));
- webkit_context_menu_remove(menu, webkit_context_menu_first(menu));
- webkit_context_menu_append(menu, webkit_context_menu_item_new_separator());
- webkit_context_menu_append(menu, webkit_context_menu_item_new_from_stock_action(WEBKIT_CONTEXT_MENU_ACTION_INSPECT_ELEMENT));
- webkit_context_menu_set_user_data(menu, serializeContextMenu(menu));
- return TRUE;
- }
-
- if (!g_strcmp0(pageURI, "ContextMenuTestClear")) {
- webkit_context_menu_remove_all(menu);
- return TRUE;
- }
-
- if (!g_strcmp0(pageURI, "ContextMenuTestNode")) {
- WebKitDOMNode* node = webkit_web_hit_test_result_get_node(hitTestResult);
- g_assert(WEBKIT_DOM_IS_NODE(node));
- webkit_context_menu_set_user_data(menu, serializeNode(node));
- return TRUE;
- }
-
- return FALSE;
-}
-
static void pageCreatedCallback(WebKitWebExtension* extension, WebKitWebPage* webPage, gpointer)
{
g_signal_connect(webPage, "document-loaded", G_CALLBACK(documentLoadedCallback), extension);
g_signal_connect(webPage, "notify::uri", G_CALLBACK(uriChangedCallback), extension);
- g_signal_connect(webPage, "send-request", G_CALLBACK(sendRequestCallback), nullptr);
- g_signal_connect(webPage, "context-menu", G_CALLBACK(contextMenuCallback), nullptr);
+ g_signal_connect(webPage, "send-request", G_CALLBACK(sendRequestCallback), 0);
}
static JSValueRef echoCallback(JSContextRef jsContext, JSObjectRef, JSObjectRef, size_t argumentCount, const JSValueRef arguments[], JSValueRef*)
@@ -301,20 +233,14 @@ static void methodCallCallback(GDBusConnection* connection, const char* sender,
g_dbus_method_invocation_return_value(invocation, 0);
} else if (!g_strcmp0(methodName, "AbortProcess")) {
abort();
+ } else if (!g_strcmp0(methodName, "GetInitializationUserData")) {
+ g_assert(initializationUserData);
+ g_assert(g_variant_is_of_type(initializationUserData.get(), G_VARIANT_TYPE_STRING));
+ g_dbus_method_invocation_return_value(invocation, g_variant_new("(s)",
+ g_variant_get_string(initializationUserData.get(), nullptr)));
} else if (!g_strcmp0(methodName, "GetProcessIdentifier")) {
g_dbus_method_invocation_return_value(invocation,
g_variant_new("(u)", static_cast<guint32>(getCurrentProcessID())));
- } else if (!g_strcmp0(methodName, "RemoveAVPluginsFromGSTRegistry")) {
- gst_init(nullptr, nullptr);
- static const char* avPlugins[] = { "libav", "omx", "vaapi", nullptr };
- GstRegistry* registry = gst_registry_get();
- for (unsigned i = 0; avPlugins[i]; ++i) {
- if (GstPlugin* plugin = gst_registry_find_plugin(registry, avPlugins[i])) {
- gst_registry_remove_plugin(registry, plugin);
- gst_object_unref(plugin);
- }
- }
- g_dbus_method_invocation_return_value(invocation, nullptr);
}
}
@@ -342,26 +268,38 @@ static void busAcquiredCallback(GDBusConnection* connection, const char* name, g
g_object_set_data(G_OBJECT(userData), "dbus-connection", connection);
while (delayedSignalsQueue.size()) {
- DelayedSignal delayedSignal = delayedSignalsQueue.takeFirst();
- switch (delayedSignal.type) {
+ OwnPtr<DelayedSignal> delayedSignal = delayedSignalsQueue.takeFirst();
+ switch (delayedSignal->type) {
case DocumentLoadedSignal:
emitDocumentLoaded(connection);
break;
case URIChangedSignal:
- emitURIChanged(connection, delayedSignal.uri.data());
+ emitURIChanged(connection, delayedSignal->uri.data());
break;
}
}
}
+static GUniquePtr<char> makeBusName(GVariant* userData)
+{
+ // When the web extension is used by TestMultiprocess, an uint32
+ // identifier is passed as user data. It uniquely identifies
+ // the web process, and the UI side expects it added as suffix to
+ // the bus name.
+ if (userData && g_variant_is_of_type(userData, G_VARIANT_TYPE_UINT32))
+ return GUniquePtr<char>(g_strdup_printf("org.webkit.gtk.WebExtensionTest%u", g_variant_get_uint32(userData)));
+
+ return GUniquePtr<char>(g_strdup("org.webkit.gtk.WebExtensionTest"));
+}
+
extern "C" void webkit_web_extension_initialize_with_user_data(WebKitWebExtension* extension, GVariant* userData)
{
+ initializationUserData = userData;
+
g_signal_connect(extension, "page-created", G_CALLBACK(pageCreatedCallback), extension);
g_signal_connect(webkit_script_world_get_default(), "window-object-cleared", G_CALLBACK(windowObjectCleared), 0);
- g_assert(userData);
- g_assert(g_variant_is_of_type(userData, G_VARIANT_TYPE_UINT32));
- GUniquePtr<char> busName(g_strdup_printf("org.webkit.gtk.WebExtensionTest%u", g_variant_get_uint32(userData)));
+ GUniquePtr<char> busName(makeBusName(userData));
g_bus_own_name(
G_BUS_TYPE_SESSION,
busName.get(),