adji

Adji's a Decisive and Joyful Internet browser
git clone https://noxz.tech/git/adji.git
Log | Files | Tags | LICENSE

commit: 6b48d7c4024a5e497ebb4a11cd1c8087e629b65d
parent: 41835171d3e1928248a5c41bfd8fee516ce81227
author: Chris Noxz <chris@noxz.tech>
date:   Sun, 29 Dec 2024 17:27:18 +0100
implement popup blocker

popup policy 0: block
popup policy 1: allow
popup policy 2: handle externally using adjipu:-scheme
Mbrowser.c17+++++++++++++++++
Mbrowser.h16+++++++++++++---
Mconfig.h1+
3 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/browser.c b/browser.c
@@ -444,6 +444,23 @@ handle_fullscreen(
 	return TRUE;
 }
 
+void
+handle_popup(
+	const gchar                                *uri)
+{
+	char u[8192];
+	snprintf(u, sizeof(u), "%lu:%s", gl.embed, uri);
+
+	switch (CFG_I(CFN_POPUP_POLICY)) {
+	case PUP_ALLOW:
+		initialize(uri);
+		break;
+	case PUP_EXTERNAL:
+		xdg_open("adjipu:", u, TRUE);
+		break;
+	}
+}
+
 gboolean
 key_common(
 	GdkEventKey                                *event)
diff --git a/browser.h b/browser.h
@@ -130,6 +130,7 @@
 
 /*** Name translations ***/
 /*      name                original name                                   */
+#define get_request(A)      webkit_navigation_action_get_request((A))
 #define request_path(R)     webkit_uri_scheme_request_get_path((R))
 #define get_socket_win(W)   gtk_plug_get_socket_window(GTK_PLUG((W)))
 #define get_widget_win(W)   gtk_widget_get_window((W))
@@ -157,6 +158,12 @@ enum config_type {
 	CFG_LIST
 };
 
+enum popup_policy {
+	PUP_BLOCK               = 0,
+	PUP_ALLOW               = 1,
+	PUP_EXTERNAL            = 2
+};
+
 /** Enumerators for configurables  */
 enum config_name {
 	CFN_ACCEPTED_LANGUAGES,
@@ -180,6 +187,7 @@ enum config_name {
 	CFN_JS_OPEN_WINDOWS,
 	CFN_MONOSPACE_FONT,
 	CFN_NORMAL_TAB_FORMAT,
+	CFN_POPUP_POLICY,
 	CFN_PROXY_IGNORE,
 	CFN_PROXY_URI,
 	CFN_SANS_SERIF_FONT,
@@ -301,6 +309,10 @@ static gboolean handle_fullscreen(
 	gboolean                                    fullscreen
 );
 
+static void handle_popup(
+	const gchar                                *uri
+);
+
 static gboolean key_common(
 	GdkEventKey                                *event
 );
@@ -648,9 +660,7 @@ cb_wv_create(WebKitWebView                     *web_view,
 	(void)web_view;
 	(void)data;
 
-	initialize(
-	    webkit_uri_request_get_uri(
-	        webkit_navigation_action_get_request(navigation_action)));
+	handle_popup(webkit_uri_request_get_uri(get_request(navigation_action)));
 
 	return NULL;
 }
diff --git a/config.h b/config.h
@@ -49,6 +49,7 @@ static Config cfg[CFN_LAST] = {
 	[CFN_MONOSPACE_FONT]            = { __NAME_UPPERCASE__"_MONOSPACE_FONT",            "monospace-font-family",                    CFG_STRING, FALSE, {.s = "monospace" }},
 	[CFN_NORMAL_TAB_FORMAT]         = { NULL,                                           NULL,                                       CFG_STRING, FALSE, {.s = "<span>%s</span>" }},
 	[CFN_PROXY_IGNORE]              = { __NAME_UPPERCASE__"_PROXY_IGNORE",              NULL,                                       CFG_LIST,   FALSE, {.l = NULL }},
+	[CFN_POPUP_POLICY]              = { __NAME_UPPERCASE__"_POPUP_POLICY",              NULL,                                       CFG_INT,    FALSE, {.i = PUP_ALLOW }},
 	[CFN_PROXY_URI]                 = { __NAME_UPPERCASE__"_PROXY_URI",                 NULL,                                       CFG_STRING, FALSE, {.s = NULL }},
 	[CFN_SANS_SERIF_FONT]           = { __NAME_UPPERCASE__"_SANS_SERIF_FONT",           "sans-serif-font-family",                   CFG_STRING, FALSE, {.s = "sans-serif" }},
 	[CFN_SEARCH_ENGINE_URI_FORMAT]  = { __NAME_UPPERCASE__"_SE_URI_FORMAT",             NULL,                                       CFG_STRING, FALSE, {.s = "https://ddg.gg?q=%s" }},