/** * Handle dbus method calls. */ static void dbus_handle_method_call(GDBusConnection *conn, const char *sender, const char *object_path, const char *interface_name, const char *method, GVariant *parameters, GDBusMethodInvocation *invocation, gpointer extension) { char *value; guint64 pageid; WebKitWebPage *page; if (g_str_has_prefix(method, "EvalJs")) { char *result = NULL; gboolean success; gboolean no_result; JSValueRef ref = NULL; JSGlobalContextRef jsContext; g_variant_get(parameters, "(ts)", &pageid, &value); page = get_web_page_or_return_dbus_error(invocation, WEBKIT_WEB_EXTENSION(extension), pageid); if (!page) { return; } no_result = !g_strcmp0(method, "EvalJsNoResult"); jsContext = webkit_frame_get_javascript_context_for_script_world( webkit_web_page_get_main_frame(page), webkit_script_world_get_default() ); success = ext_util_js_eval(jsContext, value, &ref); if (no_result) { g_dbus_method_invocation_return_value(invocation, NULL); } else { result = ext_util_js_ref_to_string(jsContext, ref); g_dbus_method_invocation_return_value(invocation, g_variant_new("(bs)", success, result)); g_free(result); } } else if (!g_strcmp0(method, "FocusInput")) { g_variant_get(parameters, "(t)", &pageid); page = get_web_page_or_return_dbus_error(invocation, WEBKIT_WEB_EXTENSION(extension), pageid); if (!page) { return; } ext_dom_focus_input(webkit_web_page_get_dom_document(page)); g_dbus_method_invocation_return_value(invocation, NULL); } else if (!g_strcmp0(method, "SetHeaderSetting")) { g_variant_get(parameters, "(s)", &value); if (ext.headers) { soup_header_free_param_list(ext.headers); ext.headers = NULL; } ext.headers = soup_header_parse_param_list(value); g_dbus_method_invocation_return_value(invocation, NULL); } }
static void methodCallCallback(GDBusConnection* connection, const char* sender, const char* objectPath, const char* interfaceName, const char* methodName, GVariant* parameters, GDBusMethodInvocation* invocation, gpointer userData) { if (g_strcmp0(interfaceName, "org.webkit.gtk.WebExtensionTest")) return; if (!g_strcmp0(methodName, "GetTitle")) { uint64_t pageID; g_variant_get(parameters, "(t)", &pageID); WebKitWebPage* page = getWebPage(WEBKIT_WEB_EXTENSION(userData), pageID, invocation); if (!page) return; WebKitDOMDocument* document = webkit_web_page_get_dom_document(page); GUniquePtr<char> title(webkit_dom_document_get_title(document)); g_dbus_method_invocation_return_value(invocation, g_variant_new("(s)", title.get())); } else if (!g_strcmp0(methodName, "RunJavaScriptInIsolatedWorld")) { uint64_t pageID; const char* script; g_variant_get(parameters, "(t&s)", &pageID, &script); WebKitWebPage* page = getWebPage(WEBKIT_WEB_EXTENSION(userData), pageID, invocation); if (!page) return; GRefPtr<WebKitScriptWorld> world = adoptGRef(webkit_script_world_new()); g_assert(webkit_script_world_get_default() != world.get()); WebKitFrame* frame = webkit_web_page_get_main_frame(page); JSGlobalContextRef jsContext = webkit_frame_get_javascript_context_for_script_world(frame, world.get()); JSRetainPtr<JSStringRef> jsScript(Adopt, JSStringCreateWithUTF8CString(script)); JSEvaluateScript(jsContext, jsScript.get(), 0, 0, 0, 0); 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()))); } }
static void busAcquiredCallback(GDBusConnection* connection, const char* name, gpointer userData) { static GDBusNodeInfo *introspectionData = 0; if (!introspectionData) introspectionData = g_dbus_node_info_new_for_xml(introspectionXML, 0); GOwnPtr<GError> error; unsigned registrationID = g_dbus_connection_register_object( connection, "/org/webkit/gtk/WebExtensionTest", introspectionData->interfaces[0], &interfaceVirtualTable, g_object_ref(userData), static_cast<GDestroyNotify>(g_object_unref), &error.outPtr()); if (!registrationID) g_warning("Failed to register object: %s\n", error->message); g_signal_connect(WEBKIT_WEB_EXTENSION(userData), "page-created", G_CALLBACK(pageCreatedCallback), connection); }
static void on_dbus_connection_created(GObject *source_object, GAsyncResult *result, gpointer data) { static GDBusNodeInfo *node_info = NULL; GDBusConnection *connection; GError *error = NULL; if (!node_info) { node_info = g_dbus_node_info_new_for_xml(introspection_xml, NULL); } connection = g_dbus_connection_new_for_address_finish(result, &error); if (error) { g_warning("Failed to connect to UI process: %s", error->message); g_error_free(error); return; } /* register the webextension object */ ext.regid = g_dbus_connection_register_object( connection, VB_WEBEXTENSION_OBJECT_PATH, node_info->interfaces[0], &interface_vtable, WEBKIT_WEB_EXTENSION(data), NULL, &error); if (!ext.regid) { g_warning("Failed to register web extension object: %s", error->message); g_error_free(error); g_object_unref(connection); return; } emit_page_created_pending(connection); ext.connection = connection; }
static void methodCallCallback(GDBusConnection* connection, const char* sender, const char* objectPath, const char* interfaceName, const char* methodName, GVariant* parameters, GDBusMethodInvocation* invocation, gpointer userData) { if (g_strcmp0(interfaceName, "org.webkit.gtk.WebExtensionTest")) return; if (!g_strcmp0(methodName, "GetTitle")) { uint64_t pageID; g_variant_get(parameters, "(t)", &pageID); WebKitWebExtension* extension = WEBKIT_WEB_EXTENSION(userData); WebKitWebPage* page = webkit_web_extension_get_page(extension, pageID); if (!page) { g_dbus_method_invocation_return_error( invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "Invalid page ID: %" G_GUINT64_FORMAT, pageID); return; } g_assert_cmpuint(webkit_web_page_get_id(page), ==, pageID); WebKitDOMDocument* document = webkit_web_page_get_dom_document(page); GOwnPtr<char> title(webkit_dom_document_get_title(document)); g_dbus_method_invocation_return_value(invocation, g_variant_new("(s)", title.get())); } else if (!g_strcmp0(methodName, "AbortProcess")) {