[Xfce4-commits] <midori:master> Implement sokoke_register_privacy_item facility

Christian Dywan noreply at xfce.org
Sun Oct 17 23:16:01 CEST 2010


Updating branch refs/heads/master
         to d73b471ec4c97d361603481547159089391edb2e (commit)
       from 384e2f5afdb2abbf432f7e2d44cb5b415974f1a9 (commit)

commit d73b471ec4c97d361603481547159089391edb2e
Author: Christian Dywan <christian at twotoasts.de>
Date:   Sun Oct 17 22:48:32 2010 +0200

    Implement sokoke_register_privacy_item facility
    
    The new function allows registering callbacks which clear data,
    with a name and label so they show up in the Clear Private Data
    dialogue and the chosen items are saved.
    
    The old enumeration still keeps history, trash and the flag
    whether to clear when Midori quits.

 extensions/web-cache.c      |   32 ++++++++----
 midori/main.c               |   76 +++++++++++++++++++++--------
 midori/midori-browser.c     |  112 +++++++++++++-----------------------------
 midori/midori-websettings.c |   28 ++++++++++-
 midori/midori-websettings.h |    8 ++--
 midori/sokoke.c             |   34 +++++++++++++
 midori/sokoke.h             |   12 +++++
 7 files changed, 189 insertions(+), 113 deletions(-)

diff --git a/extensions/web-cache.c b/extensions/web-cache.c
index a0266fa..d82d355 100644
--- a/extensions/web-cache.c
+++ b/extensions/web-cache.c
@@ -24,10 +24,19 @@
 #define MAXLENGTH 1024 * 1024
 
 static gchar*
+web_cache_get_cache_dir (void)
+{
+    static gchar* cache_dir = NULL;
+    if (!cache_dir)
+        cache_dir = g_build_filename (g_get_user_cache_dir (),
+                                      PACKAGE_NAME, "web", NULL);
+    return cache_dir;
+}
+
+static gchar*
 web_cache_get_cached_path (MidoriExtension* extension,
                            const gchar*     uri)
 {
-    static const gchar* cache_path = NULL;
     gchar* checksum;
     gchar* folder;
     gchar* sub_path;
@@ -36,13 +45,10 @@ web_cache_get_cached_path (MidoriExtension* extension,
     gchar* cached_filename;
     gchar* cached_path;
 
-    if (!cache_path)
-        cache_path = g_build_filename (g_get_user_cache_dir (),
-                                       PACKAGE_NAME, "web", NULL);
     checksum = g_compute_checksum_for_string (G_CHECKSUM_MD5, uri, -1);
     folder = g_strdup_printf ("%c%c", checksum[0], checksum[1]);
-    sub_path = g_build_path (G_DIR_SEPARATOR_S, cache_path, folder, NULL);
-    /* FIXME: Wrong place? */
+    sub_path = g_build_path (G_DIR_SEPARATOR_S,
+                             web_cache_get_cache_dir (), folder, NULL);
     katze_mkdir_with_parents (sub_path, 0700);
     g_free (folder);
 
@@ -436,14 +442,11 @@ static void
 web_cache_activate_cb (MidoriExtension* extension,
                        MidoriApp*       app)
 {
-    gchar* cache_path = g_build_filename (g_get_user_cache_dir (),
-                                          PACKAGE_NAME, "web", NULL);
     KatzeArray* browsers;
     MidoriBrowser* browser;
     SoupSession* session = webkit_get_default_session ();
 
-    katze_mkdir_with_parents (cache_path, 0700);
-    g_free (cache_path);
+    katze_mkdir_with_parents (web_cache_get_cache_dir (), 0700);
     g_signal_connect (session, "request-queued",
                       G_CALLBACK (web_cache_session_request_queued_cb), extension);
 
@@ -456,6 +459,12 @@ web_cache_activate_cb (MidoriExtension* extension,
     g_object_unref (browsers);
 }
 
+static void
+web_cache_clear_cache_cb (void)
+{
+    sokoke_remove_path (web_cache_get_cache_dir (), TRUE);
+}
+
 MidoriExtension*
 extension_init (void)
 {
@@ -469,5 +478,8 @@ extension_init (void)
     g_signal_connect (extension, "activate",
         G_CALLBACK (web_cache_activate_cb), NULL);
 
+    sokoke_register_privacy_item ("web-cache", _("Web Cache"),
+        G_CALLBACK (web_cache_clear_cache_cb));
+
     return extension;
 }
diff --git a/midori/main.c b/midori/main.c
index 64a7583..e5084b2 100644
--- a/midori/main.c
+++ b/midori/main.c
@@ -1516,6 +1516,44 @@ midori_setup_inactivity_reset (MidoriBrowser* browser,
     }
 }
 
+static void
+midori_clear_page_icons_cb (void)
+{
+    gchar* cache = g_build_filename (g_get_user_cache_dir (),
+                                     PACKAGE_NAME, "icons", NULL);
+    sokoke_remove_path (cache, TRUE);
+    g_free (cache);
+}
+
+static void
+midori_clear_web_cookies_cb (void)
+{
+    SoupSession* session = webkit_get_default_session ();
+    SoupSessionFeature* jar = soup_session_get_feature (session, SOUP_TYPE_COOKIE_JAR);
+    GSList* cookies = soup_cookie_jar_all_cookies (SOUP_COOKIE_JAR (jar));
+    for (; cookies != NULL; cookies = g_slist_next (cookies))
+    {
+        SoupCookie* cookie = cookies->data;
+        soup_cookie_set_max_age (cookie, 0);
+        soup_cookie_free (cookie);
+    }
+    g_slist_free (cookies);
+    /* Removing KatzeHttpCookies makes it save outstanding changes */
+    soup_session_remove_feature_by_type (session, KATZE_TYPE_HTTP_COOKIES);
+    soup_session_add_feature_by_type (session, KATZE_TYPE_HTTP_COOKIES);
+}
+
+#ifdef GDK_WINDOWING_X11
+static void
+midori_clear_flash_cookies_cb (void)
+{
+    gchar* cache = g_build_filename (g_get_home_dir (), ".macromedia",
+                                     "Flash_Player", NULL);
+    sokoke_remove_path (cache, TRUE);
+    g_free (cache);
+}
+#endif
+
 int
 main (int    argc,
       char** argv)
@@ -1736,6 +1774,15 @@ main (int    argc,
     }
     #endif
 
+    sokoke_register_privacy_item ("page-icons", _("Website icons"),
+        G_CALLBACK (midori_clear_page_icons_cb));
+    sokoke_register_privacy_item ("web-cookies", _("Cookies"),
+        G_CALLBACK (midori_clear_web_cookies_cb));
+    #ifdef GDK_WINDOWING_X11
+    sokoke_register_privacy_item ("flash-cookies", _("'Flash' Cookies"),
+        G_CALLBACK (midori_clear_flash_cookies_cb));
+    #endif
+
     /* Web Application support */
     if (webapp)
     {
@@ -2158,30 +2205,19 @@ main (int    argc,
     g_object_get (settings, "clear-private-data", &clear_prefs, NULL);
     if (clear_prefs & MIDORI_CLEAR_ON_QUIT)
     {
+        GList* data_items = sokoke_register_privacy_item (NULL, NULL, NULL);
+        gchar* clear_data = katze_object_get_string (settings, "clear-data");
+
         midori_remove_config_file (clear_prefs, MIDORI_CLEAR_HISTORY, "history.db");
-        midori_remove_config_file (clear_prefs, MIDORI_CLEAR_COOKIES, "cookies.txt");
-        if ((clear_prefs & MIDORI_CLEAR_FLASH_COOKIES) == MIDORI_CLEAR_FLASH_COOKIES)
-        {
-            gchar* cache = g_build_filename (g_get_home_dir (), ".macromedia",
-                                             "Flash_Player", NULL);
-            sokoke_remove_path (cache, TRUE);
-            g_free (cache);
-        }
-        if ((clear_prefs & MIDORI_CLEAR_WEBSITE_ICONS) == MIDORI_CLEAR_WEBSITE_ICONS)
-        {
-            gchar* cache = g_build_filename (g_get_user_cache_dir (),
-                                             PACKAGE_NAME, "icons", NULL);
-            sokoke_remove_path (cache, TRUE);
-            g_free (cache);
-        }
         midori_remove_config_file (clear_prefs, MIDORI_CLEAR_TRASH, "tabtrash.xbel");
-        if ((clear_prefs & MIDORI_CLEAR_WEB_CACHE) == MIDORI_CLEAR_WEB_CACHE)
+
+        for (; data_items != NULL; data_items = g_list_next (data_items))
         {
-            gchar* cache = g_build_filename (g_get_user_cache_dir (),
-                                             PACKAGE_NAME, "web", NULL);
-            sokoke_remove_path (cache, TRUE);
-            g_free (cache);
+            SokokePrivacyItem* privacy = data_items->data;
+            if (clear_data && strstr (clear_data, privacy->name))
+                privacy->clear ();
         }
+        g_free (clear_data);
     }
 
     if (katze_object_get_int (settings, "load-on-startup")
diff --git a/midori/midori-browser.c b/midori/midori-browser.c
index 56102bd..e0db678 100644
--- a/midori/midori-browser.c
+++ b/midori/midori-browser.c
@@ -4164,19 +4164,17 @@ midori_browser_clear_private_data_response_cb (GtkWidget*     dialog,
         GtkToggleButton* button;
         gint clear_prefs = MIDORI_CLEAR_NONE;
         gint saved_prefs = MIDORI_CLEAR_NONE;
-
+        GList* data_items = sokoke_register_privacy_item (NULL, NULL, NULL);
+        GString* clear_data = g_string_new (NULL);
         g_object_get (browser->settings, "clear-private-data", &saved_prefs, NULL);
 
         button = g_object_get_data (G_OBJECT (dialog), "history");
         if (gtk_toggle_button_get_active (button))
         {
-            const gchar* sqlcmd;
-            sqlite3* db;
+            const gchar* sqlcmd = "DELETE FROM history";
+            sqlite3* db = g_object_get_data (G_OBJECT (browser->history), "db");
             char* errmsg = NULL;
 
-            db = g_object_get_data (G_OBJECT (browser->history), "db");
-            sqlcmd = "DELETE FROM history";
-
             if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK)
             {
                 g_printerr (_("Failed to clear history: %s\n"), errmsg);
@@ -4193,66 +4191,32 @@ midori_browser_clear_private_data_response_cb (GtkWidget*     dialog,
             }
             clear_prefs |= MIDORI_CLEAR_HISTORY;
         }
-        button = g_object_get_data (G_OBJECT (dialog), "cookies");
-        if (gtk_toggle_button_get_active (button))
-        {
-            SoupSession* session = webkit_get_default_session ();
-            SoupSessionFeature* jar = soup_session_get_feature (session,
-                SOUP_TYPE_COOKIE_JAR);
-            GSList* cookies = soup_cookie_jar_all_cookies (SOUP_COOKIE_JAR (jar));
-            SoupCookie* cookie;
-            gsize i = 0;
-            while ((cookie = g_slist_nth_data (cookies, i++)))
-            {
-                soup_cookie_jar_delete_cookie (SOUP_COOKIE_JAR (jar), cookie);
-                soup_cookie_free (cookie);
-            }
-            g_slist_free (cookies);
-            clear_prefs |= MIDORI_CLEAR_COOKIES;
-        }
-        button = g_object_get_data (G_OBJECT (dialog), "flash-cookies");
-        if (gtk_toggle_button_get_active (button))
-        {
-            gchar* cache = g_build_filename (g_get_home_dir (), ".macromedia",
-                                             "Flash_Player", NULL);
-            sokoke_remove_path (cache, TRUE);
-            g_free (cache);
-            clear_prefs |= MIDORI_CLEAR_FLASH_COOKIES;
-        }
-        button = g_object_get_data (G_OBJECT (dialog), "website-icons");
-        if (gtk_toggle_button_get_active (button))
-        {
-            gchar* cache = g_build_filename (g_get_user_cache_dir (),
-                                             PACKAGE_NAME, "icons", NULL);
-            sokoke_remove_path (cache, TRUE);
-            g_free (cache);
-            clear_prefs |= MIDORI_CLEAR_WEBSITE_ICONS;
-        }
         button = g_object_get_data (G_OBJECT (dialog), "trash");
-        if (gtk_toggle_button_get_active (button))
+        if (gtk_toggle_button_get_active (button) && browser->trash)
         {
-            if (browser->trash)
-            {
-                katze_array_clear (browser->trash);
-                _midori_browser_update_actions (browser);
-            }
+            katze_array_clear (browser->trash);
+            _midori_browser_update_actions (browser);
             clear_prefs |= MIDORI_CLEAR_TRASH;
         }
-        button = g_object_get_data (G_OBJECT (dialog), "web-cache");
-        if (gtk_toggle_button_get_active (button))
-        {
-            gchar* cache = g_build_filename (g_get_user_cache_dir (),
-                                             PACKAGE_NAME, "web", NULL);
-            sokoke_remove_path (cache, TRUE);
-            g_free (cache);
-            clear_prefs |= MIDORI_CLEAR_WEB_CACHE;
-        }
-
         if (clear_prefs != saved_prefs)
         {
             clear_prefs |= (saved_prefs & MIDORI_CLEAR_ON_QUIT);
             g_object_set (browser->settings, "clear-private-data", clear_prefs, NULL);
         }
+        for (; data_items != NULL; data_items = g_list_next (data_items))
+        {
+            SokokePrivacyItem* privacy = data_items->data;
+            button = g_object_get_data (G_OBJECT (dialog), privacy->name);
+            g_return_if_fail (button != NULL && GTK_IS_TOGGLE_BUTTON (button));
+            if (gtk_toggle_button_get_active (button))
+            {
+                privacy->clear ();
+                g_string_append (clear_data, privacy->name);
+                g_string_append_c (clear_data, ',');
+            }
+        }
+        g_object_set (browser->settings, "clear-data", clear_data->str, NULL);
+        g_string_free (clear_data, TRUE);
     }
     if (response_id != GTK_RESPONSE_DELETE_EVENT)
         gtk_widget_destroy (dialog);
@@ -4289,6 +4253,8 @@ _action_clear_private_data_activate (GtkAction*     action,
         GtkWidget* icon;
         GtkWidget* label;
         GtkWidget* button;
+        GList* data_items;
+        gchar* clear_data = katze_object_get_string (browser->settings, "clear-data");
 
         gint clear_prefs = MIDORI_CLEAR_NONE;
         g_object_get (browser->settings, "clear-private-data", &clear_prefs, NULL);
@@ -4327,31 +4293,23 @@ _action_clear_private_data_activate (GtkAction*     action,
             gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
         g_object_set_data (G_OBJECT (dialog), "history", button);
         gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
-        button = gtk_check_button_new_with_mnemonic (_("Cookies"));
-        if ((clear_prefs & MIDORI_CLEAR_COOKIES) == MIDORI_CLEAR_COOKIES)
-            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
-        g_object_set_data (G_OBJECT (dialog), "cookies", button);
-        gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
-        button = gtk_check_button_new_with_mnemonic (_("'Flash' Cookies"));
-        if ((clear_prefs & MIDORI_CLEAR_FLASH_COOKIES) == MIDORI_CLEAR_FLASH_COOKIES)
-            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
-        g_object_set_data (G_OBJECT (dialog), "flash-cookies", button);
-        gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
-        button = gtk_check_button_new_with_mnemonic (_("Website icons"));
-        if ((clear_prefs & MIDORI_CLEAR_WEBSITE_ICONS) == MIDORI_CLEAR_WEBSITE_ICONS)
-            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
-        g_object_set_data (G_OBJECT (dialog), "website-icons", button);
-        gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
         button = gtk_check_button_new_with_mnemonic (_("_Closed Tabs"));
         if ((clear_prefs & MIDORI_CLEAR_TRASH) == MIDORI_CLEAR_TRASH)
             gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
         g_object_set_data (G_OBJECT (dialog), "trash", button);
         gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
-        button = gtk_check_button_new_with_mnemonic (_("Web Cache"));
-        if ((clear_prefs & MIDORI_CLEAR_WEB_CACHE) == MIDORI_CLEAR_WEB_CACHE)
-            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
-        g_object_set_data (G_OBJECT (dialog), "web-cache", button);
-        gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
+
+        data_items = sokoke_register_privacy_item (NULL, NULL, NULL);
+        for (; data_items != NULL; data_items = g_list_next (data_items))
+        {
+            SokokePrivacyItem* privacy = data_items->data;
+            button = gtk_check_button_new_with_mnemonic (privacy->label);
+            gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
+            g_object_set_data (G_OBJECT (dialog), privacy->name, button);
+            if (clear_data && strstr (clear_data, privacy->name))
+                gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
+        }
+        g_free (clear_data);
         gtk_container_add (GTK_CONTAINER (alignment), vbox);
         gtk_box_pack_start (GTK_BOX (hbox), alignment, TRUE, TRUE, 0);
         gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
diff --git a/midori/midori-websettings.c b/midori/midori-websettings.c
index d6d17e4..4aa20e7 100644
--- a/midori/midori-websettings.c
+++ b/midori/midori-websettings.c
@@ -87,6 +87,7 @@ struct _MidoriWebSettings
     gchar* ident_string;
 
     gint clear_private_data;
+    gchar* clear_data;
 };
 
 struct _MidoriWebSettingsClass
@@ -169,7 +170,8 @@ enum
     PROP_USER_AGENT,
     PROP_PREFERRED_LANGUAGES,
 
-    PROP_CLEAR_PRIVATE_DATA
+    PROP_CLEAR_PRIVATE_DATA,
+    PROP_CLEAR_DATA
 };
 
 GType
@@ -1085,7 +1087,7 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
     /**
      * MidoriWebSettings:clear-private-data:
      *
-     * The private data selected for deletion.
+     * The core data selected for deletion.
      *
      * Since: 0.1.7
      */
@@ -1098,6 +1100,22 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
                                      0, G_MAXINT, 0,
                                      flags));
 
+    /**
+     * MidoriWebSettings:clear-data:
+     *
+     * The data selected for deletion, including extensions.
+     *
+     * Since: 0.2.9
+     */
+    g_object_class_install_property (gobject_class,
+                                     PROP_CLEAR_DATA,
+                                     g_param_spec_string (
+                                     "clear-data",
+                                     _("Clear data"),
+                                     _("The data selected for deletion"),
+                                     NULL,
+                                     flags));
+
 }
 
 static void
@@ -1505,6 +1523,9 @@ midori_web_settings_set_property (GObject*      object,
     case PROP_CLEAR_PRIVATE_DATA:
         web_settings->clear_private_data = g_value_get_int (value);
         break;
+    case PROP_CLEAR_DATA:
+        katze_assign (web_settings->clear_data, g_value_dup_string (value));
+        break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
         break;
@@ -1733,6 +1754,9 @@ midori_web_settings_get_property (GObject*    object,
     case PROP_CLEAR_PRIVATE_DATA:
         g_value_set_int (value, web_settings->clear_private_data);
         break;
+    case PROP_CLEAR_DATA:
+        g_value_set_string (value, web_settings->clear_data);
+        break;
     default:
         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
         break;
diff --git a/midori/midori-websettings.h b/midori/midori-websettings.h
index a8f3678..bf62137 100644
--- a/midori/midori-websettings.h
+++ b/midori/midori-websettings.h
@@ -38,12 +38,12 @@ enum
 {
     MIDORI_CLEAR_NONE = 0,
     MIDORI_CLEAR_HISTORY = 1,
-    MIDORI_CLEAR_COOKIES = 2,
-    MIDORI_CLEAR_FLASH_COOKIES = 4,
-    MIDORI_CLEAR_WEBSITE_ICONS = 8,
+    MIDORI_CLEAR_COOKIES = 2, /* deprecated */
+    MIDORI_CLEAR_FLASH_COOKIES = 4, /* deprecated */
+    MIDORI_CLEAR_WEBSITE_ICONS = 8, /* deprecated */
     MIDORI_CLEAR_TRASH = 16,
     MIDORI_CLEAR_ON_QUIT = 32,
-    MIDORI_CLEAR_WEB_CACHE = 64,
+    MIDORI_CLEAR_WEB_CACHE = 64, /* deprecated */
 };
 
 typedef enum
diff --git a/midori/sokoke.c b/midori/sokoke.c
index af346c9..2389b18 100644
--- a/midori/sokoke.c
+++ b/midori/sokoke.c
@@ -2022,3 +2022,37 @@ sokoke_accept_languages (const gchar* const * lang_names)
 
     return langs_str;
 }
+
+/**
+ * sokoke_register_privacy_item:
+ * @name: the name of the privacy item
+ * @label: a user visible, localized label
+ * @clear: a callback clearing data
+ *
+ * Registers an item to clear data, either via the
+ * Clear Private Data dialogue or when Midori quits.
+ *
+ * Return value: a #GList if all arguments are %NULL
+ **/
+GList*
+sokoke_register_privacy_item (const gchar* name,
+                              const gchar* label,
+                              GCallback    clear)
+{
+    static GList* items = NULL;
+    SokokePrivacyItem* item;
+
+    if (name == NULL && label == NULL && clear == NULL)
+        return items;
+
+    g_return_val_if_fail (name != NULL, NULL);
+    g_return_val_if_fail (label != NULL, NULL);
+    g_return_val_if_fail (clear != NULL, NULL);
+
+    item = g_new (SokokePrivacyItem, 1);
+    item->name = g_strdup (name);
+    item->label = g_strdup (label);
+    item->clear = clear;
+    items = g_list_append (items, item);
+    return NULL;
+}
diff --git a/midori/sokoke.h b/midori/sokoke.h
index bd1a23e..1788882 100644
--- a/midori/sokoke.h
+++ b/midori/sokoke.h
@@ -261,4 +261,16 @@ gboolean
 sokoke_recursive_fork_protection        (const gchar*         uri,
                                          gboolean             set_uri);
 
+typedef struct
+{
+    gchar* name;
+    gchar* label;
+    GCallback clear;
+} SokokePrivacyItem;
+
+GList*
+sokoke_register_privacy_item (const gchar* name,
+                              const gchar* label,
+                              GCallback    clear);
+
 #endif /* !__SOKOKE_H__ */



More information about the Xfce4-commits mailing list