diff options
author | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-17 06:30:10 +0000 |
---|---|---|
committer | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-08-17 06:30:10 +0000 |
commit | 8a7011c64402ddef52eb312ff0ffa58898f56c8e (patch) | |
tree | 7896aeb709624cb4838d5a0d3ff25fafebc3a548 | |
parent | e109361f0263a4483e01da73a6299adae689842c (diff) | |
download | chromium_src-8a7011c64402ddef52eb312ff0ffa58898f56c8e.zip chromium_src-8a7011c64402ddef52eb312ff0ffa58898f56c8e.tar.gz chromium_src-8a7011c64402ddef52eb312ff0ffa58898f56c8e.tar.bz2 |
[Gtk] Display the current content setting applying to a domain along with the domain.
This patch only affectes the gtk ui. Here is what it looks like: http://imgur.com/g6Gox
If third party cookies are blocked, a warning is shown. Next to each domain, the content setting is displayed that applies (or nothing if the default applies). When the user selects some domains and presses an button, the labels are updated accordingly.
BUG=49826
TEST=unit_tests
Review URL: http://codereview.chromium.org/3096001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@56315 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/app/generated_resources.grd | 23 | ||||
-rw-r--r-- | chrome/browser/cookies_tree_model.cc | 25 | ||||
-rw-r--r-- | chrome/browser/cookies_tree_model.h | 5 | ||||
-rw-r--r-- | chrome/browser/gtk/collected_cookies_gtk.cc | 126 | ||||
-rw-r--r-- | chrome/browser/gtk/gtk_tree.cc | 4 | ||||
-rw-r--r-- | chrome/browser/gtk/gtk_tree.h | 21 | ||||
-rw-r--r-- | chrome/browser/host_content_settings_map.cc | 2 |
7 files changed, 165 insertions, 41 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 8cc5e9f..039a3ae 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -6123,7 +6123,7 @@ Keep your key file in a safe place. You will need it to create new versions of y <!-- Collected cookies window --> <message name="IDS_COLLECTED_COOKIES_DIALOG_TITLE" desc="The title of the collect cookies dialog"> - Cookies and site data were set + Cookies and site data were set by page </message> <message name="IDS_COLLECTED_COOKIES_ALLOWED_COOKIES_LABEL" desc="The label used to describe the cookies that were allowed"> The following cookies were set when you viewed this page: @@ -6131,6 +6131,9 @@ Keep your key file in a safe place. You will need it to create new versions of y <message name="IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_LABEL" desc="The label used to describe the cookies that were blocked"> The following cookies were blocked: </message> + <message name="IDS_COLLECTED_COOKIES_BLOCKED_THIRD_PARTY_BLOCKING_ENABLED" desc="The label used to describe the cookies that were blocked include a note that third-party cookies were blocked without exception."> + The following cookies were blocked (third-party cookies are being blocked without exception): + </message> <message name="IDS_COLLECTED_COOKIES_ALLOW_BUTTON" desc="A button that lets the use create a content settings exception to allow certain domains."> Allow </message> @@ -6140,24 +6143,6 @@ Keep your key file in a safe place. You will need it to create new versions of y <message name="IDS_COLLECTED_COOKIES_BLOCK_BUTTON" desc="A button that lets the use create a content settings exception to block certain domains."> Block </message> - <message name="IDS_COLLECTED_COOKIES_ALLOW_RULE_CREATED" desc="A notification that is displayed when a content exception to allow cookies was created."> - Cookies from <ph name="HOST">$1<ex>example.com</ex></ph> allowed. - </message> - <message name="IDS_COLLECTED_COOKIES_BLOCK_RULE_CREATED" desc="A notification that is displayed when a content exception to block cookies was created."> - Cookies from <ph name="HOST">$1<ex>example.com</ex></ph> blocked. - </message> - <message name="IDS_COLLECTED_COOKIES_SESSION_RULE_CREATED" desc="A notification that is displayed when a content exception to allow cookies for session only was created."> - Cookies from <ph name="HOST">$1<ex>example.com</ex></ph> allowed for session only. - </message> - <message name="IDS_COLLECTED_COOKIES_MULTIPLE_ALLOW_RULES_CREATED" desc="A notification that is displayed when multiple content exceptions to allow cookies were created."> - Cookies from multiple sites allowed. - </message> - <message name="IDS_COLLECTED_COOKIES_MULTIPLE_BLOCK_RULES_CREATED" desc="A notification that is displayed when multiple content exceptions to block cookies were created."> - Cookies from multiple sites blocked. - </message> - <message name="IDS_COLLECTED_COOKIES_MULTIPLE_SESSION_RULES_CREATED" desc="A notification that is displayed when multiple content exceptions to allow cookies for session only were created."> - Cookies from multiple sites allowed for session only. - </message> <!-- Cookies Window --> <message name="IDS_COOKIES_WINDOW_TITLE" desc="The title of the Cookies Window"> diff --git a/chrome/browser/cookies_tree_model.cc b/chrome/browser/cookies_tree_model.cc index ed17c13..5f166d5 100644 --- a/chrome/browser/cookies_tree_model.cc +++ b/chrome/browser/cookies_tree_model.cc @@ -281,6 +281,31 @@ bool CookieTreeOriginNode::CanCreateContentException() const { return !url_.SchemeIsFile(); } +std::string CookieTreeOriginNode::GetCurrentContentSettingTitle( + HostContentSettingsMap* content_settings) const { + if (!CanCreateContentException()) + return std::string(); + + ContentSettings settings = + content_settings->GetNonDefaultContentSettings(url_); + switch (settings.settings[CONTENT_SETTINGS_TYPE_COOKIES]) { + case CONTENT_SETTING_ALLOW: + return l10n_util::GetStringUTF8(IDS_EXCEPTIONS_ALLOW_BUTTON); + case CONTENT_SETTING_BLOCK: + return l10n_util::GetStringUTF8(IDS_EXCEPTIONS_BLOCK_BUTTON); + case CONTENT_SETTING_ASK: + return l10n_util::GetStringUTF8(IDS_EXCEPTIONS_ASK_BUTTON); + case CONTENT_SETTING_SESSION_ONLY: + return l10n_util::GetStringUTF8(IDS_EXCEPTIONS_SESSION_ONLY_BUTTON); + case CONTENT_SETTING_DEFAULT: + return std::string(); + default: + NOTREACHED(); + } + + return std::string(); // not reached. +} + /////////////////////////////////////////////////////////////////////////////// // CookieTreeCookiesNode, public: diff --git a/chrome/browser/cookies_tree_model.h b/chrome/browser/cookies_tree_model.h index faae9b5..3c6795d 100644 --- a/chrome/browser/cookies_tree_model.h +++ b/chrome/browser/cookies_tree_model.h @@ -168,6 +168,11 @@ class CookieTreeOriginNode : public CookieTreeNode { // True if a content exception can be created for this origin. bool CanCreateContentException() const; + // Returns a textual representation of the current content exception + // applying to this domain. + std::string GetCurrentContentSettingTitle( + HostContentSettingsMap* content_settings) const; + private: // Pointers to the cookies, databases, local and session storage and appcache // nodes. When we build up the tree we need to quickly get a reference to diff --git a/chrome/browser/gtk/collected_cookies_gtk.cc b/chrome/browser/gtk/collected_cookies_gtk.cc index 2992120..de88a63 100644 --- a/chrome/browser/gtk/collected_cookies_gtk.cc +++ b/chrome/browser/gtk/collected_cookies_gtk.cc @@ -6,6 +6,7 @@ #include "app/l10n_util.h" #include "chrome/browser/cookies_tree_model.h" +#include "chrome/browser/gtk/gtk_theme_provider.h" #include "chrome/browser/gtk/gtk_util.h" #include "chrome/browser/profile.h" #include "chrome/browser/tab_contents/tab_contents.h" @@ -13,7 +14,68 @@ #include "grit/generated_resources.h" namespace { -// Height of the cookie tree view. +class CookiesTreeAdapter : public gtk_tree::TreeAdapter { + public: + // Column ids for the tree store. + enum { + COOKIES_COL_ICON, + COOKIES_COL_TITLE, + COOKIES_COL_NODE_PTR, + COOKIES_COL_SETTING, + COOKIES_COL_STYLE, + COOKIES_COL_COUNT, + }; + + CookiesTreeAdapter(Delegate* delegate, + TreeModel* tree_model, + HostContentSettingsMap* host_content_settings_map) + : TreeAdapter(delegate, tree_model), + host_content_settings_map_(host_content_settings_map) { + g_object_unref(tree_store_); + tree_store_ = gtk_tree_store_new(COOKIES_COL_COUNT, + GDK_TYPE_PIXBUF, + G_TYPE_STRING, + G_TYPE_POINTER, + G_TYPE_STRING, + PANGO_TYPE_STYLE); + } + + virtual ~CookiesTreeAdapter() {} + + private: + virtual void FillRow(GtkTreeIter* iter, TreeModelNode* node) { + GdkPixbuf* pixbuf = NULL; + int icon_index = tree_model_->GetIconIndex(node); + if (icon_index >= 0 && icon_index < static_cast<int>(pixbufs_.size())) + pixbuf = pixbufs_[icon_index]; + else + pixbuf = GtkThemeProvider::GetFolderIcon(true); + std::string setting; + CookieTreeNode* cookie_node = static_cast<CookieTreeNode*>(node); + if (cookie_node->GetDetailedInfo().node_type == + CookieTreeNode::DetailedInfo::TYPE_ORIGIN) { + CookieTreeOriginNode* origin_node = static_cast<CookieTreeOriginNode*>( + cookie_node); + setting = origin_node->GetCurrentContentSettingTitle( + host_content_settings_map_); + } + PangoStyle style = PANGO_STYLE_ITALIC; + gtk_tree_store_set(tree_store_, iter, + COOKIES_COL_ICON, pixbuf, + COOKIES_COL_TITLE, WideToUTF8(node->GetTitle()).c_str(), + COOKIES_COL_NODE_PTR, node, + COOKIES_COL_SETTING, setting.c_str(), + COOKIES_COL_STYLE, style, + -1); + } + + HostContentSettingsMap* host_content_settings_map_; + + DISALLOW_COPY_AND_ASSIGN(CookiesTreeAdapter); +}; + +// Widht and height of the cookie tree view. +const int kTreeViewWidth = 450; const int kTreeViewHeight = 150; } // namespace @@ -29,6 +91,9 @@ CollectedCookiesGtk::CollectedCookiesGtk(GtkWindow* parent, } void CollectedCookiesGtk::Init() { + HostContentSettingsMap* host_content_settings_map = + tab_contents_->profile()->GetHostContentSettingsMap(); + dialog_ = gtk_vbox_new(FALSE, gtk_util::kContentAreaSpacing); gtk_box_set_spacing(GTK_BOX(dialog_), gtk_util::kContentAreaSpacing); @@ -60,10 +125,12 @@ void CollectedCookiesGtk::Init() { allowed_cookies_tree_model_.reset( content_settings->GetAllowedCookiesTreeModel()); allowed_cookies_tree_adapter_.reset( - new gtk_tree::TreeAdapter(this, allowed_cookies_tree_model_.get())); + new CookiesTreeAdapter(this, + allowed_cookies_tree_model_.get(), + host_content_settings_map)); 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_widget_set_size_request(allowed_tree_, kTreeViewWidth, 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_); @@ -72,15 +139,24 @@ void CollectedCookiesGtk::Init() { 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); + CookiesTreeAdapter::COOKIES_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); + CookiesTreeAdapter::COOKIES_COL_TITLE); gtk_tree_view_column_set_title( title_column, l10n_util::GetStringUTF8( IDS_COOKIES_DOMAIN_COLUMN_HEADER).c_str()); + gtk_tree_view_column_set_expand(title_column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(allowed_tree_), title_column); + GtkTreeViewColumn* setting_column = gtk_tree_view_column_new_with_attributes( + l10n_util::GetStringUTF8(IDS_EXCEPTIONS_ACTION_HEADER).c_str(), + gtk_cell_renderer_text_new(), + "text", CookiesTreeAdapter::COOKIES_COL_SETTING, + "style", CookiesTreeAdapter::COOKIES_COL_STYLE, + NULL); + gtk_tree_view_column_set_alignment(setting_column, 1); + gtk_tree_view_append_column(GTK_TREE_VIEW(allowed_tree_), setting_column); g_signal_connect(allowed_tree_, "row-expanded", G_CALLBACK(OnTreeViewRowExpandedThunk), this); allowed_selection_ = @@ -99,15 +175,27 @@ void CollectedCookiesGtk::Init() { G_CALLBACK(OnBlockAllowedButtonClickedThunk), this); gtk_container_add(GTK_CONTAINER(button_box), block_allowed_cookie_button_); + GtkWidget* separator = gtk_hseparator_new(); + gtk_box_pack_start(GTK_BOX(dialog_), separator, TRUE, TRUE, 0); + // 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()); + if (host_content_settings_map->BlockThirdPartyCookies()) { + label = gtk_label_new( + l10n_util::GetStringUTF8( + IDS_COLLECTED_COOKIES_BLOCKED_THIRD_PARTY_BLOCKING_ENABLED). + c_str()); + } else { + label = gtk_label_new( + l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_LABEL). + c_str()); + } + gtk_widget_set_size_request(label, kTreeViewWidth, -1); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_box_pack_start(GTK_BOX(cookie_list_vbox), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(cookie_list_vbox), label, TRUE, TRUE, 0); scroll_window = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window), @@ -120,10 +208,12 @@ void CollectedCookiesGtk::Init() { blocked_cookies_tree_model_.reset( content_settings->GetBlockedCookiesTreeModel()); blocked_cookies_tree_adapter_.reset( - new gtk_tree::TreeAdapter(this, blocked_cookies_tree_model_.get())); + new CookiesTreeAdapter(this, + blocked_cookies_tree_model_.get(), + host_content_settings_map)); 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_widget_set_size_request(blocked_tree_, kTreeViewWidth, 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_); @@ -132,15 +222,24 @@ void CollectedCookiesGtk::Init() { 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); + CookiesTreeAdapter::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); + CookiesTreeAdapter::COL_TITLE); gtk_tree_view_column_set_title( title_column, l10n_util::GetStringUTF8( IDS_COOKIES_DOMAIN_COLUMN_HEADER).c_str()); + gtk_tree_view_column_set_expand(title_column, TRUE); gtk_tree_view_append_column(GTK_TREE_VIEW(blocked_tree_), title_column); + setting_column = gtk_tree_view_column_new_with_attributes( + l10n_util::GetStringUTF8(IDS_EXCEPTIONS_ACTION_HEADER).c_str(), + gtk_cell_renderer_text_new(), + "text", CookiesTreeAdapter::COOKIES_COL_SETTING, + "style", CookiesTreeAdapter::COOKIES_COL_STYLE, + NULL); + gtk_tree_view_column_set_alignment(setting_column, 1); + gtk_tree_view_append_column(GTK_TREE_VIEW(blocked_tree_), setting_column); g_signal_connect(blocked_tree_, "row-expanded", G_CALLBACK(OnTreeViewRowExpandedThunk), this); blocked_selection_ = @@ -268,6 +367,7 @@ void CollectedCookiesGtk::AddExceptions(GtkTreeSelection* selection, if (node->CanCreateContentException()) { node->CreateContentException( tab_contents_->profile()->GetHostContentSettingsMap(), setting); + adapter->TreeNodeChanged(adapter->tree_model(), adapter->GetNode(&iter)); } } g_list_foreach(paths, reinterpret_cast<GFunc>(gtk_tree_path_free), NULL); diff --git a/chrome/browser/gtk/gtk_tree.cc b/chrome/browser/gtk/gtk_tree.cc index eeb4511..303df11 100644 --- a/chrome/browser/gtk/gtk_tree.cc +++ b/chrome/browser/gtk/gtk_tree.cc @@ -158,8 +158,8 @@ void TableAdapter::OnItemsRemoved(int start, int length) { // TreeAdapter TreeAdapter::TreeAdapter(Delegate* delegate, TreeModel* tree_model) - : delegate_(delegate), - tree_model_(tree_model) { + : tree_model_(tree_model), + delegate_(delegate) { tree_store_ = gtk_tree_store_new(COL_COUNT, GDK_TYPE_PIXBUF, G_TYPE_STRING, diff --git a/chrome/browser/gtk/gtk_tree.h b/chrome/browser/gtk/gtk_tree.h index a302bba..550a992 100644 --- a/chrome/browser/gtk/gtk_tree.h +++ b/chrome/browser/gtk/gtk_tree.h @@ -66,8 +66,8 @@ class TableAdapter : public TableModelObserver { }; // |table_model| may be NULL. - explicit TableAdapter(Delegate* delegate, GtkListStore* list_store, - TableModel* table_model); + TableAdapter(Delegate* delegate, GtkListStore* list_store, + TableModel* table_model); virtual ~TableAdapter() {} // Replace the TableModel with a different one. If the list store currenty @@ -127,6 +127,9 @@ class TreeAdapter : public TreeModelObserver { // Return the tree store. GtkTreeStore* tree_store() { return tree_store_; } + // Return the tree model. + TreeModel* tree_model() { return tree_model_; } + // Get the TreeModelNode corresponding to iter in the tree store. TreeModelNode* GetNode(GtkTreeIter* iter); @@ -142,10 +145,15 @@ class TreeAdapter : public TreeModelObserver { virtual void TreeNodeChanged(TreeModel* model, TreeModelNode* node); // End TreeModelObserver implementation. - private: + protected: // Fill the tree store values for a given node. - void FillRow(GtkTreeIter* iter, TreeModelNode* node); + virtual void FillRow(GtkTreeIter* iter, TreeModelNode* node); + + GtkTreeStore* tree_store_; + TreeModel* tree_model_; + std::vector<GdkPixbuf*> pixbufs_; + private: // Fill the tree store for a row and all its descendants. void Fill(GtkTreeIter* parent_iter, TreeModelNode* parent_node); @@ -157,9 +165,8 @@ class TreeAdapter : public TreeModelObserver { bool GetTreeIter(TreeModelNode* node, GtkTreeIter* iter); Delegate* delegate_; - GtkTreeStore* tree_store_; - TreeModel* tree_model_; - std::vector<GdkPixbuf*> pixbufs_; + + DISALLOW_COPY_AND_ASSIGN(TreeAdapter); }; } // namespace gtk_tree diff --git a/chrome/browser/host_content_settings_map.cc b/chrome/browser/host_content_settings_map.cc index dabdc96..cf7d98b 100644 --- a/chrome/browser/host_content_settings_map.cc +++ b/chrome/browser/host_content_settings_map.cc @@ -340,6 +340,8 @@ ContentSettings HostContentSettingsMap::GetContentSettings( const GURL& url) const { ContentSettings output = GetNonDefaultContentSettings(url); + AutoLock auto_lock(lock_); + // Make the remaining defaults explicit. for (int j = 0; j < CONTENT_SETTINGS_NUM_TYPES; ++j) if (output.settings[j] == CONTENT_SETTING_DEFAULT || |