[epiphany/pgriffis/web-extension/content-script-send-message: 1/2] WebExtensions: Move ephy_send_message() to common
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany/pgriffis/web-extension/content-script-send-message: 1/2] WebExtensions: Move ephy_send_message() to common
- Date: Mon, 6 Jun 2022 12:22:32 +0000 (UTC)
commit 24ebde5858c10298c3cf411e517c0c51b0a38d46
Author: Patrick Griffis <pgriffis igalia com>
Date: Sun Jun 5 18:26:59 2022 -0500
WebExtensions: Move ephy_send_message() to common
Part-of: <https://gitlab.gnome.org/GNOME/epiphany/-/merge_requests/1135>
.../ephy-web-process-extension.c | 6 +-
.../web-process-extension/ephy-webextension-api.c | 105 +-----------------
.../ephy-webextension-common.c | 119 ++++++++++++++++++++-
.../ephy-webextension-common.h | 9 +-
src/webextension/ephy-web-extension-manager.c | 4 +-
5 files changed, 134 insertions(+), 109 deletions(-)
---
diff --git a/embed/web-process-extension/ephy-web-process-extension.c
b/embed/web-process-extension/ephy-web-process-extension.c
index f34faf034..99a388c1f 100644
--- a/embed/web-process-extension/ephy-web-process-extension.c
+++ b/embed/web-process-extension/ephy-web-process-extension.c
@@ -249,7 +249,11 @@ content_script_window_object_cleared_cb (WebKitScriptWorld *world,
result = jsc_context_evaluate_with_source_uri (js_context, data, data_size,
"resource:///org/gnome/epiphany-web-extension/js/webextensions-common.js", 1);
g_clear_object (&result);
- ephy_webextension_install_common_apis (js_context, guid, translations);
+ ephy_webextension_install_common_apis (extension->extension,
+ js_context,
+ guid,
+ webkit_web_page_get_id (page),
+ translations);
}
static void
diff --git a/embed/web-process-extension/ephy-webextension-api.c
b/embed/web-process-extension/ephy-webextension-api.c
index d8350fdc6..2aa5e989a 100644
--- a/embed/web-process-extension/ephy-webextension-api.c
+++ b/embed/web-process-extension/ephy-webextension-api.c
@@ -139,92 +139,6 @@ ephy_web_extension_extension_get (void)
return EPHY_WEB_EXTENSION_EXTENSION (g_once (&once_init, ephy_web_extension_extension_create_instance,
NULL));
}
-typedef struct {
- JSCValue *resolve_callback;
- JSCValue *reject_callback;
-} EphyMessageData;
-
-static void
-ephy_message_data_free (EphyMessageData *data)
-{
- g_object_unref (data->reject_callback);
- g_object_unref (data->resolve_callback);
- g_free (data);
-}
-
-static EphyMessageData *
-ephy_message_data_new (JSCValue *resolve_callback,
- JSCValue *reject_callback)
-{
- EphyMessageData *data = g_new (EphyMessageData, 1);
- data->resolve_callback = g_object_ref (resolve_callback);
- data->reject_callback = g_object_ref (reject_callback);
- return data;
-}
-
-static void
-on_send_message_finish (WebKitWebExtension *extension,
- GAsyncResult *result,
- gpointer user_data)
-{
- EphyMessageData *message_data = user_data;
- g_autoptr (GError) error = NULL;
- g_autoptr (WebKitUserMessage) response = NULL;
- g_autoptr (JSCValue) ret = NULL;
-
- response = webkit_web_extension_send_message_to_context_finish (extension, result, &error);
-
- if (error) {
- ret = jsc_value_function_call (message_data->reject_callback, G_TYPE_STRING, error->message,
G_TYPE_NONE);
- } else {
- const char *json = g_variant_get_string (webkit_user_message_get_parameters (response), NULL);
- g_autoptr (JSCValue) value = NULL;
- JSCContext *context = jsc_value_get_context (message_data->resolve_callback);
-
- if (strcmp (json, "") == 0) {
- value = jsc_value_new_undefined (context);
- ret = jsc_value_function_call (message_data->resolve_callback, JSC_TYPE_VALUE, value, G_TYPE_NONE);
- } else if (strcmp (webkit_user_message_get_name (response), "error") == 0) {
- ret = jsc_value_function_call (message_data->reject_callback, G_TYPE_STRING, json, G_TYPE_NONE);
- } else {
- value = jsc_value_new_from_json (context, json);
- ret = jsc_value_function_call (message_data->resolve_callback, JSC_TYPE_VALUE, value, G_TYPE_NONE);
- }
- }
-
- ephy_message_data_free (message_data);
- (void)ret;
-}
-
-static void
-ephy_send_message (const char *function_name,
- JSCValue *function_args,
- JSCValue *resolve_callback,
- JSCValue *reject_callback,
- gpointer user_data)
-{
- EphyWebExtensionExtension *extension = ephy_web_extension_extension_get ();
- guint page_id = GPOINTER_TO_UINT (user_data);
- WebKitUserMessage *message;
- g_autofree char *args_json = NULL;
-
- if (!jsc_value_is_function (reject_callback))
- return; /* Can't reject in this case. */
-
- if (!jsc_value_is_array (function_args) || !jsc_value_is_function (resolve_callback)) {
- g_autoptr (JSCValue) ret = jsc_value_function_call (reject_callback, G_TYPE_STRING,
"ephy_send_message(): Invalid Arguments", G_TYPE_NONE);
- return;
- }
-
- args_json = jsc_value_to_json (function_args, 0);
- message = webkit_user_message_new (function_name,
- g_variant_new ("(us)", page_id, args_json));
-
- webkit_web_extension_send_message_to_context (extension->extension, message, NULL,
- (GAsyncReadyCallback)on_send_message_finish,
- ephy_message_data_new (resolve_callback, reject_callback));
-}
-
static JSCValue *
ephy_get_view_objects (gpointer user_data)
{
@@ -281,26 +195,17 @@ window_object_cleared_cb (WebKitScriptWorld *world,
js_browser = jsc_context_get_value (js_context, "browser");
g_assert (!jsc_value_is_object (js_browser));
- js_function = jsc_value_new_function (js_context,
- "ephy_send_message",
- G_CALLBACK (ephy_send_message),
- GUINT_TO_POINTER (webkit_web_page_get_id (page)), NULL,
- G_TYPE_NONE,
- 4,
- G_TYPE_STRING,
- JSC_TYPE_VALUE,
- JSC_TYPE_VALUE,
- JSC_TYPE_VALUE);
- jsc_context_set_value (js_context, "ephy_send_message", js_function);
- g_clear_object (&js_function);
-
bytes = g_resources_lookup_data ("/org/gnome/epiphany-web-extension/js/webextensions-common.js",
G_RESOURCE_LOOKUP_FLAGS_NONE, NULL);
data = g_bytes_get_data (bytes, &data_size);
result = jsc_context_evaluate_with_source_uri (js_context, data, data_size,
"resource:///org/gnome/epiphany-web-extension/js/webextensions-common.js", 1);
g_bytes_unref (bytes);
g_clear_object (&result);
- ephy_webextension_install_common_apis (js_context, extension->guid, extension->translations);
+ ephy_webextension_install_common_apis (extension->extension,
+ js_context,
+ extension->guid,
+ webkit_web_page_get_id (page),
+ extension->translations);
js_browser = jsc_context_get_value (js_context, "browser");
js_extension = jsc_value_object_get_property (js_browser, "extension");
diff --git a/embed/web-process-extension/ephy-webextension-common.c
b/embed/web-process-extension/ephy-webextension-common.c
index 473ab9ccd..9fd984cb5 100644
--- a/embed/web-process-extension/ephy-webextension-common.c
+++ b/embed/web-process-extension/ephy-webextension-common.c
@@ -22,6 +22,98 @@
#include <locale.h>
+typedef struct {
+ WebKitWebExtension *extension;
+ guint64 page_id;
+} EphySendMessageData;
+
+typedef struct {
+ JSCValue *resolve_callback;
+ JSCValue *reject_callback;
+} EphyCallbackData;
+
+static void
+ephy_callback_data_free (EphyCallbackData *data)
+{
+ g_object_unref (data->reject_callback);
+ g_object_unref (data->resolve_callback);
+ g_free (data);
+}
+
+static EphyCallbackData *
+ephy_callback_data_new (JSCValue *resolve_callback,
+ JSCValue *reject_callback)
+{
+ EphyCallbackData *data = g_new (EphyCallbackData, 1);
+ data->resolve_callback = g_object_ref (resolve_callback);
+ data->reject_callback = g_object_ref (reject_callback);
+ return data;
+}
+
+static void
+on_send_message_finish (WebKitWebExtension *extension,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ EphyCallbackData *callback_data = user_data;
+ g_autoptr (GError) error = NULL;
+ g_autoptr (WebKitUserMessage) response = NULL;
+ g_autoptr (JSCValue) ret = NULL;
+
+ response = webkit_web_extension_send_message_to_context_finish (extension, result, &error);
+
+ if (error) {
+ ret = jsc_value_function_call (callback_data->reject_callback, G_TYPE_STRING, error->message,
G_TYPE_NONE);
+ } else {
+ const char *json = g_variant_get_string (webkit_user_message_get_parameters (response), NULL);
+ g_autoptr (JSCValue) value = NULL;
+ JSCContext *context = jsc_value_get_context (callback_data->resolve_callback);
+
+ if (strcmp (json, "") == 0) {
+ value = jsc_value_new_undefined (context);
+ ret = jsc_value_function_call (callback_data->resolve_callback, JSC_TYPE_VALUE, value, G_TYPE_NONE);
+ } else if (strcmp (webkit_user_message_get_name (response), "error") == 0) {
+ ret = jsc_value_function_call (callback_data->reject_callback, G_TYPE_STRING, json, G_TYPE_NONE);
+ } else {
+ value = jsc_value_new_from_json (context, json);
+ ret = jsc_value_function_call (callback_data->resolve_callback, JSC_TYPE_VALUE, value, G_TYPE_NONE);
+ }
+ }
+
+ ephy_callback_data_free (callback_data);
+ (void)ret;
+}
+
+static void
+ephy_send_message (const char *function_name,
+ JSCValue *function_args,
+ JSCValue *resolve_callback,
+ JSCValue *reject_callback,
+ gpointer user_data)
+{
+ EphySendMessageData *send_message_data = user_data;
+ WebKitWebExtension *extension = send_message_data->extension;
+ guint64 page_id = send_message_data->page_id;
+ WebKitUserMessage *message;
+ g_autofree char *args_json = NULL;
+
+ if (!jsc_value_is_function (reject_callback))
+ return; /* Can't reject in this case. */
+
+ if (!jsc_value_is_array (function_args) || !jsc_value_is_function (resolve_callback)) {
+ g_autoptr (JSCValue) ret = jsc_value_function_call (reject_callback, G_TYPE_STRING,
"ephy_send_message(): Invalid Arguments", G_TYPE_NONE);
+ return;
+ }
+
+ args_json = jsc_value_to_json (function_args, 0);
+ message = webkit_user_message_new (function_name,
+ g_variant_new ("(ts)", page_id, args_json));
+
+ webkit_web_extension_send_message_to_context (extension, message, NULL,
+ (GAsyncReadyCallback)on_send_message_finish,
+ ephy_callback_data_new (resolve_callback, reject_callback));
+}
+
static char *
js_getmessage (const char *message,
gpointer user_data)
@@ -83,9 +175,11 @@ js_exception_handler (JSCContext *context,
}
void
-ephy_webextension_install_common_apis (JSCContext *js_context,
- const char *guid,
- JsonObject *translations)
+ephy_webextension_install_common_apis (WebKitWebExtension *extension,
+ JSCContext *js_context,
+ const char *guid,
+ guint64 page_id,
+ JsonObject *translations)
{
g_autoptr (JSCValue) result = NULL;
g_autoptr (JSCValue) js_browser = NULL;
@@ -93,6 +187,7 @@ ephy_webextension_install_common_apis (JSCContext *js_context,
g_autoptr (JSCValue) js_extension = NULL;
g_autoptr (JSCValue) js_function = NULL;
g_autoptr (JSCValue) js_object = NULL;
+ EphySendMessageData *send_message_data;
jsc_context_push_exception_handler (js_context, (JSCExceptionHandler)js_exception_handler, NULL, NULL);
@@ -135,4 +230,22 @@ ephy_webextension_install_common_apis (JSCContext *js_context,
G_TYPE_STRING);
jsc_value_object_set_property (js_extension, "getURL", js_function);
g_clear_object (&js_function);
+
+ /* global functions */
+ send_message_data = g_new (EphySendMessageData, 1);
+ send_message_data->extension = extension;
+ send_message_data->page_id = page_id;
+ js_function = jsc_value_new_function (js_context,
+ NULL,
+ G_CALLBACK (ephy_send_message),
+ send_message_data, g_free,
+ G_TYPE_NONE,
+ 4,
+ G_TYPE_STRING,
+ JSC_TYPE_VALUE,
+ JSC_TYPE_VALUE,
+ JSC_TYPE_VALUE);
+ jsc_context_set_value (js_context, "ephy_send_message", js_function);
+ g_clear_object (&js_function);
+
}
diff --git a/embed/web-process-extension/ephy-webextension-common.h
b/embed/web-process-extension/ephy-webextension-common.h
index a37d0605f..586bc43d2 100644
--- a/embed/web-process-extension/ephy-webextension-common.h
+++ b/embed/web-process-extension/ephy-webextension-common.h
@@ -23,11 +23,14 @@
#include <glib-object.h>
#include <jsc/jsc.h>
#include <json-glib/json-glib.h>
+#include <webkit2/webkit-web-extension.h>
G_BEGIN_DECLS
-void ephy_webextension_install_common_apis (JSCContext *js_context,
- const char *guid,
- JsonObject *translations);
+void ephy_webextension_install_common_apis (WebKitWebExtension *extension,
+ JSCContext *js_context,
+ const char *guid,
+ guint64 page_id,
+ JsonObject *translations);
G_END_DECLS
diff --git a/src/webextension/ephy-web-extension-manager.c b/src/webextension/ephy-web-extension-manager.c
index 956c5f928..37d896e70 100644
--- a/src/webextension/ephy-web-extension-manager.c
+++ b/src/webextension/ephy-web-extension-manager.c
@@ -518,10 +518,10 @@ ephy_web_extension_handle_user_message (WebKitWebContext *context,
g_autoptr (JSCValue) args = NULL;
const char *name = webkit_user_message_get_name (message);
g_auto (GStrv) split = NULL;
- guint page_id;
+ guint64 page_id;
const char *json_args;
- g_variant_get (webkit_user_message_get_parameters (message), "(u&s)", &page_id, &json_args);
+ g_variant_get (webkit_user_message_get_parameters (message), "(t&s)", &page_id, &json_args);
js_context = jsc_context_new ();
args = jsc_value_new_from_json (js_context, json_args);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]