OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "chrome/browser/ui/cocoa/browser_window_controller_private.h" | 5 #import "chrome/browser/ui/cocoa/browser_window_controller_private.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 | 8 |
9 #import "base/auto_reset.h" | 9 #import "base/auto_reset.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
11 #include "base/mac/bind_objc_block.h" | 11 #include "base/mac/bind_objc_block.h" |
12 #include "base/mac/foundation_util.h" | 12 #include "base/mac/foundation_util.h" |
13 #include "base/mac/mac_util.h" | 13 #include "base/mac/mac_util.h" |
14 #import "base/mac/scoped_nsobject.h" | 14 #import "base/mac/scoped_nsobject.h" |
15 #import "base/mac/sdk_forward_declarations.h" | 15 #import "base/mac/sdk_forward_declarations.h" |
16 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
17 #include "base/prefs/pref_service.h" | 17 #include "base/prefs/pref_service.h" |
18 #include "base/prefs/scoped_user_pref_update.h" | 18 #include "base/prefs/scoped_user_pref_update.h" |
19 #include "chrome/browser/browser_process.h" | 19 #include "chrome/browser/browser_process.h" |
20 #include "chrome/browser/fullscreen.h" | 20 #include "chrome/browser/fullscreen.h" |
21 #include "chrome/browser/profiles/profile.h" | 21 #include "chrome/browser/profiles/profile.h" |
22 #include "chrome/browser/profiles/profile_avatar_icon_util.h" | 22 #include "chrome/browser/profiles/profile_avatar_icon_util.h" |
23 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" | 23 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" |
24 #include "chrome/browser/ui/browser.h" | 24 #include "chrome/browser/ui/browser.h" |
25 #include "chrome/browser/ui/browser_window_state.h" | 25 #include "chrome/browser/ui/browser_window_state.h" |
26 #import "chrome/browser/ui/cocoa/browser_window_fullscreen_transition.h" | 26 #import "chrome/browser/ui/cocoa/browser_window_fullscreen_transition.h" |
27 #import "chrome/browser/ui/cocoa/browser_window_layout.h" | 27 #import "chrome/browser/ui/cocoa/browser_window_layout.h" |
28 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet_con troller.h" | |
28 #import "chrome/browser/ui/cocoa/custom_frame_view.h" | 29 #import "chrome/browser/ui/cocoa/custom_frame_view.h" |
29 #import "chrome/browser/ui/cocoa/dev_tools_controller.h" | 30 #import "chrome/browser/ui/cocoa/dev_tools_controller.h" |
30 #import "chrome/browser/ui/cocoa/fast_resize_view.h" | 31 #import "chrome/browser/ui/cocoa/fast_resize_view.h" |
31 #import "chrome/browser/ui/cocoa/find_bar/find_bar_cocoa_controller.h" | 32 #import "chrome/browser/ui/cocoa/find_bar/find_bar_cocoa_controller.h" |
32 #import "chrome/browser/ui/cocoa/floating_bar_backing_view.h" | 33 #import "chrome/browser/ui/cocoa/floating_bar_backing_view.h" |
33 #import "chrome/browser/ui/cocoa/framed_browser_window.h" | 34 #import "chrome/browser/ui/cocoa/framed_browser_window.h" |
34 #import "chrome/browser/ui/cocoa/fullscreen_window.h" | 35 #import "chrome/browser/ui/cocoa/fullscreen_window.h" |
35 #import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h" | 36 #import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h" |
36 #include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h" | 37 #include "chrome/browser/ui/cocoa/last_active_browser_cocoa.h" |
37 #import "chrome/browser/ui/cocoa/presentation_mode_controller.h" | 38 #import "chrome/browser/ui/cocoa/presentation_mode_controller.h" |
(...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
693 if (notification) // For System Fullscreen when non-nil. | 694 if (notification) // For System Fullscreen when non-nil. |
694 [self registerForContentViewResizeNotifications]; | 695 [self registerForContentViewResizeNotifications]; |
695 | 696 |
696 NSWindow* window = [self window]; | 697 NSWindow* window = [self window]; |
697 savedRegularWindowFrame_ = [window frame]; | 698 savedRegularWindowFrame_ = [window frame]; |
698 | 699 |
699 enteringAppKitFullscreen_ = YES; | 700 enteringAppKitFullscreen_ = YES; |
700 enteringAppKitFullscreenOnPrimaryScreen_ = | 701 enteringAppKitFullscreenOnPrimaryScreen_ = |
701 [[[self window] screen] isEqual:[[NSScreen screens] firstObject]]; | 702 [[[self window] screen] isEqual:[[NSScreen screens] firstObject]]; |
702 | 703 |
704 [self hideSheetForFullscreenTransition:YES]; | |
705 | |
703 // If we are using custom fullscreen animations, the layout will resize | 706 // If we are using custom fullscreen animations, the layout will resize |
704 // in startCustomAnimationToEnterFullScreenWithDuration. In order to prevent | 707 // in startCustomAnimationToEnterFullScreenWithDuration. In order to prevent |
705 // multiple resizing messages from being sent to the renderer, we should call | 708 // multiple resizing messages from being sent to the renderer, we should call |
706 // adjustUIForEnteringFullscreen after the layout gets resized. | 709 // adjustUIForEnteringFullscreen after the layout gets resized. |
707 if (isUsingCustomAnimation_) | 710 if (isUsingCustomAnimation_) |
708 blockLayoutSubviews_ = YES; | 711 blockLayoutSubviews_ = YES; |
709 else | 712 else |
710 [self adjustUIForEnteringFullscreen]; | 713 [self adjustUIForEnteringFullscreen]; |
711 } | 714 } |
712 | 715 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
751 CGFloat heightDelta = | 754 CGFloat heightDelta = |
752 expectedFrame.size.height - currentFrame.size.height; | 755 expectedFrame.size.height - currentFrame.size.height; |
753 if (fabs(heightDelta - kExpectedHeightDifference) > 0.01) | 756 if (fabs(heightDelta - kExpectedHeightDifference) > 0.01) |
754 return; | 757 return; |
755 | 758 |
756 [[self window] setFrame:expectedFrame display:YES]; | 759 [[self window] setFrame:expectedFrame display:YES]; |
757 }); | 760 }); |
758 base::MessageLoop::current()->PostTask(FROM_HERE, callback); | 761 base::MessageLoop::current()->PostTask(FROM_HERE, callback); |
759 } | 762 } |
760 | 763 |
764 [self hideSheetForFullscreenTransition:NO]; | |
765 | |
761 if (notification) // For System Fullscreen when non-nil. | 766 if (notification) // For System Fullscreen when non-nil. |
762 [self deregisterForContentViewResizeNotifications]; | 767 [self deregisterForContentViewResizeNotifications]; |
768 | |
763 enteringAppKitFullscreen_ = NO; | 769 enteringAppKitFullscreen_ = NO; |
764 enteringImmersiveFullscreen_ = NO; | 770 enteringImmersiveFullscreen_ = NO; |
765 enteringPresentationMode_ = NO; | 771 enteringPresentationMode_ = NO; |
766 isUsingCustomAnimation_ = NO; | 772 isUsingCustomAnimation_ = NO; |
767 | 773 |
768 [self showFullscreenExitBubbleIfNecessary]; | 774 [self showFullscreenExitBubbleIfNecessary]; |
769 [self layoutSubviews]; | |
770 browser_->WindowFullscreenStateChanged(); | 775 browser_->WindowFullscreenStateChanged(); |
771 } | 776 } |
772 | 777 |
773 - (void)windowWillExitFullScreen:(NSNotification*)notification { | 778 - (void)windowWillExitFullScreen:(NSNotification*)notification { |
774 if (notification) // For System Fullscreen when non-nil. | 779 if (notification) // For System Fullscreen when non-nil. |
775 [self registerForContentViewResizeNotifications]; | 780 [self registerForContentViewResizeNotifications]; |
776 exitingAppKitFullscreen_ = YES; | 781 exitingAppKitFullscreen_ = YES; |
777 | 782 |
778 // Like windowWillEnterFullScreen, if we use custom animations, | 783 // Like windowWillEnterFullScreen, if we use custom animations, |
779 // adjustUIForExitingFullscreen should be called after the layout resizes in | 784 // adjustUIForExitingFullscreen should be called after the layout resizes in |
780 // startCustomAnimationToExitFullScreenWithDuration. | 785 // startCustomAnimationToExitFullScreenWithDuration. |
781 if (isUsingCustomAnimation_) | 786 if (isUsingCustomAnimation_) { |
782 blockLayoutSubviews_ = YES; | 787 blockLayoutSubviews_ = YES; |
783 else | 788 [self hideSheetForFullscreenTransition:YES]; |
789 | |
790 // In OSX 10.11, when the NSFullScreenWindowMask is added or removed, | |
791 // the window's frame and layer changes slightly which causes a janky | |
792 // movement. As a result, we should disable the content view's autoresize | |
793 // at the beginning of the animation and set it back to its original value | |
794 // at the end of the animation. | |
795 [self.chromeContentView setAutoresizesSubviews:NO]; | |
796 } else { | |
784 [self adjustUIForExitingFullscreen]; | 797 [self adjustUIForExitingFullscreen]; |
798 } | |
785 } | 799 } |
786 | 800 |
787 - (void)windowDidExitFullScreen:(NSNotification*)notification { | 801 - (void)windowDidExitFullScreen:(NSNotification*)notification { |
788 DCHECK(exitingAppKitFullscreen_); | 802 DCHECK(exitingAppKitFullscreen_); |
789 | 803 |
790 if (notification) // For System Fullscreen when non-nil. | 804 if (notification) // For System Fullscreen when non-nil. |
791 [self deregisterForContentViewResizeNotifications]; | 805 [self deregisterForContentViewResizeNotifications]; |
792 | 806 |
793 browser_->WindowFullscreenStateChanged(); | 807 browser_->WindowFullscreenStateChanged(); |
808 [self.chromeContentView setAutoresizesSubviews:YES]; | |
809 | |
810 [self hideSheetForFullscreenTransition:NO]; | |
794 | 811 |
795 exitingAppKitFullscreen_ = NO; | 812 exitingAppKitFullscreen_ = NO; |
796 isUsingCustomAnimation_ = NO; | 813 isUsingCustomAnimation_ = NO; |
797 fullscreenTransition_.reset(); | 814 fullscreenTransition_.reset(); |
798 | 815 |
799 blockLayoutSubviews_ = NO; | 816 blockLayoutSubviews_ = NO; |
800 } | 817 } |
801 | 818 |
802 - (void)windowDidFailToEnterFullScreen:(NSWindow*)window { | 819 - (void)windowDidFailToEnterFullScreen:(NSWindow*)window { |
803 [self deregisterForContentViewResizeNotifications]; | 820 [self deregisterForContentViewResizeNotifications]; |
804 enteringAppKitFullscreen_ = NO; | 821 enteringAppKitFullscreen_ = NO; |
805 fullscreenTransition_.reset(); | 822 fullscreenTransition_.reset(); |
806 blockLayoutSubviews_ = NO; | 823 blockLayoutSubviews_ = NO; |
807 isUsingCustomAnimation_ = NO; | 824 isUsingCustomAnimation_ = NO; |
808 [self adjustUIForExitingFullscreenAndStopOmniboxSliding]; | 825 [self adjustUIForExitingFullscreenAndStopOmniboxSliding]; |
809 } | 826 } |
810 | 827 |
811 - (void)windowDidFailToExitFullScreen:(NSWindow*)window { | 828 - (void)windowDidFailToExitFullScreen:(NSWindow*)window { |
812 [self deregisterForContentViewResizeNotifications]; | 829 [self deregisterForContentViewResizeNotifications]; |
813 exitingAppKitFullscreen_ = NO; | 830 exitingAppKitFullscreen_ = NO; |
814 fullscreenTransition_.reset(); | 831 fullscreenTransition_.reset(); |
815 isUsingCustomAnimation_ = NO; | 832 isUsingCustomAnimation_ = NO; |
816 blockLayoutSubviews_ = NO; | 833 blockLayoutSubviews_ = NO; |
834 | |
817 // Force a relayout to try and get the window back into a reasonable state. | 835 // Force a relayout to try and get the window back into a reasonable state. |
836 [self.chromeContentView setAutoresizesSubviews:YES]; | |
818 [self layoutSubviews]; | 837 [self layoutSubviews]; |
819 } | 838 } |
820 | 839 |
840 - (void)hideSheetForFullscreenTransition:(BOOL)shoudHide { | |
841 if (!isUsingCustomAnimation_) | |
842 return; | |
843 | |
844 ConstrainedWindowSheetController* sheet_controller = | |
Robert Sesek
2015/12/04 17:56:30
naming: sheetController
spqchan
2015/12/07 18:27:52
Done.
| |
845 [ConstrainedWindowSheetController | |
846 controllerForParentWindow:[self window]]; | |
847 if (sheet_controller) { | |
Robert Sesek
2015/12/04 17:56:30
You don't need this if, since you can nil-message
spqchan
2015/12/07 18:27:52
Done.
| |
848 if (shoudHide) | |
849 [sheet_controller hideSheetForFullscreenTransition]; | |
850 else | |
851 [sheet_controller unhideSheetForFullscreenTransition]; | |
852 } | |
853 } | |
854 | |
821 - (void)adjustUIForExitingFullscreen { | 855 - (void)adjustUIForExitingFullscreen { |
822 [self destroyFullscreenExitBubbleIfNecessary]; | 856 [self destroyFullscreenExitBubbleIfNecessary]; |
823 [self adjustUIForExitingFullscreenAndStopOmniboxSliding]; | 857 [self adjustUIForExitingFullscreenAndStopOmniboxSliding]; |
824 } | 858 } |
825 | 859 |
826 - (void)adjustUIForEnteringFullscreen { | 860 - (void)adjustUIForEnteringFullscreen { |
827 fullscreen_mac::SlidingStyle style; | 861 fullscreen_mac::SlidingStyle style; |
828 if (browser_->exclusive_access_manager() | 862 if (browser_->exclusive_access_manager() |
829 ->fullscreen_controller() | 863 ->fullscreen_controller() |
830 ->IsWindowFullscreenForTabOrPending()) { | 864 ->IsWindowFullscreenForTabOrPending()) { |
(...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1159 if (![self shouldUseCustomAppKitFullscreenTransition:YES]) | 1193 if (![self shouldUseCustomAppKitFullscreenTransition:YES]) |
1160 return nil; | 1194 return nil; |
1161 | 1195 |
1162 FramedBrowserWindow* framedBrowserWindow = | 1196 FramedBrowserWindow* framedBrowserWindow = |
1163 base::mac::ObjCCast<FramedBrowserWindow>([self window]); | 1197 base::mac::ObjCCast<FramedBrowserWindow>([self window]); |
1164 fullscreenTransition_.reset([[BrowserWindowFullscreenTransition alloc] | 1198 fullscreenTransition_.reset([[BrowserWindowFullscreenTransition alloc] |
1165 initEnterWithWindow:framedBrowserWindow]); | 1199 initEnterWithWindow:framedBrowserWindow]); |
1166 | 1200 |
1167 NSArray* customWindows = | 1201 NSArray* customWindows = |
1168 [fullscreenTransition_ customWindowsForFullScreenTransition]; | 1202 [fullscreenTransition_ customWindowsForFullScreenTransition]; |
1169 isUsingCustomAnimation_ = !customWindows; | 1203 isUsingCustomAnimation_ = customWindows != nil; |
1170 return customWindows; | 1204 return customWindows; |
1171 } | 1205 } |
1172 | 1206 |
1173 - (NSArray*)customWindowsToExitFullScreenForWindow:(NSWindow*)window { | 1207 - (NSArray*)customWindowsToExitFullScreenForWindow:(NSWindow*)window { |
1174 DCHECK([window isEqual:self.window]); | 1208 DCHECK([window isEqual:self.window]); |
1175 | 1209 |
1176 if (![self shouldUseCustomAppKitFullscreenTransition:NO]) | 1210 if (![self shouldUseCustomAppKitFullscreenTransition:NO]) |
1177 return nil; | 1211 return nil; |
1178 | 1212 |
1179 FramedBrowserWindow* framedBrowserWindow = | 1213 FramedBrowserWindow* framedBrowserWindow = |
1180 base::mac::ObjCCast<FramedBrowserWindow>([self window]); | 1214 base::mac::ObjCCast<FramedBrowserWindow>([self window]); |
1181 fullscreenTransition_.reset([[BrowserWindowFullscreenTransition alloc] | 1215 fullscreenTransition_.reset([[BrowserWindowFullscreenTransition alloc] |
1182 initExitWithWindow:framedBrowserWindow | 1216 initExitWithWindow:framedBrowserWindow |
1183 frame:savedRegularWindowFrame_ | 1217 frame:savedRegularWindowFrame_ |
1184 tabStripBackgroundView:[self tabStripBackgroundView]]); | 1218 tabStripBackgroundView:[self tabStripBackgroundView]]); |
1185 | 1219 |
1186 NSArray* customWindows = | 1220 NSArray* customWindows = |
1187 [fullscreenTransition_ customWindowsForFullScreenTransition]; | 1221 [fullscreenTransition_ customWindowsForFullScreenTransition]; |
1188 isUsingCustomAnimation_ = !customWindows; | 1222 isUsingCustomAnimation_ = customWindows != nil; |
1189 return customWindows; | 1223 return customWindows; |
1190 } | 1224 } |
1191 | 1225 |
1192 - (void)window:(NSWindow*)window | 1226 - (void)window:(NSWindow*)window |
1193 startCustomAnimationToEnterFullScreenWithDuration:(NSTimeInterval)duration { | 1227 startCustomAnimationToEnterFullScreenWithDuration:(NSTimeInterval)duration { |
1194 DCHECK([window isEqual:self.window]); | 1228 DCHECK([window isEqual:self.window]); |
1195 [fullscreenTransition_ startCustomFullScreenAnimationWithDuration:duration]; | 1229 [fullscreenTransition_ startCustomFullScreenAnimationWithDuration:duration]; |
1196 | 1230 |
1197 base::AutoReset<BOOL> autoReset(&blockLayoutSubviews_, NO); | 1231 base::AutoReset<BOOL> autoReset(&blockLayoutSubviews_, NO); |
1198 [self adjustUIForEnteringFullscreen]; | 1232 [self adjustUIForEnteringFullscreen]; |
(...skipping 20 matching lines...) Expand all Loading... | |
1219 return browser_->tab_strip_model()->GetActiveWebContents(); | 1253 return browser_->tab_strip_model()->GetActiveWebContents(); |
1220 } | 1254 } |
1221 | 1255 |
1222 - (PermissionBubbleManager*)permissionBubbleManager { | 1256 - (PermissionBubbleManager*)permissionBubbleManager { |
1223 if (WebContents* contents = [self webContents]) | 1257 if (WebContents* contents = [self webContents]) |
1224 return PermissionBubbleManager::FromWebContents(contents); | 1258 return PermissionBubbleManager::FromWebContents(contents); |
1225 return nil; | 1259 return nil; |
1226 } | 1260 } |
1227 | 1261 |
1228 @end // @implementation BrowserWindowController(Private) | 1262 @end // @implementation BrowserWindowController(Private) |
OLD | NEW |