blob: 2fbf72526fe3d95475b7eda39b4d5b3e1bb2ad24 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_CONTROLLER_PRIVATE_H_
#define CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_CONTROLLER_PRIVATE_H_
#import "chrome/browser/ui/cocoa/browser_window_controller.h"
#import "chrome/browser/ui/cocoa/browser_window_layout.h"
#import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_controller.h"
@class BrowserWindowLayout;
class PermissionRequestManager;
namespace content {
class WebContents;
} // content.
// There are 2 mechanisms for invoking fullscreen: AppKit and Immersive.
// PRESENTATION_MODE = 1 had been removed, but the enums aren't renumbered
// since they are associated with a histogram.
enum FullscreenStyle {
IMMERSIVE_FULLSCREEN = 0,
CANONICAL_FULLSCREEN = 2,
FULLSCREEN_STYLE_COUNT = 3
};
// The source that triggered fullscreen. The enums should not be renumbered
// since they're ssociated with a histogram. Exposed for testing.
enum class FullscreenSource {
BROWSER = 0,
TAB,
EXTENSION,
FULLSCREEN_SOURCE_COUNT
};
// Private methods for the |BrowserWindowController|. This category should
// contain the private methods used by different parts of the BWC; private
// methods used only by single parts should be declared in their own file.
// TODO(viettrungluu): [crbug.com/35543] work on splitting out stuff from the
// BWC, and figuring out which methods belong here (need to unravel
// "dependencies").
@interface BrowserWindowController(Private)
// Create the appropriate tab strip controller based on whether or not side
// tabs are enabled. Replaces the current controller.
- (void)createTabStripController;
// Sets the window's collection behavior to the appropriate
// fullscreen behavior.
- (void)updateFullscreenCollectionBehavior;
// Saves the window's position in the local state preferences.
- (void)saveWindowPositionIfNeeded;
// We need to adjust where sheets come out of the window, as by default they
// erupt from the omnibox, which is rather weird.
- (NSRect)window:(NSWindow*)window
willPositionSheet:(NSWindow*)sheet
usingRect:(NSRect)defaultSheetRect;
// Repositions the window's subviews. From the top down: toolbar, normal
// bookmark bar (if shown), infobar, NTP detached bookmark bar (if shown),
// content area, download shelf (if any).
- (void)layoutSubviews;
// Shows the informational "how to exit fullscreen" bubble.
- (void)showFullscreenExitBubbleIfNecessary;
// Lays out the tab strip and avatar button.
- (void)applyTabStripLayout:(const chrome::TabStripLayout&)layout;
// Returns YES if the bookmark bar should be placed below the infobar, NO
// otherwise.
- (BOOL)placeBookmarkBarBelowInfoBar;
// Lays out the tab content area in the given frame. If the height changes,
// sends a message to the renderer to resize.
- (void)layoutTabContentArea:(NSRect)frame;
// Sets the toolbar's height to a value appropriate for the given compression.
// Also adjusts the bookmark bar's height by the opposite amount in order to
// keep the total height of the two views constant.
- (void)adjustToolbarAndBookmarkBarForCompression:(CGFloat)compression;
// Moves views between windows in preparation for fullscreen mode when not using
// Cocoa's System Fullscreen API. (System Fullscreen reuses the original window
// for fullscreen mode, so there is no need to move views around.) This method
// does not position views; callers must also call |-layoutSubviews:|.
- (void)moveViewsForImmersiveFullscreen:(BOOL)fullscreen
regularWindow:(NSWindow*)regularWindow
fullscreenWindow:(NSWindow*)fullscreenWindow;
// Updates the anchor position of the permission bubble.
- (void)updatePermissionBubbleAnchor;
// Enter or exit fullscreen without using Cocoa's System Fullscreen API. These
// methods are internal implementations of |-setFullscreen:|.
- (void)enterImmersiveFullscreen;
- (void)exitImmersiveFullscreen;
// Register or deregister for content view resize notifications. These
// notifications are used while transitioning into fullscreen mode using Cocoa's
// System Fullscreen API.
- (void)registerForContentViewResizeNotifications;
- (void)deregisterForContentViewResizeNotifications;
// The opacity for the toolbar divider; 0 means that it shouldn't be shown.
- (CGFloat)toolbarDividerOpacity;
// Update visibility of the infobar tip, depending on the state of the window.
- (void)updateInfoBarTipVisibility;
// The distance from the toolbar bottom to the anchor point for InfoBars.
- (NSInteger)infoBarAnchorPointY;
// Enter fullscreen by toggling the AppKit Fullscreen API.
- (void)enterAppKitFullscreen;
// Exit fullscreen by toggling the AppKit Fullscreen API. If |async| is true,
// call -toggleFullscreen: asynchronously.
- (void)exitAppKitFullscreenAsync:(BOOL)async;
// Returns where the fullscreen button should be positioned in the window.
// Returns NSZeroRect if there is no fullscreen button (if currently in
// fullscreen, or if running 10.6 or 10.10+).
- (NSRect)fullscreenButtonFrame;
// Updates |layout| with the full set of parameters required to statelessly
// determine the layout of the views managed by this controller.
- (void)updateLayoutParameters:(BrowserWindowLayout*)layout;
// Applies a layout to the views managed by this controller.
- (void)applyLayout:(BrowserWindowLayout*)layout;
// Ensures that the window's content view's subviews have the correct
// z-ordering. Will add or remove subviews as necessary.
- (void)updateSubviewZOrder;
// Performs updateSubviewZOrder when this controller is not in fullscreen.
- (void)updateSubviewZOrderNormal;
// Performs updateSubviewZOrder when this controller is in fullscreen.
- (void)updateSubviewZOrderFullscreen;
// Sets the content view's subviews. Attempts to not touch the tabContentArea
// to prevent redraws.
- (void)setContentViewSubviews:(NSArray*)subviews;
// There is a bug in Mavericks for applications linked against OSX 10.8 and
// earlier. The bug requires Screens Have Separate Spaces to be enabled, and
// for the window to be on a secondary screen. When AppKit Fullscreen is
// invoked on the window, its final frame is 22pt too short. These methods
// detect when the relevant conditions have been met so that a hack can be
// applied to fix the size of the window.
// http://crbug.com/396980
+ (BOOL)systemSettingsRequireMavericksAppKitFullscreenHack;
- (BOOL)shouldUseMavericksAppKitFullscreenHack;
// Whether the instance should use a custom transition when animating into and
// out of AppKit Fullscreen.
- (BOOL)shouldUseCustomAppKitFullscreenTransition:(BOOL)enterFullScreen;
// Resets the variables that were set from using custom AppKit fullscreen
// animation.
- (void)resetCustomAppKitFullscreenVariables;
- (content::WebContents*)webContents;
- (PermissionRequestManager*)permissionRequestManager;
// Hides or unhides any displayed modal sheet for fullscreen transition.
// Modal sheets should be hidden at the beginning and then shown at the end.
- (void)setSheetHiddenForFullscreenTransition:(BOOL)shoudHide;
// Adjusts the UI and destroys the exit bubble when we are exiting fullscreen.
- (void)adjustUIForExitingFullscreen;
// Determines the appropriate sliding fullscreen style and adjusts the UI to
// it when we are entering fullscreen.
- (void)adjustUIForEnteringFullscreen;
// Records fullscreen metrics when the browser enters fullscreen.
- (void)recordEnterFullscreenMetrics:(FullscreenStyle)style;
// Accessor for the controller managing the fullscreen toolbar visibility
// locks.
- (FullscreenToolbarVisibilityLockController*)
fullscreenToolbarVisibilityLockController;
@end // @interface BrowserWindowController(Private)
#endif // CHROME_BROWSER_UI_COCOA_BROWSER_WINDOW_CONTROLLER_PRIVATE_H_