Index: chrome/browser/ui/cocoa/browser_window_controller_private.mm |
=================================================================== |
--- chrome/browser/ui/cocoa/browser_window_controller_private.mm (revision 95287) |
+++ chrome/browser/ui/cocoa/browser_window_controller_private.mm (working copy) |
@@ -12,12 +12,16 @@ |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" |
#include "chrome/browser/ui/browser_list.h" |
+#import "chrome/browser/ui/cocoa/browser/avatar_button.h" |
#import "chrome/browser/ui/cocoa/fast_resize_view.h" |
#import "chrome/browser/ui/cocoa/find_bar/find_bar_cocoa_controller.h" |
#import "chrome/browser/ui/cocoa/floating_bar_backing_view.h" |
+#import "chrome/browser/ui/cocoa/focus_tracker.h" |
#import "chrome/browser/ui/cocoa/framed_browser_window.h" |
-#import "chrome/browser/ui/cocoa/fullscreen_controller.h" |
+#import "chrome/browser/ui/cocoa/fullscreen_window.h" |
#import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h" |
+#import "chrome/browser/ui/cocoa/presentation_mode_controller.h" |
+#import "chrome/browser/ui/cocoa/status_bubble_mac.h" |
#import "chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.h" |
#import "chrome/browser/ui/cocoa/tabs/side_tab_strip_controller.h" |
#import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h" |
@@ -30,31 +34,33 @@ |
#include "content/browser/tab_contents/tab_contents.h" |
#include "content/browser/tab_contents/tab_contents_view.h" |
-// Provide the forward-declarations of new 10.7 SDK symbols so they can be |
-// called when building with the 10.5 SDK. |
-#if !defined(MAC_OS_X_VERSION_10_7) || \ |
- MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 |
+// Forward-declare symbols that are part of the 10.6 SDK. |
+#if !defined(MAC_OS_X_VERSION_10_6) || \ |
+ MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6 |
-@interface NSWindow (LionSDKDeclarations) |
-- (void)toggleFullScreen:(id)sender; |
-@end |
- |
enum { |
- NSWindowCollectionBehaviorFullScreenPrimary = 1 << 7, |
- NSWindowCollectionBehaviorFullScreenAuxiliary = 1 << 8 |
+ NSApplicationPresentationDefault = 0, |
+ NSApplicationPresentationAutoHideDock = (1 << 0), |
+ NSApplicationPresentationHideDock = (1 << 1), |
+ NSApplicationPresentationAutoHideMenuBar = (1 << 2), |
+ NSApplicationPresentationHideMenuBar = (1 << 3), |
}; |
+typedef NSUInteger NSApplicationPresentationOptions; |
-enum { |
- NSWindowFullScreenButton = 7 |
-}; |
+#endif // MAC_OS_X_VERSION_10_6 |
-#endif // MAC_OS_X_VERSION_10_7 |
- |
namespace { |
// Space between the incognito badge and the right edge of the window. |
const CGFloat kIncognitoBadgeOffset = 4; |
+// The amount by which to shrink the tab strip (on the right) when the |
+// incognito badge is present. |
+const CGFloat kAvatarTabStripShrink = 18; |
+ |
+// The amount by which to shift the avatar to the right if on Lion. |
+const CGFloat kAvatarShiftForLion = 20; |
+ |
// Insets for the location bar, used when the full toolbar is hidden. |
// TODO(viettrungluu): We can argue about the "correct" insetting; I like the |
// following best, though arguably 0 inset is better/more correct. |
@@ -82,6 +88,26 @@ |
delegate:self]); |
} |
+- (void)createAndInstallPresentationModeToggleButton { |
+ DCHECK(base::mac::IsOSLionOrLater()); |
+ if (presentationModeToggleButton_.get()) |
+ return; |
+ |
+ // TODO(rohitrao): Make this button prettier. |
+ presentationModeToggleButton_.reset( |
+ [[NSButton alloc] initWithFrame:NSMakeRect(0, 0, 25, 25)]); |
+ NSButton* button = presentationModeToggleButton_.get(); |
+ [button setButtonType:NSMomentaryLightButton]; |
+ [button setBezelStyle:NSRegularSquareBezelStyle]; |
+ [button setBordered:NO]; |
+ [[button cell] setHighlightsBy:NSContentsCellMask]; |
+ [[button cell] setShowsStateBy:NSContentsCellMask]; |
+ [button setImage:[NSImage imageNamed:NSImageNameIChatTheaterTemplate]]; |
Mark Mentovai
2011/08/04 19:18:17
I think this was a great choice for now, at least
|
+ [button setTarget:self]; |
+ [button setAction:@selector(togglePresentationMode:)]; |
+ [[[[self window] contentView] superview] addSubview:button]; |
+} |
+ |
- (void)saveWindowPositionIfNeeded { |
if (browser_ != BrowserList::GetLastActive()) |
return; |
@@ -184,22 +210,30 @@ |
if ([window respondsToSelector:@selector(setShouldHideTitle:)]) |
[(id)window setShouldHideTitle:![self hasTitleBar]]; |
- BOOL isFullscreen = [self isFullscreen]; |
+ BOOL inPresentationMode = [self inPresentationMode]; |
CGFloat floatingBarHeight = [self floatingBarHeight]; |
- // In fullscreen mode, |yOffset| accounts for the sliding position of the |
+ // In presentation mode, |yOffset| accounts for the sliding position of the |
// floating bar and the extra offset needed to dodge the menu bar. |
- CGFloat yOffset = isFullscreen ? |
+ CGFloat yOffset = inPresentationMode ? |
(floor((1 - floatingBarShownFraction_) * floatingBarHeight) - |
Mark Mentovai
2011/08/04 19:18:17
#include <cmath> and use std::floor, here and on l
rohitrao (ping after 24h)
2011/08/04 19:49:17
Done.
|
- [fullscreenController_ floatingBarVerticalOffset]) : 0; |
+ [presentationModeController_ floatingBarVerticalOffset]) : 0; |
CGFloat maxY = NSMaxY(contentBounds) + yOffset; |
CGFloat startMaxY = maxY; |
+ CGFloat overlayMaxY = |
+ NSMaxY([window frame]) + |
+ floor((1 - floatingBarShownFraction_) * floatingBarHeight); |
+ [self layoutPresentationModeToggleAtOverlayMaxX:NSMaxX([window frame]) |
+ overlayMaxY:overlayMaxY]; |
+ |
if ([self hasTabStrip] && ![self useVerticalTabs]) { |
// If we need to lay out the top tab strip, replace |maxY| and |startMaxY| |
// with higher values, and then lay out the tab strip. |
NSRect windowFrame = [contentView convertRect:[window frame] fromView:nil]; |
startMaxY = maxY = NSHeight(windowFrame) + yOffset; |
- maxY = [self layoutTabStripAtMaxY:maxY width:width fullscreen:isFullscreen]; |
+ maxY = [self layoutTabStripAtMaxY:maxY |
+ width:width |
+ fullscreen:[self isFullscreen]]; |
} |
// Sanity-check |maxY|. |
@@ -229,20 +263,20 @@ |
NSRect floatingBarBackingRect = |
NSMakeRect(minX, maxY, width, floatingBarHeight); |
[self layoutFloatingBarBackingView:floatingBarBackingRect |
- fullscreen:isFullscreen]; |
+ presentationMode:inPresentationMode]; |
// Place the find bar immediately below the toolbar/attached bookmark bar. In |
- // fullscreen mode, it hangs off the top of the screen when the bar is hidden. |
- // The find bar is unaffected by the side tab positioning. |
+ // presentation mode, it hangs off the top of the screen when the bar is |
+ // hidden. The find bar is unaffected by the side tab positioning. |
[findBarCocoaController_ positionFindBarViewAtMaxY:maxY maxWidth:width]; |
- // If in fullscreen mode, reset |maxY| to top of screen, so that the floating |
- // bar slides over the things which appear to be in the content area. |
- if (isFullscreen) |
+ // If in presentation mode, reset |maxY| to top of screen, so that the |
+ // floating bar slides over the things which appear to be in the content area. |
+ if (inPresentationMode) |
maxY = NSMaxY(contentBounds); |
// Also place the infobar container immediate below the toolbar, except in |
- // fullscreen mode in which case it's at the top of the visual content area. |
+ // presentation mode in which case it's at the top of the visual content area. |
maxY = [self layoutInfoBarAtMinX:minX maxY:maxY width:width]; |
// If the bookmark bar is detached, place it next in the visual content area. |
@@ -263,10 +297,10 @@ |
} |
- (CGFloat)floatingBarHeight { |
- if (![self isFullscreen]) |
+ if (![self inPresentationMode]) |
return 0; |
- CGFloat totalHeight = [fullscreenController_ floatingBarVerticalOffset]; |
+ CGFloat totalHeight = [presentationModeController_ floatingBarVerticalOffset]; |
if ([self hasTabStrip]) |
totalHeight += NSHeight([[self tabStripView] frame]); |
@@ -284,6 +318,23 @@ |
return totalHeight; |
} |
+- (void)layoutPresentationModeToggleAtOverlayMaxX:(CGFloat)maxX |
+ overlayMaxY:(CGFloat)maxY { |
+ // Lay out the presentation mode toggle button at the very top of the |
+ // tabstrip. |
Mark Mentovai
2011/08/04 19:18:17
tab strip is two words.
rohitrao (ping after 24h)
2011/08/04 19:49:17
Done.
|
+ if ([self shouldShowPresentationModeToggle]) { |
+ [self createAndInstallPresentationModeToggleButton]; |
+ |
+ NSPoint origin = |
+ NSMakePoint(maxX - NSWidth([presentationModeToggleButton_ frame]), |
+ maxY - NSHeight([presentationModeToggleButton_ frame])); |
+ [presentationModeToggleButton_ setFrameOrigin:origin]; |
+ } else { |
+ [presentationModeToggleButton_ removeFromSuperview]; |
+ presentationModeToggleButton_.reset(); |
+ } |
+} |
+ |
- (CGFloat)layoutTabStripAtMaxY:(CGFloat)maxY |
width:(CGFloat)width |
fullscreen:(BOOL)fullscreen { |
@@ -296,25 +347,38 @@ |
maxY -= tabStripHeight; |
[tabStripView setFrame:NSMakeRect(0, maxY, width, tabStripHeight)]; |
- // Set indentation. |
- [tabStripController_ setIndentForControls:(fullscreen ? 0 : |
- [[tabStripController_ class] defaultIndentForControls])]; |
+ // Set left indentation based on fullscreen mode status. |
+ [tabStripController_ setLeftIndentForControls:(fullscreen ? 0 : |
+ [[tabStripController_ class] defaultLeftIndentForControls])]; |
- // TODO(viettrungluu): Seems kind of bad -- shouldn't |-layoutSubviews| do |
- // this? Moreover, |-layoutTabs| will try to animate.... |
- [tabStripController_ layoutTabs]; |
+ // Calculate the right indentation. The default indentation built into the |
+ // tabstrip leaves enough room for the fullscreen button or presentation mode |
+ // toggle button on Lion. On non-Lion systems, the default indentation also |
+ // looks fine. If an avatar button is present, indent enough to account for |
+ // its width. |
+ const CGFloat possibleExtraShiftForLion = |
+ base::mac::IsOSLionOrLater() ? kAvatarShiftForLion : 0; |
+ CGFloat rightIndent = 0; |
+ if ([self shouldShowAvatar]) |
+ rightIndent += (kAvatarTabStripShrink + possibleExtraShiftForLion); |
+ [tabStripController_ setRightIndentForControls:rightIndent]; |
+ |
+ // Go ahead and layout the tabs. |
+ [tabStripController_ layoutTabsWithoutAnimation]; |
+ |
// Now lay out incognito badge together with the tab strip. |
if (avatarButton_.get()) { |
- // Set the size of the avatar to be the (height of the tabstrip) - (padding) |
- // to let large icons fit. |
CGFloat sizeSquare = tabStripHeight - 5.0; |
[avatarButton_ setFrameSize:NSMakeSize(sizeSquare, sizeSquare)]; |
- // Actually place the badge *above* |maxY|, by +2 to miss the divider. |
- NSPoint origin = NSMakePoint(width - NSWidth([avatarButton_ frame]) - |
- kIncognitoBadgeOffset, |
- maxY + 2); |
+ // Actually place the badge *above* |maxY|, by +2 to miss the divider. On |
+ // Lion or later, shift the badge left to move it away from the fullscreen |
+ // button. |
+ CGFloat badgeOffset = kIncognitoBadgeOffset + possibleExtraShiftForLion; |
+ NSPoint origin = |
+ NSMakePoint(width - NSWidth([avatarButton_ frame]) - badgeOffset, |
+ maxY + 2); |
[avatarButton_ setFrameOrigin:origin]; |
[avatarButton_ setHidden:NO]; // Make sure it's shown. |
} |
@@ -386,9 +450,9 @@ |
} |
- (void)layoutFloatingBarBackingView:(NSRect)frame |
- fullscreen:(BOOL)fullscreen { |
- // Only display when in fullscreen mode. |
- if (fullscreen) { |
+ presentationMode:(BOOL)presentationMode { |
+ // Only display when in presentation mode. |
+ if (presentationMode) { |
// For certain window types such as app windows (e.g., the dev tools |
// window), there's no actual overlay. (Displaying one would result in an |
// overly sliding in only under the menu, which gives an ugly effect.) |
@@ -414,7 +478,7 @@ |
} |
// But we want the logic to work as usual (for show/hide/etc. purposes). |
- [fullscreenController_ overlayFrameChanged:frame]; |
+ [presentationModeController_ overlayFrameChanged:frame]; |
} else { |
// Okay to call even if |floatingBarBackingView_| is nil. |
if ([floatingBarBackingView_ superview]) |
@@ -505,18 +569,300 @@ |
[self layoutSubviews]; |
} |
+// Fullscreen and presentation mode methods |
+ |
+- (BOOL)shouldUsePresentationModeWhenEnteringFullscreen { |
+ return browser_->profile()->GetPrefs()->GetBoolean( |
+ prefs::kPresentationModeEnabled); |
+} |
+ |
+- (void)setShouldUsePresentationModeWhenEnteringFullscreen:(BOOL)flag { |
+ browser_->profile()->GetPrefs()->SetBoolean( |
+ prefs::kPresentationModeEnabled, flag); |
+} |
+ |
+- (BOOL)shouldShowPresentationModeToggle { |
+ return base::mac::IsOSLionOrLater() && [self isFullscreen]; |
+} |
+ |
+- (void)moveViewsForFullscreen:(BOOL)fullscreen |
+ regularWindow:(NSWindow*)regularWindow |
+ fullscreenWindow:(NSWindow*)fullscreenWindow { |
+ // This method is only for Snow Leopard and earlier. |
Mark Mentovai
2011/08/04 19:18:17
So name it with SnowLeopardOrEarlier like you’ve d
rohitrao (ping after 24h)
2011/08/04 19:49:17
Done.
|
+ DCHECK(base::mac::IsOSSnowLeopardOrEarlier()); |
+ |
+ NSWindow* sourceWindow = fullscreen ? regularWindow : fullscreenWindow; |
+ NSWindow* destWindow = fullscreen ? fullscreenWindow : regularWindow; |
+ |
+ // Close the bookmark bubble, if it's open. Use |-ok:| instead of |-cancel:| |
+ // or |-close| because that matches the behavior when the bubble loses key |
+ // status. |
+ [bookmarkBubbleController_ ok:self]; |
+ |
+ // Save the current first responder so we can restore after views are moved. |
+ scoped_nsobject<FocusTracker> focusTracker( |
+ [[FocusTracker alloc] initWithWindow:sourceWindow]); |
+ |
+ // While we move views (and focus) around, disable any bar visibility changes. |
+ [self disableBarVisibilityUpdates]; |
+ |
+ // Destroy the tab strip's sheet controller. We will recreate it in the new |
+ // window when needed. |
+ [tabStripController_ destroySheetController]; |
+ |
+ // Retain the tab strip view while we remove it from its superview. |
+ scoped_nsobject<NSView> tabStripView; |
+ if ([self hasTabStrip] && ![self useVerticalTabs]) { |
+ tabStripView.reset([[self tabStripView] retain]); |
+ [tabStripView removeFromSuperview]; |
+ } |
+ |
+ // Ditto for the content view. |
+ scoped_nsobject<NSView> contentView([[sourceWindow contentView] retain]); |
+ // Disable autoresizing of subviews while we move views around. This prevents |
+ // spurious renderer resizes. |
+ [contentView setAutoresizesSubviews:NO]; |
+ [contentView removeFromSuperview]; |
+ |
+ // Have to do this here, otherwise later calls can crash because the window |
+ // has no delegate. |
+ [sourceWindow setDelegate:nil]; |
+ [destWindow setDelegate:self]; |
+ |
+ // With this call, valgrind complains that a "Conditional jump or move depends |
+ // on uninitialised value(s)". The error happens in -[NSThemeFrame |
+ // drawOverlayRect:]. I'm pretty convinced this is an Apple bug, but there is |
+ // no visual impact. I have been unable to tickle it away with other window |
+ // or view manipulation Cocoa calls. Stack added to suppressions_mac.txt. |
+ [contentView setAutoresizesSubviews:YES]; |
+ [destWindow setContentView:contentView]; |
+ |
+ // Move the incognito badge if present. |
+ if (avatarButton_.get()) { |
+ [avatarButton_ removeFromSuperview]; |
+ [avatarButton_ setHidden:YES]; // Will be shown in layout. |
+ [[[destWindow contentView] superview] addSubview:avatarButton_]; |
+ } |
+ |
+ // Add the tab strip after setting the content view and moving the incognito |
+ // badge (if any), so that the tab strip will be on top (in the z-order). |
+ if ([self hasTabStrip] && ![self useVerticalTabs]) |
+ [[[destWindow contentView] superview] addSubview:tabStripView]; |
+ |
+ [sourceWindow setWindowController:nil]; |
+ [self setWindow:destWindow]; |
+ [destWindow setWindowController:self]; |
+ |
+ // Move the status bubble over, if we have one. |
+ if (statusBubble_) |
+ statusBubble_->SwitchParentWindow(destWindow); |
+ |
+ // Move the title over. |
+ [destWindow setTitle:[sourceWindow title]]; |
+ |
+ // The window needs to be onscreen before we can set its first responder. |
+ // Ordering the window to the front can change the active Space (either to |
+ // the window's old Space or to the application's assigned Space). To prevent |
+ // this by temporarily change the collectionBehavior. |
+ NSWindowCollectionBehavior behavior = [sourceWindow collectionBehavior]; |
+ [destWindow setCollectionBehavior: |
+ NSWindowCollectionBehaviorMoveToActiveSpace]; |
+ [destWindow makeKeyAndOrderFront:self]; |
+ [destWindow setCollectionBehavior:behavior]; |
+ |
+ [focusTracker restoreFocusInWindow:destWindow]; |
+ [sourceWindow orderOut:self]; |
+ |
+ // We're done moving focus, so re-enable bar visibility changes. |
+ [self enableBarVisibilityUpdates]; |
+} |
+ |
+- (void)setPresentationModeInternal:(BOOL)presentationMode |
+ forceDropdown:(BOOL)forceDropdown { |
+ if (presentationMode == [self inPresentationMode]) |
+ return; |
+ |
+ if (presentationMode) { |
+ BOOL showDropdown = forceDropdown || [self floatingBarHasFocus]; |
+ NSView* contentView = [[self window] contentView]; |
+ presentationModeController_.reset( |
+ [[PresentationModeController alloc] initWithBrowserController:self]); |
+ [presentationModeController_ enterPresentationModeForContentView:contentView |
+ showDropdown:showDropdown]; |
+ } else { |
+ [presentationModeController_ exitPresentationMode]; |
+ presentationModeController_.reset(); |
+ } |
+ |
+ [self adjustUIForPresentationMode:presentationMode]; |
+ [self layoutSubviews]; |
+} |
+ |
+- (void)enterFullscreenForSnowLeopardOrEarlier { |
+ DCHECK(base::mac::IsOSSnowLeopardOrEarlier()); |
+ |
+ // Fade to black. |
+ const CGDisplayReservationInterval kFadeDurationSeconds = 0.6; |
+ Boolean didFadeOut = NO; |
+ CGDisplayFadeReservationToken token; |
+ if (CGAcquireDisplayFadeReservation(kFadeDurationSeconds, &token) |
+ == kCGErrorSuccess) { |
+ didFadeOut = YES; |
+ CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendNormal, |
+ kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, /*synchronous=*/true); |
+ } |
+ |
+ // Create the fullscreen window. After this line, isFullscreen will return |
+ // YES. |
+ fullscreenWindow_.reset([[self createFullscreenWindow] retain]); |
+ savedRegularWindow_ = [[self window] retain]; |
+ savedRegularWindowFrame_ = [savedRegularWindow_ frame]; |
+ |
+ [self moveViewsForFullscreen:YES |
+ regularWindow:[self window] |
+ fullscreenWindow:fullscreenWindow_.get()]; |
+ [self adjustUIForPresentationMode:YES]; |
+ [self setPresentationModeInternal:YES forceDropdown:NO]; |
+ [self layoutSubviews]; |
+ |
+ // Fade back in. |
+ if (didFadeOut) { |
+ CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendSolidColor, |
+ kCGDisplayBlendNormal, 0.0, 0.0, 0.0, /*synchronous=*/false); |
+ CGReleaseDisplayFadeReservation(token); |
+ } |
+} |
+ |
+- (void)exitFullscreenForSnowLeopardOrEarlier { |
+ DCHECK(base::mac::IsOSSnowLeopardOrEarlier()); |
+ |
+ // Fade to black. |
+ const CGDisplayReservationInterval kFadeDurationSeconds = 0.6; |
+ Boolean didFadeOut = NO; |
+ CGDisplayFadeReservationToken token; |
+ if (CGAcquireDisplayFadeReservation(kFadeDurationSeconds, &token) |
+ == kCGErrorSuccess) { |
+ didFadeOut = YES; |
+ CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendNormal, |
+ kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, /*synchronous=*/true); |
+ } |
+ |
+ [self setPresentationModeInternal:NO forceDropdown:NO]; |
+ [self moveViewsForFullscreen:NO |
+ regularWindow:savedRegularWindow_ |
+ fullscreenWindow:fullscreenWindow_.get()]; |
+ |
+ // When exiting fullscreen mode, we need to call layoutSubviews manually. |
+ [savedRegularWindow_ autorelease]; |
+ savedRegularWindow_ = nil; |
+ fullscreenWindow_.reset(); |
+ [self layoutSubviews]; |
+ |
+ // Fade back in. |
+ if (didFadeOut) { |
+ CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendSolidColor, |
+ kCGDisplayBlendNormal, 0.0, 0.0, 0.0, /*synchronous=*/false); |
+ CGReleaseDisplayFadeReservation(token); |
+ } |
+} |
+ |
// TODO(rohitrao): This function has shrunk into uselessness, and |
// |-setFullscreen:| has grown rather large. Find a good way to break up |
// |-setFullscreen:| into smaller pieces. http://crbug.com/36449 |
-- (void)adjustUIForFullscreen:(BOOL)fullscreen { |
+- (void)adjustUIForPresentationMode:(BOOL)fullscreen { |
// Create the floating bar backing view if necessary. |
if (fullscreen && !floatingBarBackingView_.get() && |
([self hasTabStrip] || [self hasToolbar] || [self hasLocationBar])) { |
floatingBarBackingView_.reset( |
[[FloatingBarBackingView alloc] initWithFrame:NSZeroRect]); |
+ [floatingBarBackingView_ setAutoresizingMask:(NSViewWidthSizable | |
+ NSViewMinYMargin)]; |
} |
+ |
+ // Adjust the infobar container. In fullscreen, it needs to be below all |
+ // top chrome elements so it only sits atop the web contents. When in normal |
+ // mode, it needs to draw over the bookmark bar and part of the toolbar. |
+ [[infoBarContainerController_ view] removeFromSuperview]; |
+ NSView* infoBarDest = [[self window] contentView]; |
+ [infoBarDest addSubview:[infoBarContainerController_ view] |
+ positioned:fullscreen ? NSWindowBelow : NSWindowAbove |
+ relativeTo:fullscreen ? nil |
+ : [bookmarkBarController_ view]]; |
} |
+- (void)contentViewDidResize:(NSNotification*)notification { |
+ [self layoutSubviews]; |
+} |
+ |
+- (void)registerForContentViewResizeNotifications { |
+ [[NSNotificationCenter defaultCenter] |
+ addObserver:self |
+ selector:@selector(contentViewDidResize:) |
+ name:NSViewFrameDidChangeNotification |
+ object:[[self window] contentView]]; |
+} |
+ |
+- (void)deregisterForContentViewResizeNotifications { |
+ [[NSNotificationCenter defaultCenter] |
+ removeObserver:self |
+ name:NSViewFrameDidChangeNotification |
+ object:[[self window] contentView]]; |
+} |
+ |
+- (NSSize)window:(NSWindow*)window |
+ willUseFullScreenContentSize:(NSSize)proposedSize { |
+ return proposedSize; |
+} |
+ |
+- (NSApplicationPresentationOptions)window:(NSWindow*)window |
+ willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)opt { |
+ return (opt | |
+ NSApplicationPresentationAutoHideDock | |
+ NSApplicationPresentationAutoHideMenuBar); |
+} |
+ |
+- (void)windowWillEnterFullScreen:(NSNotification*)notification { |
+ [self registerForContentViewResizeNotifications]; |
+ |
+ // Always give focus to the tab contents before going fullscreen, to prevent a |
+ // crash when instant is open. |
+ // TODO(rohitrao): Find a way around this. |
+ [self focusTabContents]; |
+ |
+ NSWindow* window = [self window]; |
+ savedRegularWindowFrame_ = [window frame]; |
+ BOOL mode = [self shouldUsePresentationModeWhenEnteringFullscreen]; |
+ [self setPresentationModeInternal:mode forceDropdown:NO]; |
+} |
+ |
+- (void)windowDidEnterFullScreen:(NSNotification*)notification { |
+ [self deregisterForContentViewResizeNotifications]; |
+} |
+ |
+- (void)windowWillExitFullScreen:(NSNotification*)notification { |
+ [self registerForContentViewResizeNotifications]; |
+ |
+ // Always give focus to the tab contents before going fullscreen, to prevent a |
+ // crash when instant is open. |
+ // TODO(rohitrao): Find a way around this. |
+ [self focusTabContents]; |
+ |
+ [self setPresentationModeInternal:NO forceDropdown:NO]; |
+} |
+ |
+- (void)windowDidExitFullScreen:(NSNotification*)notification { |
+ [self deregisterForContentViewResizeNotifications]; |
+} |
+ |
+- (void)windowDidFailToEnterFullScreen:(NSWindow*)window { |
+ [self deregisterForContentViewResizeNotifications]; |
+ [self setPresentationModeInternal:NO forceDropdown:NO]; |
+} |
+ |
+- (void)windowDidFailToExitFullScreen:(NSWindow*)window { |
+ [self deregisterForContentViewResizeNotifications]; |
+} |
+ |
- (void)enableBarVisibilityUpdates { |
// Early escape if there's nothing to do. |
if (barVisibilityUpdatesEnabled_) |
@@ -525,9 +871,9 @@ |
barVisibilityUpdatesEnabled_ = YES; |
if ([barVisibilityLocks_ count]) |
- [fullscreenController_ ensureOverlayShownWithAnimation:NO delay:NO]; |
+ [presentationModeController_ ensureOverlayShownWithAnimation:NO delay:NO]; |
else |
- [fullscreenController_ ensureOverlayHiddenWithAnimation:NO delay:NO]; |
+ [presentationModeController_ ensureOverlayHiddenWithAnimation:NO delay:NO]; |
} |
- (void)disableBarVisibilityUpdates { |
@@ -536,11 +882,7 @@ |
return; |
barVisibilityUpdatesEnabled_ = NO; |
- [fullscreenController_ cancelAnimationAndTimers]; |
+ [presentationModeController_ cancelAnimationAndTimers]; |
} |
-- (void)setUpOSFullScreenButton { |
- // TOOD(rsesek): Properly implement Lion fullscreen <http://crbug.com/74065>. |
-} |
- |
@end // @implementation BrowserWindowController(Private) |