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 7d31c4ee7905395621c605fa6f9f26f1d3cd08d1..1232c9d22657782ea7d8ef30e4e22fe15941512e 100644 |
--- a/chrome/browser/ui/cocoa/browser_window_controller_private.mm |
+++ b/chrome/browser/ui/cocoa/browser_window_controller_private.mm |
@@ -32,6 +32,7 @@ |
#import "chrome/browser/ui/cocoa/tabs/tab_strip_view.h" |
#import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" |
#include "chrome/browser/ui/fullscreen/fullscreen_controller.h" |
+#include "chrome/browser/ui/search/search_model.h" |
#include "chrome/browser/ui/search/search_ui.h" |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/pref_names.h" |
@@ -176,6 +177,9 @@ willPositionSheet:(NSWindow*)sheet |
if ([window respondsToSelector:@selector(setShouldHideTitle:)]) |
[(id)window setShouldHideTitle:![self hasTitleBar]]; |
+ // Update z-order. The code below depends on this. |
+ [self updateSubviewZOrder]; |
+ |
BOOL inPresentationMode = [self inPresentationMode]; |
CGFloat floatingBarHeight = [self floatingBarHeight]; |
// In presentation mode, |yOffset| accounts for the sliding position of the |
@@ -201,6 +205,7 @@ willPositionSheet:(NSWindow*)sheet |
// Place the toolbar at the top of the reserved area. |
maxY = [self layoutToolbarAtMinX:minX maxY:maxY width:width]; |
+ CGFloat toolbarBottomY = maxY; |
// If we're not displaying the bookmark bar below the infobar, then it goes |
// immediately below the toolbar. |
@@ -242,14 +247,25 @@ willPositionSheet:(NSWindow*)sheet |
} |
} |
- // Finally, the content area takes up all of the remaining space. |
- NSRect contentAreaRect = NSMakeRect(minX, minY, width, maxY - minY); |
+ // In presentation mode the content area takes up all the remaining space |
+ // (from the bottom of the infobar down). In normal mode the content area |
+ // takes up the space between the bottom of the toolbar down. |
+ CGFloat contentAreaTop = 0; |
+ if (inPresentationMode) { |
+ toolbarToWebContentsOffset_ = 0; |
+ contentAreaTop = maxY; |
+ } else { |
+ toolbarToWebContentsOffset_ = toolbarBottomY - maxY; |
+ contentAreaTop = toolbarBottomY; |
+ } |
+ [self updateContentOffsets]; |
+ |
+ NSRect contentAreaRect = NSMakeRect(minX, minY, width, contentAreaTop - minY); |
[self layoutTabContentArea:contentAreaRect]; |
// Normally, we don't need to tell the toolbar whether or not to show the |
// divider, but things break down during animation. |
- [toolbarController_ |
- setDividerOpacity:[bookmarkBarController_ toolbarDividerOpacity]]; |
+ [toolbarController_ setDividerOpacity:[self toolbarDividerOpacity]]; |
} |
- (CGFloat)floatingBarHeight { |
@@ -425,22 +441,6 @@ willPositionSheet:(NSWindow*)sheet |
// 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()) { |
- BOOL aboveBookmarkBar = [self placeBookmarkBarBelowInfoBar]; |
- |
- // Insert it into the view hierarchy if necessary. |
- if (![floatingBarBackingView_ superview] || |
- aboveBookmarkBar != floatingBarAboveBookmarkBar_) { |
- NSView* contentView = [[self window] contentView]; |
- // z-order gets messed up unless we explicitly remove the floatingbar |
- // view and re-add it. |
- [floatingBarBackingView_ removeFromSuperview]; |
- [contentView addSubview:floatingBarBackingView_ |
- positioned:(aboveBookmarkBar ? |
- NSWindowAbove : NSWindowBelow) |
- relativeTo:[bookmarkBarController_ view]]; |
- floatingBarAboveBookmarkBar_ = aboveBookmarkBar; |
- } |
- |
// Set its frame. |
[floatingBarBackingView_ setFrame:frame]; |
} |
@@ -728,15 +728,9 @@ willPositionSheet:(NSWindow*)sheet |
NSViewMinYMargin)]; |
} |
- // Adjust the infobar container. In fullscreen, it needs to be below all |
- // top chrome elements so it only sits atop the web contents. When in normal |
- // mode, it needs to draw over the bookmark bar and part of the toolbar. |
- [[infoBarContainerController_ view] removeFromSuperview]; |
- NSView* infoBarDest = [[self window] contentView]; |
- [infoBarDest addSubview:[infoBarContainerController_ view] |
- positioned:fullscreen ? NSWindowBelow : NSWindowAbove |
- relativeTo:fullscreen ? nil |
- : [toolbarController_ view]]; |
+ // Force the bookmark bar z-order to update. |
+ [[bookmarkBarController_ view] removeFromSuperview]; |
+ [self updateSubviewZOrder]; |
} |
- (void)showFullscreenExitBubbleIfNecessary { |
@@ -873,4 +867,117 @@ willPositionSheet:(NSWindow*)sheet |
[presentationModeController_ cancelAnimationAndTimers]; |
} |
+- (CGFloat)toolbarDividerOpacity { |
+ if ([self isShowingInstantResults]) |
+ return 1; |
+ return [bookmarkBarController_ toolbarDividerOpacity]; |
+} |
+ |
+- (BOOL)isShowingInstantResults { |
+ if (!browser_->search_model()->mode().is_search_suggestions()) |
+ return NO; |
+ |
+ // If the search suggestions are already being displayed in the preview |
+ // contents then return YES. |
+ if ([previewableContentsController_ isShowingPreview]) |
+ return YES; |
+ |
+ // Search suggestions might be shown directly in the web contents in some |
+ // cases. |
+ return browser_->search_model()->mode().origin == |
+ chrome::search::Mode::ORIGIN_SEARCH; |
+} |
+ |
+- (void)updateContentOffsets { |
+ // Normally the preview contents is used to show instant results which must |
+ // obscure the bookmark bar. This is achieved by setting the offset to 0 |
+ // so that it overlaps the bookmark bar. The only exception is when the |
+ // preview contents is showing the NTP which must sit below the bookmark bar. |
+ CGFloat previewOffset = 0; |
+ if (browser_->search_model()->mode().is_ntp()) |
+ previewOffset = toolbarToWebContentsOffset_; |
+ [previewableContentsController_ setPreviewOffset:previewOffset]; |
+ |
+ // Normally the tab contents sits below the bookmark bar. This is achieved by |
+ // setting the offset to the height of the bookmark bar. The only exception |
+ // is on the search results page where the instant results are shown inside |
+ // the page and not in the preview contents as usual. |
+ CGFloat tabContentsOffset = toolbarToWebContentsOffset_; |
+ if (browser_->search_model()->mode().is_search_suggestions() && |
+ browser_->search_model()->mode().origin == |
+ chrome::search::Mode::ORIGIN_SEARCH) { |
+ tabContentsOffset = 0; |
+ } |
+ [previewableContentsController_ setActiveContainerOffset:tabContentsOffset]; |
+ |
+ // Prevent the fast resize view from drawing white over the bookmark bar. |
+ [[self tabContentArea] setContentOffset:toolbarToWebContentsOffset_]; |
+} |
+ |
+- (void)updateSubviewZOrder { |
+ NSView* contentView = [[self window] contentView]; |
+ NSView* toolbarView = [toolbarController_ view]; |
+ |
+ if ([self inPresentationMode]) { |
+ // 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 infobar arrow can appear above |
+ // it. Unlike other views the toolbar never overlaps the actual web |
+ // content. |
+ [contentView cr_ensureSubview:toolbarView |
+ isPositioned:NSWindowBelow |
+ relativeTo:[self tabContentArea]]; |
+ } |
+ |
+ // The bookmark bar is always below the toolbar. In normal mode this means |
+ // that it is below tab contents. This allows instant results to be above |
+ // the bookmark bar. |
+ [contentView cr_ensureSubview:[bookmarkBarController_ view] |
+ isPositioned:NSWindowBelow |
+ relativeTo:toolbarView]; |
+ |
+ if ([self inPresentationMode]) { |
+ // In presentation mode the infobar is below all other views. |
+ [contentView cr_ensureSubview:[infoBarContainerController_ view] |
+ isPositioned:NSWindowBelow |
+ relativeTo:[self tabContentArea]]; |
+ } 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]; |
+ } |
+ |
+ // The find bar is above everything except instant search results. |
+ if (findBarCocoaController_) { |
+ NSView* relativeView = nil; |
+ if ([self inPresentationMode]) |
+ relativeView = toolbarView; |
+ else if ([self isShowingInstantResults]) |
+ relativeView = [infoBarContainerController_ view]; |
+ else |
+ relativeView = [self tabContentArea]; |
+ [contentView cr_ensureSubview:[findBarCocoaController_ view] |
+ isPositioned:NSWindowAbove |
+ relativeTo:relativeView]; |
+ } |
+ |
+ if (floatingBarBackingView_) { |
+ if ([self placeBookmarkBarBelowInfoBar]) { |
+ [contentView cr_ensureSubview:floatingBarBackingView_ |
+ isPositioned:NSWindowAbove |
+ relativeTo:[bookmarkBarController_ view]]; |
+ } else { |
+ [contentView cr_ensureSubview:floatingBarBackingView_ |
+ isPositioned:NSWindowBelow |
+ relativeTo:[bookmarkBarController_ view]]; |
+ } |
+ } |
+} |
+ |
@end // @implementation BrowserWindowController(Private) |