diff options
author | Quentin Rameau <quinq@fifth.space> | 2022-10-16 17:39:05 +0200 |
---|---|---|
committer | Quentin Rameau <quinq@fifth.space> | 2022-10-16 17:39:05 +0200 |
commit | 665a709b522a6fa18c671f1fc41297603292d0e8 (patch) | |
tree | b0eec87c8965f307e99fd33a2804546ebb8c594d /webext-surf.c | |
parent | 609ea1c8e620ed38e71bf03a46a759c042e76500 (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.c | 42 |
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); +} |