[epiphany/pgriffis/web-extension-beastify: 2/6] webextensions: Dynamically create popup action




commit de22fee92e926349a9c5b54bd86eb249a34f25b5
Author: Patrick Griffis <pgriffis igalia com>
Date:   Fri May 13 12:32:00 2022 -0500

    webextensions: Dynamically create popup action
    
    This is not intended to be a long lived web view.

 src/webextension/ephy-web-extension-manager.c | 31 +++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)
---
diff --git a/src/webextension/ephy-web-extension-manager.c b/src/webextension/ephy-web-extension-manager.c
index 128206d40..f2a36cf67 100644
--- a/src/webextension/ephy-web-extension-manager.c
+++ b/src/webextension/ephy-web-extension-manager.c
@@ -693,23 +693,23 @@ static GtkWidget *
 create_browser_popup (EphyWebExtension *web_extension)
 {
   GtkWidget *web_view;
-  GtkWidget *popover;
   g_autofree char *data = NULL;
   g_autofree char *base_uri = NULL;
   const char *popup;
 
-  popover = gtk_popover_new (NULL);
-
+  popup = ephy_web_extension_get_browser_popup (web_extension);
+  data = ephy_web_extension_get_resource_as_string (web_extension, popup);
+  if (!data)
+    return NULL;
   web_view = create_web_extensions_webview (web_extension);
 
   popup = ephy_web_extension_get_browser_popup (web_extension);
   base_uri = create_base_uri_for_resource_path (web_extension, popup);
   data = ephy_web_extension_get_resource_as_string (web_extension, popup);
   webkit_web_view_load_html (WEBKIT_WEB_VIEW (web_view), (char *)data, base_uri);
-  gtk_container_add (GTK_CONTAINER (popover), web_view);
   gtk_widget_show_all (web_view);
 
-  return popover;
+  return web_view;
 }
 
 static gboolean
@@ -732,6 +732,24 @@ on_browser_action_clicked (GtkWidget *event_box,
   return GDK_EVENT_STOP;
 }
 
+static void
+on_browser_action_toggled (GtkToggleButton *button, gpointer user_data)
+{
+  EphyWebExtension *web_extension = EPHY_WEB_EXTENSION(user_data);
+  GtkPopover *popover = gtk_menu_button_get_popover (GTK_MENU_BUTTON (button));
+  GtkWidget *child;
+  
+  if (gtk_toggle_button_get_active (button)) {
+    child = create_browser_popup (web_extension);
+    gtk_container_add (GTK_CONTAINER (popover), child);
+    /* FIXME: We need to dynamically resize the popover.
+       However the webview never emits "ready-to-show" and the window-properties geometry is always 0. */
+    gtk_widget_set_size_request (child, 800, 600);
+  } else {
+    child = gtk_bin_get_child (GTK_BIN (popover));
+    gtk_widget_destroy (child);
+  }
+}
 
 GtkWidget *
 create_browser_action (EphyWebExtension *web_extension)
@@ -743,7 +761,8 @@ create_browser_action (EphyWebExtension *web_extension)
   if (ephy_web_extension_get_browser_popup (web_extension)) {
     button = gtk_menu_button_new ();
     image = gtk_image_new_from_pixbuf (ephy_web_extension_browser_action_get_icon (web_extension, 16));
-    popover = create_browser_popup (web_extension);
+    popover = gtk_popover_new (NULL);
+    g_signal_connect (button, "toggled", G_CALLBACK(on_browser_action_toggled), web_extension);
     gtk_menu_button_set_popover (GTK_MENU_BUTTON (button), popover);
 
     gtk_button_set_image (GTK_BUTTON (button), image);


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