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

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

Issue 1876313002: Fixed a fullscreen race condition on OSX (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2661
Patch Set: 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/ui/cocoa/browser_window_fullscreen_transition.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/cocoa/browser_window_fullscreen_transition.mm
diff --git a/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.mm b/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.mm
index 409c4222dacb9594279d7079241c83589e82102b..1a0792aa5cf9039d0eb00a55237b2e63a9298653 100644
--- a/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.mm
+++ b/chrome/browser/ui/cocoa/browser_window_fullscreen_transition.mm
@@ -12,6 +12,7 @@
#import "base/mac/sdk_forward_declarations.h"
#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
+#import "chrome/browser/ui/cocoa/browser_window_controller.h"
#import "chrome/browser/ui/cocoa/framed_browser_window.h"
#import "chrome/browser/ui/cocoa/tabs/tab_strip_background_view.h"
@@ -22,8 +23,10 @@ NSString* const kSnapshotWindowAnimationID = @"SnapshotWindowAnimationID";
NSString* const kAnimationIDKey = @"AnimationIDKey";
// The fraction of the duration from AppKit's startCustomAnimation methods
-// that we want our animation to run in.
+// that we want our animation to run in. Yosemite's fraction is smaller
+// since its fullscreen transition is significantly slower.
CGFloat const kAnimationDurationFraction = 0.5;
+CGFloat const kAnimationDurationFractionYosemite = 0.3;
// This class has two simultaneous animations to resize and reposition layers.
// These animations must use the same timing function, otherwise there will be
@@ -91,6 +94,9 @@ class FrameAndStyleLock {
// The window which is undergoing the fullscreen transition.
base::scoped_nsobject<FramedBrowserWindow> primaryWindow_;
+ // The window which is undergoing the fullscreen transition.
+ BrowserWindowController* controller_; // weak
+
// A layer that holds a snapshot of the original state of |primaryWindow_|.
base::scoped_nsobject<CALayer> snapshotLayer_;
@@ -131,6 +137,10 @@ class FrameAndStyleLock {
// Locks and unlocks the FullSizeContentWindow.
scoped_ptr<FrameAndStyleLock> lock_;
+
+ // Flag that indicates if the animation was completed. Sets to true at the
+ // end of the animation.
+ BOOL completedTransition_;
}
// Takes a snapshot of |primaryWindow_| and puts it in |snapshotLayer_|.
@@ -180,11 +190,14 @@ class FrameAndStyleLock {
// -------------------------Public Methods----------------------------
-- (instancetype)initEnterWithWindow:(FramedBrowserWindow*)window {
- DCHECK(window);
- DCHECK([self rootLayerOfWindow:window]);
+- (instancetype)initEnterWithController:(BrowserWindowController*)controller {
+ DCHECK(controller);
+ DCHECK([self rootLayerOfWindow:[controller window]]);
if ((self = [super init])) {
- primaryWindow_.reset([window retain]);
+ controller_ = controller;
+ FramedBrowserWindow* framedBrowserWindow =
+ base::mac::ObjCCast<FramedBrowserWindow>([controller window]);
+ primaryWindow_.reset([framedBrowserWindow retain]);
isEnteringFullscreen_ = YES;
initialFrame_ = [primaryWindow_ frame];
@@ -193,19 +206,21 @@ class FrameAndStyleLock {
return self;
}
-- (instancetype)initExitWithWindow:(FramedBrowserWindow*)window
- frame:(NSRect)frame
- tabStripBackgroundView:(NSView*)view {
- DCHECK(window);
- DCHECK([self rootLayerOfWindow:window]);
+- (instancetype)initExitWithController:(BrowserWindowController*)controller {
+ DCHECK(controller);
+ DCHECK([self rootLayerOfWindow:[controller window]]);
if ((self = [super init])) {
- primaryWindow_.reset([window retain]);
- tabStripBackgroundView_.reset([view retain]);
+ controller_ = controller;
+ FramedBrowserWindow* framedBrowserWindow =
+ base::mac::ObjCCast<FramedBrowserWindow>([controller window]);
+ primaryWindow_.reset([framedBrowserWindow retain]);
+
isEnteringFullscreen_ = NO;
- finalFrame_ = frame;
initialFrame_ = [[primaryWindow_ screen] frame];
+ finalFrame_ = [controller savedRegularWindowFrame];
+ tabStripBackgroundView_.reset([[controller tabStripBackgroundView] retain]);
- lock_.reset(new FrameAndStyleLock(window));
+ lock_.reset(new FrameAndStyleLock(framedBrowserWindow));
}
return self;
}
@@ -216,8 +231,15 @@ class FrameAndStyleLock {
return @[ primaryWindow_.get(), snapshotWindow_.get() ];
}
+- (BOOL)isTransitionCompleted {
+ return completedTransition_;
+}
+
- (void)startCustomFullScreenAnimationWithDuration:(NSTimeInterval)duration {
- CGFloat animationDuration = duration * kAnimationDurationFraction;
+ CGFloat durationFraction = base::mac::IsOSYosemite()
+ ? kAnimationDurationFractionYosemite
+ : kAnimationDurationFraction;
+ CGFloat animationDuration = duration * durationFraction;
[self preparePrimaryWindowForAnimation];
[self animatePrimaryWindowWithDuration:animationDuration];
[self animateSnapshotWindowWithDuration:animationDuration];
@@ -501,7 +523,12 @@ class FrameAndStyleLock {
CALayer* root = [self rootLayerOfWindow:primaryWindow_];
[root removeAnimationForKey:kPrimaryWindowAnimationID];
root.opacity = 1;
+
+ if (!isEnteringFullscreen_)
+ [controller_ exitFullscreenAnimationFinished];
}
+
+ completedTransition_ = YES;
}
- (CALayer*)rootLayerOfWindow:(NSWindow*)window {
« no previous file with comments | « chrome/browser/ui/cocoa/browser_window_fullscreen_transition.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698