OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/gtk/collected_cookies_gtk.h" | 5 #include "chrome/browser/gtk/collected_cookies_gtk.h" |
6 | 6 |
7 #include "app/gtk_util.h" | 7 #include "app/gtk_util.h" |
8 #include "app/l10n_util.h" | 8 #include "app/l10n_util.h" |
9 #include "chrome/browser/cookies_tree_model.h" | 9 #include "chrome/browser/cookies_tree_model.h" |
10 #include "chrome/browser/gtk/gtk_util.h" | 10 #include "chrome/browser/gtk/gtk_util.h" |
| 11 #include "chrome/browser/profile.h" |
11 #include "chrome/browser/tab_contents/tab_contents.h" | 12 #include "chrome/browser/tab_contents/tab_contents.h" |
12 #include "chrome/common/notification_service.h" | 13 #include "chrome/common/notification_service.h" |
13 #include "grit/generated_resources.h" | 14 #include "grit/generated_resources.h" |
14 | 15 |
15 namespace { | 16 namespace { |
16 // Height of the cookie tree view. | 17 // Height of the cookie tree view. |
17 const int kTreeViewHeight = 150; | 18 const int kTreeViewHeight = 150; |
18 } // namespace | 19 } // namespace |
19 | 20 |
20 CollectedCookiesGtk::CollectedCookiesGtk(GtkWindow* parent, | 21 CollectedCookiesGtk::CollectedCookiesGtk(GtkWindow* parent, |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 GtkCellRenderer* title_renderer = gtk_cell_renderer_text_new(); | 77 GtkCellRenderer* title_renderer = gtk_cell_renderer_text_new(); |
77 gtk_tree_view_column_pack_start(title_column, title_renderer, TRUE); | 78 gtk_tree_view_column_pack_start(title_column, title_renderer, TRUE); |
78 gtk_tree_view_column_add_attribute(title_column, title_renderer, "text", | 79 gtk_tree_view_column_add_attribute(title_column, title_renderer, "text", |
79 gtk_tree::TreeAdapter::COL_TITLE); | 80 gtk_tree::TreeAdapter::COL_TITLE); |
80 gtk_tree_view_column_set_title( | 81 gtk_tree_view_column_set_title( |
81 title_column, l10n_util::GetStringUTF8( | 82 title_column, l10n_util::GetStringUTF8( |
82 IDS_COOKIES_DOMAIN_COLUMN_HEADER).c_str()); | 83 IDS_COOKIES_DOMAIN_COLUMN_HEADER).c_str()); |
83 gtk_tree_view_append_column(GTK_TREE_VIEW(allowed_tree_), title_column); | 84 gtk_tree_view_append_column(GTK_TREE_VIEW(allowed_tree_), title_column); |
84 g_signal_connect(allowed_tree_, "row-expanded", | 85 g_signal_connect(allowed_tree_, "row-expanded", |
85 G_CALLBACK(OnTreeViewRowExpandedThunk), this); | 86 G_CALLBACK(OnTreeViewRowExpandedThunk), this); |
| 87 allowed_selection_ = |
| 88 gtk_tree_view_get_selection(GTK_TREE_VIEW(allowed_tree_)); |
| 89 gtk_tree_selection_set_mode(allowed_selection_, GTK_SELECTION_MULTIPLE); |
| 90 g_signal_connect(allowed_selection_, "changed", |
| 91 G_CALLBACK(OnTreeViewSelectionChangeThunk), this); |
| 92 |
| 93 GtkWidget* button_box = gtk_hbutton_box_new(); |
| 94 gtk_button_box_set_layout(GTK_BUTTON_BOX(button_box), GTK_BUTTONBOX_START); |
| 95 gtk_box_set_spacing(GTK_BOX(button_box), gtk_util::kControlSpacing); |
| 96 gtk_box_pack_start(GTK_BOX(dialog_), button_box, FALSE, FALSE, 0); |
| 97 block_allowed_cookie_button_ = gtk_button_new_with_label( |
| 98 l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_BLOCK_BUTTON).c_str()); |
| 99 g_signal_connect(block_allowed_cookie_button_, "clicked", |
| 100 G_CALLBACK(OnBlockAllowedButtonClickedThunk), this); |
| 101 gtk_container_add(GTK_CONTAINER(button_box), block_allowed_cookie_button_); |
86 | 102 |
87 // Blocked Cookie list. | 103 // Blocked Cookie list. |
88 cookie_list_vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); | 104 cookie_list_vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); |
89 gtk_box_pack_start(GTK_BOX(dialog_), cookie_list_vbox, TRUE, TRUE, 0); | 105 gtk_box_pack_start(GTK_BOX(dialog_), cookie_list_vbox, TRUE, TRUE, 0); |
90 | 106 |
91 label = gtk_label_new( | 107 label = gtk_label_new( |
92 l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_LABEL). | 108 l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_LABEL). |
93 c_str()); | 109 c_str()); |
94 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); | 110 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); |
95 gtk_box_pack_start(GTK_BOX(cookie_list_vbox), label, FALSE, FALSE, 0); | 111 gtk_box_pack_start(GTK_BOX(cookie_list_vbox), label, FALSE, FALSE, 0); |
(...skipping 25 matching lines...) Expand all Loading... |
121 title_renderer = gtk_cell_renderer_text_new(); | 137 title_renderer = gtk_cell_renderer_text_new(); |
122 gtk_tree_view_column_pack_start(title_column, title_renderer, TRUE); | 138 gtk_tree_view_column_pack_start(title_column, title_renderer, TRUE); |
123 gtk_tree_view_column_add_attribute(title_column, title_renderer, "text", | 139 gtk_tree_view_column_add_attribute(title_column, title_renderer, "text", |
124 gtk_tree::TreeAdapter::COL_TITLE); | 140 gtk_tree::TreeAdapter::COL_TITLE); |
125 gtk_tree_view_column_set_title( | 141 gtk_tree_view_column_set_title( |
126 title_column, l10n_util::GetStringUTF8( | 142 title_column, l10n_util::GetStringUTF8( |
127 IDS_COOKIES_DOMAIN_COLUMN_HEADER).c_str()); | 143 IDS_COOKIES_DOMAIN_COLUMN_HEADER).c_str()); |
128 gtk_tree_view_append_column(GTK_TREE_VIEW(blocked_tree_), title_column); | 144 gtk_tree_view_append_column(GTK_TREE_VIEW(blocked_tree_), title_column); |
129 g_signal_connect(blocked_tree_, "row-expanded", | 145 g_signal_connect(blocked_tree_, "row-expanded", |
130 G_CALLBACK(OnTreeViewRowExpandedThunk), this); | 146 G_CALLBACK(OnTreeViewRowExpandedThunk), this); |
| 147 blocked_selection_ = |
| 148 gtk_tree_view_get_selection(GTK_TREE_VIEW(blocked_tree_)); |
| 149 gtk_tree_selection_set_mode(blocked_selection_, GTK_SELECTION_MULTIPLE); |
| 150 g_signal_connect(blocked_selection_, "changed", |
| 151 G_CALLBACK(OnTreeViewSelectionChangeThunk), this); |
| 152 |
| 153 button_box = gtk_hbutton_box_new(); |
| 154 gtk_button_box_set_layout(GTK_BUTTON_BOX(button_box), GTK_BUTTONBOX_START); |
| 155 gtk_box_set_spacing(GTK_BOX(button_box), gtk_util::kControlSpacing); |
| 156 gtk_box_pack_start(GTK_BOX(dialog_), button_box, FALSE, FALSE, 0); |
| 157 allow_blocked_cookie_button_ = gtk_button_new_with_label( |
| 158 l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_ALLOW_BUTTON).c_str()); |
| 159 g_signal_connect(allow_blocked_cookie_button_, "clicked", |
| 160 G_CALLBACK(OnAllowBlockedButtonClickedThunk), this); |
| 161 gtk_container_add(GTK_CONTAINER(button_box), allow_blocked_cookie_button_); |
| 162 for_session_blocked_cookie_button_ = gtk_button_new_with_label( |
| 163 l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_SESSION_ONLY_BUTTON). |
| 164 c_str()); |
| 165 g_signal_connect(for_session_blocked_cookie_button_, "clicked", |
| 166 G_CALLBACK(OnForSessionBlockedButtonClickedThunk), this); |
| 167 gtk_container_add(GTK_CONTAINER(button_box), |
| 168 for_session_blocked_cookie_button_); |
131 | 169 |
132 // Close button. | 170 // Close button. |
133 GtkWidget* button_box = gtk_hbutton_box_new(); | 171 button_box = gtk_hbutton_box_new(); |
134 gtk_button_box_set_layout(GTK_BUTTON_BOX(button_box), GTK_BUTTONBOX_END); | 172 gtk_button_box_set_layout(GTK_BUTTON_BOX(button_box), GTK_BUTTONBOX_END); |
135 gtk_box_set_spacing(GTK_BOX(button_box), gtk_util::kControlSpacing); | 173 gtk_box_set_spacing(GTK_BOX(button_box), gtk_util::kControlSpacing); |
136 gtk_box_pack_end(GTK_BOX(dialog_), button_box, FALSE, TRUE, 0); | 174 gtk_box_pack_end(GTK_BOX(dialog_), button_box, FALSE, TRUE, 0); |
137 GtkWidget* close = gtk_button_new_from_stock(GTK_STOCK_CLOSE); | 175 GtkWidget* close = gtk_button_new_from_stock(GTK_STOCK_CLOSE); |
138 gtk_button_set_label(GTK_BUTTON(close), | 176 gtk_button_set_label(GTK_BUTTON(close), |
139 l10n_util::GetStringUTF8(IDS_CLOSE).c_str()); | 177 l10n_util::GetStringUTF8(IDS_CLOSE).c_str()); |
140 g_signal_connect(close, "clicked", G_CALLBACK(OnCloseThunk), this); | 178 g_signal_connect(close, "clicked", G_CALLBACK(OnCloseThunk), this); |
141 gtk_box_pack_end(GTK_BOX(button_box), close, FALSE, TRUE, 0); | 179 gtk_box_pack_end(GTK_BOX(button_box), close, FALSE, TRUE, 0); |
142 | 180 |
143 // Show the dialog. | 181 // Show the dialog. |
144 allowed_cookies_tree_adapter_->Init(); | 182 allowed_cookies_tree_adapter_->Init(); |
145 blocked_cookies_tree_adapter_->Init(); | 183 blocked_cookies_tree_adapter_->Init(); |
| 184 EnableControls(); |
146 window_ = tab_contents_->CreateConstrainedDialog(this); | 185 window_ = tab_contents_->CreateConstrainedDialog(this); |
147 } | 186 } |
148 | 187 |
149 CollectedCookiesGtk::~CollectedCookiesGtk() { | 188 CollectedCookiesGtk::~CollectedCookiesGtk() { |
150 gtk_widget_destroy(dialog_); | 189 gtk_widget_destroy(dialog_); |
151 } | 190 } |
152 | 191 |
153 GtkWidget* CollectedCookiesGtk::GetWidgetRoot() { | 192 GtkWidget* CollectedCookiesGtk::GetWidgetRoot() { |
154 return dialog_; | 193 return dialog_; |
155 } | 194 } |
156 | 195 |
157 void CollectedCookiesGtk::DeleteDelegate() { | 196 void CollectedCookiesGtk::DeleteDelegate() { |
158 delete this; | 197 delete this; |
159 } | 198 } |
160 | 199 |
| 200 bool CollectedCookiesGtk::SelectionContainsOriginNode( |
| 201 GtkTreeSelection* selection, gtk_tree::TreeAdapter* adapter) { |
| 202 // Check whether at least one "origin" node is selected. |
| 203 GtkTreeModel* model; |
| 204 GList* paths = |
| 205 gtk_tree_selection_get_selected_rows(selection, &model); |
| 206 bool contains_origin_node = false; |
| 207 for (GList* item = paths; item; item = item->next) { |
| 208 GtkTreeIter iter; |
| 209 gtk_tree_model_get_iter( |
| 210 model, &iter, reinterpret_cast<GtkTreePath*>(item->data)); |
| 211 CookieTreeNode* node = |
| 212 static_cast<CookieTreeNode*>(adapter->GetNode(&iter)); |
| 213 if (node->GetDetailedInfo().node_type != |
| 214 CookieTreeNode::DetailedInfo::TYPE_ORIGIN) |
| 215 continue; |
| 216 CookieTreeOriginNode* origin_node = static_cast<CookieTreeOriginNode*>( |
| 217 node); |
| 218 if (!origin_node->CanCreateContentException()) |
| 219 continue; |
| 220 contains_origin_node = true; |
| 221 } |
| 222 g_list_foreach(paths, reinterpret_cast<GFunc>(gtk_tree_path_free), NULL); |
| 223 g_list_free(paths); |
| 224 return contains_origin_node; |
| 225 } |
| 226 |
| 227 void CollectedCookiesGtk::EnableControls() { |
| 228 // Update button states. |
| 229 bool enable_for_allowed_cookies = |
| 230 SelectionContainsOriginNode(allowed_selection_, |
| 231 allowed_cookies_tree_adapter_.get()); |
| 232 gtk_widget_set_sensitive(block_allowed_cookie_button_, |
| 233 enable_for_allowed_cookies); |
| 234 |
| 235 bool enable_for_blocked_cookies = |
| 236 SelectionContainsOriginNode(blocked_selection_, |
| 237 blocked_cookies_tree_adapter_.get()); |
| 238 gtk_widget_set_sensitive(allow_blocked_cookie_button_, |
| 239 enable_for_blocked_cookies); |
| 240 gtk_widget_set_sensitive(for_session_blocked_cookie_button_, |
| 241 enable_for_blocked_cookies); |
| 242 } |
| 243 |
161 void CollectedCookiesGtk::Observe(NotificationType type, | 244 void CollectedCookiesGtk::Observe(NotificationType type, |
162 const NotificationSource& source, | 245 const NotificationSource& source, |
163 const NotificationDetails& details) { | 246 const NotificationDetails& details) { |
164 DCHECK(type == NotificationType::COLLECTED_COOKIES_SHOWN); | 247 DCHECK(type == NotificationType::COLLECTED_COOKIES_SHOWN); |
165 DCHECK_EQ(Source<TabSpecificContentSettings>(source).ptr(), | 248 DCHECK_EQ(Source<TabSpecificContentSettings>(source).ptr(), |
166 tab_contents_->GetTabSpecificContentSettings()); | 249 tab_contents_->GetTabSpecificContentSettings()); |
167 window_->CloseConstrainedWindow(); | 250 window_->CloseConstrainedWindow(); |
168 } | 251 } |
169 | 252 |
170 void CollectedCookiesGtk::OnClose(GtkWidget* close_button) { | 253 void CollectedCookiesGtk::OnClose(GtkWidget* close_button) { |
171 window_->CloseConstrainedWindow(); | 254 window_->CloseConstrainedWindow(); |
172 } | 255 } |
173 | 256 |
| 257 void CollectedCookiesGtk::AddExceptions(GtkTreeSelection* selection, |
| 258 gtk_tree::TreeAdapter* adapter, |
| 259 ContentSetting setting) { |
| 260 GtkTreeModel* model; |
| 261 GList* paths = |
| 262 gtk_tree_selection_get_selected_rows(selection, &model); |
| 263 for (GList* item = paths; item; item = item->next) { |
| 264 GtkTreeIter iter; |
| 265 gtk_tree_model_get_iter( |
| 266 model, &iter, reinterpret_cast<GtkTreePath*>(item->data)); |
| 267 CookieTreeOriginNode* node = static_cast<CookieTreeOriginNode*>( |
| 268 adapter->GetNode(&iter)); |
| 269 if (!node->CanCreateContentException()) { |
| 270 node->CreateContentException( |
| 271 tab_contents_->profile()->GetHostContentSettingsMap(), setting); |
| 272 } |
| 273 } |
| 274 g_list_foreach(paths, reinterpret_cast<GFunc>(gtk_tree_path_free), NULL); |
| 275 g_list_free(paths); |
| 276 } |
| 277 |
| 278 void CollectedCookiesGtk::OnBlockAllowedButtonClicked(GtkWidget* button) { |
| 279 AddExceptions(allowed_selection_, allowed_cookies_tree_adapter_.get(), |
| 280 CONTENT_SETTING_BLOCK); |
| 281 } |
| 282 |
| 283 void CollectedCookiesGtk::OnAllowBlockedButtonClicked(GtkWidget* button) { |
| 284 AddExceptions(blocked_selection_, blocked_cookies_tree_adapter_.get(), |
| 285 CONTENT_SETTING_ALLOW); |
| 286 } |
| 287 |
| 288 void CollectedCookiesGtk::OnForSessionBlockedButtonClicked(GtkWidget* button) { |
| 289 AddExceptions(blocked_selection_, blocked_cookies_tree_adapter_.get(), |
| 290 CONTENT_SETTING_SESSION_ONLY); |
| 291 } |
| 292 |
174 void CollectedCookiesGtk::OnTreeViewRowExpanded(GtkWidget* tree_view, | 293 void CollectedCookiesGtk::OnTreeViewRowExpanded(GtkWidget* tree_view, |
175 GtkTreeIter* iter, | 294 GtkTreeIter* iter, |
176 GtkTreePath* path) { | 295 GtkTreePath* path) { |
177 // When a row in the tree is expanded, expand all the children too. | 296 // When a row in the tree is expanded, expand all the children too. |
178 g_signal_handlers_block_by_func( | 297 g_signal_handlers_block_by_func( |
179 tree_view, reinterpret_cast<gpointer>(OnTreeViewRowExpandedThunk), this); | 298 tree_view, reinterpret_cast<gpointer>(OnTreeViewRowExpandedThunk), this); |
180 gtk_tree_view_expand_row(GTK_TREE_VIEW(tree_view), path, TRUE); | 299 gtk_tree_view_expand_row(GTK_TREE_VIEW(tree_view), path, TRUE); |
181 g_signal_handlers_unblock_by_func( | 300 g_signal_handlers_unblock_by_func( |
182 tree_view, reinterpret_cast<gpointer>(OnTreeViewRowExpandedThunk), this); | 301 tree_view, reinterpret_cast<gpointer>(OnTreeViewRowExpandedThunk), this); |
183 } | 302 } |
| 303 |
| 304 void CollectedCookiesGtk::OnTreeViewSelectionChange(GtkWidget* selection) { |
| 305 EnableControls(); |
| 306 } |
OLD | NEW |