[epiphany/pgriffis/web-extension/tabs] WebExtensions: Implement tabs.onAttached and tabs.onCreated
- From: Patrick Griffis <pgriffis src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany/pgriffis/web-extension/tabs] WebExtensions: Implement tabs.onAttached and tabs.onCreated
- Date: Fri, 3 Jun 2022 03:09:17 +0000 (UTC)
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]