From 57865955dcfb7d29657de6bbe36c9d1e28de9a57 Mon Sep 17 00:00:00 2001 From: Alexander Butenko Date: Sun, 17 Jan 2010 18:28:11 +0100 Subject: [PATCH] Simpler element hiding and some adblock optimizations 1. Less hungry and simpler blocked element hider 2. We are now also adding a context menuitem for uris in preparation for creating rules from the web inspector 3. Removed old hack for blocked element hider 4. Element hider javascript fixes 5. Unit test for small sized rules 6. Removed unneeded WebKitWebView casts --- extensions/adblock.c | 125 +++++++++++++++++++++++++++---------------- 1 file changed, 78 insertions(+), 47 deletions(-) diff --git a/extensions/adblock.c b/extensions/adblock.c index f89c16e7..25504197 100644 --- a/extensions/adblock.c +++ b/extensions/adblock.c @@ -638,34 +638,52 @@ adblock_is_matched (const gchar* opts, #if HAVE_WEBKIT_RESOURCE_REQUEST static gchar* -adblock_prepare_urihider_js (const gchar* uri) +adblock_prepare_urihider_js (GList* uris) { + GList* li = NULL; + gchar* out; + gchar* cmd = g_strdup (""); + gchar* tmp; const char *js = "(function() {" - "function getElementsByAttribute (strTagName, strAttributeName, strAttributeValue) {" + "function getElementsByAttribute (strTagName, strAttributeName, arrAttributeValue) {" " var arrElements = document.getElementsByTagName (strTagName);" " var arrReturnElements = new Array();" - " for (var i=0; i 0 && strAttributeValue.indexOf (oAttribute) != -1)" - " arrReturnElements.push (oCurrent);" + " for (var j=0; j 0 && strAttributeValue.indexOf (oAttribute) != -1)" + " arrReturnElements.push (oCurrent);" + " }" " }" " return arrReturnElements;" - "}" - "function hideElementBySrc (strUri) {" - " var oElements = getElementsByAttribute('img', 'src', strUri);" + "};" + "function hideElementBySrc (uris) {" + " var oElements = getElementsByAttribute('img', 'src', uris);" " if (oElements.length == 0)" - " oElements = getElementsByAttribute ('iframe', 'src', strUri);" + " oElements = getElementsByAttribute ('iframe', 'src', uris);" " for (var i=0; idata, cmd); + katze_assign (cmd, tmp); + } + out = g_strdup_printf (js, cmd); + g_free (cmd); + + return out; } static void @@ -677,6 +695,7 @@ adblock_resource_request_starting_cb (WebKitWebView* web_view, GtkWidget* image) { SoupMessage* msg; + GList* blocked_uris; const gchar* req_uri; const char *page_uri; @@ -701,19 +720,10 @@ adblock_resource_request_starting_cb (WebKitWebView* web_view, /* TODO: opts should be defined */ if (adblock_is_matched (NULL, req_uri, page_uri)) { - gchar* script = adblock_prepare_urihider_js (req_uri); - JSContextRef js_context = webkit_web_frame_get_global_context (web_frame); - WebKitWebFrame* main_frame; - + blocked_uris = g_object_get_data (G_OBJECT (web_view), "blocked-uris"); + blocked_uris = g_list_prepend (blocked_uris, g_strdup (req_uri)); webkit_network_request_set_uri (request, "about:blank"); - sokoke_js_script_eval (js_context, script, NULL); - main_frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW (web_view)); - if (main_frame != web_frame) - { - js_context = webkit_web_frame_get_global_context (main_frame); - sokoke_js_script_eval (js_context, script, NULL); - } - g_free (script); + g_object_set_data (G_OBJECT (web_view), "blocked-uris", blocked_uris); } /* g_debug ("%f", g_test_timer_elapsed ()); */ @@ -755,18 +765,9 @@ static void adblock_custom_block_image_cb (GtkWidget* widget, MidoriExtension* extension) { - WebKitWebView* web_view; - const gchar* req_uri; gchar* custom_list; FILE* list; - SoupURI* s_req_domain; gchar* uri; - SoupURI* s_uri; - - web_view = g_object_get_data (G_OBJECT (widget), "webview"); - req_uri = webkit_web_view_get_uri (web_view); - if (!req_uri) - return; custom_list = g_build_filename (midori_extension_get_config_dir (extension), CUSTOM_LIST_NAME, NULL); @@ -775,17 +776,12 @@ adblock_custom_block_image_cb (GtkWidget* widget, g_free (custom_list); return; } - s_req_domain = soup_uri_new (req_uri); uri = g_object_get_data (G_OBJECT (widget), "uri"); - s_uri = soup_uri_new (uri); g_fprintf (list, "%s\n", uri); - g_fprintf (list, "%s##img[src*=\"%s\"]\n", s_req_domain->host, s_uri->path); fclose (list); adblock_reload_rules (extension, TRUE); - soup_uri_free (s_req_domain); - soup_uri_free (s_uri); g_free (custom_list); } @@ -806,26 +802,55 @@ adblock_populate_popup_cb (WebKitWebView* web_view, event.y = y; hit_test = webkit_web_view_get_hit_test_result (web_view, &event); context = katze_object_get_int (hit_test, "context"); - if (!(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE)) + if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE) + { + uri = katze_object_get_string (hit_test, "image-uri"); + menuitem = gtk_menu_item_new_with_mnemonic ("Bl_ock image"); + } + else if (context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK) + { + uri = katze_object_get_string (hit_test, "link-uri"); + menuitem = gtk_menu_item_new_with_mnemonic ("Bl_ock link"); + } + else return; - uri = katze_object_get_string (hit_test, "image-uri"); - menuitem = gtk_menu_item_new_with_mnemonic ("Bl_ock image"); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); g_object_set_data_full (G_OBJECT (menuitem), "uri", uri, (GDestroyNotify)g_free); - g_object_set_data (G_OBJECT (menuitem), "webview", web_view); g_signal_connect (menuitem, "activate", G_CALLBACK (adblock_custom_block_image_cb), extension); } #endif +#if HAVE_WEBKIT_RESOURCE_REQUEST static void -adblock_window_object_cleared_cb (GtkWidget* web_view, +adblock_load_finished_cb (WebKitWebView *web_view, + WebKitWebFrame *web_frame, + gpointer user_data) +{ + JSContextRef js_context = webkit_web_frame_get_global_context (web_frame); + GList* uris = g_object_get_data (G_OBJECT (web_view), "blocked-uris"); + if (g_list_nth_data (uris, 0) == NULL) + return; + + gchar* script = adblock_prepare_urihider_js (uris); + webkit_web_view_execute_script (web_view, script); + sokoke_js_script_eval (js_context, script, NULL); + GList* li = NULL; + for (li = uris; li != NULL; li = g_list_next (li)) + uris = g_list_remove (uris, li->data); + g_free (script); + g_object_set_data (G_OBJECT (web_view), "blocked-uris", uris); +} +#endif + +static void +adblock_window_object_cleared_cb (WebKitWebView* web_view, WebKitWebFrame* web_frame, JSContextRef js_context, JSObjectRef js_window) { - webkit_web_view_execute_script (WEBKIT_WEB_VIEW (web_view), blockscript); + webkit_web_view_execute_script (web_view, blockscript); } static void @@ -847,6 +872,8 @@ adblock_add_tab_cb (MidoriBrowser* browser, #if HAVE_WEBKIT_RESOURCE_REQUEST g_signal_connect (web_view, "resource-request-starting", G_CALLBACK (adblock_resource_request_starting_cb), image); + g_signal_connect (web_view, "load-finished", + G_CALLBACK (adblock_load_finished_cb), image); #endif } @@ -1192,6 +1219,8 @@ adblock_deactivate_tabs (MidoriView* view, #if HAVE_WEBKIT_RESOURCE_REQUEST g_signal_handlers_disconnect_by_func ( web_view, adblock_resource_request_starting_cb, image); + g_signal_handlers_disconnect_by_func ( + web_view, adblock_load_finished_cb, image); #endif } @@ -1286,12 +1315,14 @@ test_adblock_pattern (void) "objects.tremormedia.com/embed/xml/*.xml?r=\n" "videostrip.com^*/admatcherclient.\n" "test.dom/test?var\n" + "/adpage.\n" "br.gcl.ru/cgi-bin/br/", -1, NULL); adblock_parse_file (filename); g_test_timer_start (); + g_assert (adblock_is_matched (NULL, "http://www.engadget.com/_uac/adpage.html", "")); g_assert (adblock_is_matched (NULL, "http://test.dom/test?var=1", "")); g_assert (adblock_is_matched (NULL, "http://ads.foo.bar/teddy", "")); g_assert (!adblock_is_matched (NULL, "http://ads.fuu.bar/teddy", ""));