Chromium Code Reviews| Index: chrome/browser/ui/cocoa/browser_window_controller_private.mm |
| diff --git a/chrome/browser/ui/cocoa/browser_window_controller_private.mm b/chrome/browser/ui/cocoa/browser_window_controller_private.mm |
| index 234af6bd046ef7bb0558444cb50a30726484b95c..a21b90683d9b5e76c60c5fe213ef8a4c91c1828f 100644 |
| --- a/chrome/browser/ui/cocoa/browser_window_controller_private.mm |
| +++ b/chrome/browser/ui/cocoa/browser_window_controller_private.mm |
| @@ -19,6 +19,7 @@ |
| #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_window_state.h" |
| +#import "chrome/browser/ui/cocoa/browser_window_layout.h" |
| #import "chrome/browser/ui/cocoa/dev_tools_controller.h" |
| #import "chrome/browser/ui/cocoa/fast_resize_view.h" |
| #import "chrome/browser/ui/cocoa/find_bar/find_bar_cocoa_controller.h" |
| @@ -54,13 +55,6 @@ namespace { |
| // Space between the incognito badge and the right edge of the window. |
| const CGFloat kAvatarRightOffset = 4; |
| -// Insets for the location bar, used when the full toolbar is hidden. |
| -// TODO(viettrungluu): We can argue about the "correct" insetting; I like the |
| -// following best, though arguably 0 inset is better/more correct. |
| -const CGFloat kLocBarLeftRightInset = 1; |
| -const CGFloat kLocBarTopInset = 0; |
| -const CGFloat kLocBarBottomInset = 1; |
| - |
| } // namespace |
| @implementation BrowserWindowController(Private) |
| @@ -170,133 +164,21 @@ willPositionSheet:(NSWindow*)sheet |
| } |
| - (void)layoutSubviews { |
| - // With the exception of the top tab strip, the subviews which we lay out are |
| - // subviews of the content view, so we mainly work in the content view's |
| - // coordinate system. Note, however, that the content view's coordinate system |
| - // and the window's base coordinate system should coincide. |
| - NSWindow* window = [self window]; |
| - NSView* contentView = [window contentView]; |
| - NSRect contentBounds = [contentView bounds]; |
| - CGFloat minX = NSMinX(contentBounds); |
| - CGFloat minY = NSMinY(contentBounds); |
| - CGFloat width = NSWidth(contentBounds); |
| - |
| // Suppress title drawing if necessary. |
| - if ([window respondsToSelector:@selector(setShouldHideTitle:)]) |
| - [(id)window setShouldHideTitle:![self hasTitleBar]]; |
| - |
| - // Update z-order. The code below depends on this. |
| - [self updateSubviewZOrder:[self isInFullscreenWithOmniboxSliding]]; |
| - |
| - CGFloat floatingBarHeight = [self floatingBarHeight]; |
| - CGFloat yOffset = 0; |
| - if ([self isInFullscreenWithOmniboxSliding]) { |
| - yOffset += [presentationModeController_ menubarOffset]; |
| - switch (presentationModeController_.get().slidingStyle) { |
| - case fullscreen_mac::OMNIBOX_TABS_PRESENT: |
| - break; |
| - case fullscreen_mac::OMNIBOX_TABS_HIDDEN: |
| - // In presentation mode, |yOffset| accounts for the sliding position of |
| - // the floating bar and the extra offset needed to dodge the menu bar. |
| - yOffset += |
| - std::floor((1 - presentationModeController_.get().toolbarFraction) * |
| - floatingBarHeight); |
| - break; |
| - } |
| - } |
| + if ([self.window respondsToSelector:@selector(setShouldHideTitle:)]) |
| + [(id)self.window setShouldHideTitle:![self hasTitleBar]]; |
| - CGFloat maxY = NSMaxY(contentBounds) + yOffset; |
| - |
| - if ([self hasTabStrip]) { |
| - // If we need to lay out the top tab strip, replace |maxY| with a higher |
| - // value, and then lay out the tab strip. |
| - NSRect windowFrame = [contentView convertRect:[window frame] fromView:nil]; |
| - maxY = NSHeight(windowFrame) + yOffset; |
| - maxY = [self layoutTabStripAtMaxY:maxY |
| - width:width |
| - fullscreen:[self isInAnyFullscreenMode]]; |
| - } |
| - |
| - // Sanity-check |maxY|. |
| - DCHECK_GE(maxY, minY); |
| - DCHECK_LE(maxY, NSMaxY(contentBounds) + yOffset); |
| - |
| - // Place the toolbar at the top of the reserved area. |
| - maxY = [self layoutToolbarAtMinX:minX maxY:maxY width:width]; |
| - |
| - // If we're not displaying the bookmark bar below the info bar, then it goes |
| - // immediately below the toolbar. |
| - BOOL placeBookmarkBarBelowInfoBar = [self placeBookmarkBarBelowInfoBar]; |
| - if (!placeBookmarkBarBelowInfoBar) |
| - maxY = [self layoutBookmarkBarAtMinX:minX maxY:maxY width:width]; |
| - |
| - // The floating bar backing view doesn't actually add any height. |
| - NSRect floatingBarBackingRect = |
| - NSMakeRect(minX, maxY, width, floatingBarHeight); |
| - [self layoutFloatingBarBackingView:floatingBarBackingRect |
| - presentationMode:[self isInFullscreenWithOmniboxSliding]]; |
| - |
| - // Place the find bar immediately below the toolbar/attached bookmark bar. In |
| - // presentation mode, it hangs off the top of the screen when the bar is |
| - // hidden. |
| - [findBarCocoaController_ positionFindBarViewAtMaxY:maxY maxWidth:width]; |
| - [fullscreenExitBubbleController_ positionInWindowAtTop:maxY width:width]; |
| - |
| - if ([self isInFullscreenWithOmniboxSliding]) { |
| - switch (presentationModeController_.get().slidingStyle) { |
| - case fullscreen_mac::OMNIBOX_TABS_PRESENT: |
| - // Do nothing in Canonical Fullscreen. All content slides. |
| - break; |
| - case fullscreen_mac::OMNIBOX_TABS_HIDDEN: |
| - // If in presentation mode, reset |maxY| to top of screen, so that the |
| - // floating bar slides over the things which appear to be in the content |
| - // area. |
| - maxY = NSMaxY(contentBounds); |
| - break; |
| - } |
| - } |
| - |
| - // Also place the info bar container immediate below the toolbar, except in |
| - // presentation mode in which case it's at the top of the visual content area. |
| - maxY = [self layoutInfoBarAtMinX:minX maxY:maxY width:width]; |
| - |
| - // If the bookmark bar is detached, place it next in the visual content area. |
| - if (placeBookmarkBarBelowInfoBar) |
| - maxY = [self layoutBookmarkBarAtMinX:minX maxY:maxY width:width]; |
| - |
| - // Place the download shelf, if any, at the bottom of the view. |
| - minY = [self layoutDownloadShelfAtMinX:minX minY:minY width:width]; |
| + [bookmarkBarController_ updateHiddenState]; |
| + [self updateSubviewZOrder]; |
| - // Finally, the content area takes up all of the remaining space. |
| - NSRect contentAreaRect = NSMakeRect(minX, minY, width, maxY - minY); |
| - [self layoutTabContentArea:contentAreaRect]; |
| + base::scoped_nsobject<BrowserWindowLayout> layout( |
| + [[BrowserWindowLayout alloc] init]); |
| + [self updateLayoutParameters:layout]; |
| + [self applyLayout:layout]; |
| - // Normally, we don't need to tell the toolbar whether or not to show the |
| - // divider, but things break down during animation. |
| [toolbarController_ setDividerOpacity:[self toolbarDividerOpacity]]; |
| } |
| -- (CGFloat)floatingBarHeight { |
| - if (![self isInFullscreenWithOmniboxSliding]) |
| - return 0; |
| - |
| - CGFloat totalHeight = 0; |
| - if ([self hasTabStrip]) |
| - totalHeight += NSHeight([[self tabStripView] frame]); |
| - |
| - if ([self hasToolbar]) { |
| - totalHeight += NSHeight([[toolbarController_ view] frame]); |
| - } else if ([self hasLocationBar]) { |
| - totalHeight += NSHeight([[toolbarController_ view] frame]) + |
| - kLocBarTopInset + kLocBarBottomInset; |
| - } |
| - |
| - if (![self placeBookmarkBarBelowInfoBar]) |
| - totalHeight += NSHeight([[bookmarkBarController_ view] frame]); |
| - |
| - return totalHeight; |
| -} |
| - |
| - (CGFloat)layoutTabStripAtMaxY:(CGFloat)maxY |
| width:(CGFloat)width |
| fullscreen:(BOOL)fullscreen { |
| @@ -383,38 +265,6 @@ willPositionSheet:(NSWindow*)sheet |
| return maxY; |
| } |
| -- (CGFloat)layoutToolbarAtMinX:(CGFloat)minX |
| - maxY:(CGFloat)maxY |
| - width:(CGFloat)width { |
| - NSView* toolbarView = [toolbarController_ view]; |
| - NSRect toolbarFrame = [toolbarView frame]; |
| - if ([self hasToolbar]) { |
| - // The toolbar is present in the window, so we make room for it. |
| - DCHECK(![toolbarView isHidden]); |
| - toolbarFrame.origin.x = minX; |
| - toolbarFrame.origin.y = maxY - NSHeight(toolbarFrame); |
| - toolbarFrame.size.width = width; |
| - maxY -= NSHeight(toolbarFrame); |
| - } else { |
| - if ([self hasLocationBar]) { |
| - // Location bar is present with no toolbar. Put a border of |
| - // |kLocBar...Inset| pixels around the location bar. |
| - // TODO(viettrungluu): This is moderately ridiculous. The toolbar should |
| - // really be aware of what its height should be (the way the toolbar |
| - // compression stuff is currently set up messes things up). |
| - DCHECK(![toolbarView isHidden]); |
| - toolbarFrame.origin.x = kLocBarLeftRightInset; |
| - toolbarFrame.origin.y = maxY - NSHeight(toolbarFrame) - kLocBarTopInset; |
| - toolbarFrame.size.width = width - 2 * kLocBarLeftRightInset; |
| - maxY -= kLocBarTopInset + NSHeight(toolbarFrame) + kLocBarBottomInset; |
| - } else { |
| - DCHECK([toolbarView isHidden]); |
| - } |
| - } |
| - [toolbarView setFrame:toolbarFrame]; |
| - return maxY; |
| -} |
| - |
| - (BOOL)placeBookmarkBarBelowInfoBar { |
| // If we are currently displaying the NTP detached bookmark bar or animating |
| // to/from it (from/to anything else), we display the bookmark bar below the |
| @@ -424,81 +274,6 @@ willPositionSheet:(NSWindow*)sheet |
| [bookmarkBarController_ isAnimatingFromState:BookmarkBar::DETACHED]; |
| } |
| -- (CGFloat)layoutBookmarkBarAtMinX:(CGFloat)minX |
| - maxY:(CGFloat)maxY |
| - width:(CGFloat)width { |
| - [bookmarkBarController_ updateHiddenState]; |
| - |
| - NSView* bookmarkBarView = [bookmarkBarController_ view]; |
| - NSRect frame = [bookmarkBarView frame]; |
| - frame.origin.x = minX; |
| - frame.origin.y = maxY - NSHeight(frame); |
| - frame.size.width = width; |
| - [bookmarkBarView setFrame:frame]; |
| - maxY -= NSHeight(frame); |
| - |
| - // Pin the bookmark bar to the top of the window and make the width flexible. |
| - [bookmarkBarView setAutoresizingMask:NSViewWidthSizable | NSViewMinYMargin]; |
| - |
| - // TODO(viettrungluu): Does this really belong here? Calling it shouldn't be |
| - // necessary in the non-NTP case. |
| - [bookmarkBarController_ layoutSubviews]; |
| - |
| - return maxY; |
| -} |
| - |
| -- (void)layoutFloatingBarBackingView:(NSRect)frame |
| - presentationMode:(BOOL)presentationMode { |
| - // Only display when in presentation mode. |
| - if (presentationMode) { |
| - // For certain window types such as app windows (e.g., the dev tools |
| - // window), there's no actual overlay. (Displaying one would result in an |
| - // overly sliding in only under the menu, which gives an ugly effect.) |
| - if (floatingBarBackingView_.get()) { |
| - // Set its frame. |
| - [floatingBarBackingView_ setFrame:frame]; |
| - } |
| - |
| - // But we want the logic to work as usual (for show/hide/etc. purposes). |
| - [presentationModeController_ overlayFrameChanged:frame]; |
| - } else { |
| - // Okay to call even if |floatingBarBackingView_| is nil. |
| - if ([floatingBarBackingView_ superview]) |
| - [floatingBarBackingView_ removeFromSuperview]; |
| - } |
| -} |
| - |
| -- (CGFloat)layoutInfoBarAtMinX:(CGFloat)minX |
| - maxY:(CGFloat)maxY |
| - width:(CGFloat)width { |
| - NSView* containerView = [infoBarContainerController_ view]; |
| - NSRect containerFrame = [containerView frame]; |
| - maxY -= NSHeight(containerFrame); |
| - maxY += [infoBarContainerController_ overlappingTipHeight]; |
| - containerFrame.origin.x = minX; |
| - containerFrame.origin.y = maxY; |
| - containerFrame.size.width = width; |
| - [containerView setFrame:containerFrame]; |
| - [infoBarContainerController_ setMaxTopArrowHeight:[self |
| - infoBarMaxTopArrowHeight]]; |
| - return maxY; |
| -} |
| - |
| -- (CGFloat)layoutDownloadShelfAtMinX:(CGFloat)minX |
| - minY:(CGFloat)minY |
| - width:(CGFloat)width { |
| - if (downloadShelfController_.get()) { |
| - NSView* downloadView = [downloadShelfController_ view]; |
| - NSRect downloadFrame = [downloadView frame]; |
| - downloadFrame.origin.x = minX; |
| - downloadFrame.origin.y = minY; |
| - downloadFrame.size.width = width; |
| - [downloadView setFrame:downloadFrame]; |
| - minY += NSHeight(downloadFrame); |
| - } |
| - return minY; |
| -} |
| - |
| - (void)layoutTabContentArea:(NSRect)newFrame { |
| NSView* tabContentView = [self tabContentArea]; |
| NSRect tabContentFrame = [tabContentView frame]; |
| @@ -983,80 +758,214 @@ willPositionSheet:(NSWindow*)sheet |
| return [bookmarkBarController_ toolbarDividerOpacity]; |
| } |
| -// TODO(erikchen): The implementation of this method is quite fragile. The |
| -// method cr_ensureSubview:... does not check that the subview is /directly/ |
| -// above/below the given view. e.g. There are 3 subviews: A, B, C, in that |
| -// order. The method cr_ensureSubview:A isPositioned:NSWindowBelow |
| -// relativeTo:C will have no effect, even though the desired result may have |
| -// been: B, A, C. Consider changing it? |
| -- (void)updateSubviewZOrder:(BOOL)inAnyFullscreen { |
| - NSView* contentView = [[self window] contentView]; |
| - NSView* toolbarView = [toolbarController_ view]; |
| - |
| - if (inAnyFullscreen) { |
| - // Toolbar is above tab contents so that it can slide down from top of |
| - // screen. |
| - [contentView cr_ensureSubview:toolbarView |
| - isPositioned:NSWindowAbove |
| - relativeTo:[self tabContentArea]]; |
| - } else { |
| - // Toolbar is below tab contents so that the info bar arrow can appear above |
| - // it. |
| - [contentView cr_ensureSubview:toolbarView |
| - isPositioned:NSWindowBelow |
| - relativeTo:[self tabContentArea]]; |
| +- (void)updateInfoBarTipVisibility { |
| + // If there's no toolbar then hide the infobar tip. |
| + [infoBarContainerController_ |
| + setShouldSuppressTopInfoBarTip:![self hasToolbar]]; |
| +} |
| + |
| +- (NSInteger)infoBarMaxTopArrowHeight { |
| + LocationBarViewMac* locationBarView = [self locationBarBridge]; |
| + |
| + // The point, in window coordinates. |
| + NSPoint iconBottom = locationBarView->GetPageInfoBubblePoint(); |
| + |
| + // The toolbar, in window coordinates. |
| + NSView* toolbar = [toolbarController_ view]; |
| + CGFloat toolbarY = NSMinY([toolbar convertRect:[toolbar bounds] toView:nil]); |
| + |
| + return iconBottom.y - toolbarY; |
| +} |
| + |
| +- (void)enterAppKitFullscreen { |
| + DCHECK(base::mac::IsOSLionOrLater()); |
| + if (FramedBrowserWindow* framedBrowserWindow = |
| + base::mac::ObjCCast<FramedBrowserWindow>([self window])) { |
| + [framedBrowserWindow toggleSystemFullScreen]; |
| + } |
| +} |
| + |
| +- (void)exitAppKitFullscreen { |
| + DCHECK(base::mac::IsOSLionOrLater()); |
| + if (FramedBrowserWindow* framedBrowserWindow = |
| + base::mac::ObjCCast<FramedBrowserWindow>([self window])) { |
| + [framedBrowserWindow toggleSystemFullScreen]; |
| } |
| +} |
| + |
| +- (void)updateLayoutParameters:(BrowserWindowLayout*)layout { |
| + [layout setContentViewSize:[[[self window] contentView] bounds].size]; |
| + [layout setWindowSize:[[self window] frame].size]; |
| + |
| + [layout setInAnyFullscreen:[self isInFullscreenWithOmniboxSliding]]; |
| + [layout |
| + setFullscreenSlidingStyle:presentationModeController_.get().slidingStyle]; |
| + [layout |
| + setFullscreenMenubarOffset:[presentationModeController_ menubarOffset]]; |
| + [layout setFullscreenToolbarFraction:[presentationModeController_ |
|
Robert Sesek
2014/09/11 03:11:13
nit: break after : instead
erikchen
2014/09/12 00:21:29
I went ahead and updated all of the other lines in
|
| + toolbarFraction]]; |
| + |
| + [layout setHasTabStrip:[self hasTabStrip]]; |
| - // The bookmark bar is always below the toolbar. |
| - [contentView cr_ensureSubview:[bookmarkBarController_ view] |
| - isPositioned:NSWindowBelow |
| - relativeTo:toolbarView]; |
| + [layout setHasToolbar:[self hasToolbar]]; |
| + [layout setToolbarHeight:NSHeight([[toolbarController_ view] bounds])]; |
| - if (inAnyFullscreen) { |
| - // In presentation mode the info bar is below all other views. |
| - [contentView cr_ensureSubview:[infoBarContainerController_ view] |
| - isPositioned:NSWindowBelow |
| - relativeTo:[self tabContentArea]]; |
| + [layout setHasLocationBar:[self hasLocationBar]]; |
| + |
| + [layout setPlaceBookmarkBarBelowInfoBar:[self placeBookmarkBarBelowInfoBar]]; |
| + [layout setBookmarkBarHidden:[bookmarkBarController_ view].isHidden]; |
| + [layout |
| + setBookmarkBarHeight:NSHeight([[bookmarkBarController_ view] bounds])]; |
| + |
| + [layout setInfoBarHeight:[infoBarContainerController_ heightOfInfoBars]]; |
| + [layout setInfoBarMaxTopArrowHeight:[self infoBarMaxTopArrowHeight]]; |
| + |
| + [layout setHasDownloadShelf:(downloadShelfController_.get() != nil)]; |
| + [layout setDownloadShelfHeight:NSHeight( |
| + [[downloadShelfController_ view] bounds])]; |
| +} |
| + |
| +- (void)applyLayout:(BrowserWindowLayout*)layout { |
| + mac_browser::LayoutOutput output = [layout computeLayout]; |
| + |
| + if (!NSIsEmptyRect(output.tabStripFrame)) { |
| + // Note: The fullscreen parameter passed to the method is different from |
| + // the field in |parameters| with the similar name. |
| + [self layoutTabStripAtMaxY:NSMaxY(output.tabStripFrame) |
| + width:NSWidth(output.tabStripFrame) |
| + fullscreen:[self isInAnyFullscreenMode]]; |
| + } |
| + |
| + if (!NSIsEmptyRect(output.toolbarFrame)) { |
| + [[toolbarController_ view] setFrame:output.toolbarFrame]; |
| + } |
| + |
| + if (!NSIsEmptyRect(output.bookmarkFrame)) { |
| + NSView* bookmarkBarView = [bookmarkBarController_ view]; |
| + [bookmarkBarView setFrame:output.bookmarkFrame]; |
| + [bookmarkBarView setAutoresizingMask:NSViewWidthSizable | NSViewMinYMargin]; |
| + // TODO(viettrungluu): Does this really belong here? Calling it shouldn't be |
|
Robert Sesek
2014/09/11 03:11:13
Can we answer this question? :D
erikchen
2014/09/12 00:21:29
Done. It does belong here. (It's used during anima
|
| + // necessary in the non-NTP case. |
| + [bookmarkBarController_ layoutSubviews]; |
| + } |
| + |
| + // The info bar is never hidden. Sometimes it has zero effective height. |
| + [[infoBarContainerController_ view] setFrame:output.infoBarFrame]; |
| + [infoBarContainerController_ |
| + setMaxTopArrowHeight:output.infoBarMaxTopArrowHeight]; |
| + |
| + if (!NSIsEmptyRect(output.downloadShelfFrame)) |
| + [[downloadShelfController_ view] setFrame:output.downloadShelfFrame]; |
| + |
| + [self layoutTabContentArea:output.contentAreaFrame]; |
| + |
| + if (!NSIsEmptyRect(output.fullscreenBackingBarFrame)) { |
| + [floatingBarBackingView_ setFrame:output.fullscreenBackingBarFrame]; |
| + [presentationModeController_ |
| + overlayFrameChanged:output.fullscreenBackingBarFrame]; |
| + } |
| + |
| + [findBarCocoaController_ |
| + positionFindBarViewAtMaxY:output.findBarMaxY |
| + maxWidth:NSWidth(output.contentAreaFrame)]; |
| + |
| + [fullscreenExitBubbleController_ |
| + positionInWindowAtTop:output.fullscreenExitButtonMaxY |
| + width:NSWidth(output.contentAreaFrame)]; |
| +} |
| + |
| +- (void)updateSubviewZOrder { |
| + if ([self isInFullscreenWithOmniboxSliding]) |
| + [self updateSubviewZOrderFullscreen]; |
| + else |
| + [self updateSubviewZOrderNormal]; |
| + |
| + [self updateSubviewZOrderHack]; |
| +} |
| + |
| +- (void)updateSubviewZOrderNormal { |
| + base::scoped_nsobject<NSMutableArray> subviews([[NSMutableArray alloc] init]); |
| + if ([downloadShelfController_ view]) |
| + [subviews addObject:[downloadShelfController_ view]]; |
| + if ([bookmarkBarController_ view]) |
| + [subviews addObject:[bookmarkBarController_ view]]; |
| + if ([toolbarController_ view]) |
| + [subviews addObject:[toolbarController_ view]]; |
| + if ([infoBarContainerController_ view]) |
| + [subviews addObject:[infoBarContainerController_ view]]; |
| + if ([self tabContentArea]) |
| + [subviews addObject:[self tabContentArea]]; |
| + if ([findBarCocoaController_ view]) |
| + [subviews addObject:[findBarCocoaController_ view]]; |
| + |
| + [self setContentViewSubviews:subviews]; |
| +} |
| + |
| +- (void)updateSubviewZOrderFullscreen { |
| + base::scoped_nsobject<NSMutableArray> subviews([[NSMutableArray alloc] init]); |
| + if ([downloadShelfController_ view]) |
| + [subviews addObject:[downloadShelfController_ view]]; |
| + if ([infoBarContainerController_ view]) |
| + [subviews addObject:[infoBarContainerController_ view]]; |
| + if ([self tabContentArea]) |
| + [subviews addObject:[self tabContentArea]]; |
| + if ([self placeBookmarkBarBelowInfoBar]) { |
| + if ([bookmarkBarController_ view]) |
| + [subviews addObject:[bookmarkBarController_ view]]; |
| + if (floatingBarBackingView_) |
| + [subviews addObject:floatingBarBackingView_]; |
| } else { |
| - // Above the toolbar but still below tab contents. Similar to the bookmark |
| - // bar, this allows Instant results to be above the info bar. |
| - [contentView cr_ensureSubview:[infoBarContainerController_ view] |
| - isPositioned:NSWindowAbove |
| - relativeTo:toolbarView]; |
| + if (floatingBarBackingView_) |
| + [subviews addObject:floatingBarBackingView_]; |
| + if ([bookmarkBarController_ view]) |
| + [subviews addObject:[bookmarkBarController_ view]]; |
| } |
| - // The find bar is above everything. |
| - if (findBarCocoaController_) { |
| - NSView* relativeView = nil; |
| - if (inAnyFullscreen) |
| - relativeView = toolbarView; |
| - else |
| - relativeView = [self tabContentArea]; |
| - [contentView cr_ensureSubview:[findBarCocoaController_ view] |
| - isPositioned:NSWindowAbove |
| - relativeTo:relativeView]; |
| + if ([toolbarController_ view]) |
| + [subviews addObject:[toolbarController_ view]]; |
| + if ([findBarCocoaController_ view]) |
| + [subviews addObject:[findBarCocoaController_ view]]; |
| + |
| + [self setContentViewSubviews:subviews]; |
| +} |
| + |
| +- (void)setContentViewSubviews:(NSArray*)subviews { |
| + // Subviews already match. |
| + if ([[self.window.contentView subviews] isEqual:subviews]) |
| + return; |
| + |
| + // The tabContentArea isn't a subview, so just set all the subviews. |
| + NSView* tabContentArea = [self tabContentArea]; |
| + if (![[self.window.contentView subviews] containsObject:tabContentArea]) { |
| + [self.window.contentView setSubviews:subviews]; |
| + return; |
| } |
| - if (floatingBarBackingView_) { |
| - if ([floatingBarBackingView_ cr_isBelowView:[self tabContentArea]]) |
| - [floatingBarBackingView_ removeFromSuperview]; |
| - if ([self placeBookmarkBarBelowInfoBar]) { |
| - [contentView cr_ensureSubview:floatingBarBackingView_ |
| - isPositioned:NSWindowAbove |
| - relativeTo:[bookmarkBarController_ view]]; |
| - } else { |
| - [contentView cr_ensureSubview:floatingBarBackingView_ |
| - isPositioned:NSWindowBelow |
| - relativeTo:[bookmarkBarController_ view]]; |
| - } |
| + // Remove all subviews that aren't the tabContentArea. |
| + for (NSView* view in [[self.window.contentView subviews] copy]) { |
| + if (view != tabContentArea) |
| + [view removeFromSuperview]; |
| + } |
| - // TODO(erikchen): This constraint is necessary. See comment at the |
| - // beginning of the method. |
| - [contentView cr_ensureSubview:floatingBarBackingView_ |
| - isPositioned:NSWindowAbove |
| - relativeTo:[self tabContentArea]]; |
| + // Add in the subviews below the tabContentArea. |
| + NSInteger index = [subviews indexOfObject:tabContentArea]; |
| + for (int i = index - 1; i >= 0; --i) { |
| + NSView* view = [subviews objectAtIndex:i]; |
| + [self.window.contentView addSubview:view |
| + positioned:NSWindowBelow |
| + relativeTo:nil]; |
| } |
| + // Add in the subviews above the tabContentArea. |
| + for (NSUInteger i = index + 1; i < [subviews count]; ++i) { |
| + NSView* view = [subviews objectAtIndex:i]; |
| + [self.window.contentView addSubview:view |
| + positioned:NSWindowAbove |
| + relativeTo:nil]; |
| + } |
| +} |
| + |
| +- (void)updateSubviewZOrderHack { |
| // TODO(erikchen): Remove and then add the tabStripView to the root NSView. |
| // This fixes a layer ordering problem that occurs between the contentView |
| // and the tabStripView. This is a hack required because NSThemeFrame is not |
| @@ -1105,43 +1014,4 @@ willPositionSheet:(NSWindow*)sheet |
| } |
| } |
| -- (void)updateInfoBarTipVisibility { |
| - // If there's no toolbar then hide the infobar tip. |
| - [infoBarContainerController_ |
| - setShouldSuppressTopInfoBarTip:![self hasToolbar]]; |
| -} |
| - |
| -- (NSInteger)infoBarMaxTopArrowHeight { |
| - NSInteger topArrowHeight = 0; |
| - LocationBarViewMac* locationBarView = [self locationBarBridge]; |
| - NSPoint iconBottom = locationBarView->GetPageInfoBubblePoint(); |
| - |
| - CGFloat overlappingTipHeight = |
| - [infoBarContainerController_ overlappingTipHeight]; |
| - NSPoint infoBarTop = |
| - NSMakePoint(0, NSHeight([infoBarContainerController_ view].frame) - |
| - overlappingTipHeight); |
| - infoBarTop = [[infoBarContainerController_ view] convertPoint:infoBarTop |
| - toView:nil]; |
| - |
| - topArrowHeight = iconBottom.y - infoBarTop.y; |
| - return topArrowHeight; |
| -} |
| - |
| -- (void)enterAppKitFullscreen { |
| - DCHECK(base::mac::IsOSLionOrLater()); |
| - if (FramedBrowserWindow* framedBrowserWindow = |
| - base::mac::ObjCCast<FramedBrowserWindow>([self window])) { |
| - [framedBrowserWindow toggleSystemFullScreen]; |
| - } |
| -} |
| - |
| -- (void)exitAppKitFullscreen { |
| - DCHECK(base::mac::IsOSLionOrLater()); |
| - if (FramedBrowserWindow* framedBrowserWindow = |
| - base::mac::ObjCCast<FramedBrowserWindow>([self window])) { |
| - [framedBrowserWindow toggleSystemFullScreen]; |
| - } |
| -} |
| - |
| @end // @implementation BrowserWindowController(Private) |