Chromium Code Reviews| Index: chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.mm | 
| diff --git a/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.mm b/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.mm | 
| index 7eb9a3a4a275171ba7c574ca7cd1c2f3761c5ff6..67a49a644229682c8e667b5aaf08aa11a16f3a10 100644 | 
| --- a/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.mm | 
| +++ b/chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.mm | 
| @@ -6,6 +6,7 @@ | 
| #include <utility> | 
| +#include "base/command_line.h" | 
| #include "base/mac/scoped_nsobject.h" | 
| #include "chrome/browser/devtools/devtools_window.h" | 
| #import "chrome/browser/themes/theme_properties.h" | 
| @@ -16,6 +17,8 @@ | 
| #include "content/public/browser/web_contents.h" | 
| #include "content/public/browser/web_contents_observer.h" | 
| #include "content/public/browser/web_contents_view.h" | 
| +#include "ui/base/cocoa/animation_utils.h" | 
| +#include "ui/base/ui_base_switches.h" | 
| #include "ui/gfx/geometry/rect.h" | 
| using content::WebContents; | 
| @@ -73,6 +76,8 @@ class FullscreenObserver : public WebContentsObserver { | 
| @private | 
| TabContentsController* delegate_; // weak | 
| } | 
| + | 
| +- (NSColor*)computeBackgroundColor; | 
| @end | 
| @implementation TabContentsContainerView | 
| @@ -80,6 +85,14 @@ class FullscreenObserver : public WebContentsObserver { | 
| - (id)initWithDelegate:(TabContentsController*)delegate { | 
| if ((self = [super initWithFrame:NSZeroRect])) { | 
| delegate_ = delegate; | 
| + if (!CommandLine::ForCurrentProcess()->HasSwitch( | 
| + switches::kDisableCoreAnimation)) { | 
| + ScopedCAActionDisabler disabler; | 
| + base::scoped_nsobject<CALayer> layer([[CALayer alloc] init]); | 
| + [layer setBackgroundColor:CGColorGetConstantColor(kCGColorWhite)]; | 
| + [self setLayer:layer]; | 
| + [self setWantsLayer:YES]; | 
| + } | 
| } | 
| return self; | 
| } | 
| @@ -90,24 +103,28 @@ class FullscreenObserver : public WebContentsObserver { | 
| delegate_ = nil; | 
| } | 
| +// Fill with a dark tint of the new tab page's background color. This is | 
| +// only seen when the subview is sized specially for fullscreen tab capture. | 
| +- (NSColor*)computeBackgroundColor { | 
| + NSColor* bgColor = nil; | 
| + ThemeService* const theme = | 
| + static_cast<ThemeService*>([[self window] themeProvider]); | 
| + if (theme) | 
| + bgColor = theme->GetNSColor(ThemeProperties::COLOR_NTP_BACKGROUND); | 
| + if (!bgColor) | 
| + bgColor = [[self window] backgroundColor]; | 
| + const float kDarknessFraction = 0.80f; | 
| + return [bgColor blendedColorWithFraction:kDarknessFraction | 
| + ofColor:[NSColor blackColor]]; | 
| +} | 
| + | 
| // Override -drawRect to fill the view with a solid color outside of the | 
| // subview's frame. | 
| - (void)drawRect:(NSRect)dirtyRect { | 
| NSView* const contentsView = | 
| [[self subviews] count] > 0 ? [[self subviews] objectAtIndex:0] : nil; | 
| if (!contentsView || !NSContainsRect([contentsView frame], dirtyRect)) { | 
| - // Fill with a dark tint of the new tab page's background color. This is | 
| - // only seen when the subview is sized specially for fullscreen tab capture. | 
| - NSColor* bgColor = nil; | 
| - ThemeService* const theme = | 
| - static_cast<ThemeService*>([[self window] themeProvider]); | 
| - if (theme) | 
| - bgColor = theme->GetNSColor(ThemeProperties::COLOR_NTP_BACKGROUND); | 
| - if (!bgColor) | 
| - bgColor = [[self window] backgroundColor]; | 
| - const float kDarknessFraction = 0.80f; | 
| - [[bgColor blendedColorWithFraction:kDarknessFraction | 
| - ofColor:[NSColor blackColor]] setFill]; | 
| + [[self computeBackgroundColor] setFill]; | 
| NSRectFill(dirtyRect); | 
| } | 
| [super drawRect:dirtyRect]; | 
| @@ -125,6 +142,24 @@ class FullscreenObserver : public WebContentsObserver { | 
| [contentsView setFrame:[delegate_ frameForContentsView]]; | 
| } | 
| +// Update the background layer's color whenever the view needs to repaint. | 
| +- (void)setNeedsDisplayInRect:(NSRect)rect { | 
| + [super setNeedsDisplayInRect:rect]; | 
| + | 
| 
 
ccameron
2014/04/19 02:45:29
[NSColor CGColor] is a 10.8+ function.
Not sure i
 
Avi (use Gerrit)
2014/04/19 19:30:49
That's fine. With 10.6, they changed things so tha
 
 | 
| + // Convert from an NSColor to a CGColorRef. | 
| + NSColor* nsBackgroundColor = [self computeBackgroundColor]; | 
| + NSColorSpace* nsColorSpace = [nsBackgroundColor colorSpace]; | 
| + CGColorSpaceRef cgColorSpace = [nsColorSpace CGColorSpace]; | 
| + const NSInteger numberOfComponents = [nsBackgroundColor numberOfComponents]; | 
| + CGFloat components[numberOfComponents]; | 
| + [nsBackgroundColor getComponents:components]; | 
| + CGColorRef cgBackgroundColor = CGColorCreate(cgColorSpace, components); | 
| 
 
Avi (use Gerrit)
2014/04/19 19:30:49
ScopedCFObject if you must go this route.
 
ccameron
2014/04/19 22:21:39
Done.
 
 | 
| + | 
| + ScopedCAActionDisabler disabler; | 
| + [[self layer] setBackgroundColor:cgBackgroundColor]; | 
| + CGColorRelease(cgBackgroundColor); | 
| +} | 
| + | 
| @end // @implementation TabContentsContainerView | 
| @implementation TabContentsController |