]> spindle.queued.net Git - midori/commitdiff
Ignore request if the source is a navigation request
authorAndré Stösel <andre@stoesel.de>
Thu, 12 Apr 2012 21:17:02 +0000 (23:17 +0200)
committerChristian Dywan <christian@twotoasts.de>
Thu, 12 Apr 2012 21:43:50 +0000 (23:43 +0200)
Fixes: https://bugs.launchpad.net/midori/+bug/979767
extensions/adblock.c

index da59e756d400920317a3d65b6a96b3e7e8bd81f9..aa64eeb1bb1b4c41c181a59c6a9a1799d998c8ff 100644 (file)
@@ -39,6 +39,7 @@ static GHashTable* keys = NULL;
 static GHashTable* optslist = NULL;
 static GHashTable* urlcache = NULL;
 static GHashTable* blockcssprivate = NULL;
+static GHashTable* navigationwhitelist = NULL;
 static GString* blockcss = NULL;
 #ifdef G_ENABLE_DEBUG
 static guint debug;
@@ -127,6 +128,8 @@ adblock_destroy_db ()
     urlcache = NULL;
     g_hash_table_destroy (blockcssprivate);
     blockcssprivate = NULL;
+    g_hash_table_destroy (navigationwhitelist);
+    navigationwhitelist = NULL;
 }
 
 static void
@@ -147,6 +150,9 @@ adblock_init_db ()
     blockcssprivate = g_hash_table_new_full (g_str_hash, g_str_equal,
                    (GDestroyNotify)g_free,
                    (GDestroyNotify)g_free);
+    navigationwhitelist = g_hash_table_new_full (g_direct_hash, g_str_equal,
+                   NULL,
+                   (GDestroyNotify)g_free);
 
     if (blockcss && blockcss->len > 0)
         g_string_free (blockcss, TRUE);
@@ -779,6 +785,23 @@ adblock_prepare_urihider_js (GList* uris)
     return g_string_free (js, FALSE);
 }
 
+static gboolean
+adblock_navigation_policy_decision_requested_cb (WebKitWebView*             web_view,
+                                                 WebKitWebFrame*            web_frame,
+                                                 WebKitNetworkRequest*      request,
+                                                 WebKitWebNavigationAction* action,
+                                                 WebKitWebPolicyDecision*   decision,
+                                                 MidoriView*                view)
+{
+    if (web_frame == webkit_web_view_get_main_frame (web_view))
+    {
+        const gchar* req_uri = webkit_network_request_get_uri (request);
+        g_hash_table_replace (navigationwhitelist, web_view, g_strdup (req_uri));
+    }
+    return false;
+}
+
+
 static void
 adblock_resource_request_starting_cb (WebKitWebView*         web_view,
                                       WebKitWebFrame*        web_frame,
@@ -798,6 +821,10 @@ adblock_resource_request_starting_cb (WebKitWebView*         web_view,
         return;
 
     req_uri = webkit_network_request_get_uri (request);
+
+    if (!g_strcmp0 (req_uri, g_hash_table_lookup (navigationwhitelist, web_view)))
+        return;
+
     if (!midori_uri_is_http (req_uri)
      || g_str_has_suffix (req_uri, "favicon.ico"))
         return;
@@ -983,12 +1010,23 @@ adblock_add_tab_cb (MidoriBrowser*   browser,
 
     g_signal_connect_after (web_view, "populate-popup",
         G_CALLBACK (adblock_populate_popup_cb), extension);
+    g_signal_connect (web_view, "navigation-policy-decision-requested",
+        G_CALLBACK (adblock_navigation_policy_decision_requested_cb), view);
     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);
 }
 
+static void
+adblock_remove_tab_cb (MidoriBrowser*   browser,
+                       MidoriView*      view,
+                       MidoriExtension* extension)
+{
+    GtkWidget* web_view = midori_view_get_web_view (view);
+    g_hash_table_remove (navigationwhitelist, web_view);
+}
+
 static void
 adblock_deactivate_cb (MidoriExtension* extension,
                        MidoriBrowser*   browser);
@@ -1021,6 +1059,8 @@ adblock_app_add_browser_cb (MidoriApp*       app,
           (GtkCallback)adblock_add_tab_foreach_cb, extension);
     g_signal_connect (browser, "add-tab",
         G_CALLBACK (adblock_add_tab_cb), extension);
+    g_signal_connect (browser, "remove-tab",
+        G_CALLBACK (adblock_remove_tab_cb), extension);
     g_signal_connect (extension, "open-preferences",
         G_CALLBACK (adblock_open_preferences_cb), extension);
     g_signal_connect (extension, "deactivate",
@@ -1466,6 +1506,8 @@ adblock_deactivate_tabs (MidoriView*      view,
        web_view, adblock_resource_request_starting_cb, image);
     g_signal_handlers_disconnect_by_func (
        web_view, adblock_load_finished_cb, image);
+    g_signal_handlers_disconnect_by_func (
+            web_view, adblock_navigation_policy_decision_requested_cb, view);
 }
 
 static void
@@ -1483,6 +1525,8 @@ adblock_deactivate_cb (MidoriExtension* extension,
         app, adblock_app_add_browser_cb, extension);
     g_signal_handlers_disconnect_by_func (
         browser, adblock_add_tab_cb, extension);
+    g_signal_handlers_disconnect_by_func (
+        browser, adblock_remove_tab_cb, extension);
     midori_browser_foreach (browser, (GtkCallback)adblock_deactivate_tabs, extension);
 
     adblock_destroy_db ();