| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" | 5 #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #import "base/mac/mac_util.h" | 9 #import "base/mac/mac_util.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 86 const static int kFirstRunBubbleYOffset = 1; | 86 const static int kFirstRunBubbleYOffset = 1; |
| 87 | 87 |
| 88 const int kDefaultIconSize = 16; | 88 const int kDefaultIconSize = 16; |
| 89 | 89 |
| 90 // Color of the vector graphic icons when the location bar is dark. | 90 // Color of the vector graphic icons when the location bar is dark. |
| 91 // SkColorSetARGB(0xCC, 0xFF, 0xFF 0xFF); | 91 // SkColorSetARGB(0xCC, 0xFF, 0xFF 0xFF); |
| 92 const SkColor kMaterialDarkVectorIconColor = SK_ColorWHITE; | 92 const SkColor kMaterialDarkVectorIconColor = SK_ColorWHITE; |
| 93 | 93 |
| 94 } // namespace | 94 } // namespace |
| 95 | 95 |
| 96 // A temporary class that draws hardcoded HTTP graphic icons for Material | |
| 97 // design. This class will be removed once the Material icons are available | |
| 98 // in M53. | |
| 99 @interface LocationBarImageRep : NSCustomImageRep | |
| 100 @property(assign, nonatomic) gfx::VectorIconId iconId; | |
| 101 @property(retain, nonatomic) NSColor* fillColor; | |
| 102 | |
| 103 + (NSImage*)imageForId:(gfx::VectorIconId)vectorIconId | |
| 104 color:(SkColor)vectorIconColor; | |
| 105 | |
| 106 // NSCustomImageRep delegate method that performs the drawing. | |
| 107 + (void)drawLocationBarIcon:(LocationBarImageRep*)imageRep; | |
| 108 | |
| 109 @end | |
| 110 | |
| 111 @implementation LocationBarImageRep | |
| 112 | |
| 113 @synthesize iconId = iconId_; | |
| 114 @synthesize fillColor = fillColor_; | |
| 115 | |
| 116 - (void)dealloc { | |
| 117 [fillColor_ release]; | |
| 118 [super dealloc]; | |
| 119 } | |
| 120 | |
| 121 + (NSImage*)imageForId:(gfx::VectorIconId)vectorIconId | |
| 122 color:(SkColor)vectorIconColor { | |
| 123 if (vectorIconId != gfx::VectorIconId::LOCATION_BAR_HTTP && | |
| 124 vectorIconId != gfx::VectorIconId::LOCATION_BAR_HTTPS_INVALID && | |
| 125 vectorIconId != gfx::VectorIconId::LOCATION_BAR_HTTPS_VALID) { | |
| 126 return NSImageFromImageSkiaWithColorSpace( | |
| 127 gfx::CreateVectorIcon(vectorIconId, kDefaultIconSize, vectorIconColor), | |
| 128 base::mac::GetSRGBColorSpace()); | |
| 129 } | |
| 130 | |
| 131 base::scoped_nsobject<LocationBarImageRep> imageRep( | |
| 132 [[LocationBarImageRep alloc] | |
| 133 initWithDrawSelector:@selector(drawLocationBarIcon:) | |
| 134 delegate:[LocationBarImageRep class]]); | |
| 135 [imageRep setIconId:vectorIconId]; | |
| 136 [imageRep setFillColor:skia::SkColorToSRGBNSColor(vectorIconColor)]; | |
| 137 | |
| 138 // Create the image from the image rep. | |
| 139 const NSSize kImageSize = NSMakeSize(kDefaultIconSize, kDefaultIconSize); | |
| 140 NSImage* locationBarImage = | |
| 141 [[[NSImage alloc] initWithSize:kImageSize] autorelease]; | |
| 142 [locationBarImage setCacheMode:NSImageCacheAlways]; | |
| 143 [locationBarImage addRepresentation:imageRep]; | |
| 144 | |
| 145 return locationBarImage; | |
| 146 } | |
| 147 | |
| 148 + (void)drawLocationBarIcon:(LocationBarImageRep*)imageRep { | |
| 149 [[imageRep fillColor] set]; | |
| 150 | |
| 151 // Determine the scale factor. | |
| 152 CGContextRef context = static_cast<CGContextRef>( | |
| 153 [[NSGraphicsContext currentContext] graphicsPort]); | |
| 154 CGRect unitRect = CGRectMake(0.0, 0.0, 1.0, 1.0); | |
| 155 CGRect deviceRect = CGContextConvertRectToDeviceSpace(context, unitRect); | |
| 156 int scaleFactor = deviceRect.size.height; | |
| 157 | |
| 158 switch ([imageRep iconId]) { | |
| 159 case gfx::VectorIconId::LOCATION_BAR_HTTP: | |
| 160 [self drawLocationBarIconHTTPForScale:scaleFactor]; | |
| 161 break; | |
| 162 case gfx::VectorIconId::LOCATION_BAR_HTTPS_INVALID: | |
| 163 [self drawLocationBarIconHTTPSInvalidForScale:scaleFactor]; | |
| 164 break; | |
| 165 case gfx::VectorIconId::LOCATION_BAR_HTTPS_VALID: | |
| 166 [self drawLocationBarIconHTTPSValidForScale:scaleFactor]; | |
| 167 break; | |
| 168 default: | |
| 169 // Make it obvious that there's a problem. | |
| 170 [[NSColor redColor] set]; | |
| 171 NSRectFill(NSMakeRect(0, 0, kDefaultIconSize, kDefaultIconSize)); | |
| 172 break; | |
| 173 } | |
| 174 } | |
| 175 | |
| 176 + (void)drawLocationBarIconHTTPForScale:(int)scaleFactor { | |
| 177 if (scaleFactor > 1) { | |
| 178 NSRect ovalRect = NSMakeRect(2.25, 1.75, 12, 12); | |
| 179 NSBezierPath* circlePath = | |
| 180 [NSBezierPath bezierPathWithOvalInRect:ovalRect]; | |
| 181 [circlePath setLineWidth:1.5]; | |
| 182 [circlePath stroke]; | |
| 183 | |
| 184 NSRectFill(NSMakeRect(7.5, 4.5, 1.5, 4)); | |
| 185 NSRectFill(NSMakeRect(7.5, 9.5, 1.5, 1.5)); | |
| 186 } else { | |
| 187 NSRect ovalRect = NSMakeRect(2, 2, 12, 12); | |
| 188 NSBezierPath* circlePath = | |
| 189 [NSBezierPath bezierPathWithOvalInRect:ovalRect]; | |
| 190 [circlePath setLineWidth:1.5]; | |
| 191 [circlePath stroke]; | |
| 192 | |
| 193 NSRectFill(NSMakeRect(7, 4, 2, 5)); | |
| 194 NSRectFill(NSMakeRect(7, 10, 2, 2)); | |
| 195 } | |
| 196 } | |
| 197 | |
| 198 + (void)drawLocationBarIconHTTPSInvalidForScale:(int)scaleFactor { | |
| 199 // The vector icon is upside down relative to the default OS X coordinate | |
| 200 // system so rotate by 180 degrees. | |
| 201 CGContextRef context = static_cast<CGContextRef>( | |
| 202 [[NSGraphicsContext currentContext] graphicsPort]); | |
| 203 const int kHalfDefaultIconSize = kDefaultIconSize / 2; | |
| 204 CGContextTranslateCTM(context, kHalfDefaultIconSize, kHalfDefaultIconSize); | |
| 205 CGContextRotateCTM(context, M_PI); | |
| 206 CGContextTranslateCTM(context, -kHalfDefaultIconSize, -kHalfDefaultIconSize); | |
| 207 | |
| 208 // If Retina, nudge the icon up 1/2pt. | |
| 209 if (scaleFactor == 2) { | |
| 210 CGContextTranslateCTM(context, 0, -0.5); | |
| 211 } | |
| 212 | |
| 213 NSBezierPath* trianglePath = [NSBezierPath bezierPath]; | |
| 214 [trianglePath moveToPoint:NSMakePoint(0.5f, 14)]; | |
| 215 [trianglePath relativeLineToPoint:NSMakePoint(15, 0)]; | |
| 216 [trianglePath lineToPoint:NSMakePoint(8, 1)]; | |
| 217 [trianglePath closePath]; | |
| 218 | |
| 219 NSBezierPath* cutOutPath = [NSBezierPath bezierPath]; | |
| 220 [cutOutPath moveToPoint:NSMakePoint(9, 12)]; | |
| 221 [cutOutPath relativeLineToPoint:NSMakePoint(-2, 0)]; | |
| 222 [cutOutPath relativeLineToPoint:NSMakePoint(0, -2)]; | |
| 223 [cutOutPath relativeLineToPoint:NSMakePoint(2, 0)]; | |
| 224 [cutOutPath relativeLineToPoint:NSMakePoint(0, 2)]; | |
| 225 [cutOutPath closePath]; | |
| 226 [cutOutPath relativeMoveToPoint:NSMakePoint(0, -3)]; | |
| 227 [cutOutPath relativeLineToPoint:NSMakePoint(-2, 0)]; | |
| 228 [cutOutPath relativeLineToPoint:NSMakePoint(0, -3)]; | |
| 229 [cutOutPath relativeLineToPoint:NSMakePoint(2, 0)]; | |
| 230 [cutOutPath relativeLineToPoint:NSMakePoint(0, 3)]; | |
| 231 [cutOutPath closePath]; | |
| 232 | |
| 233 [trianglePath appendBezierPath:cutOutPath]; | |
| 234 [trianglePath fill]; | |
| 235 } | |
| 236 | |
| 237 + (void)drawLocationBarIconHTTPSValidForScale:(int)scaleFactor { | |
| 238 NSAffineTransform* transform = [NSAffineTransform transform]; | |
| 239 // Adjust down 1px in Retina, so that the lock sits on the text baseline. | |
| 240 if (scaleFactor > 1) { | |
| 241 [transform translateXBy:0 yBy:-0.5]; | |
| 242 } | |
| 243 | |
| 244 NSBezierPath* rectPath = | |
| 245 [NSBezierPath bezierPathWithRoundedRect:NSMakeRect(4, 3, 8, 7) | |
| 246 xRadius:1 | |
| 247 yRadius:1]; | |
| 248 [rectPath transformUsingAffineTransform:transform]; | |
| 249 [rectPath fill]; | |
| 250 | |
| 251 NSBezierPath* curvePath = [NSBezierPath bezierPath]; | |
| 252 [curvePath moveToPoint:NSMakePoint(5.5, 9.75)]; | |
| 253 [curvePath lineToPoint:NSMakePoint(5.5, 10)]; | |
| 254 [curvePath curveToPoint:NSMakePoint(8, 13) | |
| 255 controlPoint1:NSMakePoint(5.5, 13) | |
| 256 controlPoint2:NSMakePoint(7.5, 13)]; | |
| 257 [curvePath curveToPoint:NSMakePoint(10.5, 10) | |
| 258 controlPoint1:NSMakePoint(8.5, 13) | |
| 259 controlPoint2:NSMakePoint(10.5, 13)]; | |
| 260 [curvePath lineToPoint:NSMakePoint(10.5, 9.75)]; | |
| 261 [curvePath setLineWidth:1.25]; | |
| 262 [curvePath transformUsingAffineTransform:transform]; | |
| 263 [curvePath stroke]; | |
| 264 } | |
| 265 | |
| 266 @end | |
| 267 | |
| 268 // TODO(shess): This code is mostly copied from the gtk | 96 // TODO(shess): This code is mostly copied from the gtk |
| 269 // implementation. Make sure it's all appropriate and flesh it out. | 97 // implementation. Make sure it's all appropriate and flesh it out. |
| 270 | 98 |
| 271 LocationBarViewMac::LocationBarViewMac(AutocompleteTextField* field, | 99 LocationBarViewMac::LocationBarViewMac(AutocompleteTextField* field, |
| 272 CommandUpdater* command_updater, | 100 CommandUpdater* command_updater, |
| 273 Profile* profile, | 101 Profile* profile, |
| 274 Browser* browser) | 102 Browser* browser) |
| 275 : LocationBar(profile), | 103 : LocationBar(profile), |
| 276 ChromeOmniboxEditController(command_updater), | 104 ChromeOmniboxEditController(command_updater), |
| 277 omnibox_view_(new OmniboxViewMac(this, profile, command_updater, field)), | 105 omnibox_view_(new OmniboxViewMac(this, profile, command_updater, field)), |
| (...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 757 vector_icon_color = skia::NSDeviceColorToSkColor(deviceColor); | 585 vector_icon_color = skia::NSDeviceColorToSkColor(deviceColor); |
| 758 } | 586 } |
| 759 } | 587 } |
| 760 | 588 |
| 761 // If the theme is dark, then the color should always be | 589 // If the theme is dark, then the color should always be |
| 762 // kMaterialDarkVectorIconColor. | 590 // kMaterialDarkVectorIconColor. |
| 763 if (in_dark_mode) | 591 if (in_dark_mode) |
| 764 vector_icon_color = kMaterialDarkVectorIconColor; | 592 vector_icon_color = kMaterialDarkVectorIconColor; |
| 765 | 593 |
| 766 DCHECK(vector_icon_id != gfx::VectorIconId::VECTOR_ICON_NONE); | 594 DCHECK(vector_icon_id != gfx::VectorIconId::VECTOR_ICON_NONE); |
| 767 NSImage* image = | 595 NSImage* image = NSImageFromImageSkiaWithColorSpace( |
| 768 [LocationBarImageRep imageForId:vector_icon_id color:vector_icon_color]; | 596 gfx::CreateVectorIcon(vector_icon_id, kDefaultIconSize, |
| 769 | 597 vector_icon_color), |
| 598 base::mac::GetSRGBColorSpace()); |
| 770 location_icon_decoration_->SetImage(image); | 599 location_icon_decoration_->SetImage(image); |
| 771 ev_bubble_decoration_->SetImage(image); | 600 ev_bubble_decoration_->SetImage(image); |
| 772 Layout(); | 601 Layout(); |
| 773 } | 602 } |
| 774 | 603 |
| 775 void LocationBarViewMac::UpdateColorsToMatchTheme() { | 604 void LocationBarViewMac::UpdateColorsToMatchTheme() { |
| 776 if (!ui::MaterialDesignController::IsModeMaterial() || | 605 if (!ui::MaterialDesignController::IsModeMaterial() || |
| 777 ![[field_ window] inIncognitoMode]) { | 606 ![[field_ window] inIncognitoMode]) { |
| 778 return; | 607 return; |
| 779 } | 608 } |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 988 | 817 |
| 989 return zoom_decoration_->UpdateIfNecessary( | 818 return zoom_decoration_->UpdateIfNecessary( |
| 990 zoom::ZoomController::FromWebContents(web_contents), default_zoom_changed, | 819 zoom::ZoomController::FromWebContents(web_contents), default_zoom_changed, |
| 991 IsLocationBarDark()); | 820 IsLocationBarDark()); |
| 992 } | 821 } |
| 993 | 822 |
| 994 void LocationBarViewMac::OnDefaultZoomLevelChanged() { | 823 void LocationBarViewMac::OnDefaultZoomLevelChanged() { |
| 995 if (UpdateZoomDecoration(/*default_zoom_changed=*/true)) | 824 if (UpdateZoomDecoration(/*default_zoom_changed=*/true)) |
| 996 OnDecorationsChanged(); | 825 OnDecorationsChanged(); |
| 997 } | 826 } |
| OLD | NEW |