| Index: chrome/browser/ui/views/page_info/page_info_bubble_view.cc
|
| diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view.cc
|
| index 12777bad3ac4687db742565dd5eea693085828a5..26093209ce08bb13cd2c5c5392550057dfb25ec1 100644
|
| --- a/chrome/browser/ui/views/page_info/page_info_bubble_view.cc
|
| +++ b/chrome/browser/ui/views/page_info/page_info_bubble_view.cc
|
| @@ -7,7 +7,7 @@
|
| #include <stddef.h>
|
|
|
| #include <algorithm>
|
| -#include <vector>
|
| +#include <utility>
|
|
|
| #include "base/i18n/rtl.h"
|
| #include "base/macros.h"
|
| @@ -89,8 +89,8 @@ const int kHeaderLabelSpacing = 4;
|
|
|
| // Site Settings Section -------------------------------------------------------
|
|
|
| -// Spacing above and below the cookies view.
|
| -const int kCookiesViewVerticalPadding = 6;
|
| +// Spacing above and below the cookies and certificate views.
|
| +const int kSubViewsVerticalPadding = 6;
|
|
|
| // Spacing between a permission image and the text.
|
| const int kPermissionImageSpacing = 6;
|
| @@ -107,6 +107,7 @@ const int STYLED_LABEL_SECURITY_DETAILS = 1338;
|
| const int STYLED_LABEL_RESET_CERTIFICATE_DECISIONS = 1339;
|
| const int LINK_COOKIE_DIALOG = 1340;
|
| const int LINK_SITE_SETTINGS = 1341;
|
| +const int LINK_CERTIFICATE_VIEWER = 1342;
|
|
|
| // The default, ui::kTitleFontSizeDelta, is too large for the page info
|
| // bubble (e.g. +3). Use +1 to obtain a smaller font.
|
| @@ -160,6 +161,30 @@ class BubbleHeaderView : public views::View {
|
| DISALLOW_COPY_AND_ASSIGN(BubbleHeaderView);
|
| };
|
|
|
| +// |InspectLinkView| is a UI element (view) that shows information and
|
| +// a link to more details. It is used for the Certificate and Cookie
|
| +// subviews.
|
| +class InspectLinkView : public views::View {
|
| + public:
|
| + InspectLinkView(const gfx::Image& image_icon,
|
| + const base::string16& title,
|
| + const base::string16& text_link,
|
| + views::LinkListener* link_listener,
|
| + const int link_id);
|
| + ~InspectLinkView() override;
|
| +
|
| + // Update the text of the link.
|
| + void SetLinkText(const base::string16& text_link);
|
| +
|
| + // Update the tooltip of the link.
|
| + void SetLinkTooltip(const base::string16& text_tooltip);
|
| +
|
| + private:
|
| + views::Link* link_inspect_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(InspectLinkView);
|
| +};
|
| +
|
| // The regular PageInfoBubbleView is not supported for internal Chrome pages and
|
| // extension pages. Instead of the |PageInfoBubbleView|, the
|
| // |InternalPageInfoBubbleView| is displayed.
|
| @@ -278,6 +303,64 @@ void BubbleHeaderView::AddResetDecisionsLabel() {
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| +// InspectLinkView
|
| +////////////////////////////////////////////////////////////////////////////////
|
| +
|
| +// |InspectLinkView| is a UI element (view) that shows information and
|
| +// a link to more details. It is used for the Certificate and Cookie
|
| +// information.
|
| +InspectLinkView::InspectLinkView(const gfx::Image& image_icon,
|
| + const base::string16& title,
|
| + const base::string16& text_link,
|
| + views::LinkListener* link_listener,
|
| + const int link_id) {
|
| + views::GridLayout* layout = new views::GridLayout(this);
|
| + SetLayoutManager(layout);
|
| +
|
| + const int column = 0;
|
| + views::ColumnSet* column_set = layout->AddColumnSet(column);
|
| + column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0,
|
| + views::GridLayout::FIXED, kPermissionIconColumnWidth,
|
| + 0);
|
| + column_set->AddPaddingColumn(0, kPermissionImageSpacing);
|
| + column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, 0,
|
| + views::GridLayout::USE_PREF, 0, 0);
|
| +
|
| + layout->AddPaddingRow(0, kSubViewsVerticalPadding);
|
| +
|
| + layout->StartRow(1, column);
|
| +
|
| + views::ImageView* icon = new NonAccessibleImageView();
|
| + icon->SetImage(image_icon.ToImageSkia());
|
| + layout->AddView(
|
| + icon, 1, 2, views::GridLayout::FILL,
|
| + // TODO(lgarron): The vertical alignment may change to CENTER once
|
| + // Harmony is implemented. See https://crbug.com/512442#c48
|
| + views::GridLayout::LEADING);
|
| +
|
| + views::Label* title_label = new views::Label(title, CONTEXT_BODY_TEXT_LARGE);
|
| + layout->AddView(title_label);
|
| + layout->StartRow(1, column);
|
| + layout->SkipColumns(1);
|
| +
|
| + link_inspect_ = new views::Link(text_link);
|
| + link_inspect_->set_id(link_id);
|
| + link_inspect_->set_listener(link_listener);
|
| + layout->AddView(link_inspect_);
|
| +}
|
| +
|
| +InspectLinkView::~InspectLinkView() {}
|
| +
|
| +void InspectLinkView::SetLinkText(const base::string16& text_link) {
|
| + link_inspect_->SetText(text_link);
|
| + InvalidateLayout();
|
| +}
|
| +
|
| +void InspectLinkView::SetLinkTooltip(const base::string16& text_tooltip) {
|
| + link_inspect_->SetTooltipText(text_tooltip);
|
| +}
|
| +
|
| +////////////////////////////////////////////////////////////////////////////////
|
| // InternalPageInfoBubbleView
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| @@ -389,8 +472,8 @@ PageInfoBubbleView::PageInfoBubbleView(
|
| header_(nullptr),
|
| separator_(nullptr),
|
| site_settings_view_(nullptr),
|
| + certificate_view_(nullptr),
|
| cookies_view_(nullptr),
|
| - cookie_dialog_link_(nullptr),
|
| permissions_view_(nullptr),
|
| weak_factory_(this) {
|
| g_shown_bubble_type = BUBBLE_PAGE_INFO;
|
| @@ -541,60 +624,7 @@ void PageInfoBubbleView::SetCookieInfo(const CookieInfoList& cookie_info_list) {
|
| base::string16 label_text = l10n_util::GetPluralStringFUTF16(
|
| IDS_PAGE_INFO_NUM_COOKIES, total_allowed);
|
|
|
| - if (!cookie_dialog_link_) {
|
| - cookie_dialog_link_ = new views::Link(label_text);
|
| - cookie_dialog_link_->set_id(LINK_COOKIE_DIALOG);
|
| - cookie_dialog_link_->set_listener(this);
|
| - } else {
|
| - cookie_dialog_link_->SetText(label_text);
|
| - }
|
| -
|
| - views::GridLayout* layout =
|
| - static_cast<views::GridLayout*>(cookies_view_->GetLayoutManager());
|
| - if (!layout) {
|
| - layout = new views::GridLayout(cookies_view_);
|
| - cookies_view_->SetLayoutManager(layout);
|
| -
|
| - const int cookies_view_column = 0;
|
| - views::ColumnSet* column_set = layout->AddColumnSet(cookies_view_column);
|
| - column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 0,
|
| - views::GridLayout::FIXED, kPermissionIconColumnWidth,
|
| - 0);
|
| - column_set->AddPaddingColumn(0, kPermissionImageSpacing);
|
| - column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL,
|
| - 0, views::GridLayout::USE_PREF, 0, 0);
|
| -
|
| - layout->AddPaddingRow(0, kCookiesViewVerticalPadding);
|
| -
|
| - layout->StartRow(1, cookies_view_column);
|
| - PageInfoUI::PermissionInfo info;
|
| - info.type = CONTENT_SETTINGS_TYPE_COOKIES;
|
| - info.setting = CONTENT_SETTING_ALLOW;
|
| - info.is_incognito =
|
| - Profile::FromBrowserContext(web_contents()->GetBrowserContext())
|
| - ->IsOffTheRecord();
|
| - views::ImageView* icon = new NonAccessibleImageView();
|
| - const gfx::Image& image = PageInfoUI::GetPermissionIcon(info);
|
| - icon->SetImage(image.ToImageSkia());
|
| - layout->AddView(
|
| - icon, 1, 2, views::GridLayout::FILL,
|
| - // TODO: The vertical alignment may change to CENTER once Harmony is
|
| - // implemented. See https://crbug.com/512442#c48
|
| - views::GridLayout::LEADING);
|
| -
|
| - views::Label* cookies_label = new views::Label(
|
| - l10n_util::GetStringUTF16(IDS_PAGE_INFO_TITLE_SITE_DATA),
|
| - CONTEXT_BODY_TEXT_LARGE);
|
| - layout->AddView(cookies_label);
|
| - layout->StartRow(1, cookies_view_column);
|
| - layout->SkipColumns(1);
|
| -
|
| - layout->AddView(cookie_dialog_link_);
|
| -
|
| - layout->AddPaddingRow(0, kCookiesViewVerticalPadding);
|
| - }
|
| -
|
| - layout->Layout(cookies_view_);
|
| + cookies_view_->SetLinkText(label_text);
|
| SizeToContents();
|
| }
|
|
|
| @@ -683,6 +713,31 @@ void PageInfoBubbleView::SetIdentityInfo(const IdentityInfo& identity_info) {
|
|
|
| if (identity_info.show_ssl_decision_revoke_button)
|
| header_->AddResetDecisionsLabel();
|
| +
|
| + if (PageInfoUI::ShouldShowCertificateLink()) {
|
| + // The text of link to the Certificate Viewer varies depending on the
|
| + // validity of the Certificate.
|
| + const base::string16 link_title =
|
| + l10n_util::GetStringUTF16((identity_info.identity_status ==
|
| + PageInfo::SITE_IDENTITY_STATUS_ERROR)
|
| + ? IDS_PAGE_INFO_CERTIFICATE_INVALID_LINK
|
| + : IDS_PAGE_INFO_CERTIFICATE_VALID_LINK);
|
| +
|
| + certificate_view_ = new InspectLinkView(
|
| + PageInfoUI::GetCertificateIcon(),
|
| + l10n_util::GetStringUTF16(IDS_PAGE_INFO_CERTIFICATE), link_title,
|
| + this, LINK_CERTIFICATE_VIEWER);
|
| +
|
| + if (identity_info.identity_status !=
|
| + PageInfo::SITE_IDENTITY_STATUS_ERROR) {
|
| + base::string16 issuer = l10n_util::GetStringFUTF16(
|
| + IDS_PAGE_INFO_CERTIFICATE_VALID_LINK_TOOLTIP,
|
| + base::UTF8ToUTF16(certificate_->issuer().GetDisplayName()));
|
| + certificate_view_->SetLinkTooltip(issuer);
|
| + }
|
| +
|
| + site_settings_view_->AddChildViewAt(certificate_view_, 0);
|
| + }
|
| }
|
|
|
| header_->SetDetails(security_description->details);
|
| @@ -700,14 +755,27 @@ views::View* PageInfoBubbleView::CreateSiteSettingsView(int side_margin) {
|
| views::BoxLayout::CROSS_AXIS_ALIGNMENT_STRETCH);
|
|
|
| // Add cookies view.
|
| - cookies_view_ = new views::View();
|
| + PageInfoUI::PermissionInfo info;
|
| + info.type = CONTENT_SETTINGS_TYPE_COOKIES;
|
| + info.setting = CONTENT_SETTING_ALLOW;
|
| + info.is_incognito =
|
| + Profile::FromBrowserContext(web_contents()->GetBrowserContext())
|
| + ->IsOffTheRecord();
|
| +
|
| + const base::string16 link_title =
|
| + l10n_util::GetPluralStringFUTF16(IDS_PAGE_INFO_NUM_COOKIES, 0);
|
| +
|
| + cookies_view_ = new InspectLinkView(
|
| + PageInfoUI::GetPermissionIcon(info),
|
| + l10n_util::GetStringUTF16(IDS_PAGE_INFO_TITLE_SITE_DATA), link_title,
|
| + this, LINK_COOKIE_DIALOG);
|
| site_settings_view->AddChildView(cookies_view_);
|
|
|
| return site_settings_view;
|
| }
|
|
|
| void PageInfoBubbleView::HandleLinkClickedAsync(views::Link* source) {
|
| - // Both switch cases require accessing web_contents(), so we check it here.
|
| + // All switch cases require accessing web_contents(), so we check it here.
|
| if (web_contents() == nullptr || web_contents()->IsBeingDestroyed())
|
| return;
|
| switch (source->id()) {
|
| @@ -729,6 +797,14 @@ void PageInfoBubbleView::HandleLinkClickedAsync(views::Link* source) {
|
| PageInfo::PAGE_INFO_COOKIES_DIALOG_OPENED);
|
| new CollectedCookiesViews(web_contents());
|
| break;
|
| + case LINK_CERTIFICATE_VIEWER: {
|
| + gfx::NativeWindow top_window = web_contents()->GetTopLevelNativeWindow();
|
| + if (certificate_ && top_window) {
|
| + presenter_->RecordPageInfoAction(
|
| + PageInfo::PAGE_INFO_CERTIFICATE_DIALOG_OPENED);
|
| + ShowCertificateViewer(web_contents(), top_window, certificate_.get());
|
| + }
|
| + } break;
|
| default:
|
| NOTREACHED();
|
| }
|
|
|