Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(278)

Unified Diff: chrome/browser/ui/cocoa/fullscreen_toolbar_controller.h

Issue 2272783002: [Mac] Fix for fullscreen toolbar (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: The fullscreen changes Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/cocoa/fullscreen_toolbar_controller.h
diff --git a/chrome/browser/ui/cocoa/fullscreen_toolbar_controller.h b/chrome/browser/ui/cocoa/fullscreen_toolbar_controller.h
index 8d54af9773d982149981497957028cea860c0aa7..a604461088002ef94f417a8c2b8475f62abf1b08 100644
--- a/chrome/browser/ui/cocoa/fullscreen_toolbar_controller.h
+++ b/chrome/browser/ui/cocoa/fullscreen_toolbar_controller.h
@@ -12,6 +12,7 @@
#include "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h"
@class BrowserWindowController;
+@class CrTrackingArea;
@class DropdownAnimation;
namespace fullscreen_mac {
@@ -35,6 +36,25 @@ enum SlidingStyle {
// when the animation finishes. This is largely done for ease of
// implementation; it is easier to check the mouse location at each animation
// step than it is to manage a constantly-changing tracking area.
+//
+
+// The |toolbarFraction_| is usually set by |setMenuBarRevealProgress:|, which
+// is called by MenuBarRevealHandler(). This makes the toolbar show/hide in
+// sync with the menubar. However, there's an edge case that appears when the
+// sliding style is set to OMNIBOX_TABS_HIDDEN. If the user interacts with the
+// bottom half of the toolbar, the menubar will disappear and take the toolbar
+// with it. This prevents users from interacting properly with the omnibox and
+// bookmarks bar.
+//
+// To prevent the toolbar from disappearing when the user is still interacting
+// with it, we lock its visibility so that the toolbar will remain, even after
+// the menubar had disappeared. The tracking area is then used to check if the
+// user is still interacting with the toolbar. Once we receive a mouse exit
+// event, we release the visibility lock so that the toolbar can hidden by the
+// menubar (if it's still there) or via a DropdownAnimation (if the menubar is
+// gone).
+
+// TODO (spqchan): Write tests for this class. See crbug.com/640064.
@interface FullscreenToolbarController : NSObject<NSAnimationDelegate> {
@private
// Our parent controller.
@@ -43,6 +63,18 @@ enum SlidingStyle {
// Whether or not we are in fullscreen mode.
BOOL inFullscreenMode_;
+ // The content view for the window. This is nil when not in fullscreen mode.
+ NSView* contentView_; // weak
+
+ // The frame for the tracking area. The value is the toolbar overlay's frame
+ // with additional height added at the bottom.
+ NSRect trackingAreaFrame_;
+
+ // The tracking area associated with the toolbar overlay bar. This tracking
+ // area is used to keep the toolbar active if the menubar had animated out
+ // but the mouse is still on the toolbar.
+ base::scoped_nsobject<CrTrackingArea> trackingArea_;
+
// Pointer to the currently running animation. Is nil if no animation is
// running.
base::scoped_nsobject<DropdownAnimation> currentAnimation_;
@@ -87,14 +119,15 @@ enum SlidingStyle {
- (id)initWithBrowserController:(BrowserWindowController*)controller
style:(fullscreen_mac::SlidingStyle)style;
-// Informs the controller that the browser has entered or exited presentation
+// Informs the controller that the browser has entered or exited fullscreen
// mode. |-setupFullscreenToolbarForContentView:showDropdown:| should be called
// after the window is setup, just before it is shown. |-exitFullscreenMode|
// should be called before any views are moved back to the non-fullscreen
// window. If |-setupFullscreenToolbarForContentView:showDropdown:| is called,
// it must be balanced with a call to |-exitFullscreenMode| before the
// controller is released.
-- (void)setupFullscreenToolbarWithDropdown:(BOOL)showDropdown;
+- (void)setupFullscreenToolbarForContentView:(NSView*)contentView
+ showDropdown:(BOOL)showDropdown;
- (void)exitFullscreenMode;
// Returns the amount by which the floating bar should be offset downwards (to
@@ -124,10 +157,16 @@ enum SlidingStyle {
// only be revealed if the mouse is there.
- (BOOL)isMouseOnScreen;
-// Returns true if the browser is in the process of entering/exiting
+// Sets |trackingAreaFrame_| from the given overlay frame.
+- (void)setTrackingAreaFromOverlayFrame:(NSRect)frame;
+
+// Returns YES if the browser is in the process of entering/exiting
// fullscreen.
- (BOOL)isFullscreenTransitionInProgress;
+// Returns YES if the browser in in fullscreen.
+- (BOOL)isInFullscreen;
+
@end
// Private methods exposed for testing.
@@ -140,7 +179,8 @@ enum SlidingStyle {
// Updates the local state that reflects the fraction of the toolbar area that
// is showing. This function has the side effect of changing the AppKit
-// Fullscreen option for whether the menu bar is shown.
+// Fullscreen option for whether the menu bar is shown. If the toolbar
+// visibility is locked, the fraction will be updated to 1.0;
- (void)changeToolbarFraction:(CGFloat)fraction;
@end

Powered by Google App Engine
This is Rietveld 408576698