1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/gtk/collected_cookies_gtk.h"
8 #include "base/prefs/pref_service.h"
9 #include "chrome/browser/browsing_data/browsing_data_appcache_helper.h"
10 #include "chrome/browser/browsing_data/browsing_data_cookie_helper.h"
11 #include "chrome/browser/browsing_data/browsing_data_database_helper.h"
12 #include "chrome/browser/browsing_data/browsing_data_file_system_helper.h"
13 #include "chrome/browser/browsing_data/browsing_data_indexed_db_helper.h"
14 #include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h"
15 #include "chrome/browser/browsing_data/browsing_data_server_bound_cert_helper.h"
16 #include "chrome/browser/browsing_data/cookies_tree_model.h"
17 #include "chrome/browser/browsing_data/local_data_container.h"
18 #include "chrome/browser/chrome_notification_types.h"
19 #include "chrome/browser/content_settings/cookie_settings.h"
20 #include "chrome/browser/content_settings/local_shared_objects_container.h"
21 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
22 #include "chrome/browser/infobars/infobar_service.h"
23 #include "chrome/browser/profiles/profile.h"
24 #include "chrome/browser/ui/browser_dialogs.h"
25 #include "chrome/browser/ui/collected_cookies_infobar_delegate.h"
26 #include "chrome/browser/ui/gtk/constrained_window_gtk.h"
27 #include "chrome/browser/ui/gtk/gtk_chrome_cookie_view.h"
28 #include "chrome/browser/ui/gtk/gtk_util.h"
29 #include "chrome/common/pref_names.h"
30 #include "components/web_modal/web_contents_modal_dialog_manager.h"
31 #include "content/public/browser/notification_source.h"
32 #include "content/public/browser/web_contents.h"
33 #include "content/public/browser/web_contents_view.h"
34 #include "grit/generated_resources.h"
35 #include "net/cookies/canonical_cookie.h"
36 #include "ui/base/gtk/gtk_hig_constants.h"
37 #include "ui/base/l10n/l10n_util.h"
39 using web_modal::WebContentsModalDialogManager
;
42 // Width and height of the cookie tree view.
43 const int kTreeViewWidth
= 450;
44 const int kTreeViewHeight
= 150;
46 // The page numbers of the pages in the notebook.
47 const gint kAllowedPageNumber
= 0;
48 const gint kBlockedPageNumber
= 1;
50 // Padding within the banner box.
51 const int kBannerPadding
= 3;
53 // Returns the text to display in the info bar when content settings were
55 const std::string
GetInfobarLabel(ContentSetting setting
,
56 bool multiple_domains_added
,
57 const base::string16
& domain_name
) {
58 if (multiple_domains_added
) {
60 case CONTENT_SETTING_BLOCK
:
61 return l10n_util::GetStringUTF8(
62 IDS_COLLECTED_COOKIES_MULTIPLE_BLOCK_RULES_CREATED
);
64 case CONTENT_SETTING_ALLOW
:
65 return l10n_util::GetStringUTF8(
66 IDS_COLLECTED_COOKIES_MULTIPLE_ALLOW_RULES_CREATED
);
68 case CONTENT_SETTING_SESSION_ONLY
:
69 return l10n_util::GetStringUTF8(
70 IDS_COLLECTED_COOKIES_MULTIPLE_SESSION_RULES_CREATED
);
79 case CONTENT_SETTING_BLOCK
:
80 return l10n_util::GetStringFUTF8(
81 IDS_COLLECTED_COOKIES_BLOCK_RULE_CREATED
, domain_name
);
83 case CONTENT_SETTING_ALLOW
:
84 return l10n_util::GetStringFUTF8(
85 IDS_COLLECTED_COOKIES_ALLOW_RULE_CREATED
, domain_name
);
87 case CONTENT_SETTING_SESSION_ONLY
:
88 return l10n_util::GetStringFUTF8(
89 IDS_COLLECTED_COOKIES_SESSION_RULE_CREATED
, domain_name
);
101 // Declared in browser_dialogs.h so others don't have to depend on our header.
102 void ShowCollectedCookiesDialog(content::WebContents
* web_contents
) {
103 // Deletes itself on close.
104 new CollectedCookiesGtk(
105 web_contents
->GetView()->GetTopLevelNativeWindow(),
109 } // namespace chrome
111 CollectedCookiesGtk::CollectedCookiesGtk(GtkWindow
* parent
,
112 content::WebContents
* web_contents
)
113 : web_contents_(web_contents
),
114 status_changed_(false) {
115 TabSpecificContentSettings
* content_settings
=
116 TabSpecificContentSettings::FromWebContents(web_contents
);
117 registrar_
.Add(this, chrome::NOTIFICATION_COLLECTED_COOKIES_SHOWN
,
118 content::Source
<TabSpecificContentSettings
>(content_settings
));
123 void CollectedCookiesGtk::Init() {
124 dialog_
= gtk_vbox_new(FALSE
, ui::kContentAreaSpacing
);
125 gtk_box_set_spacing(GTK_BOX(dialog_
), ui::kContentAreaSpacing
);
126 g_signal_connect(dialog_
, "destroy", G_CALLBACK(OnDestroyThunk
), this);
128 GtkWidget
* label
= gtk_label_new(
129 l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_DIALOG_TITLE
).c_str());
130 gtk_box_pack_start(GTK_BOX(dialog_
), label
, TRUE
, TRUE
, 0);
132 notebook_
= gtk_notebook_new();
133 gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook_
), GTK_POS_TOP
);
134 gtk_box_pack_start(GTK_BOX(dialog_
), notebook_
, TRUE
, TRUE
, 0);
136 GtkWidget
* allowed_pane
= CreateAllowedPane();
137 label
= gtk_label_new(
138 l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_ALLOWED_COOKIES_TAB_LABEL
)
140 gtk_widget_show(label
);
141 gtk_notebook_insert_page(GTK_NOTEBOOK(notebook_
), allowed_pane
, label
,
144 GtkWidget
* blocked_pane
= CreateBlockedPane();
145 label
= gtk_label_new(
146 l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_TAB_LABEL
)
148 gtk_widget_show(label
);
149 gtk_notebook_insert_page(GTK_NOTEBOOK(notebook_
), blocked_pane
, label
,
151 // Hook up the signal only after all pages are inserted, otherwise not
152 // all member variables used in OnSwitchPage() will be properly initialized.
153 g_signal_connect(notebook_
, "switch-page", G_CALLBACK(OnSwitchPageThunk
),
157 cookie_info_view_
= gtk_chrome_cookie_view_new(false);
158 gtk_box_pack_start(GTK_BOX(dialog_
), cookie_info_view_
, TRUE
, TRUE
, 0);
159 gtk_chrome_cookie_view_clear(GTK_CHROME_COOKIE_VIEW(cookie_info_view_
));
160 gtk_widget_show_all(cookie_info_view_
);
163 infobar_
= gtk_frame_new(NULL
);
164 GtkWidget
* infobar_contents
= gtk_hbox_new(FALSE
, kBannerPadding
);
165 gtk_container_set_border_width(GTK_CONTAINER(infobar_contents
),
167 gtk_container_add(GTK_CONTAINER(infobar_
), infobar_contents
);
168 GtkWidget
* info_image
=
169 gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO
,
170 GTK_ICON_SIZE_SMALL_TOOLBAR
);
171 gtk_box_pack_start(GTK_BOX(infobar_contents
), info_image
, FALSE
, FALSE
, 0);
172 infobar_label_
= gtk_label_new(NULL
);
174 GTK_BOX(infobar_contents
), infobar_label_
, FALSE
, FALSE
, 0);
175 gtk_widget_show_all(infobar_
);
176 gtk_widget_set_no_show_all(infobar_
, TRUE
);
177 gtk_widget_hide(infobar_
);
178 gtk_box_pack_start(GTK_BOX(dialog_
), infobar_
, TRUE
, TRUE
, 0);
181 GtkWidget
* button_box
= gtk_hbutton_box_new();
182 gtk_button_box_set_layout(GTK_BUTTON_BOX(button_box
), GTK_BUTTONBOX_END
);
183 gtk_box_set_spacing(GTK_BOX(button_box
), ui::kControlSpacing
);
184 gtk_box_pack_end(GTK_BOX(dialog_
), button_box
, FALSE
, TRUE
, 0);
185 close_button_
= gtk_button_new_from_stock(GTK_STOCK_CLOSE
);
186 gtk_button_set_label(GTK_BUTTON(close_button_
),
187 l10n_util::GetStringUTF8(IDS_CLOSE
).c_str());
188 g_signal_connect(close_button_
, "clicked", G_CALLBACK(OnCloseThunk
), this);
189 gtk_box_pack_end(GTK_BOX(button_box
), close_button_
, FALSE
, TRUE
, 0);
192 allowed_cookies_tree_adapter_
->Init();
193 blocked_cookies_tree_adapter_
->Init();
195 ShowCookieInfo(gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook_
)));
196 window_
= CreateWebContentsModalDialogGtk(dialog_
, close_button_
);
198 WebContentsModalDialogManager
* web_contents_modal_dialog_manager
=
199 WebContentsModalDialogManager::FromWebContents(web_contents_
);
200 web_contents_modal_dialog_manager
->ShowDialog(window_
);
203 GtkWidget
* CollectedCookiesGtk::CreateAllowedPane() {
204 GtkWidget
* cookie_list_vbox
= gtk_vbox_new(FALSE
, ui::kControlSpacing
);
206 GtkWidget
* label
= gtk_label_new(
207 l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_ALLOWED_COOKIES_LABEL
).
209 gtk_misc_set_alignment(GTK_MISC(label
), 0, 0.5);
210 gtk_box_pack_start(GTK_BOX(cookie_list_vbox
), label
, FALSE
, FALSE
,
211 ui::kControlSpacing
);
213 GtkWidget
* scroll_window
= gtk_scrolled_window_new(NULL
, NULL
);
214 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window
),
215 GTK_POLICY_AUTOMATIC
,
216 GTK_POLICY_AUTOMATIC
);
217 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll_window
),
218 GTK_SHADOW_ETCHED_IN
);
219 gtk_box_pack_start(GTK_BOX(cookie_list_vbox
), scroll_window
, TRUE
, TRUE
, 0);
221 TabSpecificContentSettings
* content_settings
=
222 TabSpecificContentSettings::FromWebContents(web_contents_
);
224 const LocalSharedObjectsContainer
& allowed_data
=
225 content_settings
->allowed_local_shared_objects();
226 allowed_cookies_tree_model_
= allowed_data
.CreateCookiesTreeModel();
228 allowed_cookies_tree_adapter_
.reset(
229 new gtk_tree::TreeAdapter(this, allowed_cookies_tree_model_
.get()));
230 allowed_tree_
= gtk_tree_view_new_with_model(
231 GTK_TREE_MODEL(allowed_cookies_tree_adapter_
->tree_store()));
232 gtk_widget_set_size_request(allowed_tree_
, kTreeViewWidth
, kTreeViewHeight
);
233 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(allowed_tree_
), FALSE
);
234 gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW(allowed_tree_
), TRUE
);
235 gtk_container_add(GTK_CONTAINER(scroll_window
), allowed_tree_
);
237 GtkTreeViewColumn
* title_column
= gtk_tree_view_column_new();
238 GtkCellRenderer
* pixbuf_renderer
= gtk_cell_renderer_pixbuf_new();
239 gtk_tree_view_column_pack_start(title_column
, pixbuf_renderer
, FALSE
);
240 gtk_tree_view_column_add_attribute(title_column
, pixbuf_renderer
, "pixbuf",
241 gtk_tree::TreeAdapter::COL_ICON
);
242 GtkCellRenderer
* title_renderer
= gtk_cell_renderer_text_new();
243 gtk_tree_view_column_pack_start(title_column
, title_renderer
, TRUE
);
244 gtk_tree_view_column_add_attribute(title_column
, title_renderer
, "text",
245 gtk_tree::TreeAdapter::COL_TITLE
);
246 gtk_tree_view_column_set_title(
247 title_column
, l10n_util::GetStringUTF8(
248 IDS_COOKIES_DOMAIN_COLUMN_HEADER
).c_str());
249 gtk_tree_view_append_column(GTK_TREE_VIEW(allowed_tree_
), title_column
);
250 g_signal_connect(allowed_tree_
, "row-expanded",
251 G_CALLBACK(OnTreeViewRowExpandedThunk
), this);
253 gtk_tree_view_get_selection(GTK_TREE_VIEW(allowed_tree_
));
254 gtk_tree_selection_set_mode(allowed_selection_
, GTK_SELECTION_MULTIPLE
);
255 g_signal_connect(allowed_selection_
, "changed",
256 G_CALLBACK(OnTreeViewSelectionChangeThunk
), this);
258 GtkWidget
* button_box
= gtk_hbutton_box_new();
259 gtk_button_box_set_layout(GTK_BUTTON_BOX(button_box
), GTK_BUTTONBOX_START
);
260 gtk_box_set_spacing(GTK_BOX(button_box
), ui::kControlSpacing
);
261 gtk_box_pack_start(GTK_BOX(cookie_list_vbox
), button_box
, FALSE
, FALSE
,
262 ui::kControlSpacing
);
263 block_allowed_cookie_button_
= gtk_button_new_with_label(
264 l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_BLOCK_BUTTON
).c_str());
265 g_signal_connect(block_allowed_cookie_button_
, "clicked",
266 G_CALLBACK(OnBlockAllowedButtonClickedThunk
), this);
267 gtk_container_add(GTK_CONTAINER(button_box
), block_allowed_cookie_button_
);
269 delete_allowed_cookie_button_
= gtk_button_new_with_label(
270 l10n_util::GetStringUTF8(IDS_COOKIES_REMOVE_LABEL
).c_str());
271 g_signal_connect(delete_allowed_cookie_button_
, "clicked",
272 G_CALLBACK(OnDeleteAllowedButtonClickedThunk
), this);
273 gtk_container_add(GTK_CONTAINER(button_box
), delete_allowed_cookie_button_
);
275 // Wrap the vbox inside an hbox so that we can specify padding along the
277 GtkWidget
* box
= gtk_hbox_new(FALSE
, 0);
278 gtk_box_pack_start(GTK_BOX(box
), cookie_list_vbox
, TRUE
, TRUE
,
279 ui::kControlSpacing
);
283 GtkWidget
* CollectedCookiesGtk::CreateBlockedPane() {
284 PrefService
* prefs
= Profile::FromBrowserContext(
285 web_contents_
->GetBrowserContext())->GetPrefs();
287 GtkWidget
* cookie_list_vbox
= gtk_vbox_new(FALSE
, ui::kControlSpacing
);
289 GtkWidget
* label
= gtk_label_new(
290 l10n_util::GetStringUTF8(
291 prefs
->GetBoolean(prefs::kBlockThirdPartyCookies
) ?
292 IDS_COLLECTED_COOKIES_BLOCKED_THIRD_PARTY_BLOCKING_ENABLED
:
293 IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_LABEL
).c_str());
294 gtk_widget_set_size_request(label
, kTreeViewWidth
, -1);
295 gtk_label_set_line_wrap(GTK_LABEL(label
), TRUE
);
296 gtk_misc_set_alignment(GTK_MISC(label
), 0, 0.5);
297 gtk_box_pack_start(GTK_BOX(cookie_list_vbox
), label
, TRUE
, TRUE
,
298 ui::kControlSpacing
);
300 GtkWidget
* scroll_window
= gtk_scrolled_window_new(NULL
, NULL
);
301 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll_window
),
302 GTK_POLICY_AUTOMATIC
,
303 GTK_POLICY_AUTOMATIC
);
304 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll_window
),
305 GTK_SHADOW_ETCHED_IN
);
306 gtk_box_pack_start(GTK_BOX(cookie_list_vbox
), scroll_window
, TRUE
, TRUE
, 0);
308 TabSpecificContentSettings
* content_settings
=
309 TabSpecificContentSettings::FromWebContents(web_contents_
);
311 const LocalSharedObjectsContainer
& blocked_data
=
312 content_settings
->blocked_local_shared_objects();
313 blocked_cookies_tree_model_
= blocked_data
.CreateCookiesTreeModel();
315 blocked_cookies_tree_adapter_
.reset(
316 new gtk_tree::TreeAdapter(this, blocked_cookies_tree_model_
.get()));
317 blocked_tree_
= gtk_tree_view_new_with_model(
318 GTK_TREE_MODEL(blocked_cookies_tree_adapter_
->tree_store()));
319 gtk_widget_set_size_request(blocked_tree_
, kTreeViewWidth
, kTreeViewHeight
);
320 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(blocked_tree_
), FALSE
);
321 gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW(blocked_tree_
), TRUE
);
322 gtk_container_add(GTK_CONTAINER(scroll_window
), blocked_tree_
);
324 GtkTreeViewColumn
* title_column
= gtk_tree_view_column_new();
325 GtkCellRenderer
* pixbuf_renderer
= gtk_cell_renderer_pixbuf_new();
326 gtk_tree_view_column_pack_start(title_column
, pixbuf_renderer
, FALSE
);
327 gtk_tree_view_column_add_attribute(title_column
, pixbuf_renderer
, "pixbuf",
328 gtk_tree::TreeAdapter::COL_ICON
);
329 GtkCellRenderer
* title_renderer
= gtk_cell_renderer_text_new();
330 gtk_tree_view_column_pack_start(title_column
, title_renderer
, TRUE
);
331 gtk_tree_view_column_add_attribute(title_column
, title_renderer
, "text",
332 gtk_tree::TreeAdapter::COL_TITLE
);
333 gtk_tree_view_column_set_title(
334 title_column
, l10n_util::GetStringUTF8(
335 IDS_COOKIES_DOMAIN_COLUMN_HEADER
).c_str());
336 gtk_tree_view_append_column(GTK_TREE_VIEW(blocked_tree_
), title_column
);
337 g_signal_connect(blocked_tree_
, "row-expanded",
338 G_CALLBACK(OnTreeViewRowExpandedThunk
), this);
340 gtk_tree_view_get_selection(GTK_TREE_VIEW(blocked_tree_
));
341 gtk_tree_selection_set_mode(blocked_selection_
, GTK_SELECTION_MULTIPLE
);
342 g_signal_connect(blocked_selection_
, "changed",
343 G_CALLBACK(OnTreeViewSelectionChangeThunk
), this);
345 GtkWidget
* button_box
= gtk_hbutton_box_new();
346 gtk_button_box_set_layout(GTK_BUTTON_BOX(button_box
), GTK_BUTTONBOX_START
);
347 gtk_box_set_spacing(GTK_BOX(button_box
), ui::kControlSpacing
);
348 gtk_box_pack_start(GTK_BOX(cookie_list_vbox
), button_box
, FALSE
, FALSE
,
349 ui::kControlSpacing
);
350 allow_blocked_cookie_button_
= gtk_button_new_with_label(
351 l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_ALLOW_BUTTON
).c_str());
352 g_signal_connect(allow_blocked_cookie_button_
, "clicked",
353 G_CALLBACK(OnAllowBlockedButtonClickedThunk
), this);
354 gtk_container_add(GTK_CONTAINER(button_box
), allow_blocked_cookie_button_
);
355 for_session_blocked_cookie_button_
= gtk_button_new_with_label(
356 l10n_util::GetStringUTF8(IDS_COLLECTED_COOKIES_SESSION_ONLY_BUTTON
).
358 g_signal_connect(for_session_blocked_cookie_button_
, "clicked",
359 G_CALLBACK(OnForSessionBlockedButtonClickedThunk
), this);
360 gtk_container_add(GTK_CONTAINER(button_box
),
361 for_session_blocked_cookie_button_
);
363 // Wrap the vbox inside an hbox so that we can specify padding along the
365 GtkWidget
* box
= gtk_hbox_new(FALSE
, 0);
366 gtk_box_pack_start(GTK_BOX(box
), cookie_list_vbox
, TRUE
, TRUE
,
367 ui::kControlSpacing
);
371 void CollectedCookiesGtk::ShowCookieInfo(gint current_page
) {
372 if (current_page
== kAllowedPageNumber
) {
373 ShowSelectionInfo(allowed_selection_
, allowed_cookies_tree_adapter_
.get());
374 } else if (current_page
== kBlockedPageNumber
) {
375 ShowSelectionInfo(blocked_selection_
, blocked_cookies_tree_adapter_
.get());
379 void CollectedCookiesGtk::ShowSelectionInfo(GtkTreeSelection
* selection
,
380 gtk_tree::TreeAdapter
* adapter
) {
381 // Check if one "cookie" node is selected. Don't allow more than one.
383 GList
* paths
= gtk_tree_selection_get_selected_rows(selection
, &model
);
384 if (g_list_length(paths
) == 1) {
385 GList
* item
= g_list_first(paths
);
387 gtk_tree_model_get_iter(model
, &iter
,
388 reinterpret_cast<GtkTreePath
*>(item
->data
));
389 CookieTreeNode
* node
=
390 static_cast<CookieTreeNode
*>(adapter
->GetNode(&iter
));
391 const CookieTreeNode::DetailedInfo detailed_info
= node
->GetDetailedInfo();
392 if (detailed_info
.node_type
== CookieTreeNode::DetailedInfo::TYPE_COOKIE
) {
393 gtk_chrome_cookie_view_display_cookie(
394 GTK_CHROME_COOKIE_VIEW(cookie_info_view_
),
395 detailed_info
.cookie
->Domain(),
396 *detailed_info
.cookie
);
398 gtk_chrome_cookie_view_clear(GTK_CHROME_COOKIE_VIEW(cookie_info_view_
));
401 gtk_chrome_cookie_view_clear(GTK_CHROME_COOKIE_VIEW(cookie_info_view_
));
404 g_list_foreach(paths
, reinterpret_cast<GFunc
>(gtk_tree_path_free
), NULL
);
408 CollectedCookiesGtk::~CollectedCookiesGtk() {
409 gtk_widget_destroy(dialog_
);
412 bool CollectedCookiesGtk::SelectionContainsHostNode(
413 GtkTreeSelection
* selection
, gtk_tree::TreeAdapter
* adapter
) {
414 // Check whether at least one "origin" node is selected.
417 gtk_tree_selection_get_selected_rows(selection
, &model
);
418 bool contains_host_node
= false;
419 for (GList
* item
= paths
; item
; item
= item
->next
) {
421 gtk_tree_model_get_iter(
422 model
, &iter
, reinterpret_cast<GtkTreePath
*>(item
->data
));
423 CookieTreeNode
* node
=
424 static_cast<CookieTreeNode
*>(adapter
->GetNode(&iter
));
425 if (node
->GetDetailedInfo().node_type
!=
426 CookieTreeNode::DetailedInfo::TYPE_HOST
)
428 CookieTreeHostNode
* host_node
= static_cast<CookieTreeHostNode
*>(
430 if (!host_node
->CanCreateContentException())
432 contains_host_node
= true;
434 g_list_foreach(paths
, reinterpret_cast<GFunc
>(gtk_tree_path_free
), NULL
);
436 return contains_host_node
;
439 void CollectedCookiesGtk::EnableControls() {
440 // Update button states.
441 bool enable_for_allowed_cookies
=
442 SelectionContainsHostNode(allowed_selection_
,
443 allowed_cookies_tree_adapter_
.get());
444 gtk_widget_set_sensitive(block_allowed_cookie_button_
,
445 enable_for_allowed_cookies
);
446 gtk_widget_set_sensitive(
447 delete_allowed_cookie_button_
,
448 gtk_tree_selection_count_selected_rows(allowed_selection_
) > 0);
450 bool enable_for_blocked_cookies
=
451 SelectionContainsHostNode(blocked_selection_
,
452 blocked_cookies_tree_adapter_
.get());
453 gtk_widget_set_sensitive(allow_blocked_cookie_button_
,
454 enable_for_blocked_cookies
);
455 gtk_widget_set_sensitive(for_session_blocked_cookie_button_
,
456 enable_for_blocked_cookies
);
459 void CollectedCookiesGtk::Observe(int type
,
460 const content::NotificationSource
& source
,
461 const content::NotificationDetails
& details
) {
462 DCHECK(type
== chrome::NOTIFICATION_COLLECTED_COOKIES_SHOWN
);
463 gtk_widget_destroy(window_
);
466 void CollectedCookiesGtk::OnClose(GtkWidget
* close_button
) {
467 if (status_changed_
) {
468 CollectedCookiesInfoBarDelegate::Create(
469 InfoBarService::FromWebContents(web_contents_
));
471 gtk_widget_destroy(window_
);
474 void CollectedCookiesGtk::AddExceptions(GtkTreeSelection
* selection
,
475 gtk_tree::TreeAdapter
* adapter
,
476 ContentSetting setting
) {
479 gtk_tree_selection_get_selected_rows(selection
, &model
);
480 base::string16 last_domain_name
;
481 bool multiple_domains_added
= false;
482 for (GList
* item
= paths
; item
; item
= item
->next
) {
484 gtk_tree_model_get_iter(
485 model
, &iter
, reinterpret_cast<GtkTreePath
*>(item
->data
));
486 CookieTreeNode
* node
=
487 static_cast<CookieTreeNode
*>(adapter
->GetNode(&iter
));
488 if (node
->GetDetailedInfo().node_type
!=
489 CookieTreeNode::DetailedInfo::TYPE_HOST
)
491 CookieTreeHostNode
* host_node
= static_cast<CookieTreeHostNode
*>(
493 if (host_node
->CanCreateContentException()) {
494 if (!last_domain_name
.empty())
495 multiple_domains_added
= true;
496 last_domain_name
= host_node
->GetTitle();
498 Profile::FromBrowserContext(web_contents_
->GetBrowserContext());
499 host_node
->CreateContentException(
500 CookieSettings::Factory::GetForProfile(profile
).get(), setting
);
503 g_list_foreach(paths
, reinterpret_cast<GFunc
>(gtk_tree_path_free
), NULL
);
505 if (last_domain_name
.empty()) {
506 gtk_widget_hide(infobar_
);
509 GTK_LABEL(infobar_label_
), GetInfobarLabel(
510 setting
, multiple_domains_added
, last_domain_name
).c_str());
511 gtk_widget_show(infobar_
);
513 status_changed_
= true;
516 void CollectedCookiesGtk::OnBlockAllowedButtonClicked(GtkWidget
* button
) {
517 AddExceptions(allowed_selection_
, allowed_cookies_tree_adapter_
.get(),
518 CONTENT_SETTING_BLOCK
);
521 void CollectedCookiesGtk::OnDeleteAllowedButtonClicked(GtkWidget
* button
) {
523 GList
* paths
= gtk_tree_selection_get_selected_rows(
524 allowed_selection_
, &model
);
525 for (GList
* item
= paths
; item
; item
= item
->next
) {
527 gtk_tree_model_get_iter(
528 model
, &iter
, reinterpret_cast<GtkTreePath
*>(item
->data
));
529 CookieTreeNode
* node
= static_cast<CookieTreeNode
*>(
530 allowed_cookies_tree_adapter_
->GetNode(&iter
));
531 allowed_cookies_tree_model_
->DeleteCookieNode(node
);
535 void CollectedCookiesGtk::OnAllowBlockedButtonClicked(GtkWidget
* button
) {
536 AddExceptions(blocked_selection_
, blocked_cookies_tree_adapter_
.get(),
537 CONTENT_SETTING_ALLOW
);
540 void CollectedCookiesGtk::OnForSessionBlockedButtonClicked(GtkWidget
* button
) {
541 AddExceptions(blocked_selection_
, blocked_cookies_tree_adapter_
.get(),
542 CONTENT_SETTING_SESSION_ONLY
);
545 void CollectedCookiesGtk::OnSwitchPage(GtkWidget
* notebook
,
549 ShowCookieInfo(page_num
);
552 void CollectedCookiesGtk::OnTreeViewRowExpanded(GtkWidget
* tree_view
,
555 // When a row in the tree is expanded, expand all the children too.
556 g_signal_handlers_block_by_func(
557 tree_view
, reinterpret_cast<gpointer
>(OnTreeViewRowExpandedThunk
), this);
558 gtk_tree_view_expand_row(GTK_TREE_VIEW(tree_view
), path
, TRUE
);
559 g_signal_handlers_unblock_by_func(
560 tree_view
, reinterpret_cast<gpointer
>(OnTreeViewRowExpandedThunk
), this);
563 void CollectedCookiesGtk::OnTreeViewSelectionChange(GtkWidget
* selection
) {
565 ShowCookieInfo(gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook_
)));
568 void CollectedCookiesGtk::OnDestroy(GtkWidget
* widget
) {