commit 55c65b21f6d94f4042d222f8bde46e1555108c66
Author:     Quentin Rameau <[email protected]>
AuthorDate: Sat May 2 15:50:50 2020 +0200
Commit:     Quentin Rameau <[email protected]>
CommitDate: Sun Nov 1 16:59:12 2020 +0100

    Simplify communication with webext

diff --git a/surf.c b/surf.c
index 566b605..ac832ff 100644
--- a/surf.c
+++ b/surf.c
@@ -7,6 +7,7 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <glib.h>
+#include <inttypes.h>
 #include <libgen.h>
 #include <limits.h>
 #include <pwd.h>
@@ -107,7 +108,7 @@ typedef struct Client {
        GTlsCertificate *cert, *failedcert;
        GTlsCertificateFlags tlserr;
        Window xid;
-       unsigned long pageid;
+       guint64 pageid;
        int progress, fullscreen, https, insecure, errorpage;
        const char *title, *overtitle, *targeturi;
        const char *needle;
@@ -366,7 +367,8 @@ setup(void)
        } else {
                gchanin = g_io_channel_unix_new(spair[0]);
                g_io_channel_set_encoding(gchanin, NULL, NULL);
-               g_io_channel_set_flags(gchanin, G_IO_FLAG_NONBLOCK, NULL);
+               g_io_channel_set_flags(gchanin, g_io_channel_get_flags(gchanin)
+                                      | G_IO_FLAG_NONBLOCK, NULL);
                g_io_channel_set_close_on_unref(gchanin, TRUE);
                g_io_add_watch(gchanin, G_IO_IN, readsock, NULL);
        }
@@ -1446,7 +1448,7 @@ createwindow(Client *c)
                gtk_window_set_wmclass(GTK_WINDOW(w), wmstr, "Surf");
                g_free(wmstr);
 
-               wmstr = g_strdup_printf("%s[%lu]", "Surf", c->pageid);
+               wmstr = g_strdup_printf("%s[%"PRIu64"]", "Surf", c->pageid);
                gtk_window_set_role(GTK_WINDOW(w), wmstr);
                g_free(wmstr);
 
@@ -1885,7 +1887,7 @@ msgext(Client *c, char type, const Arg *a)
        }
 
        if (send(spair[0], msg, ret, 0) != ret)
-               fprintf(stderr, "surf: error sending: %d%c%d (%dB)\n",
+               fprintf(stderr, "surf: error sending: %u%c%d (%d)\n",
                        c->pageid, type, a->i, ret);
 }
 
diff --git a/webext-surf.c b/webext-surf.c
index 775c1e8..d087219 100644
--- a/webext-surf.c
+++ b/webext-surf.c
@@ -1,6 +1,7 @@
 #include <sys/socket.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <inttypes.h>
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -14,42 +15,17 @@
 
 #define LENGTH(x)   (sizeof(x) / sizeof(x[0]))
 
-typedef struct Page {
-       guint64 id;
-       WebKitWebPage *webpage;
-       struct Page *next;
-} Page;
-
+static WebKitWebExtension *webext;
 static int sock;
-static Page *pages;
-
-Page *
-newpage(WebKitWebPage *page)
-{
-       Page *p;
-
-       if (!(p = calloc(1, sizeof(Page)))) {
-               fputs("Cannot malloc!\n", stderr);
-               exit(1);
-       }
-
-       p->next = pages;
-       pages = p;
-
-       p->id = webkit_web_page_get_id(page);
-       p->webpage = page;
-
-       return p;
-}
 
 static void
-msgsurf(Page *p, const char *s)
+msgsurf(guint64 pageid, const char *s)
 {
        static char msg[MSGBUFSZ];
        size_t sln = strlen(s);
        int ret;
 
-       if ((ret = snprintf(msg, sizeof(msg), "%c%s", p ? p->id : 0, s))
+       if ((ret = snprintf(msg, sizeof(msg), "%c%s", pageid, s))
            >= sizeof(msg)) {
                fprintf(stderr, "webext: msg: message too long: %d\n", ret);
                return;
@@ -62,14 +38,13 @@ msgsurf(Page *p, const char *s)
 static gboolean
 readsock(GIOChannel *s, GIOCondition c, gpointer unused)
 {
-       static char msg[MSGBUFSZ];
-       WebKitDOMDOMWindow *view;
+       static char js[48], msg[MSGBUFSZ];
+       WebKitWebPage *page;
+       JSCContext *jsc;
        GError *gerr = NULL;
        gsize msgsz;
-       glong wh, ww;
-       Page *p;
 
-       if (g_io_channel_read_chars(s, msg, LENGTH(msg), &msgsz, &gerr) !=
+       if (g_io_channel_read_chars(s, msg, sizeof(msg), &msgsz, &gerr) !=
            G_IO_STATUS_NORMAL) {
                if (gerr) {
                        fprintf(stderr, "webext: error reading socket: %s\n",
@@ -85,52 +60,47 @@ readsock(GIOChannel *s, GIOCondition c, gpointer unused)
                return TRUE;
        }
 
-       for (p = pages; p; p = p->next) {
-               if (p->id == msg[0])
-                       break;
-       }
-       if (!p || !(view = webkit_dom_document_get_default_view(
-                   webkit_web_page_get_dom_document(p->webpage))))
+       if (!(page = webkit_web_extension_get_page(webext, msg[0])))
                return TRUE;
 
+       jsc = webkit_frame_get_js_context(webkit_web_page_get_main_frame(page));
+
        switch (msg[1]) {
        case 'h':
                if (msgsz != 3)
                        return TRUE;
-               ww = webkit_dom_dom_window_get_inner_width(view);
-               webkit_dom_dom_window_scroll_by(view,
-                                               (ww / 100) * msg[2], 0);
+               snprintf(js, sizeof(js),
+                        "window.scrollBy(window.innerWidth/100*%d,0);",
+                        msg[2]);
+               jsc_context_evaluate(jsc, js, -1);
                break;
        case 'v':
                if (msgsz != 3)
                        return TRUE;
-               wh = webkit_dom_dom_window_get_inner_height(view);
-               webkit_dom_dom_window_scroll_by(view,
-                                               0, (wh / 100) * msg[2]);
+               snprintf(js, sizeof(js),
+                        "window.scrollBy(0,window.innerHeight/100*%d);",
+                        msg[2]);
+               jsc_context_evaluate(jsc, js, -1);
                break;
        }
 
        return TRUE;
 }
 
-static void
-webpagecreated(WebKitWebExtension *e, WebKitWebPage *wp, gpointer unused)
-{
-       Page *p = newpage(wp);
-}
-
 G_MODULE_EXPORT void
-webkit_web_extension_initialize_with_user_data(WebKitWebExtension *e, GVariant 
*gv)
+webkit_web_extension_initialize_with_user_data(WebKitWebExtension *e,
+                                               const GVariant *gv)
 {
        GIOChannel *gchansock;
 
-       g_signal_connect(e, "page-created", G_CALLBACK(webpagecreated), NULL);
+       webext = e;
 
        g_variant_get(gv, "i", &sock);
 
        gchansock = g_io_channel_unix_new(sock);
        g_io_channel_set_encoding(gchansock, NULL, NULL);
-       g_io_channel_set_flags(gchansock, G_IO_FLAG_NONBLOCK, NULL);
+       g_io_channel_set_flags(gchansock, g_io_channel_get_flags(gchansock)
+                              | G_IO_FLAG_NONBLOCK, NULL);
        g_io_channel_set_close_on_unref(gchansock, TRUE);
        g_io_add_watch(gchansock, G_IO_IN, readsock, NULL);
 }

Reply via email to