X-Git-Url: https://git.danieliu.xyz/?p=surf.git;a=blobdiff_plain;f=libsurf-webext.c;h=ec9a2356f6facb08396babfa5fc7577c30fdcbd4;hp=6c3deb72c6224174a958c1f86583f4c6b86568a2;hb=c6f48298df2ff2c4a3c7bf2948bbc5fad7628ebc;hpb=7ea0c2f7f8c5cc4616d8dc0676f7b4b59351667b diff --git a/libsurf-webext.c b/libsurf-webext.c index 6c3deb7..ec9a235 100644 --- a/libsurf-webext.c +++ b/libsurf-webext.c @@ -8,14 +8,13 @@ #include #include -#define LENGTH(x) (sizeof(x) / sizeof(x[0])) +#include "common.h" -#define MSGBUFSZ 32 +#define LENGTH(x) (sizeof(x) / sizeof(x[0])) typedef struct Page { guint64 id; WebKitWebPage *webpage; - WebKitDOMDOMWindow *view; struct Page *next; } Page; @@ -42,76 +41,74 @@ newpage(WebKitWebPage *page) static void msgsurf(Page *p, const char *s) { - char msg[MSGBUFSZ]; + static char msg[MSGBUFSZ]; + size_t sln = strlen(s); int ret; - msg[0] = p ? p->id : 0; - ret = snprintf(&msg[1], sizeof(msg) - 1, "%s", s); - if (ret >= sizeof(msg)) { + if ((ret = snprintf(msg, sizeof(msg), "%c%c%s", + 2 + sln, p ? p->id : 0, s)) + >= sizeof(msg)) { fprintf(stderr, "webext: message too long: %d\n", ret); return; } - if (pipeout) { - if (write(pipeout, msg, sizeof(msg)) < 0) - fprintf(stderr, "webext: error sending: %s\n", msg); - } + if (pipeout && write(pipeout, msg, sizeof(msg)) < 0) + fprintf(stderr, "webext: error sending: %.*s\n", ret-2, msg+2); } static gboolean readpipe(GIOChannel *s, GIOCondition c, gpointer unused) { - char msg[MSGBUFSZ]; - gsize msgsz; + static char msg[MSGBUFSZ], msgsz; + WebKitDOMDOMWindow *view; GError *gerr = NULL; 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, LENGTH(msg), NULL, &gerr) != G_IO_STATUS_NORMAL) { fprintf(stderr, "webext: error reading pipe: %s\n", gerr->message); g_error_free(gerr); return TRUE; } - msg[msgsz] = '\0'; + if ((msgsz = msg[0]) < 3) { + fprintf(stderr, "webext: message too short: %d\n", msgsz); + return TRUE; + } for (p = pages; p; p = p->next) { - if (p->id == msg[0]) + if (p->id == msg[1]) break; } - if (!p || !p->view) + if (!p || !(view = webkit_dom_document_get_default_view( + webkit_web_page_get_dom_document(p->webpage)))) return TRUE; - switch (msg[1]) { + switch (msg[2]) { case 'h': - ww = webkit_dom_dom_window_get_inner_width(p->view); - webkit_dom_dom_window_scroll_by(p->view, - (ww / 100) * msg[2], 0); + if (msgsz != 4) + return TRUE; + ww = webkit_dom_dom_window_get_inner_width(view); + webkit_dom_dom_window_scroll_by(view, + (ww / 100) * msg[3], 0); break; case 'v': - wh = webkit_dom_dom_window_get_inner_height(p->view); - webkit_dom_dom_window_scroll_by(p->view, - 0, (wh / 100) * msg[2]); + if (msgsz != 4) + return TRUE; + wh = webkit_dom_dom_window_get_inner_height(view); + webkit_dom_dom_window_scroll_by(view, + 0, (wh / 100) * msg[3]); break; } return TRUE; } -static void -documentloaded(WebKitWebPage *wp, Page *p) -{ - p->view = webkit_dom_document_get_default_view( - webkit_web_page_get_dom_document(wp)); -} - static void webpagecreated(WebKitWebExtension *e, WebKitWebPage *wp, gpointer unused) { Page *p = newpage(wp); - - g_signal_connect(wp, "document-loaded", G_CALLBACK(documentloaded), p); } G_MODULE_EXPORT void