15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/collected_cookies_views.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_appcache_helper.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_cookie_helper.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_database_helper.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_file_system_helper.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_indexed_db_helper.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_server_bound_cert_helper.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/cookies_tree_model.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/cookie_settings.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/local_shared_objects_container.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/collected_cookies_infobar_delegate.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/constrained_window_views.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/cookie_info_view.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_host.h"
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_manager.h"
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/locale_settings.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/color_utils.h"
392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ui/views/border.h"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/label_button.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ui/views/controls/scroll_view.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/tabbed_pane/tabbed_pane.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/tree/tree_view.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/views/window/dialog_delegate.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using web_modal::WebContentsModalDialogManager;
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)using web_modal::WebContentsModalDialogManagerDelegate;
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Declared in browser_dialogs.h so others don't have to depend on our header.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowCollectedCookiesDialog(content::WebContents* web_contents) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deletes itself on close.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new CollectedCookiesViews(web_contents);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chrome
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Spacing between the infobar frame and its contents.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kInfobarVerticalPadding = 3;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kInfobarHorizontalPadding = 8;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Width of the infobar frame.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kInfobarBorderSize = 1;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dimensions of the tree views.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTreeViewWidth = 400;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTreeViewHeight = 125;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// The color of the border around the cookies tree view.
792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst SkColor kCookiesBorderColor = SkColorSetRGB(0xC8, 0xC8, 0xC8);
802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Spacing constants used with the new dialog style.
822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst int kTabbedPaneTopPadding = 14;
832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst int kLabelBottomPadding = 17;
842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst int kCookieInfoBottomPadding = 4;
852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst int kVPanelPadding = 15;
862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A custom view that conditionally displays an infobar.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InfobarView : public views::View {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InfobarView() {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_ = new views::View;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA) || !defined(OS_WIN)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkColor border_color = SK_ColorGRAY;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkColor border_color = color_utils::GetSysSkColor(COLOR_3DSHADOW);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::Border* border = views::Border::CreateSolidBorder(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kInfobarBorderSize, border_color);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_->set_border(border);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info_image_ = new views::ImageView();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info_image_->SetImage(rb.GetImageSkiaNamed(IDR_INFO));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    label_ = new views::Label();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~InfobarView() {}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the visibility of the infobar. If |is_visible| is true, a rule for
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |setting| on |domain_name| was created.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateVisibility(bool is_visible,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ContentSetting setting,
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        const base::string16& domain_name) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!is_visible) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetVisible(false);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 label;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (setting) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case CONTENT_SETTING_BLOCK:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        label = l10n_util::GetStringFUTF16(
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IDS_COLLECTED_COOKIES_BLOCK_RULE_CREATED, domain_name);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case CONTENT_SETTING_ALLOW:
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        label = l10n_util::GetStringFUTF16(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IDS_COLLECTED_COOKIES_ALLOW_RULE_CREATED, domain_name);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case CONTENT_SETTING_SESSION_ONLY:
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        label = l10n_util::GetStringFUTF16(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IDS_COLLECTED_COOKIES_SESSION_RULE_CREATED, domain_name);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    label_->SetText(label);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_->Layout();
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetVisible(true);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize contents and layout.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init() {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChildView(content_);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_->SetLayoutManager(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kHorizontal,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             kInfobarHorizontalPadding,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             kInfobarVerticalPadding,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             views::kRelatedControlSmallHorizontalSpacing));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_->AddChildView(info_image_);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_->AddChildView(label_);
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    UpdateVisibility(false, CONTENT_SETTING_BLOCK, base::string16());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // views::View overrides.
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetPreferredSize() OVERRIDE {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!visible())
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return gfx::Size();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add space around the banner.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Size size(content_->GetPreferredSize());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size.Enlarge(0, 2 * views::kRelatedControlVerticalSpacing);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return size;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE {
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_->SetBounds(
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0, views::kRelatedControlVerticalSpacing,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        width(), height() - views::kRelatedControlVerticalSpacing);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
176a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void ViewHierarchyChanged(
177a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      const ViewHierarchyChangedDetails& details) OVERRIDE {
178a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (details.is_add && details.child == this)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Init();
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Holds the info icon image and text label and renders the border.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* content_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Info icon image.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ImageView* info_image_;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The label responsible for rendering the text.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Label* label_;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InfobarView);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, public:
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CollectedCookiesViews::CollectedCookiesViews(content::WebContents* web_contents)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : web_contents_(web_contents),
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allowed_label_(NULL),
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blocked_label_(NULL),
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allowed_cookies_tree_(NULL),
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blocked_cookies_tree_(NULL),
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      block_allowed_button_(NULL),
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allow_blocked_button_(NULL),
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for_session_blocked_button_(NULL),
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cookie_info_view_(NULL),
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      infobar_(NULL),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status_changed_(false) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_COLLECTED_COOKIES_SHOWN,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::Source<TabSpecificContentSettings>(content_settings));
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsModalDialogManager* web_contents_modal_dialog_manager =
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContentsModalDialogManager::FromWebContents(web_contents);
2133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  WebContentsModalDialogManagerDelegate* modal_delegate =
2143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      web_contents_modal_dialog_manager->delegate();
2153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(modal_delegate);
2163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  window_ = views::Widget::CreateWindowAsFramelessChild(
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      this, modal_delegate->GetWebContentsModalDialogHost()->GetHostView());
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  web_contents_modal_dialog_manager->ShowDialog(window_->GetNativeView());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, views::DialogDelegate implementation:
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
224d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)base::string16 CollectedCookiesViews::GetWindowTitle() const {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_COLLECTED_COOKIES_DIALOG_TITLE);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int CollectedCookiesViews::GetDialogButtons() const {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::DIALOG_BUTTON_CANCEL;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232d57369da7c6519fef57db42085f7b42d4c8845c1Torne (Richard Coles)base::string16 CollectedCookiesViews::GetDialogButtonLabel(
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::DialogButton button) const {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_CLOSE);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::DeleteDelegate() {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete this;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CollectedCookiesViews::Cancel() {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status_changed_) {
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CollectedCookiesInfoBarDelegate::Create(
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        InfoBarService::FromWebContents(web_contents_));
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(wittman): Remove this override once we move to the new style frame view
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// on all dialogs.
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::NonClientFrameView* CollectedCookiesViews::CreateNonClientFrameView(
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    views::Widget* widget) {
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return CreateConstrainedStyleNonClientFrameView(
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      widget,
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_->GetBrowserContext());
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::ModalType CollectedCookiesViews::GetModalType() const {
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_ASH)
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ui::MODAL_TYPE_CHILD;
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return views::WidgetDelegate::GetModalType();
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, views::ButtonListener implementation:
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::ButtonPressed(views::Button* sender,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const ui::Event& event) {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sender == block_allowed_button_)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddContentException(allowed_cookies_tree_, CONTENT_SETTING_BLOCK);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (sender == allow_blocked_button_)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddContentException(blocked_cookies_tree_, CONTENT_SETTING_ALLOW);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (sender == for_session_blocked_button_)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddContentException(blocked_cookies_tree_, CONTENT_SETTING_SESSION_ONLY);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, views::TabbedPaneListener implementation:
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::TabSelectedAt(int index) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnableControls();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCookieInfo();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, views::TreeViewController implementation:
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::OnTreeViewSelectionChanged(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::TreeView* tree_view) {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnableControls();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCookieInfo();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, views::View overrides:
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)gfx::Size CollectedCookiesViews::GetMinimumSize() {
30168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Allow UpdateWebContentsModalDialogPosition to clamp the dialog width.
30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return gfx::Size(0, View::GetMinimumSize().height());
30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
305a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void CollectedCookiesViews::ViewHierarchyChanged(
306a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const ViewHierarchyChangedDetails& details) {
307a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (details.is_add && details.child == this)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Init();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, private:
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CollectedCookiesViews::~CollectedCookiesViews() {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_->SetModel(NULL);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_->SetModel(NULL);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::Init() {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using views::GridLayout;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GridLayout* layout = GridLayout::CreatePanel(this);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLayoutManager(layout);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int single_column_layout_id = 0;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ColumnSet* column_set = layout->AddColumnSet(single_column_layout_id);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(0, single_column_layout_id);
331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  views::TabbedPane* tabbed_pane = new views::TabbedPane();
332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->SetInsets(gfx::Insets(kTabbedPaneTopPadding, 0, 0, 0));
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(tabbed_pane);
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NOTE: Panes must be added after |tabbed_pane| has been added to its parent.
336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 label_allowed = l10n_util::GetStringUTF16(
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_COLLECTED_COOKIES_ALLOWED_COOKIES_TAB_LABEL);
338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 label_blocked = l10n_util::GetStringUTF16(
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_TAB_LABEL);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tabbed_pane->AddTab(label_allowed, CreateAllowedPane());
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tabbed_pane->AddTab(label_blocked, CreateBlockedPane());
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tabbed_pane->SelectTabAt(0);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tabbed_pane->set_listener(this);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->StartRow(0, single_column_layout_id);
347ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  cookie_info_view_ = new CookieInfoView();
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(cookie_info_view_);
349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->AddPaddingRow(0, kCookieInfoBottomPadding);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->StartRow(0, single_column_layout_id);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  infobar_ = new InfobarView();
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(infobar_);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnableControls();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCookieInfo();
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* CollectedCookiesViews::CreateAllowedPane() {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents_);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the controls that go into the pane.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_label_ = new views::Label(l10n_util::GetStringUTF16(
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_COLLECTED_COOKIES_ALLOWED_COOKIES_LABEL));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const LocalSharedObjectsContainer& allowed_data =
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_settings->allowed_local_shared_objects();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_model_ = allowed_data.CreateCookiesTreeModel();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_ = new views::TreeView();
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_->SetModel(allowed_cookies_tree_model_.get());
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_->SetRootShown(false);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_->SetEditable(false);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_->set_auto_expand_children(true);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_->SetController(this);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  block_allowed_button_ = new views::LabelButton(this,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_COLLECTED_COOKIES_BLOCK_BUTTON));
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  block_allowed_button_->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the view that holds all the controls together.  This will be the
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pane added to the tabbed pane.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using views::GridLayout;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* pane = new views::View();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GridLayout* layout = GridLayout::CreatePanel(pane);
387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->SetInsets(kVPanelPadding, views::kButtonHEdgeMarginNew,
388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    kVPanelPadding, views::kButtonHEdgeMarginNew);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pane->SetLayoutManager(layout);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int single_column_layout_id = 0;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ColumnSet* column_set = layout->AddColumnSet(single_column_layout_id);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL, 1,
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(0, single_column_layout_id);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(allowed_label_);
398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->AddPaddingRow(0, kLabelBottomPadding);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(1, single_column_layout_id);
4012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  layout->AddView(CreateScrollView(allowed_cookies_tree_), 1, 1,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  GridLayout::FILL, GridLayout::FILL, kTreeViewWidth,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kTreeViewHeight);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(0, single_column_layout_id);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(block_allowed_button_, 1, 1, GridLayout::LEADING,
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  GridLayout::CENTER);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pane;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* CollectedCookiesViews::CreateBlockedPane() {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents_);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile =
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile::FromBrowserContext(web_contents_->GetBrowserContext());
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = profile->GetPrefs();
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the controls that go into the pane.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_label_ = new views::Label(
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prefs->GetBoolean(prefs::kBlockThirdPartyCookies) ?
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IDS_COLLECTED_COOKIES_BLOCKED_THIRD_PARTY_BLOCKING_ENABLED :
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_LABEL));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_label_->SetMultiLine(true);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const LocalSharedObjectsContainer& blocked_data =
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_settings->blocked_local_shared_objects();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_model_ = blocked_data.CreateCookiesTreeModel();
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_ = new views::TreeView();
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_->SetModel(blocked_cookies_tree_model_.get());
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_->SetRootShown(false);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_->SetEditable(false);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_->set_auto_expand_children(true);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_->SetController(this);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  allow_blocked_button_ = new views::LabelButton(this,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_COLLECTED_COOKIES_ALLOW_BUTTON));
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  allow_blocked_button_->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON);
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for_session_blocked_button_ = new views::LabelButton(this,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_COLLECTED_COOKIES_SESSION_ONLY_BUTTON));
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for_session_blocked_button_->SetStyle(views::Button::STYLE_NATIVE_TEXTBUTTON);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the view that holds all the controls together.  This will be the
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pane added to the tabbed pane.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using views::GridLayout;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* pane = new views::View();
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GridLayout* layout = GridLayout::CreatePanel(pane);
452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->SetInsets(kVPanelPadding, views::kButtonHEdgeMarginNew,
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    kVPanelPadding, views::kButtonHEdgeMarginNew);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pane->SetLayoutManager(layout);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int single_column_layout_id = 0;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ColumnSet* column_set = layout->AddColumnSet(single_column_layout_id);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL, 1,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int three_columns_layout_id = 1;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set = layout->AddColumnSet(three_columns_layout_id);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(0, single_column_layout_id);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(blocked_label_, 1, 1, GridLayout::FILL, GridLayout::FILL);
471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->AddPaddingRow(0, kLabelBottomPadding);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(1, single_column_layout_id);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(
4752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      CreateScrollView(blocked_cookies_tree_), 1, 1,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GridLayout::FILL, GridLayout::FILL, kTreeViewWidth, kTreeViewHeight);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(0, three_columns_layout_id);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(allow_blocked_button_);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(for_session_blocked_button_);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pane;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochviews::View* CollectedCookiesViews::CreateScrollView(views::TreeView* pane) {
487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  views::ScrollView* scroll_view = new views::ScrollView();
488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scroll_view->SetContents(pane);
489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scroll_view->set_border(
490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      views::Border::CreateSolidBorder(1, kCookiesBorderColor));
491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return scroll_view;
4922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
4932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::EnableControls() {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enable_allowed_buttons = false;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::TreeModelNode* node = allowed_cookies_tree_->GetSelectedNode();
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (node) {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CookieTreeNode* cookie_node = static_cast<CookieTreeNode*>(node);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cookie_node->GetDetailedInfo().node_type ==
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CookieTreeNode::DetailedInfo::TYPE_HOST) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enable_allowed_buttons = static_cast<CookieTreeHostNode*>(
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cookie_node)->CanCreateContentException();
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  block_allowed_button_->SetEnabled(enable_allowed_buttons);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enable_blocked_buttons = false;
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  node = blocked_cookies_tree_->GetSelectedNode();
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (node) {
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CookieTreeNode* cookie_node = static_cast<CookieTreeNode*>(node);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cookie_node->GetDetailedInfo().node_type ==
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CookieTreeNode::DetailedInfo::TYPE_HOST) {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enable_blocked_buttons = static_cast<CookieTreeHostNode*>(
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cookie_node)->CanCreateContentException();
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allow_blocked_button_->SetEnabled(enable_blocked_buttons);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for_session_blocked_button_->SetEnabled(enable_blocked_buttons);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::ShowCookieInfo() {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::TreeModelNode* node = allowed_cookies_tree_->GetSelectedNode();
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!node)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node = blocked_cookies_tree_->GetSelectedNode();
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (node) {
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CookieTreeNode* cookie_node = static_cast<CookieTreeNode*>(node);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CookieTreeNode::DetailedInfo detailed_info =
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cookie_node->GetDetailedInfo();
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (detailed_info.node_type == CookieTreeNode::DetailedInfo::TYPE_COOKIE) {
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cookie_info_view_->SetCookie(detailed_info.cookie->Domain(),
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   *detailed_info.cookie);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cookie_info_view_->ClearCookieDisplay();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cookie_info_view_->ClearCookieDisplay();
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::AddContentException(views::TreeView* tree_view,
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                ContentSetting setting) {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieTreeHostNode* host_node =
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<CookieTreeHostNode*>(tree_view->GetSelectedNode());
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile =
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile::FromBrowserContext(web_contents_->GetBrowserContext());
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_node->CreateContentException(
5497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CookieSettings::Factory::GetForProfile(profile).get(), setting);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  infobar_->UpdateVisibility(true, setting, host_node->GetTitle());
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status_changed_ = true;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, content::NotificationObserver implementation:
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::Observe(
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationSource& source,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationDetails& details) {
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(chrome::NOTIFICATION_COLLECTED_COOKIES_SHOWN, type);
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->Close();
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
564