[gnome-builder/wip/gtk4-port: 1388/1774] libide/webkit: dont allow leaving generated HTML pages
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/gtk4-port: 1388/1774] libide/webkit: dont allow leaving generated HTML pages
- Date: Mon, 11 Jul 2022 22:31:44 +0000 (UTC)
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]