// active_element_change_cb is called when the active element is changed, and // updates bookkeeping and the main process. static void active_element_change_cb(WebKitDOMEventTarget *target, WebKitDOMEvent *event, gpointer user_data) { Exten *exten = user_data; WebKitDOMDocument *document; if(WEBKIT_DOM_IS_DOCUMENT(target)) { document = WEBKIT_DOM_DOCUMENT(target); } else { // target is a window. g_object_get(target, "document", &document, NULL); } WebKitDOMElement *active = webkit_dom_document_get_active_element(document); if(active == NULL || active == exten->active) { return; } if(WEBKIT_DOM_IS_HTML_IFRAME_ELEMENT(active)) { // The iframe document handles this, unless it isn't registered yet. // In this case, register it and call recursively. WebKitDOMDocument *doc = webkit_dom_html_iframe_element_get_content_document( WEBKIT_DOM_HTML_IFRAME_ELEMENT(active)); if(!g_hash_table_contains(exten->registered_documents, doc)) { frame_document_loaded(doc, exten); active_element_change_cb( WEBKIT_DOM_EVENT_TARGET(doc), NULL, exten); } return; } exten->active = active; exten->scroll_target = get_scroll_target(active); // Check whether the currently active element is an input element. // If this has changed, signal DBus. // // Input elements: // // WebKitDOMHTMLAppletElement // WebKitDOMHTMLEmbedElement // WebKitDOMHTMLInputElement // WebKitDOMHTMLTextAreaElement gboolean input_focus = ( WEBKIT_DOM_IS_HTML_APPLET_ELEMENT(active) || WEBKIT_DOM_IS_HTML_EMBED_ELEMENT(active) || WEBKIT_DOM_IS_HTML_INPUT_ELEMENT(active) || WEBKIT_DOM_IS_HTML_TEXT_AREA_ELEMENT(active)); if(input_focus != exten->last_input_focus) { exten->last_input_focus = input_focus; input_focus_changed( exten->page_id, input_focus, exten); } }
/** * Callback called if a editable element changes it focus state. * Event target may be a WebKitDOMDocument (in case of iframe) or a * WebKitDOMDOMWindow. */ static void on_editable_change_focus(WebKitDOMEventTarget *target, WebKitDOMEvent *event, WebKitWebPage *page) { WebKitDOMDocument *doc; WebKitDOMDOMWindow *dom_window; WebKitDOMElement *active; GVariant *variant; char *message; if (WEBKIT_DOM_IS_DOM_WINDOW(target)) { g_object_get(target, "document", &doc, NULL); } else { /* target is a doc document */ doc = WEBKIT_DOM_DOCUMENT(target); } dom_window = webkit_dom_document_get_default_view(doc); if (!dom_window) { return; } active = webkit_dom_document_get_active_element(doc); /* Don't do anything if there is no active element */ if (!active) { return; } if (WEBKIT_DOM_IS_HTML_IFRAME_ELEMENT(active)) { WebKitDOMHTMLIFrameElement *iframe; WebKitDOMDocument *subdoc; iframe = WEBKIT_DOM_HTML_IFRAME_ELEMENT(active); subdoc = webkit_dom_html_iframe_element_get_content_document(iframe); add_onload_event_observers(subdoc, page); return; } /* Check if the active element is an editable element. */ variant = g_variant_new("(tb)", webkit_web_page_get_id(page), ext_dom_is_editable(active)); message = g_variant_print(variant, FALSE); g_variant_unref(variant); if (!webkit_dom_dom_window_webkit_message_handlers_post_message(dom_window, "focus", message)) { g_warning("Error sending focus message"); } g_free(message); g_object_unref(dom_window); }
// adblock_before_load_cb is triggered when static void adblock_before_load_cb(WebKitDOMEventTarget *doc, WebKitDOMEvent *event, gpointer user_data) { WebKitDOMEventTarget *target = webkit_dom_event_get_target(event); guint64 flags = 0; gchar *uri = NULL; if(WEBKIT_DOM_IS_HTML_LINK_ELEMENT(target)) { WebKitDOMHTMLLinkElement *e = WEBKIT_DOM_HTML_LINK_ELEMENT(target); gboolean isCSS = 0; isCSS |= g_strcmp0( webkit_dom_html_link_element_get_rel(e), "stylesheet") == 0; isCSS |= g_strcmp0( webkit_dom_html_link_element_get_type_attr(e), "text/css") == 0; if(!isCSS) { return; } uri = webkit_dom_html_link_element_get_href(e); flags |= ADBLOCK_STYLE_SHEET; } else if(WEBKIT_DOM_IS_HTML_OBJECT_ELEMENT(target)) { WebKitDOMHTMLObjectElement *e = WEBKIT_DOM_HTML_OBJECT_ELEMENT(target); uri = webkit_dom_html_object_element_get_data(e); flags |= ADBLOCK_OBJECT; } else if(WEBKIT_DOM_IS_HTML_EMBED_ELEMENT(target)) { WebKitDOMHTMLEmbedElement *e = WEBKIT_DOM_HTML_EMBED_ELEMENT(target); uri = webkit_dom_html_embed_element_get_src(e); flags |= ADBLOCK_OBJECT; } else if(WEBKIT_DOM_IS_HTML_IMAGE_ELEMENT(target)) { WebKitDOMHTMLImageElement *e = WEBKIT_DOM_HTML_IMAGE_ELEMENT(target); uri = webkit_dom_html_image_element_get_src(e); flags |= ADBLOCK_IMAGE; } else if(WEBKIT_DOM_IS_HTML_SCRIPT_ELEMENT(target)) { WebKitDOMHTMLScriptElement *e = WEBKIT_DOM_HTML_SCRIPT_ELEMENT(target); uri = webkit_dom_html_script_element_get_src(e); flags |= ADBLOCK_SCRIPT; } else if(WEBKIT_DOM_IS_HTML_IFRAME_ELEMENT(target)) { WebKitDOMHTMLIFrameElement *e = WEBKIT_DOM_HTML_IFRAME_ELEMENT(target); uri = webkit_dom_html_iframe_element_get_src(e); flags |= ADBLOCK_SUBDOCUMENT; if(uri_is_blocked(uri, flags, user_data)) { webkit_dom_event_prevent_default(event); } else { frame_document_loaded( webkit_dom_html_iframe_element_get_content_document(e), user_data); } g_free(uri); return; } if(uri == NULL) { return; } if(uri_is_blocked(uri, flags, user_data)) { webkit_dom_event_prevent_default(event); } g_free(uri); }
int dom_is_input(struct tab *t, WebKitDOMElement **active) { WebKitDOMDocument *doc; WebKitDOMElement *a; WebKitDOMHTMLFrameElement *frame; WebKitDOMHTMLIFrameElement *iframe; /* proof positive that OO is stupid */ doc = webkit_web_view_get_dom_document(t->wv); /* unwind frames and iframes until the cows come home */ for (;;) { a = webkit_dom_html_document_get_active_element( (WebKitDOMHTMLDocument*)doc); if (a == NULL) return (0); /* * I think this is a total hack because this property isn't * set for textareas or input however, it is set for jquery * textareas that do rich text. Since this works around issues * in RT we'll simply keep it! * * This might break some other stuff but for now it helps. */ if (webkit_dom_html_element_get_is_content_editable( (WebKitDOMHTMLElement*)a)) { *active = a; return (1); } frame = (WebKitDOMHTMLFrameElement *)a; if (WEBKIT_DOM_IS_HTML_FRAME_ELEMENT(frame)) { doc = webkit_dom_html_frame_element_get_content_document( frame); continue; } iframe = (WebKitDOMHTMLIFrameElement *)a; if (WEBKIT_DOM_IS_HTML_IFRAME_ELEMENT(iframe)) { doc = webkit_dom_html_iframe_element_get_content_document( iframe); continue; } break; } if (a == NULL) return (0); if (WEBKIT_DOM_IS_HTML_INPUT_ELEMENT((WebKitDOMNode *)a) || WEBKIT_DOM_IS_HTML_TEXT_AREA_ELEMENT((WebKitDOMNode *)a)) { *active = a; return (1); } return (0); }