summaryrefslogtreecommitdiff
path: root/webext-surf.c
diff options
context:
space:
mode:
authorQuentin Rameau <quinq@fifth.space>2022-10-16 17:39:05 +0200
committerQuentin Rameau <quinq@fifth.space>2022-10-16 17:39:05 +0200
commit665a709b522a6fa18c671f1fc41297603292d0e8 (patch)
treeb0eec87c8965f307e99fd33a2804546ebb8c594d /webext-surf.c
parent609ea1c8e620ed38e71bf03a46a759c042e76500 (diff)
webext: Exchange fd over webkit messages
This is more complex, but webkit2gtk prevents passing file descriptors to processes in 2.38.0.
Diffstat (limited to 'webext-surf.c')
-rw-r--r--webext-surf.c42
1 files changed, 37 insertions, 5 deletions
diff --git a/webext-surf.c b/webext-surf.c
index d087219..69fd04b 100644
--- a/webext-surf.c
+++ b/webext-surf.c
@@ -87,15 +87,29 @@ readsock(GIOChannel *s, GIOCondition c, gpointer unused)
return TRUE;
}
-G_MODULE_EXPORT void
-webkit_web_extension_initialize_with_user_data(WebKitWebExtension *e,
- const GVariant *gv)
+static void
+pageusermessagereply(GObject *o, GAsyncResult *r, gpointer page)
{
+ WebKitUserMessage *m;
+ GUnixFDList *gfd;
GIOChannel *gchansock;
+ const char *name;
+ int nfd;
- webext = e;
+ m = webkit_web_page_send_message_to_view_finish(page, r, NULL);
+ name = webkit_user_message_get_name(m);
+ if (strcmp(name, "surf-pipe") != 0) {
+ fprintf(stderr, "webext-surf: Unknown User Reply: %s\n", name);
+ return;
+ }
- g_variant_get(gv, "i", &sock);
+ gfd = webkit_user_message_get_fd_list(m);
+ if ((nfd = g_unix_fd_list_get_length(gfd)) != 1) {
+ fprintf(stderr, "webext-surf: Too many file-descriptors: %d\n", nfd);
+ return;
+ }
+
+ sock = g_unix_fd_list_get(gfd, 0, NULL);
gchansock = g_io_channel_unix_new(sock);
g_io_channel_set_encoding(gchansock, NULL, NULL);
@@ -104,3 +118,21 @@ webkit_web_extension_initialize_with_user_data(WebKitWebExtension *e,
g_io_channel_set_close_on_unref(gchansock, TRUE);
g_io_add_watch(gchansock, G_IO_IN, readsock, NULL);
}
+
+void
+pagecreated(WebKitWebExtension *e, WebKitWebPage *p, gpointer unused)
+{
+ WebKitUserMessage *msg;
+
+ msg = webkit_user_message_new("page-created", NULL);
+ webkit_web_page_send_message_to_view(p, msg, NULL, pageusermessagereply, p);
+}
+
+G_MODULE_EXPORT void
+webkit_web_extension_initialize(WebKitWebExtension *e)
+{
+ webext = e;
+
+ g_signal_connect(G_OBJECT(e), "page-created",
+ G_CALLBACK(pagecreated), NULL);
+}