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 00bc9a2d7f6f39bcc704b66cfc704b58e0758ef1..9cff4d3304f650f1e7bb99fd543d5ca915ab33cc 100644 |
| --- a/chrome/browser/ui/cocoa/browser_window_controller_private.mm |
| +++ b/chrome/browser/ui/cocoa/browser_window_controller_private.mm |
| @@ -23,7 +23,6 @@ |
| #import "chrome/browser/ui/cocoa/find_bar/find_bar_cocoa_controller.h" |
| #import "chrome/browser/ui/cocoa/floating_bar_backing_view.h" |
| #import "chrome/browser/ui/cocoa/framed_browser_window.h" |
| -#import "chrome/browser/ui/cocoa/fullscreen_mode_controller.h" |
| #import "chrome/browser/ui/cocoa/fullscreen_window.h" |
| #import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h" |
| #include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h" |
| @@ -90,7 +89,9 @@ const CGFloat kLocBarBottomInset = 1; |
| // If we're in fullscreen mode, save the position of the regular window |
| // instead. |
| - NSWindow* window = [self isFullscreen] ? savedRegularWindow_ : [self window]; |
| + NSWindow* window = [self isInOrEnteringAnyFullscreenMode] |
| + ? savedRegularWindow_ |
| + : [self window]; |
| // Window positions are stored relative to the origin of the primary monitor. |
| NSRect monitorFrame = [[[NSScreen screens] objectAtIndex:0] frame]; |
| @@ -105,7 +106,7 @@ const CGFloat kLocBarBottomInset = 1; |
| ui::WindowShowState show_state = ui::SHOW_STATE_NORMAL; |
| if ([window isMiniaturized]) |
| show_state = ui::SHOW_STATE_MINIMIZED; |
| - else if ([self isFullscreen]) |
| + else if ([self isInOrEnteringAnyFullscreenMode]) |
| show_state = ui::SHOW_STATE_FULLSCREEN; |
| chrome::SaveWindowPlacement(browser_.get(), bounds, show_state); |
| @@ -188,23 +189,47 @@ willPositionSheet:(NSWindow*)sheet |
| CGFloat minY = NSMinY(contentBounds); |
| CGFloat width = NSWidth(contentBounds); |
| - BOOL useSimplifiedFullscreen = CommandLine::ForCurrentProcess()->HasSwitch( |
| - switches::kEnableSimplifiedFullscreen); |
| - |
| // 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 inPresentationMode]]; |
| + [self updateSubviewZOrder:[self isInFullscreenWithOmniboxSliding]]; |
| - BOOL inPresentationMode = [self inPresentationMode]; |
| CGFloat floatingBarHeight = [self floatingBarHeight]; |
| - // In presentation mode, |yOffset| accounts for the sliding position of the |
| - // floating bar and the extra offset needed to dodge the menu bar. |
| - CGFloat yOffset = inPresentationMode && !useSimplifiedFullscreen ? |
| - (std::floor((1 - floatingBarShownFraction_) * floatingBarHeight) - |
| - [presentationModeController_ floatingBarVerticalOffset]) : 0; |
| + CGFloat yOffset = 0; |
| + if ([self isInFullscreenWithOmniboxSliding]) { |
| + switch (fullscreenStyle_) { |
| + case fullscreen_mac::OMNIBOX_TABS_PRESENT: |
| + // In system fullscreen mode, |yOffset| accounts for the extra offset |
| + // needed to dodge the menu bar. |
| + yOffset = -std::floor( |
| + (floatingBarShownFraction_) * |
| + [presentationModeController_ floatingBarVerticalOffset]); |
| + break; |
| + case fullscreen_mac::OMNIBOX_PRESENT: { |
| + // At rest: omnibox showing. yOffset should be tabstrip height |
| + // When cursor is at top: everything shows. yOffset should be -menubar |
| + // height. |
| + CGFloat tabStripHeight = 0; |
| + if ([self hasTabStrip]) |
| + tabStripHeight = NSHeight([[self tabStripView] frame]); |
| + yOffset = std::floor( |
| + (1 - floatingBarShownFraction_) * tabStripHeight - |
| + floatingBarShownFraction_ * |
| + [presentationModeController_ floatingBarVerticalOffset]); |
| + 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 - floatingBarShownFraction_) * floatingBarHeight) - |
| + [presentationModeController_ floatingBarVerticalOffset]; |
| + break; |
| + } |
| + } |
| + |
| CGFloat maxY = NSMaxY(contentBounds) + yOffset; |
| if ([self hasTabStrip]) { |
| @@ -212,20 +237,9 @@ willPositionSheet:(NSWindow*)sheet |
| // value, and then lay out the tab strip. |
| NSRect windowFrame = [contentView convertRect:[window frame] fromView:nil]; |
| maxY = NSHeight(windowFrame) + yOffset; |
| - if (useSimplifiedFullscreen && [self isFullscreen]) { |
| - CGFloat tabStripHeight = NSHeight([[self tabStripView] frame]); |
| - CGFloat revealAmount = (1 - floatingBarShownFraction_) * tabStripHeight; |
| - // In simplified fullscreen, only the toolbar is visible by default, and |
| - // the tabstrip and menu bar come down (each separately) when the user |
| - // mouses near the top of the window. Push the maxY of the toolbar up by |
| - // the amount of the tabstrip that is revealed, while removing the amount |
| - // of space needed by the menu bar. |
| - maxY += std::floor( |
| - revealAmount - [fullscreenModeController_ menuBarHeight]); |
| - } |
| maxY = [self layoutTabStripAtMaxY:maxY |
| width:width |
| - fullscreen:[self isFullscreen]]; |
| + fullscreen:[self isInOrEnteringAnyFullscreenMode]]; |
| } |
| // Sanity-check |maxY|. |
| @@ -245,7 +259,7 @@ willPositionSheet:(NSWindow*)sheet |
| NSRect floatingBarBackingRect = |
| NSMakeRect(minX, maxY, width, floatingBarHeight); |
| [self layoutFloatingBarBackingView:floatingBarBackingRect |
| - presentationMode:inPresentationMode]; |
| + 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 |
| @@ -253,11 +267,20 @@ willPositionSheet:(NSWindow*)sheet |
| [findBarCocoaController_ positionFindBarViewAtMaxY:maxY maxWidth:width]; |
| [fullscreenExitBubbleController_ positionInWindowAtTop:maxY width:width]; |
| - // 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. |
| - if (inPresentationMode || |
| - (useSimplifiedFullscreen && !fullscreenUrl_.is_empty())) { |
| - maxY = NSMaxY(contentBounds); |
| + if ([self isInFullscreenWithOmniboxSliding]) { |
| + switch (fullscreenStyle_) { |
| + case fullscreen_mac::OMNIBOX_TABS_PRESENT: |
| + case fullscreen_mac::OMNIBOX_PRESENT: |
| + // Do nothing in system fullscreen and simplified 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 |
| @@ -281,10 +304,12 @@ willPositionSheet:(NSWindow*)sheet |
| } |
| - (CGFloat)floatingBarHeight { |
| - if (![self inPresentationMode]) |
| + if (![self isInFullscreenWithOmniboxSliding]) |
| return 0; |
| - CGFloat totalHeight = [presentationModeController_ floatingBarVerticalOffset]; |
| + CGFloat totalHeight = 0; |
| + if (presentationModeController_) |
| + totalHeight = [presentationModeController_ floatingBarVerticalOffset]; |
| if ([self hasTabStrip]) |
| totalHeight += NSHeight([[self tabStripView] frame]); |
| @@ -328,7 +353,7 @@ willPositionSheet:(NSWindow*)sheet |
| if ([self shouldUseNewAvatarButton]) { |
| // The fullscreen icon is displayed to the right of the avatar button. |
| - if (![self isFullscreen]) |
| + if (![self isInOrEnteringAnyFullscreenMode]) |
| badgeXOffset -= kFullscreenIconWidth; |
| // Center the button vertically on the tabstrip. |
| badgeYOffset = (tabStripHeight - buttonHeight) / 2; |
| @@ -364,7 +389,7 @@ willPositionSheet:(NSWindow*)sheet |
| // When the fullscreen icon is not displayed, return its width to the |
| // tabstrip. |
| - if ([self isFullscreen]) |
| + if ([self isInOrEnteringAnyFullscreenMode]) |
| rightIndent -= kFullscreenIconWidth; |
| } |
| } else if ([self shouldShowAvatar]) { |
| @@ -515,7 +540,8 @@ willPositionSheet:(NSWindow*)sheet |
| } |
| - (void)updateRoundedBottomCorners { |
| - [[self tabContentArea] setRoundedBottomCorners:![self isFullscreen]]; |
| + [[self tabContentArea] |
| + setRoundedBottomCorners:![self isInOrEnteringAnyFullscreenMode]]; |
| } |
| - (void)adjustToolbarAndBookmarkBarForCompression:(CGFloat)compression { |
| @@ -643,22 +669,13 @@ willPositionSheet:(NSWindow*)sheet |
| delay:YES]; |
| } |
| -- (void)setPresentationModeInternal:(BOOL)presentationMode |
| - forceDropdown:(BOOL)forceDropdown { |
| - if (presentationMode == [self inPresentationMode]) |
| - return; |
| - |
| - if (presentationMode) { |
| +- (BOOL)commonAppKitFullscreenSetup { |
|
Robert Sesek
2014/08/27 22:04:30
nit: method indention is off
erikchen
2014/08/28 00:50:28
You're right. Wonder why clang-format didn't catch
|
| BOOL fullscreen_for_tab = |
| browser_->fullscreen_controller()->IsWindowFullscreenForTabOrPending(); |
| BOOL kiosk_mode = |
| CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode); |
| - BOOL showDropdown = !fullscreen_for_tab && |
| - !kiosk_mode && |
| - (forceDropdown || [self floatingBarHasFocus]); |
| - presentationModeController_.reset( |
| - [[PresentationModeController alloc] initWithBrowserController:self]); |
| - |
| + BOOL showDropdown = |
| + !fullscreen_for_tab && !kiosk_mode && ([self floatingBarHasFocus]); |
| if (permissionBubbleCocoa_ && permissionBubbleCocoa_->IsVisible()) { |
| DCHECK(permissionBubbleCocoa_->window()); |
| // A visible permission bubble will force the dropdown to remain visible. |
| @@ -686,20 +703,51 @@ willPositionSheet:(NSWindow*)sheet |
| windowViewWantsLayer_ = [[[self window] cr_windowView] wantsLayer]; |
| [[[self window] cr_windowView] setWantsLayer:YES]; |
| } |
| - NSView* contentView = [[self window] contentView]; |
| - [presentationModeController_ enterPresentationModeForContentView:contentView |
| - showDropdown:showDropdown]; |
| - } else { |
| + return showDropdown; |
| +} |
| + |
| +- (void)adjustUIForExitingFullscreenAndStopOmniboxSliding { |
| + [presentationModeController_ exitPresentationMode]; |
| + presentationModeController_.reset(); |
| + |
| + // Force the bookmark bar z-order to update. |
| + [[bookmarkBarController_ view] removeFromSuperview]; |
| + [self layoutSubviews]; |
| +} |
| + |
| +- (void)adjustUIForSlidingFullscreenStyle:(fullscreen_mac::SlidingStyle)style { |
| + fullscreenStyle_ = style; |
| + |
| + if (!presentationModeController_) { |
| + // Kill the "fullscreen" controller if needed. |
| + // TODO: consider not doing this? |
| [presentationModeController_ exitPresentationMode]; |
| - presentationModeController_.reset(); |
| + presentationModeController_.reset( |
| + [[PresentationModeController alloc] initWithBrowserController:self]); |
| + |
| + BOOL showDropdown = [self commonAppKitFullscreenSetup]; |
| + |
| + NSView* contentView = [[self window] contentView]; |
| + [presentationModeController_ |
| + enterPresentationModeForContentView:contentView |
| + showDropdown:showDropdown]; |
| + } |
| + |
| + if (!floatingBarBackingView_.get() && |
| + ([self hasTabStrip] || [self hasToolbar] || [self hasLocationBar])) { |
| + floatingBarBackingView_.reset( |
| + [[FloatingBarBackingView alloc] initWithFrame:NSZeroRect]); |
| + [floatingBarBackingView_ |
| + setAutoresizingMask:(NSViewWidthSizable | NSViewMinYMargin)]; |
| } |
| - [self adjustUIForPresentationMode:presentationMode]; |
| + // Force the bookmark bar z-order to update. |
| + [[bookmarkBarController_ view] removeFromSuperview]; |
| [self layoutSubviews]; |
| } |
| - (void)enterImmersiveFullscreen { |
| - // |-isFullscreen:| will return YES from here onwards. |
| + // |-isInOrEnteringAnyFullscreenMode| will return YES from here onwards. |
| enteringFullscreen_ = YES; // Set to NO by |-windowDidEnterFullScreen:|. |
| // Fade to black. |
| @@ -724,12 +772,13 @@ willPositionSheet:(NSWindow*)sheet |
| // When simplified fullscreen is enabled, do not enter presentation mode. |
| const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| + fullscreen_mac::SlidingStyle style; |
| if (command_line->HasSwitch(switches::kEnableSimplifiedFullscreen)) { |
| - // TODO(rohitrao): Add code to manage the menubar here. |
| + style = fullscreen_mac::OMNIBOX_PRESENT; |
| } else { |
| - [self adjustUIForPresentationMode:YES]; |
| - [self setPresentationModeInternal:YES forceDropdown:NO]; |
| + style = fullscreen_mac::OMNIBOX_TABS_HIDDEN; |
| } |
| + [self adjustUIForSlidingFullscreenStyle:style]; |
| // AppKit is helpful and prevents NSWindows from having the same height as |
| // the screen while the menu bar is showing. This only applies to windows on |
| @@ -799,24 +848,6 @@ willPositionSheet:(NSWindow*)sheet |
| } |
| } |
| -// TODO(rohitrao): This function has shrunk into uselessness, and |
| -// |-setFullscreen:| has grown rather large. Find a good way to break up |
| -// |-setFullscreen:| into smaller pieces. http://crbug.com/36449 |
| -- (void)adjustUIForPresentationMode:(BOOL)fullscreen { |
| - // Create the floating bar backing view if necessary. |
| - if (fullscreen && !floatingBarBackingView_.get() && |
| - ([self hasTabStrip] || [self hasToolbar] || [self hasLocationBar])) { |
| - floatingBarBackingView_.reset( |
| - [[FloatingBarBackingView alloc] initWithFrame:NSZeroRect]); |
| - [floatingBarBackingView_ setAutoresizingMask:(NSViewWidthSizable | |
| - NSViewMinYMargin)]; |
| - } |
| - |
| - // Force the bookmark bar z-order to update. |
| - [[bookmarkBarController_ view] removeFromSuperview]; |
| - [self updateSubviewZOrder:fullscreen]; |
| -} |
| - |
| - (void)showFullscreenExitBubbleIfNecessary { |
| // This method is called in response to |
| // |-updateFullscreenExitBubbleURL:bubbleType:|. If we're in the middle of the |
| @@ -890,7 +921,17 @@ willPositionSheet:(NSWindow*)sheet |
| BOOL mode = enteringPresentationMode_ || |
| browser_->fullscreen_controller()->IsWindowFullscreenForTabOrPending(); |
| enteringFullscreen_ = YES; |
| - [self setPresentationModeInternal:mode forceDropdown:NO]; |
| + |
| + fullscreen_mac::SlidingStyle style; |
| + const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| + if (command_line->HasSwitch(switches::kEnableSimplifiedFullscreen)) |
| + style = fullscreen_mac::OMNIBOX_PRESENT; |
| + else if (mode) |
| + style = fullscreen_mac::OMNIBOX_TABS_HIDDEN; |
| + else |
| + style = fullscreen_mac::OMNIBOX_TABS_PRESENT; |
| + |
| + [self adjustUIForSlidingFullscreenStyle:style]; |
| } |
| - (void)windowDidEnterFullScreen:(NSNotification*)notification { |
| @@ -912,13 +953,6 @@ willPositionSheet:(NSWindow*)sheet |
| enteringFullscreen_ = NO; |
| enteringPresentationMode_ = NO; |
| - const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| - if (command_line->HasSwitch(switches::kEnableSimplifiedFullscreen) && |
| - fullscreenUrl_.is_empty()) { |
| - fullscreenModeController_.reset([[FullscreenModeController alloc] |
| - initWithBrowserWindowController:self]); |
| - } |
| - |
| [self showFullscreenExitBubbleIfNecessary]; |
| browser_->WindowFullscreenStateChanged(); |
| [[[self window] cr_windowView] setWantsLayer:windowViewWantsLayer_]; |
| @@ -928,9 +962,8 @@ willPositionSheet:(NSWindow*)sheet |
| - (void)windowWillExitFullScreen:(NSNotification*)notification { |
| if (notification) // For System Fullscreen when non-nil. |
| [self registerForContentViewResizeNotifications]; |
| - fullscreenModeController_.reset(); |
| [self destroyFullscreenExitBubbleIfNecessary]; |
| - [self setPresentationModeInternal:NO forceDropdown:NO]; |
| + [self adjustUIForExitingFullscreenAndStopOmniboxSliding]; |
| } |
| - (void)windowDidExitFullScreen:(NSNotification*)notification { |
| @@ -943,10 +976,7 @@ willPositionSheet:(NSWindow*)sheet |
| - (void)windowDidFailToEnterFullScreen:(NSWindow*)window { |
| [self deregisterForContentViewResizeNotifications]; |
| enteringFullscreen_ = NO; |
| - [self setPresentationModeInternal:NO forceDropdown:NO]; |
| - |
| - // Force a relayout to try and get the window back into a reasonable state. |
| - [self layoutSubviews]; |
| + [self adjustUIForExitingFullscreenAndStopOmniboxSliding]; |
| } |
| - (void)windowDidFailToExitFullScreen:(NSWindow*)window { |
| @@ -989,11 +1019,17 @@ willPositionSheet:(NSWindow*)sheet |
| return [bookmarkBarController_ toolbarDividerOpacity]; |
| } |
| -- (void)updateSubviewZOrder:(BOOL)inPresentationMode { |
| +// 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. I have 3 subviews: A, B, C, in that order. |
| +// The method cr_ensureSubviuw: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 (inPresentationMode) { |
| + if (inAnyFullscreen) { |
| // Toolbar is above tab contents so that it can slide down from top of |
| // screen. |
| [contentView cr_ensureSubview:toolbarView |
| @@ -1012,7 +1048,7 @@ willPositionSheet:(NSWindow*)sheet |
| isPositioned:NSWindowBelow |
| relativeTo:toolbarView]; |
| - if (inPresentationMode) { |
| + if (inAnyFullscreen) { |
| // In presentation mode the info bar is below all other views. |
| [contentView cr_ensureSubview:[infoBarContainerController_ view] |
| isPositioned:NSWindowBelow |
| @@ -1028,7 +1064,7 @@ willPositionSheet:(NSWindow*)sheet |
| // The find bar is above everything. |
| if (findBarCocoaController_) { |
| NSView* relativeView = nil; |
| - if (inPresentationMode) |
| + if (inAnyFullscreen) |
| relativeView = toolbarView; |
| else |
| relativeView = [self tabContentArea]; |
| @@ -1049,6 +1085,46 @@ willPositionSheet:(NSWindow*)sheet |
| isPositioned:NSWindowBelow |
| relativeTo:[bookmarkBarController_ view]]; |
| } |
| + |
| + // TODO(erikchen): This constraint is necessary. See comment at the |
| + // beginning of the method. |
| + [contentView cr_ensureSubview:floatingBarBackingView_ |
| + isPositioned:NSWindowAbove |
| + relativeTo:[self tabContentArea]]; |
| + } |
| + |
| + // 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 |
| + // layer backed, and because we add subviews directly to the NSThemeFrame. |
| + // http://crbug.com/407921 |
| + if (enteringFullscreen_) { |
| + // Disable implicit animations. |
| + [CATransaction begin]; |
| + [CATransaction setDisableActions:YES]; |
| + |
| + // Get the current position of the tabStripView. |
| + NSView* superview = [[self tabStripView] superview]; |
| + NSArray* subviews = [superview subviews]; |
| + NSInteger index = [subviews indexOfObject:[self tabStripView]]; |
| + NSView* siblingBelow = nil; |
| + if (index > 0) |
| + siblingBelow = [subviews objectAtIndex:index - 1]; |
| + |
| + // Remove the tabStripView. |
| + [[self tabStripView] removeFromSuperview]; |
| + |
| + // Add it to the same position. |
| + if (siblingBelow) |
|
Robert Sesek
2014/08/27 22:04:30
nit: needs braces since body is multi-line
erikchen
2014/08/28 00:50:28
Done.
|
| + [superview addSubview:[self tabStripView] |
| + positioned:NSWindowAbove |
| + relativeTo:siblingBelow]; |
| + else |
| + [superview addSubview:[self tabStripView] |
| + positioned:NSWindowBelow |
| + relativeTo:nil]; |
| + |
| + [CATransaction commit]; |
| } |
| } |
| @@ -1058,4 +1134,18 @@ willPositionSheet:(NSWindow*)sheet |
| setShouldSuppressTopInfoBarTip:![self hasToolbar]]; |
| } |
| +- (void)enterAppKitFullscreen { |
| + if (FramedBrowserWindow* framedBrowserWindow = |
| + base::mac::ObjCCast<FramedBrowserWindow>([self window])) { |
| + [framedBrowserWindow toggleSystemFullScreen]; |
| + } |
| +} |
| + |
| +- (void)exitAppKitFullscreen { |
| + if (FramedBrowserWindow* framedBrowserWindow = |
| + base::mac::ObjCCast<FramedBrowserWindow>([self window])) { |
| + [framedBrowserWindow toggleSystemFullScreen]; |
| + } |
| +} |
| + |
| @end // @implementation BrowserWindowController(Private) |