Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "chrome/browser/ui/cocoa/fullscreen_toolbar_controller.h" | 5 #import "chrome/browser/ui/cocoa/fullscreen_toolbar_controller.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #import "base/auto_reset.h" | |
| 10 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 11 #import "base/mac/mac_util.h" | 10 #import "base/mac/mac_util.h" |
| 12 #include "base/mac/sdk_forward_declarations.h" | 11 #include "base/mac/sdk_forward_declarations.h" |
| 13 #import "chrome/browser/ui/cocoa/browser_window_controller.h" | 12 #import "chrome/browser/ui/cocoa/browser_window_controller.h" |
| 14 #import "chrome/browser/ui/cocoa/fullscreen/fullscreen_menubar_tracker.h" | 13 #import "chrome/browser/ui/cocoa/fullscreen/fullscreen_menubar_tracker.h" |
| 14 #import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_animation_control ler.h" | |
| 15 #include "chrome/common/chrome_switches.h" | 15 #include "chrome/common/chrome_switches.h" |
| 16 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMNSAnimation+Duration.h " | |
| 17 #include "ui/base/cocoa/appkit_utils.h" | 16 #include "ui/base/cocoa/appkit_utils.h" |
| 18 #import "ui/base/cocoa/nsview_additions.h" | 17 #import "ui/base/cocoa/nsview_additions.h" |
| 19 #import "ui/base/cocoa/tracking_area.h" | 18 #import "ui/base/cocoa/tracking_area.h" |
| 20 | 19 |
| 21 namespace { | 20 namespace { |
| 22 | 21 |
| 23 // The duration of the toolbar show/hide animation. | |
| 24 const NSTimeInterval kDropdownAnimationDuration = 0.20; | |
| 25 | |
| 26 // If the fullscreen toolbar is hidden, it is difficult for the user to see | |
| 27 // changes in the tabstrip. As a result, if a tab is inserted or the current | |
| 28 // tab switched to a new one, the toolbar must animate in and out to display | |
| 29 // the tabstrip changes to the user. The animation drops down the toolbar and | |
| 30 // then wait for 0.75 seconds before it hides the toolbar. | |
| 31 const NSTimeInterval kTabStripChangesDelay = 0.75; | |
| 32 | |
| 33 // Additional height threshold added at the toolbar's bottom. This is to mimic | 22 // Additional height threshold added at the toolbar's bottom. This is to mimic |
| 34 // threshold the mouse position needs to be at before the menubar automatically | 23 // threshold the mouse position needs to be at before the menubar automatically |
| 35 // hides. | 24 // hides. |
| 36 const CGFloat kTrackingAreaAdditionalThreshold = 20; | 25 const CGFloat kTrackingAreaAdditionalThreshold = 20; |
| 37 | 26 |
| 38 // Visibility fractions for the menubar and toolbar. | 27 // Visibility fractions for the menubar and toolbar. |
| 39 const CGFloat kHideFraction = 0.0; | 28 const CGFloat kHideFraction = 0.0; |
| 40 const CGFloat kShowFraction = 1.0; | 29 const CGFloat kShowFraction = 1.0; |
| 41 | 30 |
| 42 // The amount by which the toolbar is offset downwards (to avoid the menu) | 31 // The amount by which the toolbar is offset downwards (to avoid the menu) |
| 43 // when the toolbar style is OMNIBOX_TABS_HIDDEN. (We can't use | 32 // when the toolbar style is OMNIBOX_TABS_HIDDEN. (We can't use |
| 44 // |-[NSMenu menuBarHeight]| since it returns 0 when the menu bar is hidden.) | 33 // |-[NSMenu menuBarHeight]| since it returns 0 when the menu bar is hidden.) |
| 45 const CGFloat kToolbarVerticalOffset = 22; | 34 const CGFloat kToolbarVerticalOffset = 22; |
| 46 | 35 |
| 47 } // end namespace | 36 } // end namespace |
| 48 | 37 |
| 49 // Helper class to manage animations for the dropdown bar. Calls | |
| 50 // [FullscreenToolbarController changeToolbarFraction] once per | |
| 51 // animation step. | |
| 52 @interface DropdownAnimation : NSAnimation { | |
| 53 @private | |
| 54 FullscreenToolbarController* controller_; | |
| 55 CGFloat startFraction_; | |
| 56 CGFloat endFraction_; | |
| 57 CGFloat toolbarFraction_; | |
| 58 } | |
| 59 | |
| 60 @property(readonly, nonatomic) CGFloat endFraction; | |
| 61 @property(readonly, nonatomic) CGFloat toolbarFraction; | |
| 62 | |
| 63 // Designated initializer. Asks |controller| for the current shown fraction, so | |
| 64 // if the bar is already partially shown or partially hidden, the animation | |
| 65 // duration may be less than |fullDuration|. | |
| 66 - (id)initWithFraction:(CGFloat)fromFraction | |
| 67 fullDuration:(CGFloat)fullDuration | |
| 68 animationCurve:(NSAnimationCurve)animationCurve | |
| 69 controller:(FullscreenToolbarController*)controller; | |
| 70 | |
| 71 @end | |
| 72 | |
| 73 @implementation DropdownAnimation | |
| 74 | |
| 75 @synthesize endFraction = endFraction_; | |
| 76 @synthesize toolbarFraction = toolbarFraction_; | |
| 77 | |
| 78 - (id)initWithFraction:(CGFloat)toFraction | |
| 79 fullDuration:(CGFloat)fullDuration | |
| 80 animationCurve:(NSAnimationCurve)animationCurve | |
| 81 controller:(FullscreenToolbarController*)controller { | |
| 82 // Calculate the effective duration, based on the current shown fraction. | |
| 83 DCHECK(controller); | |
| 84 CGFloat fromFraction = [controller toolbarFraction]; | |
| 85 CGFloat effectiveDuration = fabs(fullDuration * (fromFraction - toFraction)); | |
| 86 | |
| 87 if ((self = [super gtm_initWithDuration:effectiveDuration | |
| 88 eventMask:NSLeftMouseDownMask | |
| 89 animationCurve:animationCurve])) { | |
| 90 startFraction_ = fromFraction; | |
| 91 endFraction_ = toFraction; | |
| 92 controller_ = controller; | |
| 93 } | |
| 94 return self; | |
| 95 } | |
| 96 | |
| 97 // Called once per animation step. Overridden to change the floating bar's | |
| 98 // position based on the animation's progress. | |
| 99 - (void)setCurrentProgress:(NSAnimationProgress)progress { | |
| 100 toolbarFraction_ = | |
| 101 startFraction_ + (progress * (endFraction_ - startFraction_)); | |
| 102 [controller_ updateToolbar]; | |
| 103 } | |
| 104 | |
| 105 @end | |
| 106 | |
| 107 @interface FullscreenToolbarController (PrivateMethods) | 38 @interface FullscreenToolbarController (PrivateMethods) |
| 108 | 39 |
| 109 // Updates the visibility of the menu bar and the dock. | 40 // Updates the visibility of the menu bar and the dock. |
| 110 - (void)updateMenuBarAndDockVisibility; | 41 - (void)updateMenuBarAndDockVisibility; |
| 111 | 42 |
| 112 // Methods to set up or remove the tracking area. | 43 // Methods to set up or remove the tracking area. |
| 113 - (void)updateTrackingArea; | 44 - (void)updateTrackingArea; |
| 114 - (void)removeTrackingAreaIfNecessary; | 45 - (void)removeTrackingAreaIfNecessary; |
| 115 | 46 |
| 116 // Returns YES if the mouse is inside the tracking area. | 47 // Returns YES if the mouse is inside the tracking area. |
| 117 - (BOOL)mouseInsideTrackingArea; | 48 - (BOOL)mouseInsideTrackingArea; |
| 118 | 49 |
| 119 // Whether the current screen is expected to have a menu bar, regardless of | 50 // Whether the current screen is expected to have a menu bar, regardless of |
| 120 // current visibility of the menu bar. | 51 // current visibility of the menu bar. |
| 121 - (BOOL)doesScreenHaveMenuBar; | 52 - (BOOL)doesScreenHaveMenuBar; |
| 122 | 53 |
| 123 // Returns YES if the window is on the primary screen. | 54 // Returns YES if the window is on the primary screen. |
| 124 - (BOOL)isWindowOnPrimaryScreen; | 55 - (BOOL)isWindowOnPrimaryScreen; |
| 125 | 56 |
| 126 // Returns |kFullScreenModeHideAll| when the overlay is hidden and | 57 // Returns |kFullScreenModeHideAll| when the overlay is hidden and |
| 127 // |kFullScreenModeHideDock| when the overlay is shown. | 58 // |kFullScreenModeHideDock| when the overlay is shown. |
| 128 - (base::mac::FullScreenMode)desiredSystemFullscreenMode; | 59 - (base::mac::FullScreenMode)desiredSystemFullscreenMode; |
| 129 | 60 |
| 130 // Animate the overlay to the given visibility with animation. If |visible| | |
| 131 // is true, animate the toolbar to a fraction of 1.0. Otherwise it's 0.0. | |
| 132 - (void)animateToolbarVisibility:(BOOL)visible; | |
| 133 | |
| 134 // Cancels the timer for hiding the floating bar. | |
| 135 - (void)cancelHideTimer; | |
| 136 | |
| 137 // Methods called when the hide timers fire. Do not call directly. | |
| 138 - (void)hideTimerFire:(NSTimer*)timer; | |
| 139 | |
| 140 // Stops any running animations, etc. | 61 // Stops any running animations, etc. |
| 141 - (void)cleanup; | 62 - (void)cleanup; |
| 142 | 63 |
| 143 // Whether the menu bar should be shown in immersive fullscreen for the screen | 64 // Whether the menu bar should be shown in immersive fullscreen for the screen |
| 144 // that contains the window. | 65 // that contains the window. |
| 145 - (BOOL)shouldShowMenubarInImmersiveFullscreen; | 66 - (BOOL)shouldShowMenubarInImmersiveFullscreen; |
| 146 | 67 |
| 147 @end | 68 @end |
| 148 | 69 |
| 149 @implementation FullscreenToolbarController | 70 @implementation FullscreenToolbarController |
| 150 | 71 |
| 151 @synthesize slidingStyle = slidingStyle_; | 72 @synthesize slidingStyle = slidingStyle_; |
| 152 | 73 |
| 153 - (id)initWithBrowserController:(BrowserWindowController*)controller | 74 - (id)initWithBrowserController:(BrowserWindowController*)controller |
| 154 style:(FullscreenSlidingStyle)style { | 75 style:(FullscreenSlidingStyle)style { |
| 155 if ((self = [super init])) { | 76 if ((self = [super init])) { |
| 156 browserController_ = controller; | 77 browserController_ = controller; |
| 157 systemFullscreenMode_ = base::mac::kFullScreenModeNormal; | 78 systemFullscreenMode_ = base::mac::kFullScreenModeNormal; |
| 158 slidingStyle_ = style; | 79 slidingStyle_ = style; |
| 80 animationController_.reset(new FullscreenToolbarAnimationController(self)); | |
| 159 } | 81 } |
| 160 | 82 |
| 161 return self; | 83 return self; |
| 162 } | 84 } |
| 163 | 85 |
| 164 - (void)dealloc { | 86 - (void)dealloc { |
| 165 DCHECK(!inFullscreenMode_); | 87 DCHECK(!inFullscreenMode_); |
| 166 [super dealloc]; | 88 [super dealloc]; |
| 167 } | 89 } |
| 168 | 90 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 207 } | 129 } |
| 208 | 130 |
| 209 - (void)windowDidBecomeMain:(NSNotification*)notification { | 131 - (void)windowDidBecomeMain:(NSNotification*)notification { |
| 210 [self updateMenuBarAndDockVisibility]; | 132 [self updateMenuBarAndDockVisibility]; |
| 211 } | 133 } |
| 212 | 134 |
| 213 - (void)windowDidResignMain:(NSNotification*)notification { | 135 - (void)windowDidResignMain:(NSNotification*)notification { |
| 214 [self updateMenuBarAndDockVisibility]; | 136 [self updateMenuBarAndDockVisibility]; |
| 215 } | 137 } |
| 216 | 138 |
| 217 - (void)lockBarVisibilityWithAnimation:(BOOL)animate { | |
| 218 base::AutoReset<BOOL> autoReset(&isLockingBarVisibility_, YES); | |
| 219 [self ensureOverlayShownWithAnimation:animate]; | |
| 220 } | |
| 221 | |
| 222 - (void)releaseBarVisibilityWithAnimation:(BOOL)animate { | |
| 223 base::AutoReset<BOOL> autoReset(&isReleasingBarVisibility_, YES); | |
| 224 [self ensureOverlayHiddenWithAnimation:animate]; | |
| 225 } | |
| 226 | |
| 227 - (void)ensureOverlayShownWithAnimation:(BOOL)animate { | 139 - (void)ensureOverlayShownWithAnimation:(BOOL)animate { |
| 228 if (!inFullscreenMode_) | 140 animationController_->AnimateToolbarIn(); |
| 229 return; | |
| 230 | |
| 231 if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode)) | |
| 232 return; | |
| 233 | |
| 234 if (self.slidingStyle != FullscreenSlidingStyle::OMNIBOX_TABS_HIDDEN) | |
| 235 return; | |
| 236 | |
| 237 [self cancelHideTimer]; | |
| 238 [self animateToolbarVisibility:YES]; | |
| 239 } | 141 } |
| 240 | 142 |
| 241 - (void)ensureOverlayHiddenWithAnimation:(BOOL)animate { | 143 - (void)ensureOverlayHiddenWithAnimation:(BOOL)animate { |
| 242 if (!inFullscreenMode_) | 144 animationController_->AnimateToolbarOutIfPossible(); |
| 243 return; | |
| 244 | |
| 245 if (self.slidingStyle != FullscreenSlidingStyle::OMNIBOX_TABS_HIDDEN) | |
| 246 return; | |
| 247 | |
| 248 if ([browserController_ isBarVisibilityLockedForOwner:nil]) | |
| 249 return; | |
| 250 | |
| 251 if ([self mouseInsideTrackingArea] || | |
| 252 [menubarTracker_ state] == FullscreenMenubarState::SHOWN) { | |
| 253 return; | |
| 254 } | |
| 255 | |
| 256 [self cancelHideTimer]; | |
| 257 [self animateToolbarVisibility:NO]; | |
| 258 } | 145 } |
| 259 | 146 |
| 147 // Cancels any running animation and timers. | |
| 260 - (void)cancelAnimationAndTimer { | 148 - (void)cancelAnimationAndTimer { |
| 261 [self cancelHideTimer]; | 149 animationController_->StopAnimationAndTimer(); |
| 262 [currentAnimation_ stopAnimation]; | |
| 263 currentAnimation_.reset(); | |
| 264 } | 150 } |
| 265 | 151 |
| 266 - (void)revealToolbarForTabStripChanges { | 152 - (void)revealToolbarForTabStripChanges { |
| 267 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( | 153 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 268 switches::kEnableFullscreenToolbarReveal)) { | 154 switches::kEnableFullscreenToolbarReveal)) { |
| 269 return; | 155 return; |
| 270 } | 156 } |
| 271 | 157 |
| 272 // Reveal the toolbar for tabstrip changes if the toolbar is hidden. | 158 animationController_->AnimateToolbarForTabstripChanges(); |
| 273 if (ui::IsCGFloatEqual([self toolbarFraction], kHideFraction)) { | |
| 274 isRevealingToolbarForTabStripChanges_ = YES; | |
| 275 [self ensureOverlayShownWithAnimation:YES]; | |
| 276 } | |
| 277 } | 159 } |
| 278 | 160 |
| 279 - (void)setSystemFullscreenModeTo:(base::mac::FullScreenMode)mode { | 161 - (void)setSystemFullscreenModeTo:(base::mac::FullScreenMode)mode { |
| 280 if (mode == systemFullscreenMode_) | 162 if (mode == systemFullscreenMode_) |
| 281 return; | 163 return; |
| 282 if (systemFullscreenMode_ == base::mac::kFullScreenModeNormal) | 164 if (systemFullscreenMode_ == base::mac::kFullScreenModeNormal) |
| 283 base::mac::RequestFullScreen(mode); | 165 base::mac::RequestFullScreen(mode); |
| 284 else if (mode == base::mac::kFullScreenModeNormal) | 166 else if (mode == base::mac::kFullScreenModeNormal) |
| 285 base::mac::ReleaseFullScreen(systemFullscreenMode_); | 167 base::mac::ReleaseFullScreen(systemFullscreenMode_); |
| 286 else | 168 else |
| 287 base::mac::SwitchFullScreenModes(systemFullscreenMode_, mode); | 169 base::mac::SwitchFullScreenModes(systemFullscreenMode_, mode); |
| 288 systemFullscreenMode_ = mode; | 170 systemFullscreenMode_ = mode; |
| 289 } | 171 } |
| 290 | 172 |
| 291 - (void)mouseEntered:(NSEvent*)event { | 173 - (void)mouseEntered:(NSEvent*)event { |
| 292 // Empty implementation. Required for CrTrackingArea. | 174 // Empty implementation. Required for CrTrackingArea. |
| 293 } | 175 } |
| 294 | 176 |
| 295 - (void)mouseExited:(NSEvent*)event { | 177 - (void)mouseExited:(NSEvent*)event { |
| 296 DCHECK(inFullscreenMode_); | 178 DCHECK(inFullscreenMode_); |
| 297 DCHECK_EQ([event trackingArea], trackingArea_.get()); | 179 DCHECK_EQ([event trackingArea], trackingArea_.get()); |
| 298 | 180 |
| 299 if ([browserController_ isBarVisibilityLockedForOwner:nil]) | 181 if ([browserController_ isBarVisibilityLockedForOwner:nil]) |
| 300 return; | 182 return; |
| 301 | 183 |
| 302 // If the menubar is gone, animate the toolbar out. | 184 // If the menubar is gone, animate the toolbar out. |
| 303 if ([menubarTracker_ state] == FullscreenMenubarState::HIDDEN) { | 185 if ([menubarTracker_ state] == FullscreenMenubarState::HIDDEN) |
| 304 base::AutoReset<BOOL> autoReset(&shouldAnimateToolbarOut_, YES); | |
| 305 [self ensureOverlayHiddenWithAnimation:YES]; | 186 [self ensureOverlayHiddenWithAnimation:YES]; |
| 306 } | |
| 307 | 187 |
| 308 [self removeTrackingAreaIfNecessary]; | 188 [self removeTrackingAreaIfNecessary]; |
| 309 } | 189 } |
| 310 | 190 |
| 311 - (void)updateToolbar { | 191 - (void)updateToolbar { |
| 312 [browserController_ layoutSubviews]; | 192 [browserController_ layoutSubviews]; |
| 313 [self updateTrackingArea]; | 193 [self updateTrackingArea]; |
| 194 animationController_->UpdateToolbar(); | |
| 314 | 195 |
| 315 // In AppKit fullscreen, moving the mouse to the top of the screen toggles | 196 // In AppKit fullscreen, moving the mouse to the top of the screen toggles |
| 316 // menu visibility. Replicate the same effect for immersive fullscreen. | 197 // menu visibility. Replicate the same effect for immersive fullscreen. |
| 317 if ([browserController_ isInImmersiveFullscreen]) | 198 if ([browserController_ isInImmersiveFullscreen]) |
| 318 [self updateMenuBarAndDockVisibility]; | 199 [self updateMenuBarAndDockVisibility]; |
| 319 } | 200 } |
| 320 | 201 |
| 321 - (BrowserWindowController*)browserWindowController { | 202 - (BrowserWindowController*)browserWindowController { |
| 322 return browserController_; | 203 return browserController_; |
| 323 } | 204 } |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 346 - (CGFloat)toolbarFraction { | 227 - (CGFloat)toolbarFraction { |
| 347 if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode)) | 228 if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode)) |
| 348 return kHideFraction; | 229 return kHideFraction; |
| 349 | 230 |
| 350 switch (slidingStyle_) { | 231 switch (slidingStyle_) { |
| 351 case FullscreenSlidingStyle::OMNIBOX_TABS_PRESENT: | 232 case FullscreenSlidingStyle::OMNIBOX_TABS_PRESENT: |
| 352 return kShowFraction; | 233 return kShowFraction; |
| 353 case FullscreenSlidingStyle::OMNIBOX_TABS_NONE: | 234 case FullscreenSlidingStyle::OMNIBOX_TABS_NONE: |
| 354 return kHideFraction; | 235 return kHideFraction; |
| 355 case FullscreenSlidingStyle::OMNIBOX_TABS_HIDDEN: | 236 case FullscreenSlidingStyle::OMNIBOX_TABS_HIDDEN: |
| 356 FullscreenMenubarState menubarState = [menubarTracker_ state]; | 237 if ([self mustShowFullscreenToolbar]) |
| 357 if (menubarState == FullscreenMenubarState::SHOWN) | 238 return 1.0; |
|
erikchen
2016/10/21 20:39:28
probably kShowFraction?
| |
| 358 return kShowFraction; | |
| 359 | 239 |
| 360 if ([self mouseInsideTrackingArea]) | 240 if (animationController_->IsAnimationRunning()) |
| 361 return kShowFraction; | 241 return animationController_->GetToolbarFractionFromProgress(); |
| 362 | |
| 363 if (currentAnimation_.get()) | |
| 364 return [currentAnimation_ toolbarFraction]; | |
| 365 | |
| 366 if (isLockingBarVisibility_) | |
| 367 return kHideFraction; | |
| 368 else if (isReleasingBarVisibility_) | |
| 369 return kShowFraction; | |
| 370 else if ([browserController_ isBarVisibilityLockedForOwner:nil]) | |
| 371 return kShowFraction; | |
| 372 | |
| 373 if (hideTimer_.get() || shouldAnimateToolbarOut_) | |
| 374 return kShowFraction; | |
| 375 | 242 |
| 376 return [menubarTracker_ menubarFraction]; | 243 return [menubarTracker_ menubarFraction]; |
| 377 } | 244 } |
| 378 } | 245 } |
| 379 | 246 |
| 247 - (BOOL)mustShowFullscreenToolbar { | |
| 248 if (!inFullscreenMode_) | |
| 249 return NO; | |
| 250 | |
| 251 if (slidingStyle_ == FullscreenSlidingStyle::OMNIBOX_TABS_PRESENT) | |
| 252 return YES; | |
| 253 | |
| 254 if (slidingStyle_ == FullscreenSlidingStyle::OMNIBOX_TABS_NONE) | |
|
erikchen
2016/10/21 19:36:59
Don't we want toolbarFraction to return kHideFract
spqchan
2016/10/21 20:34:18
I'm confused on what you're getting at.
erikchen
2016/10/21 20:39:28
Oh, I see what happened. The slidingStyle_ conditi
| |
| 255 return NO; | |
| 256 | |
| 257 FullscreenMenubarState menubarState = [menubarTracker_ state]; | |
| 258 return menubarState == FullscreenMenubarState::SHOWN || | |
| 259 [self mouseInsideTrackingArea] || | |
| 260 [browserController_ isBarVisibilityLockedForOwner:nil]; | |
| 261 } | |
| 262 | |
| 380 - (BOOL)isFullscreenTransitionInProgress { | 263 - (BOOL)isFullscreenTransitionInProgress { |
| 381 return [browserController_ isFullscreenTransitionInProgress]; | 264 return [browserController_ isFullscreenTransitionInProgress]; |
| 382 } | 265 } |
| 383 | 266 |
| 384 - (BOOL)isInFullscreen { | 267 - (BOOL)isInFullscreen { |
| 385 return inFullscreenMode_; | 268 return inFullscreenMode_; |
| 386 } | 269 } |
| 387 | 270 |
| 388 - (BOOL)isMouseOnScreen { | 271 - (BOOL)isMouseOnScreen { |
| 389 return NSMouseInRect([NSEvent mouseLocation], | 272 return NSMouseInRect([NSEvent mouseLocation], |
| 390 [[browserController_ window] screen].frame, false); | 273 [[browserController_ window] screen].frame, false); |
| 391 } | 274 } |
| 392 | 275 |
| 393 - (void)setTrackingAreaFromOverlayFrame:(NSRect)frame { | 276 - (void)setTrackingAreaFromOverlayFrame:(NSRect)frame { |
| 394 NSRect contentBounds = [contentView_ bounds]; | 277 NSRect contentBounds = [contentView_ bounds]; |
| 395 trackingAreaFrame_ = frame; | 278 trackingAreaFrame_ = frame; |
| 396 trackingAreaFrame_.origin.y -= kTrackingAreaAdditionalThreshold; | 279 trackingAreaFrame_.origin.y -= kTrackingAreaAdditionalThreshold; |
| 397 trackingAreaFrame_.size.height = | 280 trackingAreaFrame_.size.height = |
| 398 NSMaxY(contentBounds) - trackingAreaFrame_.origin.y; | 281 NSMaxY(contentBounds) - trackingAreaFrame_.origin.y; |
| 399 } | 282 } |
| 400 | 283 |
| 401 - (void)animationDidStop:(NSAnimation*)animation { | |
| 402 if (isRevealingToolbarForTabStripChanges_) { | |
| 403 if ([self toolbarFraction] > 0.0) { | |
| 404 // Set the timer to hide the toolbar. | |
| 405 [hideTimer_ invalidate]; | |
| 406 hideTimer_.reset( | |
| 407 [[NSTimer scheduledTimerWithTimeInterval:kTabStripChangesDelay | |
| 408 target:self | |
| 409 selector:@selector(hideTimerFire:) | |
| 410 userInfo:nil | |
| 411 repeats:NO] retain]); | |
| 412 } else { | |
| 413 isRevealingToolbarForTabStripChanges_ = NO; | |
| 414 } | |
| 415 } | |
| 416 | |
| 417 // Reset the |currentAnimation_| pointer now that the animation is over. | |
| 418 currentAnimation_.reset(); | |
| 419 } | |
| 420 | |
| 421 - (void)animationDidEnd:(NSAnimation*)animation { | |
| 422 [self animationDidStop:animation]; | |
| 423 [self updateTrackingArea]; | |
| 424 } | |
| 425 | |
| 426 @end | 284 @end |
| 427 | 285 |
| 428 @implementation FullscreenToolbarController (PrivateMethods) | 286 @implementation FullscreenToolbarController (PrivateMethods) |
| 429 | 287 |
| 430 - (void)updateMenuBarAndDockVisibility { | 288 - (void)updateMenuBarAndDockVisibility { |
| 431 if (![self isMouseOnScreen] || | 289 if (![self isMouseOnScreen] || |
| 432 ![browserController_ isInImmersiveFullscreen]) { | 290 ![browserController_ isInImmersiveFullscreen]) { |
| 433 [self setSystemFullscreenModeTo:base::mac::kFullScreenModeNormal]; | 291 [self setSystemFullscreenModeTo:base::mac::kFullScreenModeNormal]; |
| 434 return; | 292 return; |
| 435 } | 293 } |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 502 NSScreen* primaryScreen = [[NSScreen screens] firstObject]; | 360 NSScreen* primaryScreen = [[NSScreen screens] firstObject]; |
| 503 return (screen == primaryScreen); | 361 return (screen == primaryScreen); |
| 504 } | 362 } |
| 505 | 363 |
| 506 - (base::mac::FullScreenMode)desiredSystemFullscreenMode { | 364 - (base::mac::FullScreenMode)desiredSystemFullscreenMode { |
| 507 if ([self shouldShowMenubarInImmersiveFullscreen]) | 365 if ([self shouldShowMenubarInImmersiveFullscreen]) |
| 508 return base::mac::kFullScreenModeHideDock; | 366 return base::mac::kFullScreenModeHideDock; |
| 509 return base::mac::kFullScreenModeHideAll; | 367 return base::mac::kFullScreenModeHideAll; |
| 510 } | 368 } |
| 511 | 369 |
| 512 - (void)animateToolbarVisibility:(BOOL)visible { | |
| 513 CGFloat fraction = visible ? kShowFraction : kHideFraction; | |
| 514 | |
| 515 // If we're already animating to the given fraction, then there's nothing | |
| 516 // more to do. | |
| 517 if (currentAnimation_ && [currentAnimation_ endFraction] == fraction) | |
| 518 return; | |
| 519 | |
| 520 // In all other cases, we want to cancel any running animation (which may be | |
| 521 // to show or to hide). | |
| 522 [currentAnimation_ stopAnimation]; | |
| 523 | |
| 524 // Create the animation and set it up. | |
| 525 currentAnimation_.reset([[DropdownAnimation alloc] | |
| 526 initWithFraction:fraction | |
| 527 fullDuration:kDropdownAnimationDuration | |
| 528 animationCurve:NSAnimationEaseOut | |
| 529 controller:self]); | |
| 530 DCHECK(currentAnimation_); | |
| 531 [currentAnimation_ setAnimationBlockingMode:NSAnimationNonblocking]; | |
| 532 [currentAnimation_ setDelegate:self]; | |
| 533 | |
| 534 // If there is an existing tracking area, remove it. We do not track mouse | |
| 535 // movements during animations (see class comment in the header file). | |
| 536 [self removeTrackingAreaIfNecessary]; | |
| 537 | |
| 538 [currentAnimation_ startAnimation]; | |
| 539 } | |
| 540 | |
| 541 - (void)cancelHideTimer { | |
| 542 [hideTimer_ invalidate]; | |
| 543 hideTimer_.reset(); | |
| 544 } | |
| 545 | |
| 546 - (void)hideTimerFire:(NSTimer*)timer { | |
| 547 DCHECK_EQ(hideTimer_, timer); // This better be our hide timer. | |
| 548 [hideTimer_ invalidate]; // Make sure it doesn't repeat. | |
| 549 hideTimer_.reset(); // And get rid of it. | |
| 550 base::AutoReset<BOOL> autoReset(&shouldAnimateToolbarOut_, YES); | |
| 551 [self animateToolbarVisibility:NO]; | |
| 552 } | |
| 553 | |
| 554 - (void)cleanup { | 370 - (void)cleanup { |
| 555 [self cancelAnimationAndTimer]; | 371 animationController_->StopAnimationAndTimer(); |
| 556 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 372 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
| 557 | 373 |
| 558 [self removeTrackingAreaIfNecessary]; | 374 [self removeTrackingAreaIfNecessary]; |
| 559 | 375 |
| 560 // Call the main status resignation code to perform the associated cleanup, | 376 // Call the main status resignation code to perform the associated cleanup, |
| 561 // since we will no longer be receiving actual status resignation | 377 // since we will no longer be receiving actual status resignation |
| 562 // notifications. | 378 // notifications. |
| 563 [self setSystemFullscreenModeTo:base::mac::kFullScreenModeNormal]; | 379 [self setSystemFullscreenModeTo:base::mac::kFullScreenModeNormal]; |
| 564 | 380 |
| 565 menubarTracker_.reset(); | 381 menubarTracker_.reset(); |
| 566 | 382 |
| 567 // No more calls back up to the BWC. | 383 // No more calls back up to the BWC. |
| 568 browserController_ = nil; | 384 browserController_ = nil; |
| 569 } | 385 } |
| 570 | 386 |
| 571 - (BOOL)shouldShowMenubarInImmersiveFullscreen { | 387 - (BOOL)shouldShowMenubarInImmersiveFullscreen { |
| 572 return [self doesScreenHaveMenuBar] && [self toolbarFraction] > 0.99; | 388 return [self doesScreenHaveMenuBar] && [self toolbarFraction] > 0.99; |
| 573 } | 389 } |
| 574 | 390 |
| 575 @end | 391 @end |
| OLD | NEW |