diff options
author | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-15 15:54:19 +0000 |
---|---|---|
committer | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-07-15 15:54:19 +0000 |
commit | facc6ada0300c8e9a67b0cf283257a2c70fa15c2 (patch) | |
tree | 7abfb80d70b15b344e2c246fc4d3bf13bc8f7d4e /chrome/browser/gtk | |
parent | 0dad8074499c8a2784505f826505bd8862d618a1 (diff) | |
download | chromium_src-facc6ada0300c8e9a67b0cf283257a2c70fa15c2.zip chromium_src-facc6ada0300c8e9a67b0cf283257a2c70fa15c2.tar.gz chromium_src-facc6ada0300c8e9a67b0cf283257a2c70fa15c2.tar.bz2 |
Display a tab modal dialog of the allowed/blocked cookies.
BUG=45230
TEST=CollectedCookiesTest.*
Review URL: http://codereview.chromium.org/2907003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@52486 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk')
-rw-r--r-- | chrome/browser/gtk/browser_window_gtk.cc | 6 | ||||
-rw-r--r-- | chrome/browser/gtk/browser_window_gtk.h | 1 | ||||
-rw-r--r-- | chrome/browser/gtk/collected_cookies_gtk.cc | 183 | ||||
-rw-r--r-- | chrome/browser/gtk/collected_cookies_gtk.h | 78 |
4 files changed, 268 insertions, 0 deletions
diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc index fe4148b..d5a1691 100644 --- a/chrome/browser/gtk/browser_window_gtk.cc +++ b/chrome/browser/gtk/browser_window_gtk.cc @@ -41,6 +41,7 @@ #include "chrome/browser/gtk/browser_toolbar_gtk.h" #include "chrome/browser/gtk/cairo_cached_surface.h" #include "chrome/browser/gtk/clear_browsing_data_dialog_gtk.h" +#include "chrome/browser/gtk/collected_cookies_gtk.h" #include "chrome/browser/gtk/create_application_shortcuts_dialog_gtk.h" #include "chrome/browser/gtk/download_in_progress_dialog_gtk.h" #include "chrome/browser/gtk/download_shelf_gtk.h" @@ -952,6 +953,11 @@ void BrowserWindowGtk::ShowContentSettingsWindow( ContentSettingsWindowGtk::Show(GetNativeHandle(), content_type, profile); } +void BrowserWindowGtk::ShowCollectedCookiesDialog(TabContents* tab_contents) { + // Deletes itself on close. + new CollectedCookiesGtk(GetNativeHandle(), tab_contents); +} + void BrowserWindowGtk::ShowProfileErrorDialog(int message_id) { std::string title = l10n_util::GetStringUTF8(IDS_PRODUCT_NAME); std::string message = l10n_util::GetStringUTF8(message_id); diff --git a/chrome/browser/gtk/browser_window_gtk.h b/chrome/browser/gtk/browser_window_gtk.h index 08b815f..b672c89 100644 --- a/chrome/browser/gtk/browser_window_gtk.h +++ b/chrome/browser/gtk/browser_window_gtk.h @@ -101,6 +101,7 @@ class BrowserWindowGtk : public BrowserWindow, virtual void ShowRepostFormWarningDialog(TabContents* tab_contents); virtual void ShowContentSettingsWindow(ContentSettingsType content_type, Profile* profile); + virtual void ShowCollectedCookiesDialog(TabContents* tab_contents); virtual void ShowProfileErrorDialog(int message_id); virtual void ShowThemeInstallBubble(); virtual void ConfirmBrowserCloseWithPendingDownloads(); diff --git a/chrome/browser/gtk/collected_cookies_gtk.cc b/chrome/browser/gtk/collected_cookies_gtk.cc new file mode 100644 index 0000000..a1bd94a --- /dev/null +++ b/chrome/browser/gtk/collected_cookies_gtk.cc @@ -0,0 +1,183 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/gtk/collected_cookies_gtk.h" + +#include "app/gtk_util.h" +#include "app/l10n_util.h" +#include "chrome/browser/cookies_tree_model.h" +#include "chrome/browser/gtk/gtk_util.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/common/notification_service.h" +#include "grit/generated_resources.h" + +namespace { +// Height of the cookie tree view. +const int kTreeViewHeight = 150; +} // namespace + +CollectedCookiesGtk::CollectedCookiesGtk(GtkWindow* parent, + TabContents* tab_contents) + : tab_contents_(tab_contents) { + TabSpecificContentSettings* content_settings = + tab_contents->GetTabSpecificContentSettings(); + registrar_.Add(this, NotificationType::COLLECTED_COOKIES_SHOWN, + Source<TabSpecificContentSettings>(content_settings)); + + Init(); +} + +void CollectedCookiesGtk::Init() { + dialog_ = gtk_vbox_new(FALSE, gtk_util::kContentAreaSpacing); + gtk_box_set_spacing(GTK_BOX(dialog_), gtk_util::kContentAreaSpacing); + + GtkWidget* label = gtk_label_new( + l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_DIALOG_TITLE).c_str()); + gtk_box_pack_start(GTK_BOX(dialog_), label, TRUE, TRUE, 0); + + // Allowed Cookie list. + GtkWidget* cookie_list_vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); + gtk_box_pack_start(GTK_BOX(dialog_), cookie_list_vbox, TRUE, TRUE, 0); + + label = gtk_label_new( + l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_ALLOWED_COOKIES_LABEL). + c_str()); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + gtk_box_pack_start(GTK_BOX(cookie_list_vbox), label, FALSE, FALSE, 0); + + GtkWidget* scroll_window = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll_window), + GTK_SHADOW_ETCHED_IN); + gtk_box_pack_start(GTK_BOX(cookie_list_vbox), scroll_window, TRUE, TRUE, 0); + + TabSpecificContentSettings* content_settings = + tab_contents_->GetTabSpecificContentSettings(); + + allowed_cookies_tree_model_.reset( + content_settings->GetAllowedCookiesTreeModel()); + allowed_cookies_tree_adapter_.reset( + new gtk_tree::TreeAdapter(this, allowed_cookies_tree_model_.get())); + allowed_tree_ = gtk_tree_view_new_with_model( + GTK_TREE_MODEL(allowed_cookies_tree_adapter_->tree_store())); + gtk_widget_set_size_request(allowed_tree_, -1, kTreeViewHeight); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(allowed_tree_), FALSE); + gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW(allowed_tree_), TRUE); + gtk_container_add(GTK_CONTAINER(scroll_window), allowed_tree_); + + GtkTreeViewColumn* title_column = gtk_tree_view_column_new(); + GtkCellRenderer* pixbuf_renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(title_column, pixbuf_renderer, FALSE); + gtk_tree_view_column_add_attribute(title_column, pixbuf_renderer, "pixbuf", + gtk_tree::TreeAdapter::COL_ICON); + GtkCellRenderer* title_renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(title_column, title_renderer, TRUE); + gtk_tree_view_column_add_attribute(title_column, title_renderer, "text", + gtk_tree::TreeAdapter::COL_TITLE); + gtk_tree_view_column_set_title( + title_column, l10n_util::GetStringUTF8( + IDS_COOKIES_DOMAIN_COLUMN_HEADER).c_str()); + gtk_tree_view_append_column(GTK_TREE_VIEW(allowed_tree_), title_column); + g_signal_connect(allowed_tree_, "row-expanded", + G_CALLBACK(OnTreeViewRowExpandedThunk), this); + + // Blocked Cookie list. + cookie_list_vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); + gtk_box_pack_start(GTK_BOX(dialog_), cookie_list_vbox, TRUE, TRUE, 0); + + label = gtk_label_new( + l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_LABEL). + c_str()); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); + gtk_box_pack_start(GTK_BOX(cookie_list_vbox), label, FALSE, FALSE, 0); + + scroll_window = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll_window), + GTK_SHADOW_ETCHED_IN); + gtk_box_pack_start(GTK_BOX(cookie_list_vbox), scroll_window, TRUE, TRUE, 0); + + blocked_cookies_tree_model_.reset( + content_settings->GetBlockedCookiesTreeModel()); + blocked_cookies_tree_adapter_.reset( + new gtk_tree::TreeAdapter(this, blocked_cookies_tree_model_.get())); + blocked_tree_ = gtk_tree_view_new_with_model( + GTK_TREE_MODEL(blocked_cookies_tree_adapter_->tree_store())); + gtk_widget_set_size_request(blocked_tree_, -1, kTreeViewHeight); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(blocked_tree_), FALSE); + gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW(blocked_tree_), TRUE); + gtk_container_add(GTK_CONTAINER(scroll_window), blocked_tree_); + + title_column = gtk_tree_view_column_new(); + pixbuf_renderer = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(title_column, pixbuf_renderer, FALSE); + gtk_tree_view_column_add_attribute(title_column, pixbuf_renderer, "pixbuf", + gtk_tree::TreeAdapter::COL_ICON); + title_renderer = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(title_column, title_renderer, TRUE); + gtk_tree_view_column_add_attribute(title_column, title_renderer, "text", + gtk_tree::TreeAdapter::COL_TITLE); + gtk_tree_view_column_set_title( + title_column, l10n_util::GetStringUTF8( + IDS_COOKIES_DOMAIN_COLUMN_HEADER).c_str()); + gtk_tree_view_append_column(GTK_TREE_VIEW(blocked_tree_), title_column); + g_signal_connect(blocked_tree_, "row-expanded", + G_CALLBACK(OnTreeViewRowExpandedThunk), this); + + // Close button. + GtkWidget* button_box = gtk_hbutton_box_new(); + gtk_button_box_set_layout(GTK_BUTTON_BOX(button_box), GTK_BUTTONBOX_END); + gtk_box_set_spacing(GTK_BOX(button_box), gtk_util::kControlSpacing); + gtk_box_pack_end(GTK_BOX(dialog_), button_box, FALSE, TRUE, 0); + GtkWidget* close = gtk_button_new_from_stock(GTK_STOCK_CLOSE); + gtk_button_set_label(GTK_BUTTON(close), + l10n_util::GetStringUTF8(IDS_CLOSE).c_str()); + g_signal_connect(close, "clicked", G_CALLBACK(OnCloseThunk), this); + gtk_box_pack_end(GTK_BOX(button_box), close, FALSE, TRUE, 0); + + // Show the dialog. + allowed_cookies_tree_adapter_->Init(); + blocked_cookies_tree_adapter_->Init(); + window_ = tab_contents_->CreateConstrainedDialog(this); +} + +CollectedCookiesGtk::~CollectedCookiesGtk() { + gtk_widget_destroy(dialog_); +} + +GtkWidget* CollectedCookiesGtk::GetWidgetRoot() { + return dialog_; +} + +void CollectedCookiesGtk::DeleteDelegate() { + delete this; +} + +void CollectedCookiesGtk::Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + DCHECK(type == NotificationType::COLLECTED_COOKIES_SHOWN); + DCHECK_EQ(Source<TabSpecificContentSettings>(source).ptr(), + tab_contents_->GetTabSpecificContentSettings()); + window_->CloseConstrainedWindow(); +} + +void CollectedCookiesGtk::OnClose(GtkWidget* close_button) { + window_->CloseConstrainedWindow(); +} + +void CollectedCookiesGtk::OnTreeViewRowExpanded(GtkWidget* tree_view, + GtkTreeIter* iter, + GtkTreePath* path) { + // When a row in the tree is expanded, expand all the children too. + g_signal_handlers_block_by_func( + tree_view, reinterpret_cast<gpointer>(OnTreeViewRowExpandedThunk), this); + gtk_tree_view_expand_row(GTK_TREE_VIEW(tree_view), path, TRUE); + g_signal_handlers_unblock_by_func( + tree_view, reinterpret_cast<gpointer>(OnTreeViewRowExpandedThunk), this); +} diff --git a/chrome/browser/gtk/collected_cookies_gtk.h b/chrome/browser/gtk/collected_cookies_gtk.h new file mode 100644 index 0000000..0691d06 --- /dev/null +++ b/chrome/browser/gtk/collected_cookies_gtk.h @@ -0,0 +1,78 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This is the Gtk implementation of the collected Cookies dialog. + +#ifndef CHROME_BROWSER_GTK_COLLECTED_COOKIES_GTK_H_ +#define CHROME_BROWSER_GTK_COLLECTED_COOKIES_GTK_H_ + +#include <gtk/gtk.h> + +#include "app/gtk_signal.h" +#include "base/scoped_ptr.h" +#include "chrome/browser/gtk/constrained_window_gtk.h" +#include "chrome/browser/gtk/gtk_tree.h" +#include "chrome/common/notification_registrar.h" + +class CookiesTreeModel; + +// CollectedCookiesGtk is a dialog that displays the allowed and blocked +// cookies of the current tab contents. To display the dialog, invoke +// ShowCollectedCookiesDialog() on the delegate of the tab contents. + +class CollectedCookiesGtk : public ConstrainedDialogDelegate, + gtk_tree::TreeAdapter::Delegate, + NotificationObserver { + public: + CollectedCookiesGtk(GtkWindow* parent, TabContents* tab_contents); + + // ConstrainedDialogDelegate methods. + virtual GtkWidget* GetWidgetRoot(); + virtual void DeleteDelegate(); + + private: + virtual ~CollectedCookiesGtk(); + + void Init(); + + // Notification Observer implementation. + void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details); + + // Callbacks. + CHROMEGTK_CALLBACK_2(CollectedCookiesGtk, void, OnTreeViewRowExpanded, + GtkTreeIter*, GtkTreePath*); + CHROMEGTK_CALLBACK_0(CollectedCookiesGtk, void, OnClose); + + NotificationRegistrar registrar_; + + ConstrainedWindow* window_; + + // Widgets of the dialog. + GtkWidget* dialog_; + + GtkWidget* allowed_description_label_; + GtkWidget* blocked_description_label_; + + // The table listing the cookies. + GtkWidget* allowed_tree_; + GtkWidget* blocked_tree_; + + GtkWidget* allowed_cookie_display_; + GtkWidget* blocked_cookie_display_; + + // The tab contents. + TabContents* tab_contents_; + + // The Cookies Table model. + scoped_ptr<CookiesTreeModel> allowed_cookies_tree_model_; + scoped_ptr<CookiesTreeModel> blocked_cookies_tree_model_; + scoped_ptr<gtk_tree::TreeAdapter> allowed_cookies_tree_adapter_; + scoped_ptr<gtk_tree::TreeAdapter> blocked_cookies_tree_adapter_; + + DISALLOW_COPY_AND_ASSIGN(CollectedCookiesGtk); +}; + +#endif // CHROME_BROWSER_GTK_COLLECTED_COOKIES_GTK_H_ |