[epiphany/pgriffis/web-extension/content-script-send-message: 1/2] WebExtensions: Move ephy_send_message() to common




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]