Index: chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm |
diff --git a/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm b/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm |
index 9c68f3f8ecfc2b208c42c3663275c8ce3be787fc..ab2b5e484c74e7f839a9322a9f21f36dae430f07 100644 |
--- a/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm |
+++ b/chrome/browser/ui/cocoa/page_info/page_info_bubble_controller.mm |
@@ -8,6 +8,7 @@ |
#include <cmath> |
+#include "base/command_line.h" |
#include "base/i18n/rtl.h" |
#include "base/mac/bind_objc_block.h" |
#include "base/memory/ptr_util.h" |
@@ -23,6 +24,7 @@ |
#import "chrome/browser/ui/cocoa/page_info/permission_selector_button.h" |
#include "chrome/browser/ui/page_info/permission_menu_model.h" |
#import "chrome/browser/ui/tab_dialogs.h" |
+#include "chrome/common/chrome_switches.h" |
#include "chrome/common/url_constants.h" |
#include "chrome/grit/chromium_strings.h" |
#include "chrome/grit/generated_resources.h" |
@@ -345,6 +347,7 @@ bool IsInternalURL(const GURL& url) { |
// These will be created only if necessary. |
resetDecisionsField_ = nil; |
resetDecisionsButton_ = nil; |
+ certificateView_ = nil; |
NSString* connectionHelpButtonText = l10n_util::GetNSString(IDS_LEARN_MORE); |
connectionHelpButton_ = [self addLinkButtonWithText:connectionHelpButtonText |
@@ -527,6 +530,11 @@ bool IsInternalURL(const GURL& url) { |
// Start the layout with the first element. Margins are handled by the caller. |
CGFloat yPos = 0; |
+ if (certificateView_) { |
+ yPos = [self setYPositionOfView:certificateView_ |
+ to:yPos + kSectionVerticalPadding]; |
+ } |
+ |
yPos = |
[self setYPositionOfView:cookiesView_ to:yPos + kSectionVerticalPadding]; |
@@ -681,7 +689,8 @@ bool IsInternalURL(const GURL& url) { |
return button.get(); |
} |
-// Set the content of the identity and identity status fields. |
+// Set the content of the identity and identity status fields, and add the |
+// Certificate view if applicable. |
- (void)setIdentityInfo:(const PageInfoUI::IdentityInfo&)identityInfo { |
std::unique_ptr<PageInfoUI::SecurityDescription> security_description = |
identityInfo.GetSecurityDescription(); |
@@ -693,26 +702,112 @@ bool IsInternalURL(const GURL& url) { |
certificate_ = identityInfo.certificate; |
- if (certificate_ && identityInfo.show_ssl_decision_revoke_button) { |
- resetDecisionsField_ = |
- [self addText:base::string16() |
- withSize:[NSFont smallSystemFontSize] |
- bold:NO |
- toView:securitySectionView_ |
- atPoint:NSMakePoint(kSectionHorizontalPadding, 0)]; |
- [resetDecisionsField_ |
- setStringValue:l10n_util::GetNSString( |
- IDS_PAGEINFO_INVALID_CERTIFICATE_DESCRIPTION)]; |
- [self sizeTextFieldHeightToFit:resetDecisionsField_]; |
- |
- resetDecisionsButton_ = |
- [self addLinkButtonWithText: |
- l10n_util::GetNSString( |
- IDS_PAGEINFO_RESET_INVALID_CERTIFICATE_DECISIONS_BUTTON) |
- toView:securitySectionView_]; |
- [resetDecisionsButton_ setTarget:self]; |
- [resetDecisionsButton_ setAction:@selector(resetCertificateDecisions:)]; |
- } |
+ if (certificate_) { |
+ if (identityInfo.show_ssl_decision_revoke_button) { |
+ resetDecisionsField_ = |
+ [self addText:base::string16() |
+ withSize:[NSFont smallSystemFontSize] |
+ bold:NO |
+ toView:securitySectionView_ |
+ atPoint:NSMakePoint(kSectionHorizontalPadding, 0)]; |
+ [resetDecisionsField_ |
+ setStringValue:l10n_util::GetNSString( |
+ IDS_PAGEINFO_INVALID_CERTIFICATE_DESCRIPTION)]; |
+ [self sizeTextFieldHeightToFit:resetDecisionsField_]; |
+ |
+ resetDecisionsButton_ = |
+ [self addLinkButtonWithText: |
+ l10n_util::GetNSString( |
+ IDS_PAGEINFO_RESET_INVALID_CERTIFICATE_DECISIONS_BUTTON) |
+ toView:securitySectionView_]; |
+ [resetDecisionsButton_ setTarget:self]; |
+ [resetDecisionsButton_ setAction:@selector(resetCertificateDecisions:)]; |
+ } |
+ |
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
lgarron
2017/04/05 02:06:26
Could you move this check into a platform-independ
|
+ switches::kShowCertButton)) { |
+ if (!certificateView_) { |
+ certificateView_ = [[[FlippedView alloc] |
+ initWithFrame:[contentView_ frame]] autorelease]; |
+ [certificateView_ setAutoresizingMask:NSViewWidthSizable]; |
+ [siteSettingsSectionView_ addSubview:certificateView_]; |
+ } |
+ |
+ base::string16 label_text = l10n_util::GetStringUTF16( |
+ (identityInfo.identity_status == PageInfo::SITE_IDENTITY_STATUS_ERROR) |
+ ? IDS_PAGE_INFO_CERTIFICATE_INVALID_LINK |
+ : IDS_PAGE_INFO_CERTIFICATE_VALID_LINK); |
+ |
+ base::string16 sectionTitle = |
+ l10n_util::GetStringUTF16(IDS_PAGE_INFO_CERTIFICATE); |
+ bool isRTL = base::i18n::IsRTL(); |
+ |
+ [certificateView_ setSubviews:[NSArray array]]; |
+ NSPoint controlOrigin = NSMakePoint(kSectionHorizontalPadding, 0); |
+ |
+ CGFloat viewWidth = NSWidth([certificateView_ frame]); |
+ |
+ // Reset X for the certificate image. |
+ if (isRTL) { |
+ controlOrigin.x = viewWidth - kPermissionImageSize - |
+ kPermissionImageSpacing - kSectionHorizontalPadding; |
+ } |
+ |
+ NSImage* image = PageInfoUI::GetCertificateIcon().ToNSImage(); |
+ NSImageView* imageView = [self addImageWithSize:[image size] |
+ toView:certificateView_ |
+ atPoint:controlOrigin]; |
+ [imageView setImage:image]; |
+ |
+ NSButton* certificateButton = |
+ [self addLinkButtonWithText:base::SysUTF16ToNSString(label_text) |
+ toView:certificateView_]; |
+ [certificateButton setTarget:self]; |
+ [certificateButton setAction:@selector(showCertificateInfo:)]; |
+ |
+ if (isRTL) { |
+ controlOrigin.x -= kPermissionImageSpacing; |
+ NSTextField* certificateLabel = [self addText:sectionTitle |
+ withSize:[NSFont systemFontSize] |
+ bold:NO |
+ toView:certificateView_ |
+ atPoint:controlOrigin]; |
+ [certificateLabel sizeToFit]; |
+ |
+ NSPoint certificateLabelOrigin = [certificateLabel frame].origin; |
+ certificateLabelOrigin.x -= NSWidth([certificateLabel frame]); |
+ [certificateLabel setFrameOrigin:certificateLabelOrigin]; |
+ |
+ // Align the icon with the text. |
+ [self alignPermissionIcon:imageView withTextField:certificateLabel]; |
+ |
+ controlOrigin.y += NSHeight([certificateLabel frame]); |
+ controlOrigin.x -= |
+ NSWidth([certificateButton frame]) - kLinkButtonXAdjustment; |
+ [certificateButton setFrameOrigin:controlOrigin]; |
+ } else { |
+ controlOrigin.x += kPermissionImageSize + kPermissionImageSpacing; |
+ NSTextField* certificateLabel = [self addText:sectionTitle |
+ withSize:[NSFont systemFontSize] |
+ bold:NO |
+ toView:certificateView_ |
+ atPoint:controlOrigin]; |
+ [certificateLabel sizeToFit]; |
+ |
+ controlOrigin.y += NSHeight([certificateLabel frame]); |
+ controlOrigin.x -= kLinkButtonXAdjustment; |
+ [certificateButton setFrameOrigin:controlOrigin]; |
+ |
+ // Align the icon with the text. |
+ [self alignPermissionIcon:imageView withTextField:certificateLabel]; |
+ } |
+ |
+ controlOrigin.y += NSHeight([certificateButton frame]); |
+ [certificateView_ |
+ setFrameSize:NSMakeSize(NSWidth([certificateView_ frame]), |
+ controlOrigin.y)]; |
+ } |
+ } // if (certificate_) |
[self performLayout]; |
} |
@@ -1005,8 +1100,6 @@ bool IsInternalURL(const GURL& url) { |
base::string16 label_text = |
l10n_util::GetPluralStringFUTF16(IDS_PAGE_INFO_NUM_COOKIES, totalAllowed); |
- base::string16 sectionTitle = |
- l10n_util::GetStringUTF16(IDS_PAGE_INFO_TITLE_SITE_DATA); |
bool isRTL = base::i18n::IsRTL(); |
[cookiesView_ setSubviews:[NSArray array]]; |
@@ -1090,9 +1183,6 @@ bool IsInternalURL(const GURL& url) { |
permissionsPresent_ = YES; |
if (permissionInfoList.size() > 0 || chosenObjectInfoList.size() > 0) { |
- base::string16 sectionTitle = |
- l10n_util::GetStringUTF16(IDS_PAGE_INFO_TITLE_SITE_PERMISSIONS); |
- |
for (const auto& permission : permissionInfoList) { |
controlOrigin.y += kPermissionsVerticalSpacing; |
NSPoint rowBottomRight = [self addPermission:permission |