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)); |
+ } |
+} |