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"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_channel_id_helper.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_cookie_helper.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_database_helper.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_file_system_helper.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_indexed_db_helper.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browsing_data/browsing_data_local_storage_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"
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (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"
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/locale_settings.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/color_utils.h"
362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ui/views/border.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/label_button.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h"
402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ui/views/controls/scroll_view.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/tabbed_pane/tabbed_pane.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/tree/tree_view.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Declared in browser_dialogs.h so others don't have to depend on our header.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowCollectedCookiesDialog(content::WebContents* web_contents) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Deletes itself on close.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new CollectedCookiesViews(web_contents);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chrome
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Spacing between the infobar frame and its contents.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kInfobarVerticalPadding = 3;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kInfobarHorizontalPadding = 8;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Width of the infobar frame.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kInfobarBorderSize = 1;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dimensions of the tree views.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTreeViewWidth = 400;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kTreeViewHeight = 125;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// The color of the border around the cookies tree view.
722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst SkColor kCookiesBorderColor = SkColorSetRGB(0xC8, 0xC8, 0xC8);
732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch// Spacing constants used with the new dialog style.
752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst int kTabbedPaneTopPadding = 14;
762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst int kLabelBottomPadding = 17;
772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst int kCookieInfoBottomPadding = 4;
782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst int kVPanelPadding = 15;
792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A custom view that conditionally displays an infobar.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InfobarView : public views::View {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InfobarView() {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_ = new views::View;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkColor border_color = SK_ColorGRAY;
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content_->SetBorder(
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        views::Border::CreateSolidBorder(kInfobarBorderSize, border_color));
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info_image_ = new views::ImageView();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    info_image_->SetImage(rb.GetImageSkiaNamed(IDR_INFO));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    label_ = new views::Label();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~InfobarView() {}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the visibility of the infobar. If |is_visible| is true, a rule for
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |setting| on |domain_name| was created.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateVisibility(bool is_visible,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ContentSetting setting,
102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        const base::string16& domain_name) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!is_visible) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetVisible(false);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 label;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (setting) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case CONTENT_SETTING_BLOCK:
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        label = l10n_util::GetStringFUTF16(
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IDS_COLLECTED_COOKIES_BLOCK_RULE_CREATED, domain_name);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case CONTENT_SETTING_ALLOW:
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        label = l10n_util::GetStringFUTF16(
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IDS_COLLECTED_COOKIES_ALLOW_RULE_CREATED, domain_name);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case CONTENT_SETTING_SESSION_ONLY:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        label = l10n_util::GetStringFUTF16(
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IDS_COLLECTED_COOKIES_SESSION_RULE_CREATED, domain_name);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    label_->SetText(label);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_->Layout();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetVisible(true);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize contents and layout.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init() {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddChildView(content_);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_->SetLayoutManager(
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new views::BoxLayout(views::BoxLayout::kHorizontal,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             kInfobarHorizontalPadding,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             kInfobarVerticalPadding,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             views::kRelatedControlSmallHorizontalSpacing));
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_->AddChildView(info_image_);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_->AddChildView(label_);
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    UpdateVisibility(false, CONTENT_SETTING_BLOCK, base::string16());
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // views::View overrides.
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!visible())
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return gfx::Size();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add space around the banner.
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Size size(content_->GetPreferredSize());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size.Enlarge(0, 2 * views::kRelatedControlVerticalSpacing);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return size;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Layout() OVERRIDE {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content_->SetBounds(
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0, views::kRelatedControlVerticalSpacing,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        width(), height() - views::kRelatedControlVerticalSpacing);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  virtual void ViewHierarchyChanged(
165a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      const ViewHierarchyChangedDetails& details) OVERRIDE {
166a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    if (details.is_add && details.child == this)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Init();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Holds the info icon image and text label and renders the border.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* content_;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Info icon image.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ImageView* info_image_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The label responsible for rendering the text.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::Label* label_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InfobarView);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, public:
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CollectedCookiesViews::CollectedCookiesViews(content::WebContents* web_contents)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : web_contents_(web_contents),
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allowed_label_(NULL),
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blocked_label_(NULL),
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allowed_cookies_tree_(NULL),
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      blocked_cookies_tree_(NULL),
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      block_allowed_button_(NULL),
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      delete_allowed_button_(NULL),
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      allow_blocked_button_(NULL),
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for_session_blocked_button_(NULL),
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cookie_info_view_(NULL),
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      infobar_(NULL),
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      status_changed_(false) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_COLLECTED_COOKIES_SHOWN,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::Source<TabSpecificContentSettings>(content_settings));
20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ShowWebModalDialogViews(this, web_contents);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, views::DialogDelegate implementation:
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 CollectedCookiesViews::GetWindowTitle() const {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_COLLECTED_COOKIES_DIALOG_TITLE);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int CollectedCookiesViews::GetDialogButtons() const {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::DIALOG_BUTTON_CANCEL;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 CollectedCookiesViews::GetDialogButtonLabel(
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::DialogButton button) const {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_CLOSE);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CollectedCookiesViews::Cancel() {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (status_changed_) {
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CollectedCookiesInfoBarDelegate::Create(
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        InfoBarService::FromWebContents(web_contents_));
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::ModalType CollectedCookiesViews::GetModalType() const {
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ui::MODAL_TYPE_CHILD;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, views::ButtonListener implementation:
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::ButtonPressed(views::Button* sender,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const ui::Event& event) {
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (sender == block_allowed_button_) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddContentException(allowed_cookies_tree_, CONTENT_SETTING_BLOCK);
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (sender == delete_allowed_button_) {
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    allowed_cookies_tree_model_->DeleteCookieNode(
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        static_cast<CookieTreeNode*>(allowed_cookies_tree_->GetSelectedNode()));
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (sender == allow_blocked_button_) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddContentException(blocked_cookies_tree_, CONTENT_SETTING_ALLOW);
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (sender == for_session_blocked_button_) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddContentException(blocked_cookies_tree_, CONTENT_SETTING_SESSION_ONLY);
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, views::TabbedPaneListener implementation:
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::TabSelectedAt(int index) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnableControls();
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCookieInfo();
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, views::TreeViewController implementation:
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::OnTreeViewSelectionChanged(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    views::TreeView* tree_view) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnableControls();
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCookieInfo();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, views::View overrides:
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size CollectedCookiesViews::GetMinimumSize() const {
26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Allow UpdateWebContentsModalDialogPosition to clamp the dialog width.
27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return gfx::Size(0, View::GetMinimumSize().height());
27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
273a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void CollectedCookiesViews::ViewHierarchyChanged(
274a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    const ViewHierarchyChangedDetails& details) {
275a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  if (details.is_add && details.child == this)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Init();
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, private:
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CollectedCookiesViews::~CollectedCookiesViews() {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_->SetModel(NULL);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_->SetModel(NULL);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::Init() {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using views::GridLayout;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GridLayout* layout = GridLayout::CreatePanel(this);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLayoutManager(layout);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int single_column_layout_id = 0;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ColumnSet* column_set = layout->AddColumnSet(single_column_layout_id);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(0, single_column_layout_id);
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  views::TabbedPane* tabbed_pane = new views::TabbedPane();
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->SetInsets(gfx::Insets(kTabbedPaneTopPadding, 0, 0, 0));
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(tabbed_pane);
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NOTE: Panes must be added after |tabbed_pane| has been added to its parent.
304a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 label_allowed = l10n_util::GetStringUTF16(
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_COLLECTED_COOKIES_ALLOWED_COOKIES_TAB_LABEL);
306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 label_blocked = l10n_util::GetStringUTF16(
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_TAB_LABEL);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tabbed_pane->AddTab(label_allowed, CreateAllowedPane());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tabbed_pane->AddTab(label_blocked, CreateBlockedPane());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tabbed_pane->SelectTabAt(0);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tabbed_pane->set_listener(this);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->StartRow(0, single_column_layout_id);
315ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  cookie_info_view_ = new CookieInfoView();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(cookie_info_view_);
317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->AddPaddingRow(0, kCookieInfoBottomPadding);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layout->StartRow(0, single_column_layout_id);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  infobar_ = new InfobarView();
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(infobar_);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnableControls();
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCookieInfo();
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* CollectedCookiesViews::CreateAllowedPane() {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents_);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the controls that go into the pane.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_label_ = new views::Label(l10n_util::GetStringUTF16(
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_COLLECTED_COOKIES_ALLOWED_COOKIES_LABEL));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const LocalSharedObjectsContainer& allowed_data =
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_settings->allowed_local_shared_objects();
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_model_ = allowed_data.CreateCookiesTreeModel();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_ = new views::TreeView();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_->SetModel(allowed_cookies_tree_model_.get());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_->SetRootShown(false);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_->SetEditable(false);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_->set_auto_expand_children(true);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allowed_cookies_tree_->SetController(this);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  block_allowed_button_ = new views::LabelButton(this,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_COLLECTED_COOKIES_BLOCK_BUTTON));
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  block_allowed_button_->SetStyle(views::Button::STYLE_BUTTON);
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete_allowed_button_ = new views::LabelButton(this,
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_COOKIES_REMOVE_LABEL));
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete_allowed_button_->SetStyle(views::Button::STYLE_BUTTON);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the view that holds all the controls together.  This will be the
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pane added to the tabbed pane.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using views::GridLayout;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* pane = new views::View();
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GridLayout* layout = GridLayout::CreatePanel(pane);
359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->SetInsets(kVPanelPadding, views::kButtonHEdgeMarginNew,
360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    kVPanelPadding, views::kButtonHEdgeMarginNew);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pane->SetLayoutManager(layout);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int single_column_layout_id = 0;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ColumnSet* column_set = layout->AddColumnSet(single_column_layout_id);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL, 1,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const int three_columns_layout_id = 1;
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  column_set = layout->AddColumnSet(three_columns_layout_id);
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(0, single_column_layout_id);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(allowed_label_);
378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->AddPaddingRow(0, kLabelBottomPadding);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(1, single_column_layout_id);
3812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  layout->AddView(CreateScrollView(allowed_cookies_tree_), 1, 1,
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  GridLayout::FILL, GridLayout::FILL, kTreeViewWidth,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  kTreeViewHeight);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  layout->StartRow(0, three_columns_layout_id);
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  layout->AddView(block_allowed_button_);
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  layout->AddView(delete_allowed_button_);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pane;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* CollectedCookiesViews::CreateBlockedPane() {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabSpecificContentSettings* content_settings =
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TabSpecificContentSettings::FromWebContents(web_contents_);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile =
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile::FromBrowserContext(web_contents_->GetBrowserContext());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = profile->GetPrefs();
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the controls that go into the pane.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_label_ = new views::Label(
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          prefs->GetBoolean(prefs::kBlockThirdPartyCookies) ?
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IDS_COLLECTED_COOKIES_BLOCKED_THIRD_PARTY_BLOCKING_ENABLED :
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IDS_COLLECTED_COOKIES_BLOCKED_COOKIES_LABEL));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_label_->SetMultiLine(true);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const LocalSharedObjectsContainer& blocked_data =
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_settings->blocked_local_shared_objects();
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_model_ = blocked_data.CreateCookiesTreeModel();
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_ = new views::TreeView();
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_->SetModel(blocked_cookies_tree_model_.get());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_->SetRootShown(false);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_->SetEditable(false);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_->set_auto_expand_children(true);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  blocked_cookies_tree_->SetController(this);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  allow_blocked_button_ = new views::LabelButton(this,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_COLLECTED_COOKIES_ALLOW_BUTTON));
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  allow_blocked_button_->SetStyle(views::Button::STYLE_BUTTON);
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for_session_blocked_button_ = new views::LabelButton(this,
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_COLLECTED_COOKIES_SESSION_ONLY_BUTTON));
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for_session_blocked_button_->SetStyle(views::Button::STYLE_BUTTON);
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create the view that holds all the controls together.  This will be the
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pane added to the tabbed pane.
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using views::GridLayout;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::View* pane = new views::View();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GridLayout* layout = GridLayout::CreatePanel(pane);
432f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->SetInsets(kVPanelPadding, views::kButtonHEdgeMarginNew,
433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    kVPanelPadding, views::kButtonHEdgeMarginNew);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pane->SetLayoutManager(layout);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int single_column_layout_id = 0;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ColumnSet* column_set = layout->AddColumnSet(single_column_layout_id);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::LEADING, GridLayout::FILL, 1,
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int three_columns_layout_id = 1;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set = layout->AddColumnSet(three_columns_layout_id);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddPaddingColumn(0, views::kRelatedControlHorizontalSpacing);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  column_set->AddColumn(GridLayout::LEADING, GridLayout::CENTER, 0,
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        GridLayout::USE_PREF, 0, 0);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(0, single_column_layout_id);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(blocked_label_, 1, 1, GridLayout::FILL, GridLayout::FILL);
451f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  layout->AddPaddingRow(0, kLabelBottomPadding);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(1, single_column_layout_id);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(
4552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      CreateScrollView(blocked_cookies_tree_), 1, 1,
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GridLayout::FILL, GridLayout::FILL, kTreeViewWidth, kTreeViewHeight);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(0, three_columns_layout_id);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(allow_blocked_button_);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(for_session_blocked_button_);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pane;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochviews::View* CollectedCookiesViews::CreateScrollView(views::TreeView* pane) {
467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  views::ScrollView* scroll_view = new views::ScrollView();
468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scroll_view->SetContents(pane);
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scroll_view->SetBorder(
470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      views::Border::CreateSolidBorder(1, kCookiesBorderColor));
471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return scroll_view;
4722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
4732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::EnableControls() {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enable_allowed_buttons = false;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::TreeModelNode* node = allowed_cookies_tree_->GetSelectedNode();
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (node) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CookieTreeNode* cookie_node = static_cast<CookieTreeNode*>(node);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cookie_node->GetDetailedInfo().node_type ==
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CookieTreeNode::DetailedInfo::TYPE_HOST) {
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enable_allowed_buttons = static_cast<CookieTreeHostNode*>(
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cookie_node)->CanCreateContentException();
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  block_allowed_button_->SetEnabled(enable_allowed_buttons);
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  delete_allowed_button_->SetEnabled(node != NULL);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enable_blocked_buttons = false;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  node = blocked_cookies_tree_->GetSelectedNode();
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (node) {
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CookieTreeNode* cookie_node = static_cast<CookieTreeNode*>(node);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cookie_node->GetDetailedInfo().node_type ==
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        CookieTreeNode::DetailedInfo::TYPE_HOST) {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      enable_blocked_buttons = static_cast<CookieTreeHostNode*>(
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          cookie_node)->CanCreateContentException();
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  allow_blocked_button_->SetEnabled(enable_blocked_buttons);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for_session_blocked_button_->SetEnabled(enable_blocked_buttons);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::ShowCookieInfo() {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::TreeModelNode* node = allowed_cookies_tree_->GetSelectedNode();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!node)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    node = blocked_cookies_tree_->GetSelectedNode();
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (node) {
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CookieTreeNode* cookie_node = static_cast<CookieTreeNode*>(node);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const CookieTreeNode::DetailedInfo detailed_info =
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cookie_node->GetDetailedInfo();
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (detailed_info.node_type == CookieTreeNode::DetailedInfo::TYPE_COOKIE) {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cookie_info_view_->SetCookie(detailed_info.cookie->Domain(),
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   *detailed_info.cookie);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cookie_info_view_->ClearCookieDisplay();
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cookie_info_view_->ClearCookieDisplay();
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::AddContentException(views::TreeView* tree_view,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                ContentSetting setting) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieTreeHostNode* host_node =
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<CookieTreeHostNode*>(tree_view->GetSelectedNode());
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile =
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Profile::FromBrowserContext(web_contents_->GetBrowserContext());
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_node->CreateContentException(
5307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      CookieSettings::Factory::GetForProfile(profile).get(), setting);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  infobar_->UpdateVisibility(true, setting, host_node->GetTitle());
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  status_changed_ = true;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CollectedCookiesViews, content::NotificationObserver implementation:
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CollectedCookiesViews::Observe(
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationSource& source,
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationDetails& details) {
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(chrome::NOTIFICATION_COLLECTED_COOKIES_SHOWN, type);
54346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GetWidget()->Close();
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545