]> spindle.queued.net Git - midori/commitdiff
Implement Clear Private Data dialogue
authorChristian Dywan <christian@twotoasts.de>
Sat, 11 Apr 2009 03:14:53 +0000 (05:14 +0200)
committerChristian Dywan <christian@twotoasts.de>
Sat, 11 Apr 2009 03:14:53 +0000 (05:14 +0200)
midori/midori-browser.c
midori/sokoke.c
midori/sokoke.h

index 3bb38b6b4bd4b56ff3691c3e4482bfc171abd834..46dcf8458d3dc4329089b510eb053025b38c3463 100644 (file)
@@ -2948,6 +2948,125 @@ _action_manage_search_engines_activate (GtkAction*     action,
         gtk_window_present (GTK_WINDOW (dialog));
 }
 
+static void
+midori_browser_clear_private_data_response_cb (GtkWidget*     dialog,
+                                               gint           response_id,
+                                               MidoriBrowser* browser)
+{
+    if (response_id == GTK_RESPONSE_ACCEPT)
+    {
+        GtkToggleButton* button;
+
+        button = g_object_get_data (G_OBJECT (dialog), "history");
+        if (gtk_toggle_button_get_active (button))
+            katze_array_clear (browser->history);
+        button = g_object_get_data (G_OBJECT (dialog), "cookies");
+        if (gtk_toggle_button_get_active (button))
+        {
+            SoupSession* session = katze_net_get_session (browser->net);
+            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);
+        }
+        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);
+        }
+        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);
+        }
+    }
+    if (response_id != GTK_RESPONSE_DELETE_EVENT)
+        gtk_widget_destroy (dialog);
+}
+
+static void
+_action_clear_private_data_activate (GtkAction*     action,
+                                     MidoriBrowser* browser)
+{
+    static GtkWidget* dialog = NULL;
+
+    if (!GTK_WIDGET_VISIBLE (browser))
+        return;
+
+    if (!dialog)
+    {
+        GdkScreen* screen;
+        GtkIconTheme* icon_theme;
+        GtkSizeGroup* sizegroup;
+        GtkWidget* hbox;
+        GtkWidget* vbox;
+        GtkWidget* icon;
+        GtkWidget* label;
+        GtkWidget* button;
+
+        dialog = gtk_dialog_new_with_buttons (_("Clear Private Data"),
+            GTK_WINDOW (browser), GTK_DIALOG_DESTROY_WITH_PARENT,
+            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+            _("Clear private data"), GTK_RESPONSE_ACCEPT, NULL);
+        gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog), FALSE);
+        screen = gtk_widget_get_screen (GTK_WIDGET (browser));
+        if (screen)
+        {
+            icon_theme = gtk_icon_theme_get_for_screen (screen);
+            gtk_window_set_icon_name (GTK_WINDOW (dialog), GTK_STOCK_CLEAR);
+        }
+        sizegroup = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+        hbox = gtk_hbox_new (FALSE, 4);
+        icon = gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_DIALOG);
+        gtk_size_group_add_widget (sizegroup, icon);
+        gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
+        label = gtk_label_new (_("Clear the following data:"));
+        gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+        gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 8);
+        hbox = gtk_hbox_new (FALSE, 4);
+        icon = gtk_image_new ();
+        gtk_size_group_add_widget (sizegroup, icon);
+        gtk_box_pack_start (GTK_BOX (hbox), icon, FALSE, FALSE, 0);
+        vbox = gtk_vbox_new (TRUE, 4);
+        button = gtk_check_button_new_with_mnemonic (_("History"));
+        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"));
+        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"));
+        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"));
+        g_object_set_data (G_OBJECT (dialog), "website-icons", button);
+        gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);
+        gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+        gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 8);
+        gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);
+
+        g_signal_connect (dialog, "response",
+            G_CALLBACK (midori_browser_clear_private_data_response_cb), browser);
+        g_signal_connect (dialog, "destroy",
+            G_CALLBACK (gtk_widget_destroyed), &dialog);
+        gtk_widget_show (dialog);
+    }
+    else
+        gtk_window_present (GTK_WINDOW (dialog));
+}
+
 static void
 _action_tab_previous_activate (GtkAction*     action,
                                MidoriBrowser* browser)
@@ -3369,6 +3488,10 @@ static const GtkActionEntry entries[] = {
    N_("_Manage Search Engines"), "<Ctrl><Alt>s",
    N_("Add, edit and remove search engines..."),
    G_CALLBACK (_action_manage_search_engines_activate) },
+ { "ClearPrivateData", GTK_STOCK_CLEAR,
+   N_("_Clear Private Data"), "<Ctrl><Shift>Delete",
+   N_("Clear private data..."),
+   G_CALLBACK (_action_clear_private_data_activate) },
 
  { "TabPrevious", GTK_STOCK_GO_BACK,
    N_("_Previous Tab"), "<Ctrl>Page_Up",
@@ -3584,6 +3707,7 @@ static const gchar* ui_markup =
    "<menuitem action='Bookmarks'/>"
    "<menu action='Tools'>"
     "<menuitem action='ManageSearchEngines'/>"
+    "<menuitem action='ClearPrivateData'/>"
     /* Panel items shall be appended here */
    "</menu>"
    "<menuitem action='Window'/>"
index c9639ca51da9fa599e4c7ff0febcce8412324e8d..09fc9f560e9763df9d384d238ed0774d369d61b6 100644 (file)
@@ -25,6 +25,7 @@
 #include <gdk/gdkkeysyms.h>
 #include <glib/gi18n.h>
 #include <glib/gprintf.h>
+#include <glib/gstdio.h>
 
 #if HAVE_LIBIDN
     #include <stringprep.h>
@@ -829,3 +830,42 @@ sokoke_set_config_dir (const gchar* new_config_dir)
 
     return config_dir;
 }
+
+/**
+ * sokoke_remove_path:
+ * @path: an absolute path
+ * @ignore_errors: keep removing even if an error occurred
+ *
+ * Removes the file at @path or the folder including any
+ * child folders and files if @path is a folder.
+ *
+ * If @ignore_errors is %TRUE and @path is a folder with
+ * children, one of which can't be removed, remaining
+ * children will be deleted nevertheless
+ * If @ignore_errors is %FALSE and @path is a folder, the
+ * removal process will cancel immediately.
+ *
+ * Return value: %TRUE on success, %FALSE if an error occurred
+ **/
+gboolean
+sokoke_remove_path (const gchar* path,
+                    gboolean     ignore_errors)
+{
+    GDir* dir = g_dir_open (path, 0, NULL);
+    const gchar* name;
+
+    if (!dir)
+        return g_remove (path) == 0;
+
+    while ((name = g_dir_read_name (dir)))
+    {
+        gchar* sub_path = g_build_filename (path, name, NULL);
+        if (!sokoke_remove_path (sub_path, ignore_errors) && !ignore_errors)
+            return FALSE;
+        g_free (sub_path);
+    }
+
+    g_dir_close (dir);
+    g_rmdir (path);
+    return TRUE;
+}
index 79eec0840906d5a12c3abe4334263b7b033812e1..72f1305eae8bbd832128a2cb80bdf7a84e147008 100644 (file)
@@ -130,4 +130,8 @@ sokoke_register_stock_items          (void);
 const gchar*
 sokoke_set_config_dir                (const gchar* new_config_dir);
 
+gboolean
+sokoke_remove_path                   (const gchar* path,
+                                      gboolean     ignore_errors);
+
 #endif /* !__SOKOKE_H__ */