Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4946)

Unified Diff: chrome/browser/ui/views/website_settings/website_settings_popup_view.cc

Issue 23441062: Fix a crash by asynchronizing destruction. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/views/website_settings/website_settings_popup_view.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/views/website_settings/website_settings_popup_view.cc
diff --git a/chrome/browser/ui/views/website_settings/website_settings_popup_view.cc b/chrome/browser/ui/views/website_settings/website_settings_popup_view.cc
index e5419ba3524213196595ea70162fe9dd79fe91f2..148a3a4ab763a56d03e6368de4a99bb97593cf08 100644
--- a/chrome/browser/ui/views/website_settings/website_settings_popup_view.cc
+++ b/chrome/browser/ui/views/website_settings/website_settings_popup_view.cc
@@ -1,751 +1,764 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/views/website_settings/website_settings_popup_view.h"
-
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/certificate_viewer.h"
-#include "chrome/browser/infobars/infobar_service.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/views/collected_cookies_views.h"
-#include "chrome/browser/ui/views/website_settings/permission_selector_view.h"
-#include "chrome/browser/ui/website_settings/website_settings.h"
-#include "chrome/browser/ui/website_settings/website_settings_utils.h"
-#include "chrome/common/content_settings_types.h"
-#include "chrome/common/url_constants.h"
-#include "content/public/browser/cert_store.h"
-#include "content/public/browser/user_metrics.h"
-#include "grit/chromium_strings.h"
-#include "grit/generated_resources.h"
-#include "grit/theme_resources.h"
-#include "grit/ui_resources.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/models/simple_menu_model.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/font.h"
-#include "ui/gfx/image/image.h"
-#include "ui/gfx/insets.h"
-#include "ui/views/controls/button/image_button.h"
-#include "ui/views/controls/button/menu_button.h"
-#include "ui/views/controls/button/menu_button_listener.h"
-#include "ui/views/controls/image_view.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/controls/link.h"
-#include "ui/views/controls/menu/menu_model_adapter.h"
-#include "ui/views/controls/menu/menu_runner.h"
-#include "ui/views/controls/separator.h"
-#include "ui/views/controls/tabbed_pane/tabbed_pane.h"
-#include "ui/views/layout/box_layout.h"
-#include "ui/views/layout/grid_layout.h"
-#include "ui/views/layout/layout_manager.h"
-#include "ui/views/view.h"
-#include "ui/views/widget/widget.h"
-#include "url/gurl.h"
-
-namespace {
-
-// Padding values for sections on the connection tab.
-const int kConnectionSectionPaddingBottom = 16;
-const int kConnectionSectionPaddingLeft = 18;
-const int kConnectionSectionPaddingTop = 16;
-const int kConnectionSectionPaddingRight = 18;
-
-// Font size of the label for the site identity.
-const int kIdentityNameFontSize = 14;
-// The text color that is used for the site identity status text, if the site's
-// identity was sucessfully verified.
-const int kIdentityVerifiedTextColor = 0xFF298a27;
-
-// Left icon margin.
-const int kIconMarginLeft = 6;
-
-// Margin and padding values for the |PopupHeaderView|.
-const int kHeaderMarginBottom = 10;
-const int kHeaderPaddingBottom = 12;
-const int kHeaderPaddingLeft = 18;
-const int kHeaderPaddingRight = 8;
-const int kHeaderPaddingTop = 12;
-
-// Spacing between the site identity label and the site identity status text in
-// the popup header.
-const int kHeaderRowSpacing = 4;
-
-// To make the bubble's arrow point directly at the location icon rather than at
-// the Omnibox's edge, inset the bubble's anchor rect by this amount of pixels.
-const int kLocationIconVerticalMargin = 5;
-
-// The max possible width of the popup.
-const int kMaxPopupWidth = 500;
-
-// The margins between the popup border and the popup content.
-const int kPopupMarginTop = 4;
-const int kPopupMarginLeft = 0;
-const int kPopupMarginBottom = 10;
-const int kPopupMarginRight = 0;
-
-// Padding values for sections on the permissions tab.
-const int kPermissionsSectionContentMinWidth = 300;
-const int kPermissionsSectionPaddingBottom = 6;
-const int kPermissionsSectionPaddingLeft = 18;
-const int kPermissionsSectionPaddingTop = 16;
-
-// Space between the headline and the content of a section on the permissions
-// tab.
-const int kPermissionsSectionHeadlineMarginBottom = 10;
-// The content of the "Permissions" section and the "Cookies and Site Data"
-// section is structured in individual rows. |kPermissionsSectionRowSpacing|
-// is the space between these rows.
-const int kPermissionsSectionRowSpacing = 2;
-
-const int kSiteDataIconColumnWidth = 20;
-const int kSiteDataSectionRowSpacing = 11;
-
-} // namespace
-
-// |PopupHeaderView| is the UI element (view) that represents the header of the
-// |WebsiteSettingsPopupView|. The header shows the status of the site's
-// identity check and the name of the site's identity.
-class PopupHeaderView : public views::View {
- public:
- explicit PopupHeaderView(views::ButtonListener* close_button_listener);
- virtual ~PopupHeaderView();
-
- // Sets the name of the site's identity.
- void SetIdentityName(const string16& name);
-
- // Sets the |status_text| for the identity check of this site and the
- // |text_color|.
- void SetIdentityStatus(const string16& status_text, SkColor text_color);
-
- private:
- // The label that displays the name of the site's identity.
- views::Label* name_;
- // The label that displays the status of the identity check for this site.
- views::Label* status_;
-
- DISALLOW_COPY_AND_ASSIGN(PopupHeaderView);
-};
-
-// Website Settings are not supported for internal Chrome pages. Instead of the
-// |WebsiteSettingsPopupView|, the |InternalPageInfoPopupView| is
-// displayed.
-class InternalPageInfoPopupView : public views::BubbleDelegateView {
- public:
- explicit InternalPageInfoPopupView(views::View* anchor_view);
- virtual ~InternalPageInfoPopupView();
-
- private:
- DISALLOW_COPY_AND_ASSIGN(InternalPageInfoPopupView);
-};
-
-////////////////////////////////////////////////////////////////////////////////
-// Popup Header
-////////////////////////////////////////////////////////////////////////////////
-
-PopupHeaderView::PopupHeaderView(views::ButtonListener* close_button_listener)
- : name_(NULL), status_(NULL) {
- views::GridLayout* layout = new views::GridLayout(this);
- SetLayoutManager(layout);
-
- const int label_column = 0;
- views::ColumnSet* column_set = layout->AddColumnSet(label_column);
- column_set->AddPaddingColumn(0, kHeaderPaddingLeft);
- column_set->AddColumn(views::GridLayout::FILL,
- views::GridLayout::FILL,
- 1,
- views::GridLayout::USE_PREF,
- 0,
- 0);
- column_set->AddPaddingColumn(1,0);
- column_set->AddColumn(views::GridLayout::FILL,
- views::GridLayout::FILL,
- 1,
- views::GridLayout::USE_PREF,
- 0,
- 0);
- column_set->AddPaddingColumn(0, kHeaderPaddingRight);
-
- layout->AddPaddingRow(0, kHeaderPaddingTop);
-
- layout->StartRow(0, label_column);
- name_ = new views::Label(string16());
- gfx::Font headline_font(name_->font().GetFontName(), kIdentityNameFontSize);
- name_->SetFont(headline_font.DeriveFont(0, gfx::Font::BOLD));
- layout->AddView(name_, 1, 1, views::GridLayout::LEADING,
- views::GridLayout::TRAILING);
- views::ImageButton* close_button =
- new views::ImageButton(close_button_listener);
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- close_button->SetImage(views::CustomButton::STATE_NORMAL,
- rb.GetImageNamed(IDR_CLOSE_2).ToImageSkia());
- close_button->SetImage(views::CustomButton::STATE_HOVERED,
- rb.GetImageNamed(IDR_CLOSE_2_H).ToImageSkia());
- close_button->SetImage(views::CustomButton::STATE_PRESSED,
- rb.GetImageNamed(IDR_CLOSE_2_P).ToImageSkia());
- layout->AddView(close_button, 1, 1, views::GridLayout::TRAILING,
- views::GridLayout::LEADING);
-
- layout->AddPaddingRow(0, kHeaderRowSpacing);
-
- layout->StartRow(0, label_column);
- status_ = new views::Label(string16());
- layout->AddView(status_,
- 1,
- 1,
- views::GridLayout::LEADING,
- views::GridLayout::CENTER);
-
- layout->AddPaddingRow(0, kHeaderPaddingBottom);
-}
-
-PopupHeaderView::~PopupHeaderView() {
-}
-
-void PopupHeaderView::SetIdentityName(const string16& name) {
- name_->SetText(name);
-}
-
-void PopupHeaderView::SetIdentityStatus(const string16& status,
- SkColor text_color) {
- status_->SetText(status);
- status_->SetEnabledColor(text_color);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// InternalPageInfoPopupView
-////////////////////////////////////////////////////////////////////////////////
-
-InternalPageInfoPopupView::InternalPageInfoPopupView(views::View* anchor_view)
- : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_LEFT) {
- // Compensate for built-in vertical padding in the anchor view's image.
- set_anchor_view_insets(gfx::Insets(kLocationIconVerticalMargin, 0,
- kLocationIconVerticalMargin, 0));
-
- const int kSpacing = 4;
- SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, kSpacing,
- kSpacing, kSpacing));
- views::ImageView* icon_view = new views::ImageView();
- ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
- icon_view->SetImage(rb.GetImageSkiaNamed(IDR_PRODUCT_LOGO_26));
- AddChildView(icon_view);
-
- views::Label* label =
- new views::Label(l10n_util::GetStringUTF16(IDS_PAGE_INFO_INTERNAL_PAGE));
- label->SetMultiLine(true);
- label->SetAllowCharacterBreak(true);
- label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- AddChildView(label);
-
- views::BubbleDelegateView::CreateBubble(this)->Show();
- SizeToContents();
-}
-
-InternalPageInfoPopupView::~InternalPageInfoPopupView() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// WebsiteSettingsPopupView
-////////////////////////////////////////////////////////////////////////////////
-
-WebsiteSettingsPopupView::~WebsiteSettingsPopupView() {
-}
-
-// static
-void WebsiteSettingsPopupView::ShowPopup(views::View* anchor_view,
- Profile* profile,
- content::WebContents* web_contents,
- const GURL& url,
- const content::SSLStatus& ssl,
- Browser* browser) {
- if (InternalChromePage(url)) {
- new InternalPageInfoPopupView(anchor_view);
- } else {
- new WebsiteSettingsPopupView(anchor_view, profile, web_contents, url, ssl,
- browser);
- }
-}
-
-WebsiteSettingsPopupView::WebsiteSettingsPopupView(
- views::View* anchor_view,
- Profile* profile,
- content::WebContents* web_contents,
- const GURL& url,
- const content::SSLStatus& ssl,
- Browser* browser)
- : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_LEFT),
- web_contents_(web_contents),
- browser_(browser),
- header_(NULL),
- tabbed_pane_(NULL),
- site_data_content_(NULL),
- cookie_dialog_link_(NULL),
- permissions_content_(NULL),
- connection_tab_(NULL),
- identity_info_content_(NULL),
- certificate_dialog_link_(NULL),
- cert_id_(0),
- help_center_link_(NULL),
- connection_info_content_(NULL),
- page_info_content_(NULL) {
- // Compensate for built-in vertical padding in the anchor view's image.
- set_anchor_view_insets(gfx::Insets(kLocationIconVerticalMargin, 0,
- kLocationIconVerticalMargin, 0));
-
- views::GridLayout* layout = new views::GridLayout(this);
- SetLayoutManager(layout);
- const int content_column = 0;
- views::ColumnSet* column_set = layout->AddColumnSet(content_column);
- column_set->AddColumn(views::GridLayout::FILL,
- views::GridLayout::FILL,
- 1,
- views::GridLayout::USE_PREF,
- 0,
- 0);
-
- header_ = new PopupHeaderView(this);
- layout->StartRow(1, content_column);
- layout->AddView(header_);
-
- layout->AddPaddingRow(1, kHeaderMarginBottom);
- tabbed_pane_ = new views::TabbedPane(false);
- layout->StartRow(1, content_column);
- layout->AddView(tabbed_pane_);
- // Tabs must be added after the tabbed_pane_ was added to the views
- // hierachy. Adding the |tabbed_pane_| to the views hierachy triggers the
- // initialization of the native tab UI element. If the native tab UI
- // element is not initalized adding a tab will result in a NULL pointer
- // exception.
- tabbed_pane_->AddTabAtIndex(
- TAB_ID_PERMISSIONS,
- l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TAB_LABEL_PERMISSIONS),
- CreatePermissionsTab());
- connection_tab_ = CreateConnectionTab();
- tabbed_pane_->AddTabAtIndex(
- TAB_ID_CONNECTION,
- l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TAB_LABEL_CONNECTION),
- connection_tab_);
- DCHECK_EQ(tabbed_pane_->GetTabCount(), NUM_TAB_IDS);
- tabbed_pane_->set_listener(this);
-
- set_margins(gfx::Insets(kPopupMarginTop, kPopupMarginLeft,
- kPopupMarginBottom, kPopupMarginRight));
-
- views::BubbleDelegateView::CreateBubble(this)->Show();
- SizeToContents();
-
- presenter_.reset(new WebsiteSettings(
- this, profile,
- TabSpecificContentSettings::FromWebContents(web_contents),
- InfoBarService::FromWebContents(web_contents), url, ssl,
- content::CertStore::GetInstance()));
-}
-
-void WebsiteSettingsPopupView::OnPermissionChanged(
- PermissionSelectorView* permission_selector) {
- DCHECK(permission_selector);
- presenter_->OnSitePermissionChanged(permission_selector->type(),
- permission_selector->current_setting());
-}
-
-void WebsiteSettingsPopupView::OnWidgetDestroying(views::Widget* widget) {
- presenter_->OnUIClosing();
-}
-
-void WebsiteSettingsPopupView::ButtonPressed(
- views::Button* button,
- const ui::Event& event) {
- GetWidget()->Close();
-}
-
-void WebsiteSettingsPopupView::LinkClicked(views::Link* source,
- int event_flags) {
- if (source == cookie_dialog_link_) {
- // Count how often the Collected Cookies dialog is opened.
- content::RecordAction(
- content::UserMetricsAction("WebsiteSettings_CookiesDialogOpened"));
- new CollectedCookiesViews(web_contents_);
- } else if (source == certificate_dialog_link_) {
- gfx::NativeWindow parent =
- anchor_view() ? anchor_view()->GetWidget()->GetNativeWindow() : NULL;
- ShowCertificateViewerByID(web_contents_, parent, cert_id_);
- } else if (source == help_center_link_) {
- browser_->OpenURL(content::OpenURLParams(
- GURL(chrome::kPageInfoHelpCenterURL),
- content::Referrer(),
- NEW_FOREGROUND_TAB,
- content::PAGE_TRANSITION_LINK,
- false));
- }
- // The popup closes automatically when the collected cookies dialog or the
- // certificate viewer opens.
-}
-
-void WebsiteSettingsPopupView::TabSelectedAt(int index) {
- tabbed_pane_->GetSelectedTab()->Layout();
- SizeToContents();
-}
-
-gfx::Size WebsiteSettingsPopupView::GetPreferredSize() {
- if (header_ == NULL && tabbed_pane_ == NULL)
- return views::View::GetPreferredSize();
-
- int height = 0;
- if (header_)
- height += header_->GetPreferredSize().height();
- if (tabbed_pane_)
- height += tabbed_pane_->GetPreferredSize().height();
-
- int width = kPermissionsSectionContentMinWidth;
- if (site_data_content_)
- width = std::max(width, site_data_content_->GetPreferredSize().width());
- if (permissions_content_)
- width = std::max(width, permissions_content_->GetPreferredSize().width());
- width += kPermissionsSectionPaddingLeft;
- width = std::min(width, kMaxPopupWidth);
-
- return gfx::Size(width, height);
-}
-
-void WebsiteSettingsPopupView::SetCookieInfo(
- const CookieInfoList& cookie_info_list) {
- site_data_content_->RemoveAllChildViews(true);
-
- views::GridLayout* layout = new views::GridLayout(site_data_content_);
- site_data_content_->SetLayoutManager(layout);
-
- const int site_data_content_column = 0;
- views::ColumnSet* column_set =
- layout->AddColumnSet(site_data_content_column);
- column_set->AddColumn(views::GridLayout::FILL,
- views::GridLayout::FILL,
- 1,
- views::GridLayout::FIXED,
- kSiteDataIconColumnWidth,
- 0);
- column_set->AddPaddingColumn(0, kIconMarginLeft);
- column_set->AddColumn(views::GridLayout::FILL,
- views::GridLayout::FILL,
- 1,
- views::GridLayout::USE_PREF,
- 0,
- 0);
-
- layout->AddPaddingRow(1, 5);
- for (CookieInfoList::const_iterator i(cookie_info_list.begin());
- i != cookie_info_list.end();
- ++i) {
- string16 label_text = l10n_util::GetStringFUTF16(
- IDS_WEBSITE_SETTINGS_SITE_DATA_STATS_LINE,
- UTF8ToUTF16(i->cookie_source),
- base::IntToString16(i->allowed),
- base::IntToString16(i->blocked));
- if (i != cookie_info_list.begin())
- layout->AddPaddingRow(1, kSiteDataSectionRowSpacing);
- layout->StartRow(1, site_data_content_column);
- views::ImageView* icon = new views::ImageView();
- const gfx::Image& image = WebsiteSettingsUI::GetPermissionIcon(
- CONTENT_SETTINGS_TYPE_COOKIES, CONTENT_SETTING_ALLOW);
- icon->SetImage(image.ToImageSkia());
- layout->AddView(icon, 1, 1, views::GridLayout::CENTER,
- views::GridLayout::CENTER);
- layout->AddView(new views::Label(label_text), 1, 1,
- views::GridLayout::LEADING, views::GridLayout::CENTER);
- }
- layout->AddPaddingRow(1, 6);
-
- layout->Layout(site_data_content_);
- SizeToContents();
-}
-
-void WebsiteSettingsPopupView::SetPermissionInfo(
- const PermissionInfoList& permission_info_list) {
- permissions_content_->RemoveAllChildViews(true);
-
- views::GridLayout* layout =
- new views::GridLayout(permissions_content_);
- permissions_content_->SetLayoutManager(layout);
- const int content_column = 0;
- views::ColumnSet* column_set =
- layout->AddColumnSet(content_column);
- column_set->AddColumn(views::GridLayout::FILL,
- views::GridLayout::FILL,
- 1,
- views::GridLayout::USE_PREF,
- 0,
- 0);
- for (PermissionInfoList::const_iterator permission =
- permission_info_list.begin();
- permission != permission_info_list.end();
- ++permission) {
- layout->StartRow(1, content_column);
- PermissionSelectorView* selector = new PermissionSelectorView(
- web_contents_ ? web_contents_->GetURL() : GURL::EmptyGURL(),
- permission->type,
- permission->default_setting,
- permission->setting,
- permission->source);
- selector->AddObserver(this);
- layout->AddView(selector,
- 1,
- 1,
- views::GridLayout::LEADING,
- views::GridLayout::CENTER);
- layout->AddPaddingRow(1, kPermissionsSectionRowSpacing);
- }
-
- SizeToContents();
-}
-
-void WebsiteSettingsPopupView::SetIdentityInfo(
- const IdentityInfo& identity_info) {
- string16 identity_status_text;
- SkColor text_color = SK_ColorBLACK;
- switch (identity_info.identity_status) {
- case WebsiteSettings::SITE_IDENTITY_STATUS_CERT:
- case WebsiteSettings::SITE_IDENTITY_STATUS_EV_CERT:
- identity_status_text =
- l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_IDENTITY_VERIFIED);
- text_color = kIdentityVerifiedTextColor;
- break;
- case WebsiteSettings::SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT:
- identity_status_text =
- l10n_util::GetStringUTF16(IDS_CERT_POLICY_PROVIDED_CERT_HEADER);
- break;
- default:
- identity_status_text =
- l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_IDENTITY_NOT_VERIFIED);
- break;
- }
- header_->SetIdentityName(UTF8ToUTF16(identity_info.site_identity));
- header_->SetIdentityStatus(identity_status_text, text_color);
-
- // The headline and the certificate dialog link of the site's identity
- // section is only displayed if the site's identity was verified. If the
- // site's identity was verified, then the headline contains the organization
- // name from the provided certificate. If the organization name is not
- // available than the hostname of the site is used instead.
- string16 headline;
- if (identity_info.cert_id) {
- cert_id_ = identity_info.cert_id;
- certificate_dialog_link_ = new views::Link(
- l10n_util::GetStringUTF16(IDS_PAGEINFO_CERT_INFO_BUTTON));
- certificate_dialog_link_->set_listener(this);
- headline = UTF8ToUTF16(identity_info.site_identity);
- }
- ResetConnectionSection(
- identity_info_content_,
- WebsiteSettingsUI::GetIdentityIcon(identity_info.identity_status),
- string16(), // The identity section has no headline.
- UTF8ToUTF16(identity_info.identity_status_description),
- certificate_dialog_link_);
-
- ResetConnectionSection(
- connection_info_content_,
- WebsiteSettingsUI::GetConnectionIcon(identity_info.connection_status),
- string16(), // The connection section has no headline.
- UTF8ToUTF16(identity_info.connection_status_description),
- NULL);
-
- connection_tab_->InvalidateLayout();
- Layout();
- SizeToContents();
-}
-
-void WebsiteSettingsPopupView::SetFirstVisit(const string16& first_visit) {
- ResetConnectionSection(
- page_info_content_,
- WebsiteSettingsUI::GetFirstVisitIcon(first_visit),
- l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_INFO_TITLE),
- first_visit,
- NULL);
- connection_tab_->InvalidateLayout();
- Layout();
- SizeToContents();
-}
-
-void WebsiteSettingsPopupView::SetSelectedTab(TabId tab_id) {
- tabbed_pane_->SelectTabAt(tab_id);
-}
-
-views::View* WebsiteSettingsPopupView::CreatePermissionsTab() {
- views::View* pane = new views::View();
- pane->SetLayoutManager(
- new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
- // Add cookies and site data section.
- cookie_dialog_link_ = new views::Link(
- l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_SHOW_SITE_DATA));
- cookie_dialog_link_->set_listener(this);
- site_data_content_ = new views::View();
- views::View* site_data_section =
- CreateSection(l10n_util::GetStringUTF16(
- IDS_WEBSITE_SETTINGS_TITLE_SITE_DATA),
- site_data_content_,
- cookie_dialog_link_);
- pane->AddChildView(site_data_section);
- // Add permissions section.
- permissions_content_ = new views::View();
- views::View* permissions_section =
- CreateSection(l10n_util::GetStringUTF16(
- IDS_WEBSITE_SETTINGS_TITLE_SITE_PERMISSIONS),
- permissions_content_,
- NULL);
- pane->AddChildView(permissions_section);
- return pane;
-}
-
-views::View* WebsiteSettingsPopupView::CreateConnectionTab() {
- views::View* pane = new views::View();
- pane->SetLayoutManager(
- new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
- // Add site identity section.
- identity_info_content_ = new views::View();
- pane->AddChildView(identity_info_content_);
-
- // Add connection section.
- pane->AddChildView(new views::Separator(views::Separator::HORIZONTAL));
- connection_info_content_ = new views::View();
- pane->AddChildView(connection_info_content_);
-
- // Add page info section.
- pane->AddChildView(new views::Separator(views::Separator::HORIZONTAL));
- page_info_content_ = new views::View();
- pane->AddChildView(page_info_content_);
-
- // Add help center link.
- pane->AddChildView(new views::Separator(views::Separator::HORIZONTAL));
- help_center_link_ = new views::Link(
- l10n_util::GetStringUTF16(IDS_PAGE_INFO_HELP_CENTER_LINK));
- help_center_link_->set_listener(this);
- views::View* link_section = new views::View();
- const int kLinkMarginTop = 4;
- link_section->SetLayoutManager(
- new views::BoxLayout(views::BoxLayout::kHorizontal,
- kConnectionSectionPaddingLeft,
- kLinkMarginTop,
- 0));
- link_section->AddChildView(help_center_link_);
- pane->AddChildView(link_section);
- return pane;
-}
-
-views::View* WebsiteSettingsPopupView::CreateSection(
- const string16& headline_text,
- views::View* content,
- views::Link* link) {
- views::View* container = new views::View();
- views::GridLayout* layout = new views::GridLayout(container);
- container->SetLayoutManager(layout);
- const int content_column = 0;
- views::ColumnSet* column_set = layout->AddColumnSet(content_column);
- column_set->AddPaddingColumn(0, kPermissionsSectionPaddingLeft);
- column_set->AddColumn(views::GridLayout::FILL,
- views::GridLayout::FILL,
- 1,
- views::GridLayout::USE_PREF,
- 0,
- 0);
-
- layout->AddPaddingRow(1, kPermissionsSectionPaddingTop);
- layout->StartRow(1, content_column);
- views::Label* headline = new views::Label(headline_text);
- headline->SetFont(headline->font().DeriveFont(0, gfx::Font::BOLD));
- layout->AddView(headline, 1, 1, views::GridLayout::LEADING,
- views::GridLayout::CENTER);
-
- layout->AddPaddingRow(1, kPermissionsSectionHeadlineMarginBottom);
- layout->StartRow(1, content_column);
- layout->AddView(content, 1, 1, views::GridLayout::LEADING,
- views::GridLayout::CENTER);
-
- if (link) {
- layout->AddPaddingRow(1, 4);
- layout->StartRow(1, content_column);
- layout->AddView(link, 1, 1, views::GridLayout::LEADING,
- views::GridLayout::CENTER);
- }
-
- layout->AddPaddingRow(1, kPermissionsSectionPaddingBottom);
- return container;
-}
-
-void WebsiteSettingsPopupView::ResetConnectionSection(
- views::View* section_container,
- const gfx::Image& icon,
- const string16& headline,
- const string16& text,
- views::Link* link) {
- section_container->RemoveAllChildViews(true);
-
- views::GridLayout* layout = new views::GridLayout(section_container);
- section_container->SetLayoutManager(layout);
- views::ColumnSet* column_set = layout->AddColumnSet(0);
- column_set->AddPaddingColumn(0, kConnectionSectionPaddingLeft);
- column_set->AddColumn(views::GridLayout::LEADING,
- views::GridLayout::LEADING,
- 0,
- views::GridLayout::USE_PREF,
- 0,
- 0);
- column_set->AddPaddingColumn(0, kIconMarginLeft);
- column_set->AddColumn(views::GridLayout::FILL,
- views::GridLayout::FILL,
- 1,
- views::GridLayout::USE_PREF,
- 0,
- 0);
- column_set->AddPaddingColumn(0, kConnectionSectionPaddingRight);
-
-
- layout->AddPaddingRow(0, kConnectionSectionPaddingTop);
- layout->StartRow(1, 0);
-
- // Add status icon.
- views::ImageView* icon_view = new views::ImageView();
- icon_view->SetImage(*icon.ToImageSkia());
- layout->AddView(icon_view, 1, 1, views::GridLayout::LEADING,
- views::GridLayout::LEADING);
-
- // Add section content.
- views::View* content_pane = new views::View();
- views::GridLayout* content_layout = new views::GridLayout(content_pane);
- content_pane->SetLayoutManager(content_layout);
- views::ColumnSet* content_column_set = content_layout->AddColumnSet(0);
- content_column_set->AddColumn(views::GridLayout::LEADING,
- views::GridLayout::LEADING,
- 1,
- views::GridLayout::USE_PREF,
- 0,
- 0);
- if (!headline.empty()) {
- views::Label* headline_label = new views::Label(headline);
- headline_label->SetFont(
- headline_label->font().DeriveFont(0, gfx::Font::BOLD));
- headline_label->SetMultiLine(true);
- headline_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- // Allow linebreaking in the middle of words if necessary, so that extremely
- // long hostnames (longer than one line) will still be completely shown.
- headline_label->SetAllowCharacterBreak(true);
- content_layout->StartRow(1, 0);
- content_layout->AddView(headline_label);
- }
-
- views::Label* description_label = new views::Label(text);
- description_label->SetMultiLine(true);
- description_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
- description_label->SetAllowCharacterBreak(true);
- content_layout->StartRow(1, 0);
- content_layout->AddView(description_label);
-
- if (link) {
- content_layout->StartRow(1, 0);
- content_layout->AddView(link);
- }
-
- layout->AddView(content_pane, 1, 1, views::GridLayout::LEADING,
- views::GridLayout::LEADING);
- layout->AddPaddingRow(0, kConnectionSectionPaddingBottom);
-}
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/website_settings/website_settings_popup_view.h"
+
+#include "base/strings/string_number_conversions.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/certificate_viewer.h"
+#include "chrome/browser/infobars/infobar_service.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/views/collected_cookies_views.h"
+#include "chrome/browser/ui/views/website_settings/permission_selector_view.h"
+#include "chrome/browser/ui/website_settings/website_settings.h"
+#include "chrome/browser/ui/website_settings/website_settings_utils.h"
+#include "chrome/common/content_settings_types.h"
+#include "chrome/common/url_constants.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/cert_store.h"
+#include "content/public/browser/user_metrics.h"
+#include "grit/chromium_strings.h"
+#include "grit/generated_resources.h"
+#include "grit/theme_resources.h"
+#include "grit/ui_resources.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/models/simple_menu_model.h"
+#include "ui/base/resource/resource_bundle.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/font.h"
+#include "ui/gfx/image/image.h"
+#include "ui/gfx/insets.h"
+#include "ui/views/controls/button/image_button.h"
+#include "ui/views/controls/button/menu_button.h"
+#include "ui/views/controls/button/menu_button_listener.h"
+#include "ui/views/controls/image_view.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/controls/link.h"
+#include "ui/views/controls/menu/menu_model_adapter.h"
+#include "ui/views/controls/menu/menu_runner.h"
+#include "ui/views/controls/separator.h"
+#include "ui/views/controls/tabbed_pane/tabbed_pane.h"
+#include "ui/views/layout/box_layout.h"
+#include "ui/views/layout/grid_layout.h"
+#include "ui/views/layout/layout_manager.h"
+#include "ui/views/view.h"
+#include "ui/views/widget/widget.h"
+#include "url/gurl.h"
+
+namespace {
+
+// Padding values for sections on the connection tab.
+const int kConnectionSectionPaddingBottom = 16;
+const int kConnectionSectionPaddingLeft = 18;
+const int kConnectionSectionPaddingTop = 16;
+const int kConnectionSectionPaddingRight = 18;
+
+// Font size of the label for the site identity.
+const int kIdentityNameFontSize = 14;
+// The text color that is used for the site identity status text, if the site's
+// identity was sucessfully verified.
+const int kIdentityVerifiedTextColor = 0xFF298a27;
+
+// Left icon margin.
+const int kIconMarginLeft = 6;
+
+// Margin and padding values for the |PopupHeaderView|.
+const int kHeaderMarginBottom = 10;
+const int kHeaderPaddingBottom = 12;
+const int kHeaderPaddingLeft = 18;
+const int kHeaderPaddingRight = 8;
+const int kHeaderPaddingTop = 12;
+
+// Spacing between the site identity label and the site identity status text in
+// the popup header.
+const int kHeaderRowSpacing = 4;
+
+// To make the bubble's arrow point directly at the location icon rather than at
+// the Omnibox's edge, inset the bubble's anchor rect by this amount of pixels.
+const int kLocationIconVerticalMargin = 5;
+
+// The max possible width of the popup.
+const int kMaxPopupWidth = 500;
+
+// The margins between the popup border and the popup content.
+const int kPopupMarginTop = 4;
+const int kPopupMarginLeft = 0;
+const int kPopupMarginBottom = 10;
+const int kPopupMarginRight = 0;
+
+// Padding values for sections on the permissions tab.
+const int kPermissionsSectionContentMinWidth = 300;
+const int kPermissionsSectionPaddingBottom = 6;
+const int kPermissionsSectionPaddingLeft = 18;
+const int kPermissionsSectionPaddingTop = 16;
+
+// Space between the headline and the content of a section on the permissions
+// tab.
+const int kPermissionsSectionHeadlineMarginBottom = 10;
+// The content of the "Permissions" section and the "Cookies and Site Data"
+// section is structured in individual rows. |kPermissionsSectionRowSpacing|
+// is the space between these rows.
+const int kPermissionsSectionRowSpacing = 2;
+
+const int kSiteDataIconColumnWidth = 20;
+const int kSiteDataSectionRowSpacing = 11;
+
+} // namespace
+
+// |PopupHeaderView| is the UI element (view) that represents the header of the
+// |WebsiteSettingsPopupView|. The header shows the status of the site's
+// identity check and the name of the site's identity.
+class PopupHeaderView : public views::View {
+ public:
+ explicit PopupHeaderView(views::ButtonListener* close_button_listener);
+ virtual ~PopupHeaderView();
+
+ // Sets the name of the site's identity.
+ void SetIdentityName(const string16& name);
+
+ // Sets the |status_text| for the identity check of this site and the
+ // |text_color|.
+ void SetIdentityStatus(const string16& status_text, SkColor text_color);
+
+ private:
+ // The label that displays the name of the site's identity.
+ views::Label* name_;
+ // The label that displays the status of the identity check for this site.
+ views::Label* status_;
+
+ DISALLOW_COPY_AND_ASSIGN(PopupHeaderView);
+};
+
+// Website Settings are not supported for internal Chrome pages. Instead of the
+// |WebsiteSettingsPopupView|, the |InternalPageInfoPopupView| is
+// displayed.
+class InternalPageInfoPopupView : public views::BubbleDelegateView {
+ public:
+ explicit InternalPageInfoPopupView(views::View* anchor_view);
+ virtual ~InternalPageInfoPopupView();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(InternalPageInfoPopupView);
+};
+
+////////////////////////////////////////////////////////////////////////////////
+// Popup Header
+////////////////////////////////////////////////////////////////////////////////
+
+PopupHeaderView::PopupHeaderView(views::ButtonListener* close_button_listener)
+ : name_(NULL), status_(NULL) {
+ views::GridLayout* layout = new views::GridLayout(this);
+ SetLayoutManager(layout);
+
+ const int label_column = 0;
+ views::ColumnSet* column_set = layout->AddColumnSet(label_column);
+ column_set->AddPaddingColumn(0, kHeaderPaddingLeft);
+ column_set->AddColumn(views::GridLayout::FILL,
+ views::GridLayout::FILL,
+ 1,
+ views::GridLayout::USE_PREF,
+ 0,
+ 0);
+ column_set->AddPaddingColumn(1,0);
+ column_set->AddColumn(views::GridLayout::FILL,
+ views::GridLayout::FILL,
+ 1,
+ views::GridLayout::USE_PREF,
+ 0,
+ 0);
+ column_set->AddPaddingColumn(0, kHeaderPaddingRight);
+
+ layout->AddPaddingRow(0, kHeaderPaddingTop);
+
+ layout->StartRow(0, label_column);
+ name_ = new views::Label(string16());
+ gfx::Font headline_font(name_->font().GetFontName(), kIdentityNameFontSize);
+ name_->SetFont(headline_font.DeriveFont(0, gfx::Font::BOLD));
+ layout->AddView(name_, 1, 1, views::GridLayout::LEADING,
+ views::GridLayout::TRAILING);
+ views::ImageButton* close_button =
+ new views::ImageButton(close_button_listener);
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ close_button->SetImage(views::CustomButton::STATE_NORMAL,
+ rb.GetImageNamed(IDR_CLOSE_2).ToImageSkia());
+ close_button->SetImage(views::CustomButton::STATE_HOVERED,
+ rb.GetImageNamed(IDR_CLOSE_2_H).ToImageSkia());
+ close_button->SetImage(views::CustomButton::STATE_PRESSED,
+ rb.GetImageNamed(IDR_CLOSE_2_P).ToImageSkia());
+ layout->AddView(close_button, 1, 1, views::GridLayout::TRAILING,
+ views::GridLayout::LEADING);
+
+ layout->AddPaddingRow(0, kHeaderRowSpacing);
+
+ layout->StartRow(0, label_column);
+ status_ = new views::Label(string16());
+ layout->AddView(status_,
+ 1,
+ 1,
+ views::GridLayout::LEADING,
+ views::GridLayout::CENTER);
+
+ layout->AddPaddingRow(0, kHeaderPaddingBottom);
+}
+
+PopupHeaderView::~PopupHeaderView() {
+}
+
+void PopupHeaderView::SetIdentityName(const string16& name) {
+ name_->SetText(name);
+}
+
+void PopupHeaderView::SetIdentityStatus(const string16& status,
+ SkColor text_color) {
+ status_->SetText(status);
+ status_->SetEnabledColor(text_color);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// InternalPageInfoPopupView
+////////////////////////////////////////////////////////////////////////////////
+
+InternalPageInfoPopupView::InternalPageInfoPopupView(views::View* anchor_view)
+ : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_LEFT) {
+ // Compensate for built-in vertical padding in the anchor view's image.
+ set_anchor_view_insets(gfx::Insets(kLocationIconVerticalMargin, 0,
+ kLocationIconVerticalMargin, 0));
+
+ const int kSpacing = 4;
+ SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, kSpacing,
+ kSpacing, kSpacing));
+ views::ImageView* icon_view = new views::ImageView();
+ ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
+ icon_view->SetImage(rb.GetImageSkiaNamed(IDR_PRODUCT_LOGO_26));
+ AddChildView(icon_view);
+
+ views::Label* label =
+ new views::Label(l10n_util::GetStringUTF16(IDS_PAGE_INFO_INTERNAL_PAGE));
+ label->SetMultiLine(true);
+ label->SetAllowCharacterBreak(true);
+ label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+ AddChildView(label);
+
+ views::BubbleDelegateView::CreateBubble(this)->Show();
+ SizeToContents();
+}
+
+InternalPageInfoPopupView::~InternalPageInfoPopupView() {
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// WebsiteSettingsPopupView
+////////////////////////////////////////////////////////////////////////////////
+
+WebsiteSettingsPopupView::~WebsiteSettingsPopupView() {
+}
+
+// static
+void WebsiteSettingsPopupView::ShowPopup(views::View* anchor_view,
+ Profile* profile,
+ content::WebContents* web_contents,
+ const GURL& url,
+ const content::SSLStatus& ssl,
+ Browser* browser) {
+ if (InternalChromePage(url)) {
+ new InternalPageInfoPopupView(anchor_view);
+ } else {
+ new WebsiteSettingsPopupView(anchor_view, profile, web_contents, url, ssl,
+ browser);
+ }
+}
+
+WebsiteSettingsPopupView::WebsiteSettingsPopupView(
+ views::View* anchor_view,
+ Profile* profile,
+ content::WebContents* web_contents,
+ const GURL& url,
+ const content::SSLStatus& ssl,
+ Browser* browser)
+ : BubbleDelegateView(anchor_view, views::BubbleBorder::TOP_LEFT),
+ web_contents_(web_contents),
+ browser_(browser),
+ header_(NULL),
+ tabbed_pane_(NULL),
+ site_data_content_(NULL),
+ cookie_dialog_link_(NULL),
+ permissions_content_(NULL),
+ connection_tab_(NULL),
+ identity_info_content_(NULL),
+ certificate_dialog_link_(NULL),
+ cert_id_(0),
+ help_center_link_(NULL),
+ connection_info_content_(NULL),
+ page_info_content_(NULL),
+ weak_factory_(this) {
+ // Compensate for built-in vertical padding in the anchor view's image.
+ set_anchor_view_insets(gfx::Insets(kLocationIconVerticalMargin, 0,
+ kLocationIconVerticalMargin, 0));
+
+ views::GridLayout* layout = new views::GridLayout(this);
+ SetLayoutManager(layout);
+ const int content_column = 0;
+ views::ColumnSet* column_set = layout->AddColumnSet(content_column);
+ column_set->AddColumn(views::GridLayout::FILL,
+ views::GridLayout::FILL,
+ 1,
+ views::GridLayout::USE_PREF,
+ 0,
+ 0);
+
+ header_ = new PopupHeaderView(this);
+ layout->StartRow(1, content_column);
+ layout->AddView(header_);
+
+ layout->AddPaddingRow(1, kHeaderMarginBottom);
+ tabbed_pane_ = new views::TabbedPane(false);
+ layout->StartRow(1, content_column);
+ layout->AddView(tabbed_pane_);
+ // Tabs must be added after the tabbed_pane_ was added to the views
+ // hierachy. Adding the |tabbed_pane_| to the views hierachy triggers the
+ // initialization of the native tab UI element. If the native tab UI
+ // element is not initalized adding a tab will result in a NULL pointer
+ // exception.
+ tabbed_pane_->AddTabAtIndex(
+ TAB_ID_PERMISSIONS,
+ l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TAB_LABEL_PERMISSIONS),
+ CreatePermissionsTab());
+ connection_tab_ = CreateConnectionTab();
+ tabbed_pane_->AddTabAtIndex(
+ TAB_ID_CONNECTION,
+ l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_TAB_LABEL_CONNECTION),
+ connection_tab_);
+ DCHECK_EQ(tabbed_pane_->GetTabCount(), NUM_TAB_IDS);
+ tabbed_pane_->set_listener(this);
+
+ set_margins(gfx::Insets(kPopupMarginTop, kPopupMarginLeft,
+ kPopupMarginBottom, kPopupMarginRight));
+
+ views::BubbleDelegateView::CreateBubble(this)->Show();
+ SizeToContents();
+
+ presenter_.reset(new WebsiteSettings(
+ this, profile,
+ TabSpecificContentSettings::FromWebContents(web_contents),
+ InfoBarService::FromWebContents(web_contents), url, ssl,
+ content::CertStore::GetInstance()));
+}
+
+void WebsiteSettingsPopupView::OnPermissionChanged(
+ PermissionSelectorView* permission_selector) {
+ DCHECK(permission_selector);
+ presenter_->OnSitePermissionChanged(permission_selector->type(),
+ permission_selector->current_setting());
+}
+
+void WebsiteSettingsPopupView::OnWidgetDestroying(views::Widget* widget) {
+ presenter_->OnUIClosing();
+}
+
+void WebsiteSettingsPopupView::ButtonPressed(
+ views::Button* button,
+ const ui::Event& event) {
+ GetWidget()->Close();
+}
+
+void WebsiteSettingsPopupView::LinkClicked(views::Link* source,
+ int event_flags) {
+ // The popup closes automatically when the collected cookies dialog or the
+ // certificate viewer opens. So delay handling of the link clicked to avoid
+ // a crash in the base class which needs to complete the mouse event handling.
+ content::BrowserThread::PostTask(
+ content::BrowserThread::UI, FROM_HERE,
+ base::Bind(&WebsiteSettingsPopupView::HandleLinkClickedAsync,
+ weak_factory_.GetWeakPtr(), source));
+}
+
+void WebsiteSettingsPopupView::TabSelectedAt(int index) {
+ tabbed_pane_->GetSelectedTab()->Layout();
+ SizeToContents();
+}
+
+gfx::Size WebsiteSettingsPopupView::GetPreferredSize() {
+ if (header_ == NULL && tabbed_pane_ == NULL)
+ return views::View::GetPreferredSize();
+
+ int height = 0;
+ if (header_)
+ height += header_->GetPreferredSize().height();
+ if (tabbed_pane_)
+ height += tabbed_pane_->GetPreferredSize().height();
+
+ int width = kPermissionsSectionContentMinWidth;
+ if (site_data_content_)
+ width = std::max(width, site_data_content_->GetPreferredSize().width());
+ if (permissions_content_)
+ width = std::max(width, permissions_content_->GetPreferredSize().width());
+ width += kPermissionsSectionPaddingLeft;
+ width = std::min(width, kMaxPopupWidth);
+
+ return gfx::Size(width, height);
+}
+
+void WebsiteSettingsPopupView::SetCookieInfo(
+ const CookieInfoList& cookie_info_list) {
+ site_data_content_->RemoveAllChildViews(true);
+
+ views::GridLayout* layout = new views::GridLayout(site_data_content_);
+ site_data_content_->SetLayoutManager(layout);
+
+ const int site_data_content_column = 0;
+ views::ColumnSet* column_set =
+ layout->AddColumnSet(site_data_content_column);
+ column_set->AddColumn(views::GridLayout::FILL,
+ views::GridLayout::FILL,
+ 1,
+ views::GridLayout::FIXED,
+ kSiteDataIconColumnWidth,
+ 0);
+ column_set->AddPaddingColumn(0, kIconMarginLeft);
+ column_set->AddColumn(views::GridLayout::FILL,
+ views::GridLayout::FILL,
+ 1,
+ views::GridLayout::USE_PREF,
+ 0,
+ 0);
+
+ layout->AddPaddingRow(1, 5);
+ for (CookieInfoList::const_iterator i(cookie_info_list.begin());
+ i != cookie_info_list.end();
+ ++i) {
+ string16 label_text = l10n_util::GetStringFUTF16(
+ IDS_WEBSITE_SETTINGS_SITE_DATA_STATS_LINE,
+ UTF8ToUTF16(i->cookie_source),
+ base::IntToString16(i->allowed),
+ base::IntToString16(i->blocked));
+ if (i != cookie_info_list.begin())
+ layout->AddPaddingRow(1, kSiteDataSectionRowSpacing);
+ layout->StartRow(1, site_data_content_column);
+ views::ImageView* icon = new views::ImageView();
+ const gfx::Image& image = WebsiteSettingsUI::GetPermissionIcon(
+ CONTENT_SETTINGS_TYPE_COOKIES, CONTENT_SETTING_ALLOW);
+ icon->SetImage(image.ToImageSkia());
+ layout->AddView(icon, 1, 1, views::GridLayout::CENTER,
+ views::GridLayout::CENTER);
+ layout->AddView(new views::Label(label_text), 1, 1,
+ views::GridLayout::LEADING, views::GridLayout::CENTER);
+ }
+ layout->AddPaddingRow(1, 6);
+
+ layout->Layout(site_data_content_);
+ SizeToContents();
+}
+
+void WebsiteSettingsPopupView::SetPermissionInfo(
+ const PermissionInfoList& permission_info_list) {
+ permissions_content_->RemoveAllChildViews(true);
+
+ views::GridLayout* layout =
+ new views::GridLayout(permissions_content_);
+ permissions_content_->SetLayoutManager(layout);
+ const int content_column = 0;
+ views::ColumnSet* column_set =
+ layout->AddColumnSet(content_column);
+ column_set->AddColumn(views::GridLayout::FILL,
+ views::GridLayout::FILL,
+ 1,
+ views::GridLayout::USE_PREF,
+ 0,
+ 0);
+ for (PermissionInfoList::const_iterator permission =
+ permission_info_list.begin();
+ permission != permission_info_list.end();
+ ++permission) {
+ layout->StartRow(1, content_column);
+ PermissionSelectorView* selector = new PermissionSelectorView(
+ web_contents_ ? web_contents_->GetURL() : GURL::EmptyGURL(),
+ permission->type,
+ permission->default_setting,
+ permission->setting,
+ permission->source);
+ selector->AddObserver(this);
+ layout->AddView(selector,
+ 1,
+ 1,
+ views::GridLayout::LEADING,
+ views::GridLayout::CENTER);
+ layout->AddPaddingRow(1, kPermissionsSectionRowSpacing);
+ }
+
+ SizeToContents();
+}
+
+void WebsiteSettingsPopupView::SetIdentityInfo(
+ const IdentityInfo& identity_info) {
+ string16 identity_status_text;
+ SkColor text_color = SK_ColorBLACK;
+ switch (identity_info.identity_status) {
+ case WebsiteSettings::SITE_IDENTITY_STATUS_CERT:
+ case WebsiteSettings::SITE_IDENTITY_STATUS_EV_CERT:
+ identity_status_text =
+ l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_IDENTITY_VERIFIED);
+ text_color = kIdentityVerifiedTextColor;
+ break;
+ case WebsiteSettings::SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT:
+ identity_status_text =
+ l10n_util::GetStringUTF16(IDS_CERT_POLICY_PROVIDED_CERT_HEADER);
+ break;
+ default:
+ identity_status_text =
+ l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_IDENTITY_NOT_VERIFIED);
+ break;
+ }
+ header_->SetIdentityName(UTF8ToUTF16(identity_info.site_identity));
+ header_->SetIdentityStatus(identity_status_text, text_color);
+
+ // The headline and the certificate dialog link of the site's identity
+ // section is only displayed if the site's identity was verified. If the
+ // site's identity was verified, then the headline contains the organization
+ // name from the provided certificate. If the organization name is not
+ // available than the hostname of the site is used instead.
+ string16 headline;
+ if (identity_info.cert_id) {
+ cert_id_ = identity_info.cert_id;
+ certificate_dialog_link_ = new views::Link(
+ l10n_util::GetStringUTF16(IDS_PAGEINFO_CERT_INFO_BUTTON));
+ certificate_dialog_link_->set_listener(this);
+ headline = UTF8ToUTF16(identity_info.site_identity);
+ }
+ ResetConnectionSection(
+ identity_info_content_,
+ WebsiteSettingsUI::GetIdentityIcon(identity_info.identity_status),
+ string16(), // The identity section has no headline.
+ UTF8ToUTF16(identity_info.identity_status_description),
+ certificate_dialog_link_);
+
+ ResetConnectionSection(
+ connection_info_content_,
+ WebsiteSettingsUI::GetConnectionIcon(identity_info.connection_status),
+ string16(), // The connection section has no headline.
+ UTF8ToUTF16(identity_info.connection_status_description),
+ NULL);
+
+ connection_tab_->InvalidateLayout();
+ Layout();
+ SizeToContents();
+}
+
+void WebsiteSettingsPopupView::SetFirstVisit(const string16& first_visit) {
+ ResetConnectionSection(
+ page_info_content_,
+ WebsiteSettingsUI::GetFirstVisitIcon(first_visit),
+ l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_INFO_TITLE),
+ first_visit,
+ NULL);
+ connection_tab_->InvalidateLayout();
+ Layout();
+ SizeToContents();
+}
+
+void WebsiteSettingsPopupView::SetSelectedTab(TabId tab_id) {
+ tabbed_pane_->SelectTabAt(tab_id);
+}
+
+views::View* WebsiteSettingsPopupView::CreatePermissionsTab() {
+ views::View* pane = new views::View();
+ pane->SetLayoutManager(
+ new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
+ // Add cookies and site data section.
+ cookie_dialog_link_ = new views::Link(
+ l10n_util::GetStringUTF16(IDS_WEBSITE_SETTINGS_SHOW_SITE_DATA));
+ cookie_dialog_link_->set_listener(this);
+ site_data_content_ = new views::View();
+ views::View* site_data_section =
+ CreateSection(l10n_util::GetStringUTF16(
+ IDS_WEBSITE_SETTINGS_TITLE_SITE_DATA),
+ site_data_content_,
+ cookie_dialog_link_);
+ pane->AddChildView(site_data_section);
+ // Add permissions section.
+ permissions_content_ = new views::View();
+ views::View* permissions_section =
+ CreateSection(l10n_util::GetStringUTF16(
+ IDS_WEBSITE_SETTINGS_TITLE_SITE_PERMISSIONS),
+ permissions_content_,
+ NULL);
+ pane->AddChildView(permissions_section);
+ return pane;
+}
+
+views::View* WebsiteSettingsPopupView::CreateConnectionTab() {
+ views::View* pane = new views::View();
+ pane->SetLayoutManager(
+ new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 1));
+ // Add site identity section.
+ identity_info_content_ = new views::View();
+ pane->AddChildView(identity_info_content_);
+
+ // Add connection section.
+ pane->AddChildView(new views::Separator(views::Separator::HORIZONTAL));
+ connection_info_content_ = new views::View();
+ pane->AddChildView(connection_info_content_);
+
+ // Add page info section.
+ pane->AddChildView(new views::Separator(views::Separator::HORIZONTAL));
+ page_info_content_ = new views::View();
+ pane->AddChildView(page_info_content_);
+
+ // Add help center link.
+ pane->AddChildView(new views::Separator(views::Separator::HORIZONTAL));
+ help_center_link_ = new views::Link(
+ l10n_util::GetStringUTF16(IDS_PAGE_INFO_HELP_CENTER_LINK));
+ help_center_link_->set_listener(this);
+ views::View* link_section = new views::View();
+ const int kLinkMarginTop = 4;
+ link_section->SetLayoutManager(
+ new views::BoxLayout(views::BoxLayout::kHorizontal,
+ kConnectionSectionPaddingLeft,
+ kLinkMarginTop,
+ 0));
+ link_section->AddChildView(help_center_link_);
+ pane->AddChildView(link_section);
+ return pane;
+}
+
+views::View* WebsiteSettingsPopupView::CreateSection(
+ const string16& headline_text,
+ views::View* content,
+ views::Link* link) {
+ views::View* container = new views::View();
+ views::GridLayout* layout = new views::GridLayout(container);
+ container->SetLayoutManager(layout);
+ const int content_column = 0;
+ views::ColumnSet* column_set = layout->AddColumnSet(content_column);
+ column_set->AddPaddingColumn(0, kPermissionsSectionPaddingLeft);
+ column_set->AddColumn(views::GridLayout::FILL,
+ views::GridLayout::FILL,
+ 1,
+ views::GridLayout::USE_PREF,
+ 0,
+ 0);
+
+ layout->AddPaddingRow(1, kPermissionsSectionPaddingTop);
+ layout->StartRow(1, content_column);
+ views::Label* headline = new views::Label(headline_text);
+ headline->SetFont(headline->font().DeriveFont(0, gfx::Font::BOLD));
+ layout->AddView(headline, 1, 1, views::GridLayout::LEADING,
+ views::GridLayout::CENTER);
+
+ layout->AddPaddingRow(1, kPermissionsSectionHeadlineMarginBottom);
+ layout->StartRow(1, content_column);
+ layout->AddView(content, 1, 1, views::GridLayout::LEADING,
+ views::GridLayout::CENTER);
+
+ if (link) {
+ layout->AddPaddingRow(1, 4);
+ layout->StartRow(1, content_column);
+ layout->AddView(link, 1, 1, views::GridLayout::LEADING,
+ views::GridLayout::CENTER);
+ }
+
+ layout->AddPaddingRow(1, kPermissionsSectionPaddingBottom);
+ return container;
+}
+
+void WebsiteSettingsPopupView::ResetConnectionSection(
+ views::View* section_container,
+ const gfx::Image& icon,
+ const string16& headline,
+ const string16& text,
+ views::Link* link) {
+ section_container->RemoveAllChildViews(true);
+
+ views::GridLayout* layout = new views::GridLayout(section_container);
+ section_container->SetLayoutManager(layout);
+ views::ColumnSet* column_set = layout->AddColumnSet(0);
+ column_set->AddPaddingColumn(0, kConnectionSectionPaddingLeft);
+ column_set->AddColumn(views::GridLayout::LEADING,
+ views::GridLayout::LEADING,
+ 0,
+ views::GridLayout::USE_PREF,
+ 0,
+ 0);
+ column_set->AddPaddingColumn(0, kIconMarginLeft);
+ column_set->AddColumn(views::GridLayout::FILL,
+ views::GridLayout::FILL,
+ 1,
+ views::GridLayout::USE_PREF,
+ 0,
+ 0);
+ column_set->AddPaddingColumn(0, kConnectionSectionPaddingRight);
+
+
+ layout->AddPaddingRow(0, kConnectionSectionPaddingTop);
+ layout->StartRow(1, 0);
+
+ // Add status icon.
+ views::ImageView* icon_view = new views::ImageView();
+ icon_view->SetImage(*icon.ToImageSkia());
+ layout->AddView(icon_view, 1, 1, views::GridLayout::LEADING,
+ views::GridLayout::LEADING);
+
+ // Add section content.
+ views::View* content_pane = new views::View();
+ views::GridLayout* content_layout = new views::GridLayout(content_pane);
+ content_pane->SetLayoutManager(content_layout);
+ views::ColumnSet* content_column_set = content_layout->AddColumnSet(0);
+ content_column_set->AddColumn(views::GridLayout::LEADING,
+ views::GridLayout::LEADING,
+ 1,
+ views::GridLayout::USE_PREF,
+ 0,
+ 0);
+ if (!headline.empty()) {
+ views::Label* headline_label = new views::Label(headline);
+ headline_label->SetFont(
+ headline_label->font().DeriveFont(0, gfx::Font::BOLD));
+ headline_label->SetMultiLine(true);
+ headline_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+ // Allow linebreaking in the middle of words if necessary, so that extremely
+ // long hostnames (longer than one line) will still be completely shown.
+ headline_label->SetAllowCharacterBreak(true);
+ content_layout->StartRow(1, 0);
+ content_layout->AddView(headline_label);
+ }
+
+ views::Label* description_label = new views::Label(text);
+ description_label->SetMultiLine(true);
+ description_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
+ description_label->SetAllowCharacterBreak(true);
+ content_layout->StartRow(1, 0);
+ content_layout->AddView(description_label);
+
+ if (link) {
+ content_layout->StartRow(1, 0);
+ content_layout->AddView(link);
+ }
+
+ layout->AddView(content_pane, 1, 1, views::GridLayout::LEADING,
+ views::GridLayout::LEADING);
+ layout->AddPaddingRow(0, kConnectionSectionPaddingBottom);
+}
+
+// Used to asynchronously handle clicks since these calls may cause the
+// destruction of the settings view and the base class window still
+// needs to be alive to finish handling the mouse click.
+void WebsiteSettingsPopupView::HandleLinkClickedAsync(views::Link* source) {
+ if (source == cookie_dialog_link_) {
+ // Count how often the Collected Cookies dialog is opened.
+ content::RecordAction(
+ content::UserMetricsAction("WebsiteSettings_CookiesDialogOpened"));
+ new CollectedCookiesViews(web_contents_);
+ } else if (source == certificate_dialog_link_) {
+ gfx::NativeWindow parent =
+ anchor_view() ? anchor_view()->GetWidget()->GetNativeWindow() : NULL;
+ ShowCertificateViewerByID(web_contents_, parent, cert_id_);
+ } else if (source == help_center_link_) {
+ browser_->OpenURL(content::OpenURLParams(
+ GURL(chrome::kPageInfoHelpCenterURL),
+ content::Referrer(),
+ NEW_FOREGROUND_TAB,
+ content::PAGE_TRANSITION_LINK,
+ false));
+ }
+}
« no previous file with comments | « chrome/browser/ui/views/website_settings/website_settings_popup_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698