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

Unified Diff: chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm

Issue 7461134: [Mac] Unspoofable infobars v3. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Rohit Created 9 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/infobars/infobar_gradient_view.mm
diff --git a/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm b/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm
index cb541b1328a25275b05c821e43acefd3284081e0..2927db21d70b448a937b0167267840731d3913ed 100644
--- a/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm
+++ b/chrome/browser/ui/cocoa/infobars/infobar_gradient_view.mm
@@ -7,10 +7,18 @@
#include "base/memory/scoped_nsobject.h"
#include "chrome/browser/tab_contents/infobar.h"
#import "chrome/browser/themes/theme_service.h"
+#import "chrome/browser/ui/cocoa/browser_window_controller.h"
#import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h"
+#import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
#import "chrome/browser/ui/cocoa/themed_window.h"
#include "skia/ext/skia_utils_mac.h"
+const CGFloat kTipWidth = 23;
rohitrao (ping after 24h) 2011/08/05 14:24:12 Might as well put this in a namespace.
Robert Sesek 2011/08/05 15:10:40 Done.
+
+@interface InfoBarGradientView (Private)
+- (NSPoint)pointForTipApex;
rohitrao (ping after 24h) 2011/08/05 14:24:12 Add a comment for this method. Mention what coord
Robert Sesek 2011/08/05 15:10:40 Done.
+@end
+
@implementation InfoBarGradientView
- (void)setInfobarType:(InfoBarDelegate::Type)infobarType {
@@ -38,11 +46,23 @@
NSRect bounds = [self bounds];
bounds.size.height = infobars::kBaseHeight;
+ const CGFloat kHalfWidth = kTipWidth / 2.0;
+ const CGFloat kTipXOffset = [self pointForTipApex].x - kHalfWidth;
+
// Around the bounds of the infobar, continue drawing the path into which the
// gradient will be drawn.
NSBezierPath* infoBarPath = [NSBezierPath bezierPath];
[infoBarPath moveToPoint:NSMakePoint(NSMinX(bounds), NSMaxY(bounds))];
+
+ // Draw the tip.
+ [infoBarPath lineToPoint:NSMakePoint(kTipXOffset, NSMaxY(bounds))];
+ [infoBarPath relativeLineToPoint:NSMakePoint(kHalfWidth,
+ infobars::kTipHeight)];
+ [infoBarPath relativeLineToPoint:NSMakePoint(kHalfWidth,
+ -infobars::kTipHeight)];
[infoBarPath lineToPoint:NSMakePoint(NSMaxX(bounds), NSMaxY(bounds))];
+
+ // Save off the top path of the infobar.
scoped_nsobject<NSBezierPath> topPath([infoBarPath copy]);
[infoBarPath lineToPoint:NSMakePoint(NSMaxX(bounds), NSMinY(bounds))];
@@ -52,21 +72,33 @@
// Draw the gradient.
[[self gradient] drawInBezierPath:infoBarPath angle:270];
- // Stroke the bottom.
NSColor* strokeColor = [self strokeColor];
if (strokeColor) {
[strokeColor set];
+
+ // Stroke the bottom of the infobar.
NSRect borderRect, contentRect;
NSDivideRect(bounds, &borderRect, &contentRect, 1, NSMinYEdge);
NSRectFillUsingOperation(borderRect, NSCompositeSourceOver);
+
+ // Re-stroke the top because the tip will have no stroke. This will draw
+ // over the divider drawn by the bottom of the tabstrip.
+ [topPath stroke];
}
// Add an inner stroke.
+ const CGFloat kHighlightTipHeight = infobars::kTipHeight - 1;
+ NSBezierPath* highlightPath = [NSBezierPath bezierPath];
+ [highlightPath moveToPoint:NSMakePoint(NSMinX(bounds), NSMaxY(bounds) - 1)];
+ [highlightPath relativeLineToPoint:NSMakePoint(kTipXOffset + 1, 0)];
+ [highlightPath relativeLineToPoint:NSMakePoint(kHalfWidth - 1,
+ kHighlightTipHeight)];
+ [highlightPath relativeLineToPoint:NSMakePoint(kHalfWidth - 1,
+ -kHighlightTipHeight)];
+ [highlightPath lineToPoint:NSMakePoint(NSMaxX(bounds), NSMaxY(bounds) - 1)];
+
[[NSColor colorWithDeviceWhite:1.0 alpha:1.0] setStroke];
- NSAffineTransform* transform = [NSAffineTransform transform];
- [transform translateXBy:0.0 yBy:-1.0];
- [topPath transformUsingAffineTransform:transform];
- [topPath stroke];
+ [highlightPath stroke];
}
- (BOOL)mouseDownCanMoveWindow {
@@ -86,4 +118,23 @@
return [super accessibilityAttributeValue:attribute];
}
+// Private /////////////////////////////////////////////////////////////////////
+
+// Returns the point, in local coordinates, at which the apex of the infobar tip
+// should be drawn.
+- (NSPoint)pointForTipApex {
+ id controller = [[self window] windowController];
rohitrao (ping after 24h) 2011/08/05 14:24:12 Can we do this through a delegate interface instea
Robert Sesek 2011/08/05 15:10:40 Routed through protocols. Done.
+ if (![controller isKindOfClass:[BrowserWindowController class]]) {
+ NOTREACHED();
+ return NSZeroPoint;
+ }
+
+ BrowserWindowController* windowController =
+ static_cast<BrowserWindowController*>(controller);
+ LocationBarViewMac* locationBar = [windowController locationBarBridge];
+ NSPoint point = locationBar->GetPageInfoBubblePoint();
+ point = [self convertPoint:point fromView:nil];
+ return point;
+}
+
@end

Powered by Google App Engine
This is Rietveld 408576698