-gboolean
-buttonreleased(GtkWidget *w, GdkEventKey *e, Client *c)
-{
- WebKitHitTestResultContext element;
- GdkEventButton *eb = (GdkEventButton*)e;
- int i;
-
- element = webkit_hit_test_result_get_context(c->mousepos);
-
- for (i = 0; i < LENGTH(buttons); ++i) {
- if (element & buttons[i].target &&
- eb->button == buttons[i].button &&
- CLEANMASK(eb->state) == CLEANMASK(buttons[i].mask) &&
- buttons[i].func) {
- buttons[i].func(c, &buttons[i].arg, c->mousepos);
- return buttons[i].stopevent;
- }
- }
-
- return FALSE;
-}
-
-void
-cleanup(void)
-{
- while (clients)
- destroyclient(clients);
- g_free(cookiefile);
- g_free(scriptfile);
- g_free(stylefile);
- g_free(cachedir);
-}
-
-WebKitCookieAcceptPolicy
-cookiepolicy_get(void)
-{
- switch (cookiepolicies[cookiepolicy]) {
- case 'a':
- return WEBKIT_COOKIE_POLICY_ACCEPT_NEVER;
- case '@':
- return WEBKIT_COOKIE_POLICY_ACCEPT_NO_THIRD_PARTY;
- case 'A':
- default:
- break;
- }
-
- return WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS;
-}
-
-char
-cookiepolicy_set(const WebKitCookieAcceptPolicy ep)
-{
- switch (ep) {
- case WEBKIT_COOKIE_POLICY_ACCEPT_NEVER:
- return 'a';
- case WEBKIT_COOKIE_POLICY_ACCEPT_NO_THIRD_PARTY:
- return '@';
- case WEBKIT_COOKIE_POLICY_ACCEPT_ALWAYS:
- default:
- break;
- }
-
- return 'A';
-}
-
-void
-evalscript(Client *c, const char *jsstr, ...)
-{
- va_list ap;
- gchar *script;
-
- va_start(ap, jsstr);
- script = g_strdup_vprintf(jsstr, ap);
- va_end(ap);
-
- webkit_web_view_run_javascript(c->view, script, NULL, NULL, NULL);
- g_free(script);
-}
-
-void
-runscript(Client *c)
-{
- gchar *script;
- gsize l;
-
- if (g_file_get_contents(scriptfile, &script, &l, NULL) && l)
- evalscript(c, script);
- g_free(script);
-}
-
-void
-clipboard(Client *c, const Arg *a)
-{
- if (a->b) { /* load clipboard uri */
- gtk_clipboard_request_text(gtk_clipboard_get(
- GDK_SELECTION_PRIMARY),
- pasteuri, c);
- } else { /* copy uri */
- gtk_clipboard_set_text(gtk_clipboard_get(
- GDK_SELECTION_PRIMARY), c->targeturi
- ? c->targeturi : geturi(c), -1);
- }
-}
-
-char *
-copystr(char **str, const char *src)
-{
- char *tmp;
- tmp = g_strdup(src);
-
- if (str && *str) {
- g_free(*str);
- *str = tmp;
- }
- return tmp;
-}
-
-GtkWidget *
-createview(WebKitWebView *v, WebKitNavigationAction *a, Client *c)
-{
- Client *n;
-
- switch (webkit_navigation_action_get_navigation_type(a)) {
- case WEBKIT_NAVIGATION_TYPE_OTHER: /* fallthrough */
- /*
- * popup windows of type “other” are almost always triggered
- * by user gesture, so inverse the logic here
- */
-/* instead of this, compare destination uri to mouse-over uri for validating window */
- if (webkit_navigation_action_is_user_gesture(a)) {
- return NULL;
- break;
- }
- case WEBKIT_NAVIGATION_TYPE_LINK_CLICKED: /* fallthrough */
- case WEBKIT_NAVIGATION_TYPE_FORM_SUBMITTED: /* fallthrough */
- case WEBKIT_NAVIGATION_TYPE_BACK_FORWARD: /* fallthrough */
- case WEBKIT_NAVIGATION_TYPE_RELOAD: /* fallthrough */
- case WEBKIT_NAVIGATION_TYPE_FORM_RESUBMITTED:
- n = newclient(c);
- break;
- default:
- return NULL;
- break;
- }
-
- return GTK_WIDGET(n->view);
-}
-
-gboolean
-decidepolicy(WebKitWebView *v, WebKitPolicyDecision *d,
- WebKitPolicyDecisionType dt, Client *c)
-{
- switch (dt) {
- case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION:
- decidenavigation(d, c);
- break;
- case WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION:
- decidenewwindow(d, c);
- break;
- case WEBKIT_POLICY_DECISION_TYPE_RESPONSE:
- decideresource(d, c);
- break;
- default:
- webkit_policy_decision_ignore(d);
- break;
- }
- return TRUE;
-}
-
-void
-decidenavigation(WebKitPolicyDecision *d, Client *c)
-{
- WebKitNavigationAction *a;
-
- a = webkit_navigation_policy_decision_get_navigation_action(
- WEBKIT_NAVIGATION_POLICY_DECISION(d));
-
- switch (webkit_navigation_action_get_navigation_type(a)) {
- case WEBKIT_NAVIGATION_TYPE_LINK_CLICKED: /* fallthrough */
- case WEBKIT_NAVIGATION_TYPE_FORM_SUBMITTED: /* fallthrough */
- case WEBKIT_NAVIGATION_TYPE_BACK_FORWARD: /* fallthrough */
- case WEBKIT_NAVIGATION_TYPE_RELOAD: /* fallthrough */
- case WEBKIT_NAVIGATION_TYPE_FORM_RESUBMITTED:
- case WEBKIT_NAVIGATION_TYPE_OTHER: /* fallthrough */
- default:
- /* Do not navigate to links with a "_blank" target (popup) */
- if (webkit_navigation_policy_decision_get_frame_name(
- WEBKIT_NAVIGATION_POLICY_DECISION(d))) {
- webkit_policy_decision_ignore(d);
- } else {
- /* Filter out navigation to different domain ? */
- /* get action→urirequest, copy and load in new window+view
- * on Ctrl+Click ? */
- webkit_policy_decision_use(d);
- }
- break;
- }
-}
-
-void
-decidenewwindow(WebKitPolicyDecision *d, Client *c)
-{
- WebKitNavigationAction *a;
- Arg arg;
-
- a = webkit_navigation_policy_decision_get_navigation_action(
- WEBKIT_NAVIGATION_POLICY_DECISION(d));
-
- switch (webkit_navigation_action_get_navigation_type(a)) {
- case WEBKIT_NAVIGATION_TYPE_LINK_CLICKED: /* fallthrough */
- case WEBKIT_NAVIGATION_TYPE_FORM_SUBMITTED: /* fallthrough */
- case WEBKIT_NAVIGATION_TYPE_BACK_FORWARD: /* fallthrough */
- case WEBKIT_NAVIGATION_TYPE_RELOAD: /* fallthrough */
- case WEBKIT_NAVIGATION_TYPE_FORM_RESUBMITTED:
- /* Filter domains here */
-/* If the value of “mouse-button” is not 0, then the navigation was triggered by a mouse event.
- * test for link clicked but no button ? */
- arg.v = webkit_uri_request_get_uri(
- webkit_navigation_action_get_request(a));
- newwindow(c, &arg, 0);
- break;
- case WEBKIT_NAVIGATION_TYPE_OTHER: /* fallthrough */
- default:
- break;
- }
-
- webkit_policy_decision_ignore(d);
-}
-
-void
-decideresource(WebKitPolicyDecision *d, Client *c)
-{
- const gchar *uri;
- int i, isascii = 1;
- WebKitResponsePolicyDecision *r = WEBKIT_RESPONSE_POLICY_DECISION(d);
- WebKitURIResponse *res;
-
- res = webkit_response_policy_decision_get_response(r);
- uri = webkit_uri_response_get_uri(res);
-
- if (g_str_has_suffix(uri, "/favicon.ico"))
- webkit_uri_request_set_uri(
- webkit_response_policy_decision_get_request(r),
- "about:blank");
-
- if (!g_str_has_prefix(uri, "http://")
- && !g_str_has_prefix(uri, "https://")
- && !g_str_has_prefix(uri, "about:")
- && !g_str_has_prefix(uri, "file://")
- && !g_str_has_prefix(uri, "data:")
- && !g_str_has_prefix(uri, "blob:")
- && strlen(uri) > 0) {
- for (i = 0; i < strlen(uri); i++) {
- if (!g_ascii_isprint(uri[i])) {
- isascii = 0;
- break;
- }
- }
- if (isascii) {
- handleplumb(c, uri);
- webkit_policy_decision_ignore(d);
- }
- }
-
- if (webkit_response_policy_decision_is_mime_type_supported(r)) {
- webkit_policy_decision_use(d);
- } else {
- webkit_policy_decision_ignore(d);
- download(c, res);
- }
-}
-
-void
-destroyclient(Client *c)