static void load_status_cb(WebKitWebView* webView, GParamSpec* spec, gpointer data) { WebKitLoadStatus status = webkit_web_view_get_load_status(webView); TestInfo* info = (TestInfo*)data; if (status == WEBKIT_LOAD_FINISHED) { WebKitHitTestResult* result; guint context; GdkEvent* event = gdk_event_new(GDK_BUTTON_PRESS); WebKitDOMNode* node; gint x, y; /* Close enough to 0,0 */ event->button.x = 5; event->button.y = 5; result = webkit_web_view_get_hit_test_result(webView, (GdkEventButton*) event); gdk_event_free(event); g_assert(result); g_object_get(result, "context", &context, NULL); g_assert(context & info->flag); g_object_get(result, "inner-node", &node, NULL); g_assert(node); g_assert(WEBKIT_DOM_IS_NODE(node)); g_object_get(result, "x", &x, "y", &y, NULL); g_assert_cmpint(x, ==, 5); g_assert_cmpint(y, ==, 5); /* We can only test these node types at the moment. In the * input case there seems to be an extra layer with a DIV on * top of the input, which gets assigned to the inner-node. * tag */ if (info->flag == WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT) g_assert(WEBKIT_DOM_IS_HTML_HTML_ELEMENT(node)); else if (info->flag == WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE) g_assert(WEBKIT_DOM_IS_HTML_IMAGE_ELEMENT(node)); else if (info->flag == WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) { /* The hit test will give us the inner text node, we want * the A tag */ WebKitDOMNode* parent = webkit_dom_node_get_parent_node(node); g_assert(WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT(parent)); } g_object_unref(result); g_main_loop_quit(loop); }
// 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); }