1 #include <sys/socket.h>
10 #include <gio/gunixfdlist.h>
11 #include <webkit2/webkit-web-extension.h>
12 #include <webkitdom/webkitdom.h>
13 #include <webkitdom/WebKitDOMDOMWindowUnstable.h>
17 #define LENGTH(x) (sizeof(x) / sizeof(x[0]))
19 static WebKitWebExtension
*webext
;
23 msgsurf(guint64 pageid
, const char *s
)
25 static char msg
[MSGBUFSZ
];
26 size_t sln
= strlen(s
);
29 if ((ret
= snprintf(msg
, sizeof(msg
), "%c%s", pageid
, s
))
31 fprintf(stderr
, "webext: msg: message too long: %d\n", ret
);
35 if (send(sock
, msg
, ret
, 0) < 0)
36 fprintf(stderr
, "webext: error sending: %s\n", msg
+1);
40 readsock(GIOChannel
*s
, GIOCondition c
, gpointer unused
)
42 static char js
[48], msg
[MSGBUFSZ
];
48 if (g_io_channel_read_chars(s
, msg
, sizeof(msg
), &msgsz
, &gerr
) !=
51 fprintf(stderr
, "webext: error reading socket: %s\n",
59 fprintf(stderr
, "webext: readsock: message too short: %d\n",
64 if (!(page
= webkit_web_extension_get_page(webext
, msg
[0])))
67 jsc
= webkit_frame_get_js_context(webkit_web_page_get_main_frame(page
));
73 snprintf(js
, sizeof(js
),
74 "window.scrollBy(window.innerWidth/100*%d,0);",
76 jsc_context_evaluate(jsc
, js
, -1);
81 snprintf(js
, sizeof(js
),
82 "window.scrollBy(0,window.innerHeight/100*%d);",
84 jsc_context_evaluate(jsc
, js
, -1);
92 pageusermessagereply(GObject
*o
, GAsyncResult
*r
, gpointer page
)
96 GIOChannel
*gchansock
;
100 m
= webkit_web_page_send_message_to_view_finish(page
, r
, NULL
);
101 name
= webkit_user_message_get_name(m
);
102 if (strcmp(name
, "surf-pipe") != 0) {
103 fprintf(stderr
, "webext-surf: Unknown User Reply: %s\n", name
);
107 gfd
= webkit_user_message_get_fd_list(m
);
108 if ((nfd
= g_unix_fd_list_get_length(gfd
)) != 1) {
109 fprintf(stderr
, "webext-surf: Too many file-descriptors: %d\n", nfd
);
113 sock
= g_unix_fd_list_get(gfd
, 0, NULL
);
115 gchansock
= g_io_channel_unix_new(sock
);
116 g_io_channel_set_encoding(gchansock
, NULL
, NULL
);
117 g_io_channel_set_flags(gchansock
, g_io_channel_get_flags(gchansock
)
118 | G_IO_FLAG_NONBLOCK
, NULL
);
119 g_io_channel_set_close_on_unref(gchansock
, TRUE
);
120 g_io_add_watch(gchansock
, G_IO_IN
, readsock
, NULL
);
124 pagecreated(WebKitWebExtension
*e
, WebKitWebPage
*p
, gpointer unused
)
126 WebKitUserMessage
*msg
;
128 msg
= webkit_user_message_new("page-created", NULL
);
129 webkit_web_page_send_message_to_view(p
, msg
, NULL
, pageusermessagereply
, p
);
133 webkit_web_extension_initialize(WebKitWebExtension
*e
)
137 g_signal_connect(G_OBJECT(e
), "page-created",
138 G_CALLBACK(pagecreated
), NULL
);