Index: chrome/browser/ui/cocoa/browser_window_controller_private.mm |
diff --git a/chrome/browser/ui/cocoa/browser_window_controller_private.mm b/chrome/browser/ui/cocoa/browser_window_controller_private.mm |
index 2aa6a4cc83c8fac45b64456b3f90490371e38248..b808efe0a3e394be7a3d60e4629b89293dc61121 100644 |
--- a/chrome/browser/ui/cocoa/browser_window_controller_private.mm |
+++ b/chrome/browser/ui/cocoa/browser_window_controller_private.mm |
@@ -25,6 +25,7 @@ |
#include "chrome/browser/ui/browser_window_state.h" |
#import "chrome/browser/ui/cocoa/browser_window_fullscreen_transition.h" |
#import "chrome/browser/ui/cocoa/browser_window_layout.h" |
+#import "chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet_controller.h" |
#import "chrome/browser/ui/cocoa/custom_frame_view.h" |
#import "chrome/browser/ui/cocoa/dev_tools_controller.h" |
#import "chrome/browser/ui/cocoa/fast_resize_view.h" |
@@ -700,6 +701,8 @@ willPositionSheet:(NSWindow*)sheet |
enteringAppKitFullscreenOnPrimaryScreen_ = |
[[[self window] screen] isEqual:[[NSScreen screens] firstObject]]; |
+ [self setSheetHiddenForFullscreenTransition:YES]; |
+ |
// If we are using custom fullscreen animations, the layout will resize |
// in startCustomAnimationToEnterFullScreenWithDuration. In order to prevent |
// multiple resizing messages from being sent to the renderer, we should call |
@@ -758,15 +761,17 @@ willPositionSheet:(NSWindow*)sheet |
base::MessageLoop::current()->PostTask(FROM_HERE, callback); |
} |
+ [self setSheetHiddenForFullscreenTransition:NO]; |
+ |
if (notification) // For System Fullscreen when non-nil. |
[self deregisterForContentViewResizeNotifications]; |
+ |
enteringAppKitFullscreen_ = NO; |
enteringImmersiveFullscreen_ = NO; |
enteringPresentationMode_ = NO; |
isUsingCustomAnimation_ = NO; |
[self showFullscreenExitBubbleIfNecessary]; |
- [self layoutSubviews]; |
browser_->WindowFullscreenStateChanged(); |
} |
@@ -778,10 +783,19 @@ willPositionSheet:(NSWindow*)sheet |
// Like windowWillEnterFullScreen, if we use custom animations, |
// adjustUIForExitingFullscreen should be called after the layout resizes in |
// startCustomAnimationToExitFullScreenWithDuration. |
- if (isUsingCustomAnimation_) |
+ if (isUsingCustomAnimation_) { |
blockLayoutSubviews_ = YES; |
- else |
+ [self setSheetHiddenForFullscreenTransition:YES]; |
+ |
+ // In OSX 10.11, when the NSFullScreenWindowMask is added or removed, |
+ // the window's frame and layer changes slightly which causes a janky |
+ // movement. As a result, we should disable the content view's autoresize |
+ // at the beginning of the animation and set it back to its original value |
+ // at the end of the animation. |
+ [self.chromeContentView setAutoresizesSubviews:NO]; |
+ } else { |
[self adjustUIForExitingFullscreen]; |
+ } |
} |
- (void)windowDidExitFullScreen:(NSNotification*)notification { |
@@ -791,6 +805,9 @@ willPositionSheet:(NSWindow*)sheet |
[self deregisterForContentViewResizeNotifications]; |
browser_->WindowFullscreenStateChanged(); |
+ [self.chromeContentView setAutoresizesSubviews:YES]; |
+ |
+ [self setSheetHiddenForFullscreenTransition:NO]; |
exitingAppKitFullscreen_ = NO; |
isUsingCustomAnimation_ = NO; |
@@ -814,10 +831,25 @@ willPositionSheet:(NSWindow*)sheet |
fullscreenTransition_.reset(); |
isUsingCustomAnimation_ = NO; |
blockLayoutSubviews_ = NO; |
+ |
// Force a relayout to try and get the window back into a reasonable state. |
+ [self.chromeContentView setAutoresizesSubviews:YES]; |
[self layoutSubviews]; |
} |
+- (void)setSheetHiddenForFullscreenTransition:(BOOL)shoudHide { |
+ if (!isUsingCustomAnimation_) |
+ return; |
+ |
+ ConstrainedWindowSheetController* sheetController = |
+ [ConstrainedWindowSheetController |
+ controllerForParentWindow:[self window]]; |
+ if (shoudHide) |
+ [sheetController hideSheetForFullscreenTransition]; |
+ else |
+ [sheetController unhideSheetForFullscreenTransition]; |
+} |
+ |
- (void)adjustUIForExitingFullscreen { |
[self destroyFullscreenExitBubbleIfNecessary]; |
[self adjustUIForExitingFullscreenAndStopOmniboxSliding]; |
@@ -1166,7 +1198,7 @@ willPositionSheet:(NSWindow*)sheet |
NSArray* customWindows = |
[fullscreenTransition_ customWindowsForFullScreenTransition]; |
- isUsingCustomAnimation_ = !customWindows; |
+ isUsingCustomAnimation_ = customWindows != nil; |
return customWindows; |
} |
@@ -1185,7 +1217,7 @@ willPositionSheet:(NSWindow*)sheet |
NSArray* customWindows = |
[fullscreenTransition_ customWindowsForFullScreenTransition]; |
- isUsingCustomAnimation_ = !customWindows; |
+ isUsingCustomAnimation_ = customWindows != nil; |
return customWindows; |
} |