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

Unified Diff: chrome/browser/ui/cocoa/browser_window_controller.mm

Issue 1881093002: Implement Tab Detaching in Fullscreen Mode on Mac OSX (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add to the histogram Created 4 years, 8 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
« no previous file with comments | « chrome/browser/about_flags.cc ('k') | chrome/browser/ui/cocoa/browser_window_controller_private.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/cocoa/browser_window_controller.mm
diff --git a/chrome/browser/ui/cocoa/browser_window_controller.mm b/chrome/browser/ui/cocoa/browser_window_controller.mm
index 328873278325eeb8a1854e530d277969a3c837b5..0cabe30d460a66d49e78a72b3bb06062b1227b5d 100644
--- a/chrome/browser/ui/cocoa/browser_window_controller.mm
+++ b/chrome/browser/ui/cocoa/browser_window_controller.mm
@@ -363,23 +363,7 @@ void SetUpBrowserWindowCommandHandler(NSWindow* window) {
// Allow bar visibility to be changed.
[self enableBarVisibilityUpdates];
- // Set the window to participate in Lion Fullscreen mode. Setting this flag
- // has no effect on Snow Leopard or earlier. Panels can share a fullscreen
- // space with a tabbed window, but they can not be primary fullscreen
- // windows.
- // This ensures the fullscreen button is appropriately positioned. It must
- // be done before calling layoutSubviews because the new avatar button's
- // position depends on the fullscreen button's position, as well as
- // TabStripController's rightIndentForControls.
- // The fullscreen button's position may depend on the old avatar button's
- // width, but that does not require calling layoutSubviews first.
- NSUInteger collectionBehavior = [window collectionBehavior];
- collectionBehavior |=
- browser_->type() == Browser::TYPE_TABBED ||
- browser_->type() == Browser::TYPE_POPUP ?
- NSWindowCollectionBehaviorFullScreenPrimary :
- NSWindowCollectionBehaviorFullScreenAuxiliary;
- [window setCollectionBehavior:collectionBehavior];
+ [self updateFullscreenCollectionBehavior];
[self layoutSubviews];
@@ -1205,7 +1189,8 @@ void SetUpBrowserWindowCommandHandler(NSWindow* window) {
NSWindow* sourceWindow = [draggedTab window];
NSRect windowRect = [sourceWindow frame];
NSScreen* screen = [sourceWindow screen];
- windowRect.origin.y = NSHeight([screen frame]) - NSMaxY(windowRect);
+ windowRect.origin.y =
+ NSHeight([screen frame]) - NSMaxY(windowRect) + [self menubarOffset];
gfx::Rect browserRect(windowRect.origin.x, windowRect.origin.y,
NSWidth(windowRect), NSHeight(windowRect));
@@ -1245,6 +1230,19 @@ void SetUpBrowserWindowCommandHandler(NSWindow* window) {
[newBrowser->window()->GetNativeWindow() delegate]);
DCHECK(controller && [controller isKindOfClass:[TabWindowController class]]);
+ // Ensure that the window will appear on top of the source window in
+ // fullscreen mode.
+ if ([self isInAppKitFullscreen]) {
+ NSWindow* window = [controller window];
+ NSUInteger collectionBehavior = [window collectionBehavior];
+ collectionBehavior &= ~NSWindowCollectionBehaviorFullScreenPrimary;
+ collectionBehavior |= NSWindowCollectionBehaviorFullScreenAuxiliary;
+ [window setCollectionBehavior:collectionBehavior];
+ [window setLevel:NSFloatingWindowLevel];
+
+ controller->savedRegularWindowFrame_ = savedRegularWindowFrame_;
+ }
+
// And make sure we use the correct frame in the new view.
TabStripController* tabStripController = [controller tabStripController];
NSView* tabStrip = [self tabStripView];
@@ -1269,6 +1267,25 @@ void SetUpBrowserWindowCommandHandler(NSWindow* window) {
return controller;
}
+- (void)detachedWindowEnterFullscreenIfNeeded:(TabWindowController*)source {
+ // Ensure that this is only called when the tab is detached into its own
+ // window (in which the overlay window will be present).
+ DCHECK([self overlayWindow]);
+
+ if (([[source window] styleMask] & NSFullScreenWindowMask)
+ == NSFullScreenWindowMask) {
+ [self updateFullscreenCollectionBehavior];
+
+ // Since the detached window in fullscreen will have the size of the
+ // screen, it will set |savedRegularWindowFrame_| to the screen size after
+ // it enters fullscreen. Make sure that we have the correct value for the
+ // |savedRegularWindowFrame_|.
+ NSRect regularWindowFrame = savedRegularWindowFrame_;
+ [[self window] toggleFullScreen:nil];
+ savedRegularWindowFrame_ = regularWindowFrame;
+ }
+}
+
- (void)insertPlaceholderForTab:(TabView*)tab
frame:(NSRect)frame {
[super insertPlaceholderForTab:tab frame:frame];
@@ -1292,11 +1309,13 @@ void SetUpBrowserWindowCommandHandler(NSWindow* window) {
}
- (BOOL)tabTearingAllowed {
- return ![self isInAnyFullscreenMode];
+ return ![self isInAnyFullscreenMode] ||
+ base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnableFullscreenTabDetaching);
}
- (BOOL)windowMovementAllowed {
- return ![self isInAnyFullscreenMode];
+ return ![self isInAnyFullscreenMode] || [self overlayWindow];
}
- (BOOL)isTabFullyVisible:(TabView*)tab {
@@ -1908,6 +1927,10 @@ willAnimateFromState:(BookmarkBar::State)oldState
enteringAppKitFullscreen_);
}
+- (CGFloat)menubarOffset {
+ return [presentationModeController_ menubarOffset];
+}
+
- (void)enterExtensionFullscreen {
if (chrome::mac::SupportsSystemFullscreen()) {
[self enterBrowserFullscreenWithToolbar:NO];
« no previous file with comments | « chrome/browser/about_flags.cc ('k') | chrome/browser/ui/cocoa/browser_window_controller_private.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698