[gnome-builder/wip/gtk4-port: 1388/1774] libide/webkit: dont allow leaving generated HTML pages




commit d165228d43ef580d7fa69c85f9b7db8d54563ebb
Author: Christian Hergert <chergert redhat com>
Date:   Tue Jun 7 00:44:12 2022 -0700

    libide/webkit: dont allow leaving generated HTML pages
    
    If we generated the HTML for the page, then it isn't meant to be navigated
    away from, as it's a preview. Instead show it in a new browser window
    above the workspace.

 src/libide/webkit/ide-webkit-page.c  | 35 +++++++++++++++++++++++++++++++++++
 src/libide/webkit/ide-webkit-page.ui |  1 +
 2 files changed, 36 insertions(+)
---
diff --git a/src/libide/webkit/ide-webkit-page.c b/src/libide/webkit/ide-webkit-page.c
index b5bc30680..f8af06ffe 100644
--- a/src/libide/webkit/ide-webkit-page.c
+++ b/src/libide/webkit/ide-webkit-page.c
@@ -152,6 +152,40 @@ ide_webkit_page_grab_focus (GtkWidget *widget)
     return gtk_widget_grab_focus (GTK_WIDGET (priv->web_view));
 }
 
+static gboolean
+on_web_view_decide_policy_cb (IdeWebkitPage            *self,
+                              WebKitPolicyDecision     *decision,
+                              WebKitPolicyDecisionType  decision_type,
+                              WebKitWebView            *web_view)
+{
+  IdeWebkitPagePrivate *priv = ide_webkit_page_get_instance_private (self);
+
+  g_assert (IDE_IS_WEBKIT_PAGE (self));
+  g_assert (WEBKIT_IS_POLICY_DECISION (decision));
+  g_assert (WEBKIT_IS_WEB_VIEW (web_view));
+
+  if (priv->generator == NULL)
+    return FALSE;
+
+  if (decision_type == WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION)
+    {
+      WebKitNavigationAction *action = webkit_navigation_policy_decision_get_navigation_action 
(WEBKIT_NAVIGATION_POLICY_DECISION (decision));
+      WebKitURIRequest *request = webkit_navigation_action_get_request (action);
+      const char *uri = webkit_uri_request_get_uri (request);
+      const char *base_uri = ide_html_generator_get_base_uri (priv->generator);
+
+      if (!ide_str_equal0 (uri, base_uri))
+        {
+          GtkRoot *root = gtk_widget_get_root (GTK_WIDGET (self));
+          ide_gtk_show_uri_on_window (GTK_WINDOW (root), uri, g_get_monotonic_time (), NULL);
+          webkit_policy_decision_ignore (decision);
+          return TRUE;
+        }
+    }
+
+  return FALSE;
+}
+
 static void
 go_forward_action (GSimpleAction *action,
                    GVariant      *param,
@@ -417,6 +451,7 @@ ide_webkit_page_class_init (IdeWebkitPageClass *klass)
   gtk_widget_class_bind_template_child_private (widget_class, IdeWebkitPage, web_view);
   gtk_widget_class_bind_template_callback (widget_class, on_toolbar_notify_visible_cb);
   gtk_widget_class_bind_template_callback (widget_class, ide_webkit_page_update_reload);
+  gtk_widget_class_bind_template_callback (widget_class, on_web_view_decide_policy_cb);
 
   g_type_ensure (WEBKIT_TYPE_SETTINGS);
   g_type_ensure (WEBKIT_TYPE_WEB_VIEW);
diff --git a/src/libide/webkit/ide-webkit-page.ui b/src/libide/webkit/ide-webkit-page.ui
index 849985407..c809725d2 100644
--- a/src/libide/webkit/ide-webkit-page.ui
+++ b/src/libide/webkit/ide-webkit-page.ui
@@ -13,6 +13,7 @@
             <property name="vexpand">true</property>
             <signal name="notify::is-loading" handler="ide_webkit_page_update_reload" swapped="true" 
object="IdeWebkitPage"/>
             <signal name="notify::uri" handler="ide_webkit_page_update_reload" swapped="true" 
object="IdeWebkitPage"/>
+            <signal name="decide-policy" handler="on_web_view_decide_policy_cb" swapped="true" 
object="IdeWebkitPage"/>
           </object>
         </child>
         <child>


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