[epiphany/pgriffis/web-extension/tabs] WebExtensions: Implement tabs.onAttached and tabs.onCreated



commit bd962ce94de8a63c25a33a439d9565133d36fc5f
Author: Patrick Griffis <pgriffis igalia com>
Date:   Thu Jun 2 21:27:55 2022 -0500

    WebExtensions: Implement tabs.onAttached and tabs.onCreated

 .../resources/js/webextensions-common.js           |  4 +-
 src/webextension/api/tabs.c                        | 37 +++++++++------
 src/webextension/api/tabs.h                        |  5 +++
 src/webextension/ephy-web-extension-manager.c      | 52 ++++++++++++++++++++++
 4 files changed, 83 insertions(+), 15 deletions(-)
---
diff --git a/embed/web-process-extension/resources/js/webextensions-common.js 
b/embed/web-process-extension/resources/js/webextensions-common.js
index 0cba51763..2a7587d3f 100644
--- a/embed/web-process-extension/resources/js/webextensions-common.js
+++ b/embed/web-process-extension/resources/js/webextensions-common.js
@@ -22,9 +22,9 @@ class EphyEventListener {
         return !!this._listeners.find(l => l.callback === cb);
     }
 
-    _emit (data) {
+    _emit (...data) {
         for (const listener of this._listeners)
-            listener.callback (data);
+            listener.callback (...data);
     }
 
     _emit_with_reply (message, sender, message_guid) {
diff --git a/src/webextension/api/tabs.c b/src/webextension/api/tabs.c
index 0bf34632f..31b7f3136 100644
--- a/src/webextension/api/tabs.c
+++ b/src/webextension/api/tabs.c
@@ -66,11 +66,11 @@ get_web_view_for_tab_id (EphyShell   *shell,
   return NULL;
 }
 
-static void
-add_web_view_to_json (JsonBuilder *builder,
-                      EphyWindow  *window,
-                      EphyWebView *web_view,
-                      gboolean     has_tab_permission)
+void
+tabs_add_web_view_to_json (JsonBuilder *builder,
+                           EphyWindow  *window,
+                           EphyWebView *web_view,
+                           gboolean     has_tab_permission)
 {
   EphyTabView *tab_view = ephy_window_get_tab_view (window);
   GtkWidget *page = gtk_widget_get_parent (gtk_widget_get_parent (GTK_WIDGET (web_view)));
@@ -259,8 +259,8 @@ tabs_handler_query (EphyWebExtension  *self,
       else if (active == TAB_QUERY_DONT_MATCH && web_view == active_web_view)
         continue;
 
-      add_web_view_to_json (builder, window, web_view,
-                            ephy_web_extension_has_tab_or_host_permission (self, web_view, TRUE));
+      tabs_add_web_view_to_json (builder, window, web_view,
+                                 ephy_web_extension_has_tab_or_host_permission (self, web_view, TRUE));
     }
   }
 
@@ -405,8 +405,8 @@ tabs_handler_get (EphyWebExtension  *self,
     return NULL;
   }
 
-  add_web_view_to_json (builder, parent_window, target_web_view,
-                        ephy_web_extension_has_tab_or_host_permission (self, target_web_view, TRUE));
+  tabs_add_web_view_to_json (builder, parent_window, target_web_view,
+                             ephy_web_extension_has_tab_or_host_permission (self, target_web_view, TRUE));
   root = json_builder_get_root (builder);
 
   return json_to_string (root, FALSE);
@@ -629,8 +629,8 @@ tabs_handler_create (EphyWebExtension  *self,
     ephy_web_view_load_new_tab_page (web_view);
 
   builder = json_builder_new ();
-  add_web_view_to_json (builder, parent_window, web_view,
-                        ephy_web_extension_has_tab_or_host_permission (self, web_view, TRUE));
+  tabs_add_web_view_to_json (builder, parent_window, web_view,
+                             ephy_web_extension_has_tab_or_host_permission (self, web_view, TRUE));
   root = json_builder_get_root (builder);
   return json_to_string (root, FALSE);
 }
@@ -694,8 +694,8 @@ tabs_handler_update (EphyWebExtension  *self,
     webkit_web_view_load_uri (web_view, new_url);
 
   builder = json_builder_new ();
-  add_web_view_to_json (builder, parent_window, EPHY_WEB_VIEW (web_view),
-                        ephy_web_extension_has_tab_or_host_permission (self, EPHY_WEB_VIEW (web_view), 
TRUE));
+  tabs_add_web_view_to_json (builder, parent_window, EPHY_WEB_VIEW (web_view),
+                             ephy_web_extension_has_tab_or_host_permission (self, EPHY_WEB_VIEW (web_view), 
TRUE));
   root = json_builder_get_root (builder);
   return json_to_string (root, FALSE);
 }
@@ -830,6 +830,16 @@ tabs_handler_get_zoom (EphyWebExtension  *self,
   return g_strdup_printf ("%f", webkit_web_view_get_zoom_level (web_view));
 }
 
+static void
+tabs_handler_go_back (EphyWebExtension  *self,
+                      char              *name,
+                      JSCValue          *args,
+                      gint64             extension_page_id,
+                      GTask             *task)
+{
+
+}
+
 static EphyWebExtensionSyncApiHandler tabs_sync_handlers[] = {
   {"create", tabs_handler_create},
   {"query", tabs_handler_query},
@@ -845,6 +855,7 @@ static EphyWebExtensionSyncApiHandler tabs_sync_handlers[] = {
 
 static EphyWebExtensionAsyncApiHandler tab_async_handlers[] = {
   {"executeScript", tabs_handler_execute_script},
+  {"goBack", tabs_handler_go_back},
 };
 
 void
diff --git a/src/webextension/api/tabs.h b/src/webextension/api/tabs.h
index 367857ace..0fe9951af 100644
--- a/src/webextension/api/tabs.h
+++ b/src/webextension/api/tabs.h
@@ -33,4 +33,9 @@ void ephy_web_extension_api_tabs_handler (EphyWebExtension *self,
                                           gint64            extension_page_id,
                                           GTask            *task);
 
+void tabs_add_web_view_to_json (JsonBuilder *builder,
+                                EphyWindow  *window,
+                                EphyWebView *web_view,
+                                gboolean     has_tab_permission);
+
 G_END_DECLS
diff --git a/src/webextension/ephy-web-extension-manager.c b/src/webextension/ephy-web-extension-manager.c
index a61ec724d..b9549f44d 100644
--- a/src/webextension/ephy-web-extension-manager.c
+++ b/src/webextension/ephy-web-extension-manager.c
@@ -59,6 +59,8 @@ struct _EphyWebExtensionManager {
   GHashTable *popup_web_views;
 
   GHashTable *pending_messages;
+
+  GHashTable *known_tab_ids;
 };
 
 G_DEFINE_TYPE (EphyWebExtensionManager, ephy_web_extension_manager, G_TYPE_OBJECT)
@@ -215,6 +217,7 @@ ephy_web_extension_manager_constructed (GObject *object)
   self->page_action_map = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_hash_table_destroy);
   self->browser_action_map = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)destroy_widget_list);
   self->pending_messages = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, 
(GDestroyNotify)g_hash_table_destroy);
+  self->known_tab_ids = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, 
(GDestroyNotify)g_hash_table_destroy);
   self->web_extensions = NULL;
 
   ephy_web_extension_manager_scan_directory (self, dir);
@@ -229,6 +232,7 @@ ephy_web_extension_manager_dispose (GObject *object)
   g_clear_pointer (&self->popup_web_views, g_hash_table_destroy);
   g_clear_pointer (&self->page_action_map, g_hash_table_destroy);
   g_clear_pointer (&self->pending_messages, g_hash_table_destroy);
+  g_clear_pointer (&self->known_tab_ids, g_hash_table_destroy);
   g_list_free_full (g_steal_pointer (&self->web_extensions), g_object_unref);
 }
 
@@ -639,6 +643,33 @@ update_translations (EphyWebExtension *web_extension)
                                                                               g_variant_new ("(ss)", 
ephy_web_extension_get_guid (web_extension), data)));
 }
 
+static gboolean
+register_tab_id (EphyWebExtensionManager *self,
+                 EphyWebExtension        *web_extension,
+                 guint64                  tab_id)
+{
+  GHashTable *tab_ids = g_hash_table_lookup (self->known_tab_ids, web_extension);
+  if (!tab_ids) {
+    tab_ids = g_hash_table_new (NULL, NULL);
+    g_hash_table_insert (self->known_tab_ids, web_extension, tab_ids);
+  }
+
+  /* Returns TRUE if this is a *new* tab. */
+  return g_hash_table_add (tab_ids, GUINT_TO_POINTER (tab_id));
+}
+
+#if 0
+static void
+unregister_tab_id (EphyWebExtensionManager *self,
+                   EphyWebExtension        *web_extension,
+                   guint64                  tab_id)
+{
+  GHashTable *tab_ids = g_hash_table_lookup (self->known_tab_ids, web_extension);
+  g_assert (tab_ids);
+  g_hash_table_remove (tab_ids, GUINT_TO_POINTER (tab_id));
+}
+#endif
+
 static void
 ephy_web_extension_manager_add_web_extension_to_webview (EphyWebExtensionManager *self,
                                                          EphyWebExtension        *web_extension,
@@ -687,6 +718,27 @@ page_attached_cb (HdyTabView *tab_view,
 
   ephy_web_extension_manager_add_web_extension_to_webview (self, web_extension, window, web_view);
   ephy_web_extension_manager_update_location_entry (self, window);
+
+  /* HdyTabView doesn't distingush between attached and created so we track this. */
+  if (register_tab_id (self, web_extension, ephy_web_view_get_uid (web_view))) {
+    g_autoptr (JsonBuilder) builder = json_builder_new ();
+    g_autoptr (JsonNode) root = NULL;
+    g_autofree char *created_info = NULL;
+
+    tabs_add_web_view_to_json (builder, window, web_view,
+                               ephy_web_extension_has_tab_or_host_permission (web_extension, web_view, 
FALSE));
+    root = json_builder_get_root (builder);
+    created_info = json_to_string (root, FALSE);
+
+    ephy_web_extension_manager_emit_in_extension_views (self, web_extension, "tabs.onCreated", created_info);
+  } else {
+    g_autofree char *attached_info = NULL;
+    attached_info = g_strdup_printf ("%ld, {newWindowId: %ld, newPosition: %d}",
+                                    ephy_web_view_get_uid (web_view),
+                                    ephy_window_get_uid (window),
+                                    position);
+    ephy_web_extension_manager_emit_in_extension_views (self, web_extension, "tabs.onAttached", 
attached_info);
+  }
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]