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

Side by Side Diff: chrome/browser/ui/cocoa/browser_window_controller.h

Issue 493143004: mac: Major fullscreen refactor. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix 2 minor bugs, remove 2 unit tests that no longer test anything. Created 6 years, 3 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 #ifndef CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_CONTROLLER_H_ 5 #ifndef CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_CONTROLLER_H_
6 #define CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_CONTROLLER_H_ 6 #define CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_CONTROLLER_H_
7 7
8 // A class acting as the Objective-C controller for the Browser 8 // A class acting as the Objective-C controller for the Browser
9 // object. Handles interactions between Cocoa and the cross-platform 9 // object. Handles interactions between Cocoa and the cross-platform
10 // code. Each window has a single toolbar and, by virtue of being a 10 // code. Each window has a single toolbar and, by virtue of being a
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 @class TranslateBubbleController; 50 @class TranslateBubbleController;
51 51
52 namespace content { 52 namespace content {
53 class WebContents; 53 class WebContents;
54 } 54 }
55 55
56 namespace extensions { 56 namespace extensions {
57 class Command; 57 class Command;
58 } 58 }
59 59
60 namespace fullscreen_mac {
61 enum SlidingStyle {
62 OMNIBOX_TABS_PRESENT = 0, // Tab strip and omnibox both visible.
63 OMNIBOX_PRESENT, // Tab strip hidden.
Robert Sesek 2014/08/27 22:04:30 When is this mode used?
erikchen 2014/08/28 00:50:28 Only for simplified fullscreen.
64 OMNIBOX_TABS_HIDDEN, // Tab strip and omnibox both hidden.
65 };
66 } // namespace fullscreen_mac
67
60 @interface BrowserWindowController : 68 @interface BrowserWindowController :
61 TabWindowController<NSUserInterfaceValidations, 69 TabWindowController<NSUserInterfaceValidations,
62 BookmarkBarControllerDelegate, 70 BookmarkBarControllerDelegate,
63 BrowserCommandExecutor, 71 BrowserCommandExecutor,
64 ViewResizer, 72 ViewResizer,
65 TabStripControllerDelegate> { 73 TabStripControllerDelegate> {
66 @private 74 @private
67 // The ordering of these members is important as it determines the order in 75 // The ordering of these members is important as it determines the order in
68 // which they are destroyed. |browser_| needs to be destroyed last as most of 76 // which they are destroyed. |browser_| needs to be destroyed last as most of
69 // the other objects hold weak references to it or things it owns 77 // the other objects hold weak references to it or things it owns
70 // (tab/toolbar/bookmark models, profiles, etc). 78 // (tab/toolbar/bookmark models, profiles, etc).
71 scoped_ptr<Browser> browser_; 79 scoped_ptr<Browser> browser_;
72 NSWindow* savedRegularWindow_; 80 NSWindow* savedRegularWindow_;
73 scoped_ptr<BrowserWindowCocoa> windowShim_; 81 scoped_ptr<BrowserWindowCocoa> windowShim_;
74 base::scoped_nsobject<ToolbarController> toolbarController_; 82 base::scoped_nsobject<ToolbarController> toolbarController_;
75 base::scoped_nsobject<TabStripController> tabStripController_; 83 base::scoped_nsobject<TabStripController> tabStripController_;
76 base::scoped_nsobject<FindBarCocoaController> findBarCocoaController_; 84 base::scoped_nsobject<FindBarCocoaController> findBarCocoaController_;
77 base::scoped_nsobject<InfoBarContainerController> infoBarContainerController_; 85 base::scoped_nsobject<InfoBarContainerController> infoBarContainerController_;
78 base::scoped_nsobject<DownloadShelfController> downloadShelfController_; 86 base::scoped_nsobject<DownloadShelfController> downloadShelfController_;
79 base::scoped_nsobject<BookmarkBarController> bookmarkBarController_; 87 base::scoped_nsobject<BookmarkBarController> bookmarkBarController_;
80 base::scoped_nsobject<DevToolsController> devToolsController_; 88 base::scoped_nsobject<DevToolsController> devToolsController_;
81 base::scoped_nsobject<OverlayableContentsController> 89 base::scoped_nsobject<OverlayableContentsController>
82 overlayableContentsController_; 90 overlayableContentsController_;
83 base::scoped_nsobject<PresentationModeController> presentationModeController_; 91 base::scoped_nsobject<PresentationModeController> presentationModeController_;
84 base::scoped_nsobject<FullscreenModeController> fullscreenModeController_;
85 base::scoped_nsobject<FullscreenExitBubbleController> 92 base::scoped_nsobject<FullscreenExitBubbleController>
86 fullscreenExitBubbleController_; 93 fullscreenExitBubbleController_;
87 94
88 // Strong. StatusBubble is a special case of a strong reference that 95 // Strong. StatusBubble is a special case of a strong reference that
89 // we don't wrap in a scoped_ptr because it is acting the same 96 // we don't wrap in a scoped_ptr because it is acting the same
90 // as an NSWindowController in that it wraps a window that must 97 // as an NSWindowController in that it wraps a window that must
91 // be shut down before our destructors are called. 98 // be shut down before our destructors are called.
92 StatusBubbleMac* statusBubble_; 99 StatusBubbleMac* statusBubble_;
93 100
94 BookmarkBubbleController* bookmarkBubbleController_; // Weak. 101 BookmarkBubbleController* bookmarkBubbleController_; // Weak.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 // The borderless window used in fullscreen mode when Cocoa's System 133 // The borderless window used in fullscreen mode when Cocoa's System
127 // Fullscreen API is not being used (or not available, before OS 10.7). 134 // Fullscreen API is not being used (or not available, before OS 10.7).
128 base::scoped_nsobject<NSWindow> fullscreenWindow_; 135 base::scoped_nsobject<NSWindow> fullscreenWindow_;
129 136
130 // The Cocoa implementation of the PermissionBubbleView. 137 // The Cocoa implementation of the PermissionBubbleView.
131 scoped_ptr<PermissionBubbleCocoa> permissionBubbleCocoa_; 138 scoped_ptr<PermissionBubbleCocoa> permissionBubbleCocoa_;
132 139
133 // True between |-windowWillEnterFullScreen:| and |-windowDidEnterFullScreen:| 140 // True between |-windowWillEnterFullScreen:| and |-windowDidEnterFullScreen:|
134 // to indicate that the window is in the process of transitioning into 141 // to indicate that the window is in the process of transitioning into
135 // fullscreen mode. 142 // fullscreen mode.
143 //
144 // TODO(erikchen): This flag is used when entering AppKit Fullscreen and
145 // immersive fullscreen. This is confusing.
136 BOOL enteringFullscreen_; 146 BOOL enteringFullscreen_;
137 147
138 // True between |-setPresentationMode:url:bubbleType:| and 148 // True between |-setPresentationMode:url:bubbleType:| and
139 // |-windowDidEnterFullScreen:| to indicate that the window is in the process 149 // |-windowDidEnterFullScreen:| to indicate that the window is in the process
140 // of transitioning into fullscreen presentation mode. 150 // of transitioning into fullscreen presentation mode.
141 BOOL enteringPresentationMode_; 151 BOOL enteringPresentationMode_;
142 152
143 // The size of the original (non-fullscreen) window. This is saved just 153 // The size of the original (non-fullscreen) window. This is saved just
144 // before entering fullscreen mode and is only valid when |-isFullscreen| 154 // before entering fullscreen mode and is only valid when |-isFullscreen|
145 // returns YES. 155 // returns YES.
146 NSRect savedRegularWindowFrame_; 156 NSRect savedRegularWindowFrame_;
147 157
148 // The proportion of the floating bar which is shown (in presentation mode). 158 // The proportion of the floating bar which is shown (in presentation mode).
149 CGFloat floatingBarShownFraction_; 159 CGFloat floatingBarShownFraction_;
150 160
161 // Whether the omnibox is hidden in fullscreen.
162 fullscreen_mac::SlidingStyle fullscreenStyle_;
163
151 // Various UI elements/events may want to ensure that the floating bar is 164 // Various UI elements/events may want to ensure that the floating bar is
152 // visible (in presentation mode), e.g., because of where the mouse is or 165 // visible (in presentation mode), e.g., because of where the mouse is or
153 // where keyboard focus is. Whenever an object requires bar visibility, it has 166 // where keyboard focus is. Whenever an object requires bar visibility, it has
154 // itself added to |barVisibilityLocks_|. When it no longer requires bar 167 // itself added to |barVisibilityLocks_|. When it no longer requires bar
155 // visibility, it has itself removed. 168 // visibility, it has itself removed.
156 base::scoped_nsobject<NSMutableSet> barVisibilityLocks_; 169 base::scoped_nsobject<NSMutableSet> barVisibilityLocks_;
157 170
158 // Bar visibility locks and releases only result (when appropriate) in changes 171 // Bar visibility locks and releases only result (when appropriate) in changes
159 // in visible state when the following is |YES|. 172 // in visible state when the following is |YES|.
160 BOOL barVisibilityUpdatesEnabled_; 173 BOOL barVisibilityUpdatesEnabled_;
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 - (BOOL)supportsBookmarkBar; 407 - (BOOL)supportsBookmarkBar;
395 408
396 // Called to check if this controller's window is a tabbed window (e.g., not a 409 // Called to check if this controller's window is a tabbed window (e.g., not a
397 // pop-up window). Returns YES if it is, NO otherwise. 410 // pop-up window). Returns YES if it is, NO otherwise.
398 // Note: The |-has...| methods are usually preferred, so this method is largely 411 // Note: The |-has...| methods are usually preferred, so this method is largely
399 // deprecated. 412 // deprecated.
400 - (BOOL)isTabbedWindow; 413 - (BOOL)isTabbedWindow;
401 414
402 @end // @interface BrowserWindowController(WindowType) 415 @end // @interface BrowserWindowController(WindowType)
403 416
417 // Fullscreen terminology:
418 //
419 // ----------------------------------------------------------------------------
420 // There are 2 APIs that cause the window to get resized, and possibly move
421 // spaces.
422 //
423 // + AppKitFullscreen API: AppKit touts a feature known as "fullscreen". This
424 // involves moving the current window to a different space, and resizing the
425 // window to take up the entire size of the screen.
426 //
427 // + Immersive fullscreen: An alternative to AppKitFullscreen API. Uses on 10.6
428 // (before AppKitFullscreen API was available), and on certain HTML/Flash
429 // content. This is a method defined by Chrome.
430 //
431 // The Immersive fullscreen API can be called after the AppKitFullscreen API.
432 // Calling the AppKitFullscreen API while immersive fullscreen API has been
433 // invoked causes all fullscreen modes to exit.
434 //
435 // ----------------------------------------------------------------------------
436 // There are 3 "styles" of omnibox sliding.
437 // + OMNIBOX_TABS_PRESENT: Both the omnibox and the tabstrip are present.
438 // Moving the cursor to the top causes the menubar to appear, and everything
439 // else to slide down.
440 // + OMNIBOX_PRESENT: The tabstrip is hidden. Moving the cursor to the top
441 // shows the tabstrip and menubar, sliding everything else down.
442 // + OMNIBOX_TABS_HIDDEN: Both tabstrip and omnibox are hidden. Moving cursor
443 // to top shows tabstrip, omnibox, and menu bar.
444 //
445 // The omnibox sliding styles are used in conjunction with the fullscreen APIs.
446 // There is exactly 1 sliding style active at a time. The sliding is mangaged
447 // by the presentationModeController_. (poorly named).
448 //
449 // ----------------------------------------------------------------------------
450 // There are several "fullscreen modes" bantered around. Technically, any
451 // fullscreen API can be combined with any sliding style.
452 //
453 // + System fullscreen***deprecated***: This term is confusing. Don't use it.
454 // I've tried to remove all references to it. It either refers to the
Robert Sesek 2014/08/27 22:04:30 Please only use the third person in comments.
erikchen 2014/08/28 00:50:28 Done. I went through the whole CL and removed all
455 // AppKitFullscreen API, or the behavior that users expect to see when they
456 // click the fullscreen button, or some Chrome specific implementation that
457 // uses the AppKitFullscreen API.
458 //
459 // + Canonical Fullscreen: When a user clicks on the fullscreen button, they
Robert Sesek 2014/08/27 22:04:30 This is as system fullscreen.
erikchen 2014/08/28 00:50:28 What do you mean by your comment? Is that a questi
460 // expect a fullscreen behavior similar to other AppKit apps.
461 // - AppKitFullscreen API + OMNIBOX_TABS_PRESENT.
462 // - The button click directly invokes the AppKitFullscreen API. We get a
463 // callback, and call adjustUIForOmniboxFullscreen.
464 // - We have a menu item that is intended to invoke the same behavior. When
465 // they click the menu item, or use its hotkey, we manually invoke the
466 // AppKitFullscreen API.
467 //
468 // + Presentation Mode:
469 // - OMNIBOX_TABS_HIDDEN, typically with AppKitFullscreen API, but can
470 // also be with Immersive fullscreen API.
471 // - We set a flag, indicating that we want Presentation Mode instead of
472 // Canonical Fullscreen. Then we invoke the AppKitFullscreen API.
473 //
474 // + HTML5 fullscreen. <-- Currently uses AppKitFullscreen API. We want
475 // this to change.
476 //
477 // + Simplified fullscreen. Hidden by default. Some users have manually
Robert Sesek 2014/08/27 22:04:30 Just kill this.
erikchen 2014/08/28 00:50:28 Okay. I will do so in a separate CL.
478 // enabled it.
479 // - OMNIBOX_PRESENT. Can be with either fullscreen API.
480 //
481 // + Flash fullscreen.
404 482
405 // Methods having to do with fullscreen and presentation mode. 483 // Methods having to do with fullscreen and presentation mode.
406 @interface BrowserWindowController(Fullscreen) 484 @interface BrowserWindowController(Fullscreen)
407 485
408 // Toggles fullscreen mode. Meant to be called by Lion windows when they enter 486 // Toggles fullscreen mode. Meant to be called by Lion windows when they enter
409 // or exit Lion fullscreen mode. Must not be called on Snow Leopard or earlier. 487 // or exit Lion fullscreen mode. Must not be called on Snow Leopard or earlier.
410 - (void)handleLionToggleFullscreen; 488 - (void)handleLionToggleFullscreen;
411 489
412 // Enters (or exits) fullscreen mode. This method is safe to call on all OS 490 // Enters Canonical Fullscreen.
413 // versions. 491 - (void)enterFullscreenWithChrome;
414 - (void)enterFullscreen;
415 - (void)exitFullscreen;
416 492
417 // Updates the contents of the fullscreen exit bubble with |url| and 493 // Updates the contents of the fullscreen exit bubble with |url| and
418 // |bubbleType|. 494 // |bubbleType|.
419 - (void)updateFullscreenExitBubbleURL:(const GURL&)url 495 - (void)updateFullscreenExitBubbleURL:(const GURL&)url
420 bubbleType:(FullscreenExitBubbleType)bubbleType; 496 bubbleType:(FullscreenExitBubbleType)bubbleType;
421 497
422 // Returns fullscreen state: YES when the window is in fullscreen or is 498 // Returns YES if the code is in or entering any fullscreen mode.
423 // animating into fullscreen. 499 - (BOOL)isInOrEnteringAnyFullscreenMode;
Robert Sesek 2014/08/27 22:04:30 Not sure how helpful the "OrEntering" naming is an
erikchen 2014/08/28 00:50:28 Updated method names to remove "OrEntering".
424 - (BOOL)isFullscreen;
425 500
426 // Returns YES if the browser window is currently in fullscreen via the built-in 501 // Returns YES if the browser window is currently in fullscreen via the built-in
427 // immersive mechanism. 502 // immersive mechanism.
428 - (BOOL)isInImmersiveFullscreen; 503 - (BOOL)isInImmersiveFullscreen;
429 504
430 // Returns YES if the browser window is currently in fullscreen via the Cocoa 505 // Returns YES if the browser window is currently in fullscreen via the AppKit
431 // System Fullscreen API. 506 // Fullscreen API.
432 - (BOOL)isInSystemFullscreen; 507 - (BOOL)isInOrEnteringAppKitFullscreen;
433 508
434 // Enters (or exits) presentation mode. Also enters fullscreen mode if this 509 // Returns YES if the PresentationModeController exists and hence the omnibox
435 // window is not already fullscreen. This method is safe to call on all OS 510 // and other UI is expected to slide.
436 // versions. 511 - (BOOL)isInFullscreenWithOmniboxSliding;
512
513 // Enters (or exits) presentation mode.
437 - (void)enterPresentationModeForURL:(const GURL&)url 514 - (void)enterPresentationModeForURL:(const GURL&)url
438 bubbleType:(FullscreenExitBubbleType)bubbleType; 515 bubbleType:(FullscreenExitBubbleType)bubbleType;
439 - (void)exitPresentationMode;
440 516
441 // For simplified fullscreen: Enters fullscreen for a tab at a URL. The |url| 517 // Tries to enter presentation mode. Falls back to simplified fullscreen.
442 // is guaranteed to be non-empty; see -enterFullscreen for the user-initiated 518 - (void)enterGenericFullscreenForURL:(const GURL&)url
Robert Sesek 2014/08/27 22:04:30 Why is this generic? Fullscreen for a URL is a spe
erikchen 2014/08/28 00:50:28 Renamed the method to enterHTML5FullscreenForURL
443 // fullscreen mode. Called on Snow Leopard and Lion+. 519 bubbleType:(FullscreenExitBubbleType)bubbleType;
444 - (void)enterFullscreenForURL:(const GURL&)url 520 // Exits the current fullscreen mode.
445 bubbleType:(FullscreenExitBubbleType)bubbleType; 521 - (void)exitGenericFullscreen;
446 522
447 // Returns presentation mode state. This method is safe to call on all OS 523 // Whether the system is in the very specific fullscreen mode: Presentation
448 // versions. 524 // Mode.
449 - (BOOL)inPresentationMode; 525 - (BOOL)inPresentationMode;
450 526
451 // Resizes the fullscreen window to fit the screen it's currently on. Called by 527 // Resizes the fullscreen window to fit the screen it's currently on. Called by
452 // the PresentationModeController when there is a change in monitor placement or 528 // the PresentationModeController when there is a change in monitor placement or
453 // resolution. 529 // resolution.
454 - (void)resizeFullscreenWindow; 530 - (void)resizeFullscreenWindow;
455 531
456 // Gets or sets the fraction of the floating bar (presentation mode overlay) 532 // Gets or sets the fraction of the floating bar (presentation mode overlay)
457 // that is shown. 0 is completely hidden, 1 is fully shown. 533 // that is shown. 0 is completely hidden, 1 is fully shown.
458 - (CGFloat)floatingBarShownFraction; 534 - (CGFloat)floatingBarShownFraction;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 // positioned relative to. 598 // positioned relative to.
523 - (NSRect)omniboxPopupAnchorRect; 599 - (NSRect)omniboxPopupAnchorRect;
524 600
525 // Force a layout of info bars. 601 // Force a layout of info bars.
526 - (void)layoutInfoBars; 602 - (void)layoutInfoBars;
527 603
528 @end // @interface BrowserWindowController (TestingAPI) 604 @end // @interface BrowserWindowController (TestingAPI)
529 605
530 606
531 #endif // CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_CONTROLLER_H_ 607 #endif // CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_CONTROLLER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698