| Index: chrome/browser/ui/cocoa/fullscreen_toolbar_controller.mm
|
| diff --git a/chrome/browser/ui/cocoa/fullscreen_toolbar_controller.mm b/chrome/browser/ui/cocoa/fullscreen_toolbar_controller.mm
|
| index e34cb4cb1cd6855e6bfc1b57bef253d304ea6508..e84f9ea822627483496c985b40cf39bfc6c69bfc 100644
|
| --- a/chrome/browser/ui/cocoa/fullscreen_toolbar_controller.mm
|
| +++ b/chrome/browser/ui/cocoa/fullscreen_toolbar_controller.mm
|
| @@ -18,7 +18,7 @@
|
| namespace {
|
|
|
| // The duration of the toolbar show/hide animation.
|
| -const NSTimeInterval kDropdownAnimationDuration = 0.20;
|
| +const NSTimeInterval kDropdownAnimationDuration = 0.17;
|
|
|
| // If the fullscreen toolbar is hidden, it is difficult for the user to see
|
| // changes in the tabstrip. As a result, if a tab is inserted or the current
|
| @@ -155,6 +155,10 @@ OSStatus MenuBarRevealHandler(EventHandlerCallRef handler,
|
| // current visibility of the menu bar.
|
| - (BOOL)doesScreenHaveMenuBar;
|
|
|
| +// Returns YES if the toolbar's visibility is locked or if the cursor is
|
| +// interacting with it.
|
| +- (BOOL)isToolbarFocused;
|
| +
|
| // Returns YES if the window is on the primary screen.
|
| - (BOOL)isWindowOnPrimaryScreen;
|
|
|
| @@ -191,6 +195,7 @@ OSStatus MenuBarRevealHandler(EventHandlerCallRef handler,
|
| browserController_ = controller;
|
| systemFullscreenMode_ = base::mac::kFullScreenModeNormal;
|
| slidingStyle_ = style;
|
| + hiddenToolbarState_ = fullscreen_mac::TOOLBAR_HIDDEN;
|
| }
|
|
|
| // Install the Carbon event handler for the menubar show, hide and
|
| @@ -267,7 +272,7 @@ OSStatus MenuBarRevealHandler(EventHandlerCallRef handler,
|
| return kFloatingBarVerticalOffset;
|
| }
|
|
|
| -- (void)ensureOverlayShownWithAnimation:(BOOL)animate {
|
| +- (void)showToolbarIfPossibleWithAnimation:(BOOL)animate {
|
| if (!inFullscreenMode_)
|
| return;
|
|
|
| @@ -281,15 +286,19 @@ OSStatus MenuBarRevealHandler(EventHandlerCallRef handler,
|
| [self animateToolbarVisibility:YES];
|
| }
|
|
|
| -- (void)ensureOverlayHiddenWithAnimation:(BOOL)animate {
|
| +- (void)hideToolbarIfPossibleWithAnimation:(BOOL)animate {
|
| if (!inFullscreenMode_)
|
| return;
|
|
|
| if (self.slidingStyle != fullscreen_mac::OMNIBOX_TABS_HIDDEN)
|
| return;
|
|
|
| + if ([self isToolbarFocused])
|
| + return;
|
| +
|
| [self cancelHideTimer];
|
| [self animateToolbarVisibility:NO];
|
| + shouldShowToolbarWithoutMenu_ = NO;
|
| }
|
|
|
| - (void)cancelAnimationAndTimer {
|
| @@ -304,10 +313,13 @@ OSStatus MenuBarRevealHandler(EventHandlerCallRef handler,
|
| return;
|
| }
|
|
|
| + if (self.slidingStyle != fullscreen_mac::OMNIBOX_TABS_HIDDEN)
|
| + return;
|
| +
|
| // Reveal the toolbar for tabstrip changes if the toolbar is hidden.
|
| - if (IsCGFloatEqual([self toolbarFraction], kHideFraction)) {
|
| + if (hiddenToolbarState_ == fullscreen_mac::TOOLBAR_HIDDEN) {
|
| isRevealingToolbarForTabStripChanges_ = YES;
|
| - [self ensureOverlayShownWithAnimation:YES];
|
| + [self showToolbarIfPossibleWithAnimation:YES];
|
| }
|
| }
|
|
|
| @@ -333,9 +345,11 @@ OSStatus MenuBarRevealHandler(EventHandlerCallRef handler,
|
|
|
| // If the menubar is gone, animate the toolbar out.
|
| if (IsCGFloatEqual(menubarFraction_, kHideFraction))
|
| - [self ensureOverlayHiddenWithAnimation:YES];
|
| + [self hideToolbarIfPossibleWithAnimation:YES];
|
|
|
| - [self removeTrackingAreaIfNecessary];
|
| + // We no longer need to track it if it's not focused.
|
| + if (![self isToolbarFocused])
|
| + [self removeTrackingAreaIfNecessary];
|
| }
|
|
|
| - (void)updateToolbar {
|
| @@ -368,9 +382,6 @@ OSStatus MenuBarRevealHandler(EventHandlerCallRef handler,
|
| }
|
|
|
| - (CGFloat)toolbarFraction {
|
| - if ([browserController_ isBarVisibilityLockedForOwner:nil])
|
| - return kShowFraction;
|
| -
|
| if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode))
|
| return kHideFraction;
|
|
|
| @@ -380,13 +391,16 @@ OSStatus MenuBarRevealHandler(EventHandlerCallRef handler,
|
| case fullscreen_mac::OMNIBOX_TABS_NONE:
|
| return kHideFraction;
|
| case fullscreen_mac::OMNIBOX_TABS_HIDDEN:
|
| + if (hiddenToolbarState_ == fullscreen_mac::TOOLBAR_SHOWN)
|
| + return kShowFraction;
|
| +
|
| + if (hiddenToolbarState_ == fullscreen_mac::TOOLBAR_HIDDEN)
|
| + return kHideFraction;
|
| +
|
| if (currentAnimation_.get())
|
| return [currentAnimation_ toolbarFraction];
|
|
|
| - if (hideTimer_.get() || shouldAnimateToolbarOut_)
|
| - return kShowFraction;
|
| -
|
| - return toolbarFractionFromMenuProgress_;
|
| + return shouldShowToolbarWithoutMenu_ ? kShowFraction : menubarFraction_;
|
| }
|
| }
|
|
|
| @@ -405,15 +419,26 @@ OSStatus MenuBarRevealHandler(EventHandlerCallRef handler,
|
|
|
| - (void)setTrackingAreaFromOverlayFrame:(NSRect)frame {
|
| NSRect contentBounds = [contentView_ bounds];
|
| + CGFloat yOffset =
|
| + kFloatingBarVerticalOffset - kTrackingAreaAdditionalThreshold;
|
| +
|
| trackingAreaFrame_ = frame;
|
| - trackingAreaFrame_.origin.y -= kTrackingAreaAdditionalThreshold;
|
| + trackingAreaFrame_.origin.y += yOffset;
|
| trackingAreaFrame_.size.height =
|
| NSMaxY(contentBounds) - trackingAreaFrame_.origin.y;
|
| }
|
|
|
| - (void)animationDidStop:(NSAnimation*)animation {
|
| + CGFloat toolbarFraction = [self toolbarFraction];
|
| + if (IsCGFloatEqual(toolbarFraction, 1.0))
|
| + hiddenToolbarState_ = fullscreen_mac::TOOLBAR_SHOWN;
|
| + else if (IsCGFloatEqual(toolbarFraction, 0.0))
|
| + hiddenToolbarState_ = fullscreen_mac::TOOLBAR_HIDDEN;
|
| + else
|
| + hiddenToolbarState_ = fullscreen_mac::TOOLBAR_TRANSITIONING;
|
| +
|
| if (isRevealingToolbarForTabStripChanges_) {
|
| - if ([self toolbarFraction] > 0.0) {
|
| + if (hiddenToolbarState_ != fullscreen_mac::TOOLBAR_HIDDEN) {
|
| // Set the timer to hide the toolbar.
|
| [hideTimer_ invalidate];
|
| hideTimer_.reset(
|
| @@ -442,20 +467,26 @@ OSStatus MenuBarRevealHandler(EventHandlerCallRef handler,
|
| if (![self isMouseOnScreen] && progress > menubarFraction_)
|
| return;
|
|
|
| + BOOL isMenuBarDisappearing = progress < menubarFraction_;
|
| menubarFraction_ = progress;
|
|
|
| if (self.slidingStyle == fullscreen_mac::OMNIBOX_TABS_HIDDEN) {
|
| - if (IsCGFloatEqual(menubarFraction_, kShowFraction))
|
| + shouldShowToolbarWithoutMenu_ =
|
| + shouldShowToolbarWithoutMenu_ ||
|
| + (isMenuBarDisappearing && [self isToolbarFocused]);
|
| +
|
| + if (IsCGFloatEqual(menubarFraction_, kShowFraction)) {
|
| [self setupTrackingArea];
|
| + hiddenToolbarState_ = fullscreen_mac::TOOLBAR_SHOWN;
|
| + }
|
|
|
| - // If the menubar is disappearing from the screen, check if the mouse
|
| - // is still interacting with the toolbar. If it is, don't set
|
| - // |toolbarFractionFromMenuProgress_| so that the the toolbar will remain
|
| - // on the screen.
|
| - BOOL isMenuBarDisappearing =
|
| - menubarFraction_ < toolbarFractionFromMenuProgress_;
|
| - if (!(isMenuBarDisappearing && [self mouseInsideTrackingArea]))
|
| - toolbarFractionFromMenuProgress_ = progress;
|
| + // If |shouldShowToolbarWithoutMenu_| is true, then |hiddenToolbarState_|
|
| + // should remain fullscreen_mac::TOOLBAR_SHOWN.
|
| + if (!shouldShowToolbarWithoutMenu_) {
|
| + hiddenToolbarState_ = IsCGFloatEqual(menubarFraction_, kHideFraction)
|
| + ? fullscreen_mac::TOOLBAR_HIDDEN
|
| + : fullscreen_mac::TOOLBAR_TRANSITIONING;
|
| + }
|
| }
|
|
|
| // If an animation is not running, then -layoutSubviews will not be called
|
| @@ -532,6 +563,13 @@ OSStatus MenuBarRevealHandler(EventHandlerCallRef handler,
|
| return eachScreenShouldHaveMenuBar ?: [self isWindowOnPrimaryScreen];
|
| }
|
|
|
| +- (BOOL)isToolbarFocused {
|
| + if ([browserController_ isBarVisibilityLockedForOwner:nil])
|
| + return YES;
|
| +
|
| + return [self mouseInsideTrackingArea] || menubarFraction_ == kShowFraction;
|
| +}
|
| +
|
| - (BOOL)isWindowOnPrimaryScreen {
|
| NSScreen* screen = [[browserController_ window] screen];
|
| NSScreen* primaryScreen = [[NSScreen screens] firstObject];
|
| @@ -571,6 +609,7 @@ OSStatus MenuBarRevealHandler(EventHandlerCallRef handler,
|
| [self removeTrackingAreaIfNecessary];
|
|
|
| [currentAnimation_ startAnimation];
|
| + hiddenToolbarState_ = fullscreen_mac::TOOLBAR_TRANSITIONING;
|
| }
|
|
|
| - (void)cancelHideTimer {
|
| @@ -582,9 +621,7 @@ OSStatus MenuBarRevealHandler(EventHandlerCallRef handler,
|
| DCHECK_EQ(hideTimer_, timer); // This better be our hide timer.
|
| [hideTimer_ invalidate]; // Make sure it doesn't repeat.
|
| hideTimer_.reset(); // And get rid of it.
|
| - shouldAnimateToolbarOut_ = YES;
|
| [self animateToolbarVisibility:NO];
|
| - shouldAnimateToolbarOut_ = NO;
|
| }
|
|
|
| - (void)cleanup {
|
|
|