Extend EnrollmentHandler to handle consumer management.
[chromium-blink-merge.git] / chrome / browser / ui / views / collected_cookies_views.cc
blob101337bbc26223754f523458d0e8a83c13823ce0
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/views/collected_cookies_views.h"
7 #include "base/prefs/pref_service.h"
8 #include "chrome/browser/browsing_data/browsing_data_appcache_helper.h"
9 #include "chrome/browser/browsing_data/browsing_data_channel_id_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/cookies_tree_model.h"
16 #include "chrome/browser/chrome_notification_types.h"
17 #include "chrome/browser/content_settings/cookie_settings.h"
18 #include "chrome/browser/content_settings/local_shared_objects_container.h"
19 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
20 #include "chrome/browser/infobars/infobar_service.h"
21 #include "chrome/browser/profiles/profile.h"
22 #include "chrome/browser/ui/collected_cookies_infobar_delegate.h"
23 #include "chrome/browser/ui/views/constrained_window_views.h"
24 #include "chrome/browser/ui/views/cookie_info_view.h"
25 #include "chrome/common/pref_names.h"
26 #include "content/public/browser/notification_details.h"
27 #include "content/public/browser/notification_source.h"
28 #include "content/public/browser/web_contents.h"
29 #include "grit/generated_resources.h"
30 #include "grit/locale_settings.h"
31 #include "grit/theme_resources.h"
32 #include "net/cookies/canonical_cookie.h"
33 #include "ui/base/l10n/l10n_util.h"
34 #include "ui/base/resource/resource_bundle.h"
35 #include "ui/gfx/color_utils.h"
36 #include "ui/views/border.h"
37 #include "ui/views/controls/button/label_button.h"
38 #include "ui/views/controls/image_view.h"
39 #include "ui/views/controls/label.h"
40 #include "ui/views/controls/scroll_view.h"
41 #include "ui/views/controls/tabbed_pane/tabbed_pane.h"
42 #include "ui/views/controls/tree/tree_view.h"
43 #include "ui/views/layout/box_layout.h"
44 #include "ui/views/layout/grid_layout.h"
45 #include "ui/views/layout/layout_constants.h"
46 #include "ui/views/widget/widget.h"
48 namespace chrome {
50 // Declared in browser_dialogs.h so others don't have to depend on our header.
51 void ShowCollectedCookiesDialog(content::WebContents* web_contents) {
52 // Deletes itself on close.
53 new CollectedCookiesViews(web_contents);
56 } // namespace chrome
58 namespace {
60 // Spacing between the infobar frame and its contents.
61 const int kInfobarVerticalPadding = 3;
62 const int kInfobarHorizontalPadding = 8;
64 // Width of the infobar frame.
65 const int kInfobarBorderSize = 1;
67 // Dimensions of the tree views.
68 const int kTreeViewWidth = 400;
69 const int kTreeViewHeight = 125;
71 // The color of the border around the cookies tree view.
72 const SkColor kCookiesBorderColor = SkColorSetRGB(0xC8, 0xC8, 0xC8);
74 // Spacing constants used with the new dialog style.
75 const int kTabbedPaneTopPadding = 14;
76 const int kLabelBottomPadding = 17;
77 const int kCookieInfoBottomPadding = 4;
78 const int kVPanelPadding = 15;
80 } // namespace
82 // A custom view that conditionally displays an infobar.
83 class InfobarView : public views::View {
84 public:
85 InfobarView() {
86 content_ = new views::View;
87 SkColor border_color = SK_ColorGRAY;
88 content_->SetBorder(
89 views::Border::CreateSolidBorder(kInfobarBorderSize, border_color));
91 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
92 info_image_ = new views::ImageView();
93 info_image_->SetImage(rb.GetImageSkiaNamed(IDR_INFO));
94 label_ = new views::Label();
96 virtual ~InfobarView() {}
98 // Update the visibility of the infobar. If |is_visible| is true, a rule for
99 // |setting| on |domain_name| was created.
100 void UpdateVisibility(bool is_visible,
101 ContentSetting setting,
102 const base::string16& domain_name) {
103 if (!is_visible) {
104 SetVisible(false);
105 return;
108 base::string16 label;
109 switch (setting) {
110 case CONTENT_SETTING_BLOCK:
111 label = l10n_util::GetStringFUTF16(
112 IDS_COLLECTED_COOKIES_BLOCK_RULE_CREATED, domain_name);
113 break;
115 case CONTENT_SETTING_ALLOW:
116 label = l10n_util::GetStringFUTF16(
117 IDS_COLLECTED_COOKIES_ALLOW_RULE_CREATED, domain_name);
118 break;
120 case CONTENT_SETTING_SESSION_ONLY:
121 label = l10n_util::GetStringFUTF16(
122 IDS_COLLECTED_COOKIES_SESSION_RULE_CREATED, domain_name);
123 break;
125 default:
126 NOTREACHED();
128 label_->SetText(label);
129 content_->Layout();
130 SetVisible(true);
133 private:
134 // Initialize contents and layout.
135 void Init() {
136 AddChildView(content_);
137 content_->SetLayoutManager(
138 new views::BoxLayout(views::BoxLayout::kHorizontal,
139 kInfobarHorizontalPadding,
140 kInfobarVerticalPadding,
141 views::kRelatedControlSmallHorizontalSpacing));
142 content_->AddChildView(info_image_);
143 content_->AddChildView(label_);
144 UpdateVisibility(false, CONTENT_SETTING_BLOCK, base::string16());
147 // views::View overrides.
148 virtual gfx::Size GetPreferredSize() const OVERRIDE {
149 if (!visible())
150 return gfx::Size();
152 // Add space around the banner.
153 gfx::Size size(content_->GetPreferredSize());
154 size.Enlarge(0, 2 * views::kRelatedControlVerticalSpacing);
155 return size;
158 virtual void Layout() OVERRIDE {
159 content_->SetBounds(
160 0, views::kRelatedControlVerticalSpacing,
161 width(), height() - views::kRelatedControlVerticalSpacing);
164 virtual void ViewHierarchyChanged(
165 const ViewHierarchyChangedDetails& details) OVERRIDE {
166 if (details.is_add && details.child == this)
167 Init();
170 // Holds the info icon image and text label and renders the border.
171 views::View* content_;
172 // Info icon image.
173 views::ImageView* info_image_;
174 // The label responsible for rendering the text.
175 views::Label* label_;
177 DISALLOW_COPY_AND_ASSIGN(InfobarView);
180 ///////////////////////////////////////////////////////////////////////////////
181 // CollectedCookiesViews, public:
183 CollectedCookiesViews::CollectedCookiesViews(content::WebContents* web_contents)
184 : web_contents_(web_contents),
185 allowed_label_(NULL),
186 blocked_label_(NULL),
187 allowed_cookies_tree_(NULL),
188 blocked_cookies_tree_(NULL),
189 block_allowed_button_(NULL),
190 delete_allowed_button_(NULL),
191 allow_blocked_button_(NULL),
192 for_session_blocked_button_(NULL),
193 cookie_info_view_(NULL),
194 infobar_(NULL),
195 status_changed_(false) {
196 TabSpecificContentSettings* content_settings =
197 TabSpecificContentSettings::FromWebContents(web_contents);
198 registrar_.Add(this, chrome::NOTIFICATION_COLLECTED_COOKIES_SHOWN,
199 content::Source<TabSpecificContentSettings>(content_settings));
200 ShowWebModalDialogViews(this, web_contents);
203 ///////////////////////////////////////////////////////////////////////////////
204 // CollectedCookiesViews, views::DialogDelegate implementation:
206 base::string16 CollectedCookiesViews::GetWindowTitle() const {
207 return l10n_util::GetStringUTF16(IDS_COLLECTED_COOKIES_DIALOG_TITLE);
210 int CollectedCookiesViews::GetDialogButtons() const {
211 return ui::DIALOG_BUTTON_CANCEL;
214 base::string16 CollectedCookiesViews::GetDialogButtonLabel(
215 ui::DialogButton button) const {
216 return l10n_util::GetStringUTF16(IDS_CLOSE);
219 bool CollectedCookiesViews::Cancel() {
220 if (status_changed_) {
221 CollectedCookiesInfoBarDelegate::Create(
222 InfoBarService::FromWebContents(web_contents_));
224 return true;
227 ui::ModalType CollectedCookiesViews::GetModalType() const {
228 return ui::MODAL_TYPE_CHILD;
231 ///////////////////////////////////////////////////////////////////////////////
232 // CollectedCookiesViews, views::ButtonListener implementation:
234 void CollectedCookiesViews::ButtonPressed(views::Button* sender,
235 const ui::Event& event) {
236 if (sender == block_allowed_button_) {
237 AddContentException(allowed_cookies_tree_, CONTENT_SETTING_BLOCK);
238 } else if (sender == delete_allowed_button_) {
239 allowed_cookies_tree_model_->DeleteCookieNode(
240 static_cast<CookieTreeNode*>(allowed_cookies_tree_->GetSelectedNode()));
241 } else if (sender == allow_blocked_button_) {
242 AddContentException(blocked_cookies_tree_, CONTENT_SETTING_ALLOW);
243 } else if (sender == for_session_blocked_button_) {
244 AddContentException(blocked_cookies_tree_, CONTENT_SETTING_SESSION_ONLY);
248 ///////////////////////////////////////////////////////////////////////////////
249 // CollectedCookiesViews, views::TabbedPaneListener implementation:
251 void CollectedCookiesViews::TabSelectedAt(int index) {
252 EnableControls();
253 ShowCookieInfo();
256 ///////////////////////////////////////////////////////////////////////////////
257 // CollectedCookiesViews, views::TreeViewController implementation:
259 void CollectedCookiesViews::OnTreeViewSelectionChanged(
260 views::TreeView* tree_view) {
261 EnableControls();
262 ShowCookieInfo();
265 ///////////////////////////////////////////////////////////////////////////////
266 // CollectedCookiesViews, views::View overrides:
268 gfx::Size CollectedCookiesViews::GetMinimumSize() const {
269 // Allow UpdateWebContentsModalDialogPosition to clamp the dialog width.
270 return gfx::Size(0, View::GetMinimumSize().height());
273 void CollectedCookiesViews::ViewHierarchyChanged(
274 const ViewHierarchyChangedDetails& details) {
275 if (details.is_add && details.child == this)
276 Init();
279 ////////////////////////////////////////////////////////////////////////////////
280 // CollectedCookiesViews, private:
282 CollectedCookiesViews::~CollectedCookiesViews() {
283 allowed_cookies_tree_->SetModel(NULL);
284 blocked_cookies_tree_->SetModel(NULL);
287 void CollectedCookiesViews::Init() {
288 using views::GridLayout;
290 GridLayout* layout = GridLayout::CreatePanel(this);
291 SetLayoutManager(layout);
293 const int single_column_layout_id = 0;
294 views::ColumnSet* column_set = layout->AddColumnSet(single_column_layout_id);
295 column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
296 GridLayout::USE_PREF, 0, 0);
298 layout->StartRow(0, single_column_layout_id);
299 views::TabbedPane* tabbed_pane = new views::TabbedPane();
300 layout->SetInsets(gfx::Insets(kTabbedPaneTopPadding, 0, 0, 0));
302 layout->AddView(tabbed_pane);
303 // NOTE: Panes must be added after |tabbed_pane| has been added to its parent.
304 base::string16 label_allowed = l10n_util::GetStringUTF16(
305 IDS_COLLECTED_COOKIES_ALLOWED_COOKIES_TAB_LABEL);
306 base::string16 label_blocked = l10n_util::GetStringUTF16(
307 IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_TAB_LABEL);
308 tabbed_pane->AddTab(label_allowed, CreateAllowedPane());
309 tabbed_pane->AddTab(label_blocked, CreateBlockedPane());
310 tabbed_pane->SelectTabAt(0);
311 tabbed_pane->set_listener(this);
312 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
314 layout->StartRow(0, single_column_layout_id);
315 cookie_info_view_ = new CookieInfoView();
316 layout->AddView(cookie_info_view_);
317 layout->AddPaddingRow(0, kCookieInfoBottomPadding);
319 layout->StartRow(0, single_column_layout_id);
320 infobar_ = new InfobarView();
321 layout->AddView(infobar_);
323 EnableControls();
324 ShowCookieInfo();
327 views::View* CollectedCookiesViews::CreateAllowedPane() {
328 TabSpecificContentSettings* content_settings =
329 TabSpecificContentSettings::FromWebContents(web_contents_);
331 // Create the controls that go into the pane.
332 allowed_label_ = new views::Label(l10n_util::GetStringUTF16(
333 IDS_COLLECTED_COOKIES_ALLOWED_COOKIES_LABEL));
335 const LocalSharedObjectsContainer& allowed_data =
336 content_settings->allowed_local_shared_objects();
337 allowed_cookies_tree_model_ = allowed_data.CreateCookiesTreeModel();
338 allowed_cookies_tree_ = new views::TreeView();
339 allowed_cookies_tree_->SetModel(allowed_cookies_tree_model_.get());
340 allowed_cookies_tree_->SetRootShown(false);
341 allowed_cookies_tree_->SetEditable(false);
342 allowed_cookies_tree_->set_auto_expand_children(true);
343 allowed_cookies_tree_->SetController(this);
345 block_allowed_button_ = new views::LabelButton(this,
346 l10n_util::GetStringUTF16(IDS_COLLECTED_COOKIES_BLOCK_BUTTON));
347 block_allowed_button_->SetStyle(views::Button::STYLE_BUTTON);
349 delete_allowed_button_ = new views::LabelButton(this,
350 l10n_util::GetStringUTF16(IDS_COOKIES_REMOVE_LABEL));
351 delete_allowed_button_->SetStyle(views::Button::STYLE_BUTTON);
353 // Create the view that holds all the controls together. This will be the
354 // pane added to the tabbed pane.
355 using views::GridLayout;
357 views::View* pane = new views::View();
358 GridLayout* layout = GridLayout::CreatePanel(pane);
359 layout->SetInsets(kVPanelPadding, views::kButtonHEdgeMarginNew,
360 kVPanelPadding, views::kButtonHEdgeMarginNew);
361 pane->SetLayoutManager(layout);
363 const int single_column_layout_id = 0;
364 views::ColumnSet* column_set = layout->AddColumnSet(single_column_layout_id);
365 column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL, 1,
366 GridLayout::USE_PREF, 0, 0);
368 const int three_columns_layout_id = 1;
369 column_set = layout->AddColumnSet(three_columns_layout_id);
370 column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
371 GridLayout::USE_PREF, 0, 0);
372 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
373 column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
374 GridLayout::USE_PREF, 0, 0);
376 layout->StartRow(0, single_column_layout_id);
377 layout->AddView(allowed_label_);
378 layout->AddPaddingRow(0, kLabelBottomPadding);
380 layout->StartRow(1, single_column_layout_id);
381 layout->AddView(CreateScrollView(allowed_cookies_tree_), 1, 1,
382 GridLayout::FILL, GridLayout::FILL, kTreeViewWidth,
383 kTreeViewHeight);
384 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
386 layout->StartRow(0, three_columns_layout_id);
387 layout->AddView(block_allowed_button_);
388 layout->AddView(delete_allowed_button_);
390 return pane;
393 views::View* CollectedCookiesViews::CreateBlockedPane() {
394 TabSpecificContentSettings* content_settings =
395 TabSpecificContentSettings::FromWebContents(web_contents_);
397 Profile* profile =
398 Profile::FromBrowserContext(web_contents_->GetBrowserContext());
399 PrefService* prefs = profile->GetPrefs();
401 // Create the controls that go into the pane.
402 blocked_label_ = new views::Label(
403 l10n_util::GetStringUTF16(
404 prefs->GetBoolean(prefs::kBlockThirdPartyCookies) ?
405 IDS_COLLECTED_COOKIES_BLOCKED_THIRD_PARTY_BLOCKING_ENABLED :
406 IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_LABEL));
407 blocked_label_->SetMultiLine(true);
408 blocked_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
409 const LocalSharedObjectsContainer& blocked_data =
410 content_settings->blocked_local_shared_objects();
411 blocked_cookies_tree_model_ = blocked_data.CreateCookiesTreeModel();
412 blocked_cookies_tree_ = new views::TreeView();
413 blocked_cookies_tree_->SetModel(blocked_cookies_tree_model_.get());
414 blocked_cookies_tree_->SetRootShown(false);
415 blocked_cookies_tree_->SetEditable(false);
416 blocked_cookies_tree_->set_auto_expand_children(true);
417 blocked_cookies_tree_->SetController(this);
419 allow_blocked_button_ = new views::LabelButton(this,
420 l10n_util::GetStringUTF16(IDS_COLLECTED_COOKIES_ALLOW_BUTTON));
421 allow_blocked_button_->SetStyle(views::Button::STYLE_BUTTON);
422 for_session_blocked_button_ = new views::LabelButton(this,
423 l10n_util::GetStringUTF16(IDS_COLLECTED_COOKIES_SESSION_ONLY_BUTTON));
424 for_session_blocked_button_->SetStyle(views::Button::STYLE_BUTTON);
426 // Create the view that holds all the controls together. This will be the
427 // pane added to the tabbed pane.
428 using views::GridLayout;
430 views::View* pane = new views::View();
431 GridLayout* layout = GridLayout::CreatePanel(pane);
432 layout->SetInsets(kVPanelPadding, views::kButtonHEdgeMarginNew,
433 kVPanelPadding, views::kButtonHEdgeMarginNew);
434 pane->SetLayoutManager(layout);
436 const int single_column_layout_id = 0;
437 views::ColumnSet* column_set = layout->AddColumnSet(single_column_layout_id);
438 column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL, 1,
439 GridLayout::USE_PREF, 0, 0);
441 const int three_columns_layout_id = 1;
442 column_set = layout->AddColumnSet(three_columns_layout_id);
443 column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
444 GridLayout::USE_PREF, 0, 0);
445 column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
446 column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
447 GridLayout::USE_PREF, 0, 0);
449 layout->StartRow(0, single_column_layout_id);
450 layout->AddView(blocked_label_, 1, 1, GridLayout::FILL, GridLayout::FILL);
451 layout->AddPaddingRow(0, kLabelBottomPadding);
453 layout->StartRow(1, single_column_layout_id);
454 layout->AddView(
455 CreateScrollView(blocked_cookies_tree_), 1, 1,
456 GridLayout::FILL, GridLayout::FILL, kTreeViewWidth, kTreeViewHeight);
457 layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
459 layout->StartRow(0, three_columns_layout_id);
460 layout->AddView(allow_blocked_button_);
461 layout->AddView(for_session_blocked_button_);
463 return pane;
466 views::View* CollectedCookiesViews::CreateScrollView(views::TreeView* pane) {
467 views::ScrollView* scroll_view = new views::ScrollView();
468 scroll_view->SetContents(pane);
469 scroll_view->SetBorder(
470 views::Border::CreateSolidBorder(1, kCookiesBorderColor));
471 return scroll_view;
474 void CollectedCookiesViews::EnableControls() {
475 bool enable_allowed_buttons = false;
476 ui::TreeModelNode* node = allowed_cookies_tree_->GetSelectedNode();
477 if (node) {
478 CookieTreeNode* cookie_node = static_cast<CookieTreeNode*>(node);
479 if (cookie_node->GetDetailedInfo().node_type ==
480 CookieTreeNode::DetailedInfo::TYPE_HOST) {
481 enable_allowed_buttons = static_cast<CookieTreeHostNode*>(
482 cookie_node)->CanCreateContentException();
485 block_allowed_button_->SetEnabled(enable_allowed_buttons);
486 delete_allowed_button_->SetEnabled(node != NULL);
488 bool enable_blocked_buttons = false;
489 node = blocked_cookies_tree_->GetSelectedNode();
490 if (node) {
491 CookieTreeNode* cookie_node = static_cast<CookieTreeNode*>(node);
492 if (cookie_node->GetDetailedInfo().node_type ==
493 CookieTreeNode::DetailedInfo::TYPE_HOST) {
494 enable_blocked_buttons = static_cast<CookieTreeHostNode*>(
495 cookie_node)->CanCreateContentException();
498 allow_blocked_button_->SetEnabled(enable_blocked_buttons);
499 for_session_blocked_button_->SetEnabled(enable_blocked_buttons);
502 void CollectedCookiesViews::ShowCookieInfo() {
503 ui::TreeModelNode* node = allowed_cookies_tree_->GetSelectedNode();
504 if (!node)
505 node = blocked_cookies_tree_->GetSelectedNode();
507 if (node) {
508 CookieTreeNode* cookie_node = static_cast<CookieTreeNode*>(node);
509 const CookieTreeNode::DetailedInfo detailed_info =
510 cookie_node->GetDetailedInfo();
512 if (detailed_info.node_type == CookieTreeNode::DetailedInfo::TYPE_COOKIE) {
513 cookie_info_view_->SetCookie(detailed_info.cookie->Domain(),
514 *detailed_info.cookie);
515 } else {
516 cookie_info_view_->ClearCookieDisplay();
518 } else {
519 cookie_info_view_->ClearCookieDisplay();
523 void CollectedCookiesViews::AddContentException(views::TreeView* tree_view,
524 ContentSetting setting) {
525 CookieTreeHostNode* host_node =
526 static_cast<CookieTreeHostNode*>(tree_view->GetSelectedNode());
527 Profile* profile =
528 Profile::FromBrowserContext(web_contents_->GetBrowserContext());
529 host_node->CreateContentException(
530 CookieSettings::Factory::GetForProfile(profile).get(), setting);
531 infobar_->UpdateVisibility(true, setting, host_node->GetTitle());
532 status_changed_ = true;
535 ///////////////////////////////////////////////////////////////////////////////
536 // CollectedCookiesViews, content::NotificationObserver implementation:
538 void CollectedCookiesViews::Observe(
539 int type,
540 const content::NotificationSource& source,
541 const content::NotificationDetails& details) {
542 DCHECK_EQ(chrome::NOTIFICATION_COLLECTED_COOKIES_SHOWN, type);
543 GetWidget()->Close();