Index: chrome/browser/ui/cocoa/tabs/tab_window_controller.mm |
diff --git a/chrome/browser/ui/cocoa/tabs/tab_window_controller.mm b/chrome/browser/ui/cocoa/tabs/tab_window_controller.mm |
index b5069cb862f85d692f195ce06f9ca0fefd9026bd..33f7fc013b8dcc45dbf5dc5707a1778c9f329456 100644 |
--- a/chrome/browser/ui/cocoa/tabs/tab_window_controller.mm |
+++ b/chrome/browser/ui/cocoa/tabs/tab_window_controller.mm |
@@ -15,8 +15,14 @@ |
#import "ui/base/cocoa/focus_tracker.h" |
#include "ui/base/theme_provider.h" |
-@interface TabWindowController(PRIVATE) |
+@interface TabWindowController () |
- (void)setUseOverlay:(BOOL)useOverlay; |
+ |
+// The tab strip background view should always be inserted as the back-most |
+// subview of the root view. It cannot be a subview of the contentView, as that |
+// would cause it to become layer backed, which would cause it to draw on top |
+// of non-layer backed content like the window controls. |
+- (void)insertTabStripBackgroundViewIntoWindow:(NSWindow*)window; |
@end |
@interface TabWindowOverlayWindow : NSWindow |
@@ -49,7 +55,10 @@ |
@implementation TabWindowController |
- (id)initTabWindowControllerWithTabStrip:(BOOL)hasTabStrip { |
- NSRect contentRect = NSMakeRect(60, 229, 750, 600); |
+ const CGFloat kDefaultWidth = 750; |
+ const CGFloat kDefaultHeight = 600; |
+ |
+ NSRect contentRect = NSMakeRect(60, 229, kDefaultWidth, kDefaultHeight); |
base::scoped_nsobject<FramedBrowserWindow> window( |
[[FramedBrowserWindow alloc] initWithContentRect:contentRect |
hasTabStrip:hasTabStrip]); |
@@ -59,11 +68,18 @@ |
if ((self = [super initWithWindow:window])) { |
[[self window] setDelegate:self]; |
- tabContentArea_.reset([[FastResizeView alloc] initWithFrame: |
- NSMakeRect(0, 0, 750, 600)]); |
+ chromeContentView_.reset([[NSView alloc] |
+ initWithFrame:NSMakeRect(0, 0, kDefaultWidth, kDefaultHeight)]); |
+ [chromeContentView_ |
+ setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; |
+ [chromeContentView_ setWantsLayer:YES]; |
+ [[[self window] contentView] addSubview:chromeContentView_]; |
+ |
+ tabContentArea_.reset( |
+ [[FastResizeView alloc] initWithFrame:[chromeContentView_ bounds]]); |
[tabContentArea_ setAutoresizingMask:NSViewWidthSizable | |
NSViewHeightSizable]; |
- [[[self window] contentView] addSubview:tabContentArea_]; |
+ [chromeContentView_ addSubview:tabContentArea_]; |
// tabStripBackgroundView_ draws the theme image behind the tab strip area. |
// When making a tab dragging window (setUseOverlay:), this view stays in |
@@ -78,14 +94,13 @@ |
kBrowserFrameViewPaintHeight)]); |
[tabStripBackgroundView_ |
setAutoresizingMask:NSViewWidthSizable | NSViewMinYMargin]; |
- [windowView addSubview:tabStripBackgroundView_ |
- positioned:NSWindowBelow |
- relativeTo:nil]; |
+ [self insertTabStripBackgroundViewIntoWindow:window]; |
[self moveContentViewToBack:[window contentView]]; |
tabStripView_.reset([[TabStripView alloc] |
- initWithFrame:NSMakeRect(0, 0, 750, chrome::kTabStripHeight)]); |
+ initWithFrame:NSMakeRect( |
+ 0, 0, kDefaultWidth, chrome::kTabStripHeight)]); |
[tabStripView_ setAutoresizingMask:NSViewWidthSizable | |
NSViewMinYMargin]; |
if (hasTabStrip) |
@@ -106,6 +121,10 @@ |
return tabContentArea_; |
} |
+- (NSView*)chromeContentView { |
+ return chromeContentView_; |
+} |
+ |
- (void)removeOverlay { |
[self setUseOverlay:NO]; |
if (closeDeferred_) { |
@@ -141,8 +160,9 @@ |
[overlayWindow_ setBackgroundColor:[NSColor clearColor]]; |
[overlayWindow_ setOpaque:NO]; |
[overlayWindow_ setDelegate:self]; |
+ [[overlayWindow_ contentView] setWantsLayer:YES]; |
- originalContentView_ = [window contentView]; |
+ originalContentView_ = self.chromeContentView; |
[window addChildWindow:overlayWindow_ ordered:NSWindowAbove]; |
// Explicitly set the responder to be nil here (for restoring later). |
@@ -168,8 +188,10 @@ |
// places. The TabStripView always needs to be in front of the window's |
// content view and therefore it should always be added after the content |
// view is set. |
- [window setContentView:originalContentView_]; |
- [self moveContentViewToBack:originalContentView_]; |
+ [[window contentView] addSubview:originalContentView_ |
+ positioned:NSWindowBelow |
+ relativeTo:nil]; |
+ originalContentView_.frame = [[window contentView] bounds]; |
[self insertTabStripView:[self tabStripView] intoWindow:window]; |
[[window cr_windowView] updateTrackingAreas]; |
@@ -334,6 +356,14 @@ |
} |
} |
+- (void)insertTabStripBackgroundViewIntoWindow:(NSWindow*)window { |
+ DCHECK(tabStripBackgroundView_); |
+ NSView* rootView = [[window contentView] superview]; |
+ [rootView addSubview:tabStripBackgroundView_ |
+ positioned:NSWindowBelow |
+ relativeTo:nil]; |
+} |
+ |
// Called when the size of the window content area has changed. Override to |
// position specific views. Base class implementation does nothing. |
- (void)layoutSubviews { |