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

Unified Diff: chrome/browser/ui/cocoa/website_settings_bubble_controller.mm

Issue 10831280: [Mac] Website settings: Add cookie info & permission icons, plus other visual fixes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix unit tests. Created 8 years, 4 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
Index: chrome/browser/ui/cocoa/website_settings_bubble_controller.mm
diff --git a/chrome/browser/ui/cocoa/website_settings_bubble_controller.mm b/chrome/browser/ui/cocoa/website_settings_bubble_controller.mm
index 172a25e035980942f2e3c269011dbcf0c00d0e5e..d1fb526967137933e8af463e491f18810656c5b1 100644
--- a/chrome/browser/ui/cocoa/website_settings_bubble_controller.mm
+++ b/chrome/browser/ui/cocoa/website_settings_bubble_controller.mm
@@ -4,6 +4,7 @@
#import "chrome/browser/ui/cocoa/website_settings_bubble_controller.h"
+#include "base/string_number_conversions.h"
#include "base/sys_string_conversions.h"
#import "chrome/browser/ui/cocoa/browser_window_controller.h"
#import "chrome/browser/ui/cocoa/info_bubble_view.h"
@@ -33,20 +34,21 @@ const CGFloat kFramePadding = 10;
// Spacing between the optional headline and description text views.
const CGFloat kHeadlineSpacing = 2;
-// Spacing between the image and the text.
-const CGFloat kImageSpacing = 10;
+// Spacing between images on the Connection tab and the text.
+const CGFloat kConnectionImageSpacing = 10;
-// Square size of the image.
-const CGFloat kImageSize = 30;
+// Square size of the images on the Connections tab.
+const CGFloat kConnectionImageSize = 30;
-// The X position of the text fields. Variants for with and without an image.
-const CGFloat kTextXPositionNoImage = kFramePadding;
-const CGFloat kTextXPosition = kTextXPositionNoImage + kImageSize +
- kImageSpacing;
+// Square size of the permission images.
+const CGFloat kPermissionImageSize = 19;
-// Width of the text fields.
-const CGFloat kTextWidth = kWindowWidth - (kImageSize + kImageSpacing +
- kFramePadding * 2);
+// Vertical adjustment for the permission images.
+// They have an extra pixel of padding on the bottom edge.
+const CGFloat kPermissionImageYAdjust = 1;
+
+// Spacing between a permission image and the text.
+const CGFloat kPermissionImageSpacing = 3;
// The amount of padding given to tab view contents.
const CGFloat kTabViewContentsPadding = kFramePadding;
@@ -83,6 +85,17 @@ const ContentSetting kPermissionsMenuSettings[] = {
CONTENT_SETTING_DEFAULT
};
+// Return the text color to use for the indentity status when the site's
+// identity has been verified.
+NSColor* IdentityVerifiedTextColor() {
+ // RGB components are specified using integer RGB [0-255] values for easy
+ // comparison to other platforms.
+ return [NSColor colorWithCalibratedRed:0x07/255.0
+ green:0x95/255.0
+ blue:0
+ alpha:1.0];
+}
+
} // namespace
// A simple container to hold all the contents of the website settings bubble.
@@ -249,7 +262,7 @@ const ContentSetting kPermissionsMenuSettings[] = {
- (void)initializeContents {
// Keeps track of the position that the next control should be drawn at.
NSPoint controlOrigin = NSMakePoint(
- kTextXPositionNoImage,
+ kFramePadding,
kFramePadding + info_bubble::kBubbleArrowHeight);
// Create the container view that uses flipped coordinates.
@@ -321,7 +334,7 @@ const ContentSetting kPermissionsMenuSettings[] = {
[tabView_ setControlSize:NSSmallControlSize];
[contentView_ addSubview:tabView_.get()];
- permissionsContentView_ = [self addPermissionsTabToTabView:tabView_];
+ permissionsTabContentView_ = [self addPermissionsTabToTabView:tabView_];
[self addConnectionTabToTabView:tabView_];
// Replace the window's content.
@@ -339,6 +352,17 @@ const ContentSetting kPermissionsMenuSettings[] = {
scoped_nsobject<NSView> contentView([[WebsiteSettingsContentView alloc]
initWithFrame:[tabView_ contentRect]]);
[item setView:contentView.get()];
+
+ // Initialize the two containers that hold the controls. The initial frames
+ // are arbitrary, and will be adjusted after the controls are laid out.
+ cookiesView_ = [[WebsiteSettingsContentView alloc]
Robert Sesek 2012/08/13 17:44:57 These are leaked.
+ initWithFrame:[tabView_ contentRect]];
+ permissionsView_ = [[WebsiteSettingsContentView alloc]
+ initWithFrame:[tabView_ contentRect]];
+
+ [contentView addSubview:cookiesView_];
+ [contentView addSubview:permissionsView_];
+
return contentView.get();
}
@@ -352,11 +376,13 @@ const ContentSetting kPermissionsMenuSettings[] = {
// Place all the text at the same position. It will be adjusted in
// performLayout.
NSPoint textPosition = NSMakePoint(
- kTabViewContentsPadding + kImageSize + kImageSpacing,
+ kTabViewContentsPadding + kConnectionImageSize + kConnectionImageSpacing,
kTabViewContentsPadding);
+ NSSize imageSize = NSMakeSize(kConnectionImageSize, kConnectionImageSize);
- identityStatusIcon_ =
- [self addImageToView:contentView atOffset:kTabViewContentsPadding];
+ identityStatusIcon_ = [self addImageWithSize:imageSize
+ toView:contentView
+ atOffset:kTabViewContentsPadding];
identityStatusDescriptionField_ =
[self addText:string16()
withSize:[NSFont smallSystemFontSize]
@@ -365,8 +391,9 @@ const ContentSetting kPermissionsMenuSettings[] = {
atPoint:textPosition];
separatorAfterIdentity_ = [self addSeparatorToView:contentView];
- connectionStatusIcon_ =
- [self addImageToView:contentView atOffset:kTabViewContentsPadding];
+ connectionStatusIcon_ = [self addImageWithSize:imageSize
+ toView:contentView
+ atOffset:kTabViewContentsPadding];
connectionStatusDescriptionField_ =
[self addText:string16()
withSize:[NSFont smallSystemFontSize]
@@ -375,8 +402,9 @@ const ContentSetting kPermissionsMenuSettings[] = {
atPoint:textPosition];
separatorAfterConnection_ = [self addSeparatorToView:contentView];
- firstVisitIcon_ =
- [self addImageToView:contentView atOffset:kTabViewContentsPadding];
+ firstVisitIcon_ = [self addImageWithSize:imageSize
+ toView:contentView
+ atOffset:kTabViewContentsPadding];
firstVisitHeaderField_ =
[self addText:l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_INFO_TITLE)
withSize:[NSFont smallSystemFontSize]
@@ -414,7 +442,12 @@ const ContentSetting kPermissionsMenuSettings[] = {
CGFloat yPos = NSMaxY([identityField_ frame]) + kHeadlineSpacing;
yPos = [self setYPositionOfView:identityStatusField_ to:yPos];
- // Lay out the connection tab.
+ // Lay out the Permissions tab.
+ NSRect permissionsViewFrame = [permissionsView_ frame];
+ permissionsViewFrame.origin.y = NSMaxY([cookiesView_ frame]);
+ [permissionsView_ setFrame:permissionsViewFrame];
+
+ // Lay out the Connection tab.
// Lay out the identity status section.
[self sizeTextFieldHeightToFit:identityStatusDescriptionField_];
@@ -452,13 +485,18 @@ const ContentSetting kPermissionsMenuSettings[] = {
NSRect tabViewFrame = [tabView_ frame];
tabViewFrame.origin.y = NSMaxY(segmentedControlFrame);
+ // Determine the height of the tab contents.
+
CGFloat connectionTabHeight = std::max(
NSMaxY([firstVisitDescriptionField_ frame]),
NSMaxY([firstVisitIcon_ frame ]));
connectionTabHeight += kVerticalSpacing;
+ CGFloat permissionsTabHeight =
+ NSHeight([cookiesView_ frame]) + NSHeight([permissionsView_ frame]);
+
CGFloat tabContentHeight = std::max(connectionTabHeight,
- permissionsTabHeight_);
+ permissionsTabHeight);
tabViewFrame.size.height = tabContentHeight +
NSHeight(tabViewFrame) - NSHeight([tabView_ contentRect]);
[tabView_ setFrame:tabViewFrame];
@@ -536,7 +574,7 @@ const ContentSetting kPermissionsMenuSettings[] = {
// Size the text to take up the full available width, with some padding.
// The height is arbitrary as it will be adjusted later.
CGFloat width = NSWidth([view frame]) - point.x - kFramePadding;
- NSRect frame = NSMakeRect(point.x, point.y, width, kImageSize);
+ NSRect frame = NSMakeRect(point.x, point.y, width, 100);
scoped_nsobject<NSTextField> textField(
[[NSTextField alloc] initWithFrame:frame]);
[self configureTextFieldAsLabel:textField.get()];
@@ -551,9 +589,10 @@ const ContentSetting kPermissionsMenuSettings[] = {
// Add an image as a subview of the given view, placed at a pre-determined x
// position and the given y position. Return the new NSImageView.
-- (NSImageView*)addImageToView:(NSView*)view
- atOffset:(CGFloat)offset {
- NSRect frame = NSMakeRect(kFramePadding, offset, kImageSize, kImageSize);
+- (NSImageView*)addImageWithSize:(NSSize)size
+ toView:(NSView*)view
+ atOffset:(CGFloat)offset {
+ NSRect frame = NSMakeRect(kFramePadding, offset, size.width, size.height);
scoped_nsobject<NSImageView> imageView(
[[NSImageView alloc] initWithFrame:frame]);
[imageView setImageFrameStyle:NSImageFrameNone];
@@ -672,6 +711,18 @@ const ContentSetting kPermissionsMenuSettings[] = {
(const WebsiteSettingsUI::PermissionInfo&)permissionInfo
toView:(NSView*)view
atPoint:(NSPoint)point {
+ // TODO(dubroy): Remove this check by refactoring GetPermissionIcon to take
+ // the PermissionInfo object as its argument.
+ ContentSetting setting = permissionInfo.setting == CONTENT_SETTING_DEFAULT ?
+ permissionInfo.default_setting : permissionInfo.setting;
+ NSImage* image = WebsiteSettingsUI::GetPermissionIcon(
+ permissionInfo.type, setting).ToNSImage();
+ NSImageView* imageView = [self addImageWithSize:[image size]
+ toView:view
+ atOffset:point.y];
+ [imageView setImage:image];
+ point.x += kPermissionImageSize + kPermissionImageSpacing;
+
string16 labelText =
WebsiteSettingsUI::PermissionTypeToUIString(permissionInfo.type) +
ASCIIToUTF16(":");
@@ -697,9 +748,62 @@ const ContentSetting kPermissionsMenuSettings[] = {
popUpPosition.y -= titleRect.origin.y;
[button setFrameOrigin:popUpPosition];
+ // Align the icon with the text.
+ [self alignPermissionIcon:imageView withTextField:label];
+
return std::max(NSHeight([label frame]), NSHeight([button frame]));
}
+// Align an image with a text field by vertically centering the image on
+// the cap height of the first line of text.
+- (void)alignPermissionIcon:(NSImageView*)imageView
+ withTextField:(NSTextField*)textField {
+ NSFont* font = [textField font];
+
+ // Calculate the offset from the top of the text field.
+ CGFloat capHeight = [font capHeight];
+ CGFloat offset = (kPermissionImageSize - capHeight) / 2 -
+ ([font ascender] - capHeight) - kPermissionImageYAdjust;
+
+ NSRect frame = [imageView frame];
+ frame.origin.y -= offset;
+ [imageView setFrame:frame];
+}
+
+- (CGFloat)addCookieInfo:
+ (const WebsiteSettingsUI::CookieInfo&)cookieInfo
+ toView:(NSView*)view
+ atPoint:(NSPoint)point {
+ NSImage* image = WebsiteSettingsUI::GetPermissionIcon(
+ CONTENT_SETTINGS_TYPE_COOKIES, CONTENT_SETTING_ALLOW).ToNSImage();
+ NSImageView* imageView = [self addImageWithSize:[image size]
+ toView:view
+ atOffset:point.y];
+ [imageView setImage:image];
+ point.x += kPermissionImageSize + kPermissionImageSpacing;
+
+ string16 labelText = l10n_util::GetStringFUTF16(
+ IDS_WEBSITE_SETTINGS_SITE_DATA_STATS_LINE,
+ UTF8ToUTF16(cookieInfo.cookie_source),
+ base::IntToString16(cookieInfo.allowed),
+ base::IntToString16(cookieInfo.blocked));
+
+ NSTextField* label = [self addText:labelText
+ withSize:[NSFont smallSystemFontSize]
+ bold:NO
+ toView:view
+ atPoint:point];
+
+ // Shrink the label to fit the text width.
+ NSSize requiredSize = [[label cell] cellSizeForBounds:[label frame]];
+ [label setFrameSize:requiredSize];
+
+ // Align the icon with the text.
+ [self alignPermissionIcon:imageView withTextField:label];
+
+ return NSHeight([label frame]);
+}
+
// Set the content of the identity and identity status fields.
- (void)setIdentityInfo:(const WebsiteSettingsUI::IdentityInfo&)identityInfo {
[identityField_ setStringValue:
@@ -707,6 +811,13 @@ const ContentSetting kPermissionsMenuSettings[] = {
[identityStatusField_ setStringValue:
base::SysUTF16ToNSString(identityInfo.GetIdentityStatusText())];
+ WebsiteSettings::SiteIdentityStatus status = identityInfo.identity_status;
+ if (status == WebsiteSettings::SITE_IDENTITY_STATUS_CERT ||
+ status == WebsiteSettings::SITE_IDENTITY_STATUS_DNSSEC_CERT ||
+ status == WebsiteSettings::SITE_IDENTITY_STATUS_EV_CERT) {
+ [identityStatusField_ setTextColor:IdentityVerifiedTextColor()];
+ }
+
[identityStatusIcon_ setImage:WebsiteSettingsUI::GetIdentityIcon(
identityInfo.identity_status).ToNSImage()];
[identityStatusDescriptionField_ setStringValue:
@@ -720,28 +831,59 @@ const ContentSetting kPermissionsMenuSettings[] = {
[self performLayout];
}
-- (void)setFirstVisit:(const string16&)firstVisit {
- [firstVisitIcon_ setImage:
- WebsiteSettingsUI::GetFirstVisitIcon(firstVisit).ToNSImage()];
- [firstVisitDescriptionField_ setStringValue:
- base::SysUTF16ToNSString(firstVisit)];
- [self performLayout];
+- (void)setCookieInfo:(const CookieInfoList&)cookieInfoList {
+ [cookiesView_ setSubviews:[NSArray array]];
+ NSPoint controlOrigin = NSMakePoint(kFramePadding, kFramePadding);
+
+ NSTextField* header = [self addText:ASCIIToUTF16("Cookies")
+ withSize:[NSFont smallSystemFontSize]
+ bold:YES
+ toView:cookiesView_
+ atPoint:controlOrigin];
+ [self sizeTextFieldHeightToFit:header];
+ controlOrigin.y += NSHeight([header frame]) + kPermissionsTabSpacing;
+
+ for (CookieInfoList::const_iterator it = cookieInfoList.begin();
+ it != cookieInfoList.end();
+ ++it) {
+ CGFloat rowHeight = [self addCookieInfo:*it
+ toView:cookiesView_
+ atPoint:controlOrigin];
+ controlOrigin.y += rowHeight + kPermissionsTabSpacing;
+ }
+ [cookiesView_ setFrameSize:NSMakeSize(kWindowWidth, controlOrigin.y)];
}
- (void)setPermissionInfo:(const PermissionInfoList&)permissionInfoList {
- [permissionsContentView_ setSubviews:[NSArray array]];
+ [permissionsView_ setSubviews:[NSArray array]];
NSPoint controlOrigin = NSMakePoint(kFramePadding, kFramePadding);
+ NSTextField* header = [self addText:ASCIIToUTF16("Permissions")
+ withSize:[NSFont smallSystemFontSize]
+ bold:YES
+ toView:permissionsView_
+ atPoint:controlOrigin];
+ [self sizeTextFieldHeightToFit:header];
+ controlOrigin.y += NSHeight([header frame]) + kPermissionsTabSpacing;
+
for (PermissionInfoList::const_iterator permission =
permissionInfoList.begin();
permission != permissionInfoList.end();
++permission) {
CGFloat rowHeight = [self addPermission:*permission
- toView:permissionsContentView_
+ toView:permissionsView_
atPoint:controlOrigin];
controlOrigin.y += rowHeight + kPermissionsTabSpacing;
}
- permissionsTabHeight_ = controlOrigin.y;
+ [permissionsView_ setFrameSize:NSMakeSize(kWindowWidth, controlOrigin.y)];
+}
+
+- (void)setFirstVisit:(const string16&)firstVisit {
+ [firstVisitIcon_ setImage:
+ WebsiteSettingsUI::GetFirstVisitIcon(firstVisit).ToNSImage()];
+ [firstVisitDescriptionField_ setStringValue:
+ base::SysUTF16ToNSString(firstVisit)];
+ [self performLayout];
}
@end
@@ -786,8 +928,14 @@ void WebsiteSettingsUIBridge::Show(gfx::NativeWindow parent,
[bubble_controller showWindow:nil];
}
+void WebsiteSettingsUIBridge::SetIdentityInfo(
+ const WebsiteSettingsUI::IdentityInfo& identity_info) {
+ [bubble_controller_ setIdentityInfo:identity_info];
+}
+
void WebsiteSettingsUIBridge::SetCookieInfo(
const CookieInfoList& cookie_info_list) {
+ [bubble_controller_ setCookieInfo:cookie_info_list];
}
void WebsiteSettingsUIBridge::SetPermissionInfo(
@@ -795,11 +943,6 @@ void WebsiteSettingsUIBridge::SetPermissionInfo(
[bubble_controller_ setPermissionInfo:permission_info_list];
}
-void WebsiteSettingsUIBridge::SetIdentityInfo(
- const WebsiteSettingsUI::IdentityInfo& identity_info) {
- [bubble_controller_ setIdentityInfo:identity_info];
-}
-
void WebsiteSettingsUIBridge::SetFirstVisit(const string16& first_visit) {
[bubble_controller_ setFirstVisit:first_visit];
}

Powered by Google App Engine
This is Rietveld 408576698