| 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 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/mac/mac_util.h" | 10 #include "base/mac/mac_util.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 #include "chrome/common/chrome_switches.h" | 43 #include "chrome/common/chrome_switches.h" |
| 44 #include "chrome/common/pref_names.h" | 44 #include "chrome/common/pref_names.h" |
| 45 #include "content/public/browser/render_widget_host_view.h" | 45 #include "content/public/browser/render_widget_host_view.h" |
| 46 #include "content/public/browser/web_contents.h" | 46 #include "content/public/browser/web_contents.h" |
| 47 #import "ui/base/cocoa/focus_tracker.h" | 47 #import "ui/base/cocoa/focus_tracker.h" |
| 48 #include "ui/base/ui_base_types.h" | 48 #include "ui/base/ui_base_types.h" |
| 49 | 49 |
| 50 using content::RenderWidgetHostView; | 50 using content::RenderWidgetHostView; |
| 51 using content::WebContents; | 51 using content::WebContents; |
| 52 | 52 |
| 53 namespace { | |
| 54 | |
| 55 // Space between the incognito badge and the right edge of the window. | |
| 56 const CGFloat kAvatarRightOffset = 4; | |
| 57 | |
| 58 } // namespace | |
| 59 | |
| 60 @implementation BrowserWindowController(Private) | 53 @implementation BrowserWindowController(Private) |
| 61 | 54 |
| 62 // Create the tab strip controller. | 55 // Create the tab strip controller. |
| 63 - (void)createTabStripController { | 56 - (void)createTabStripController { |
| 64 DCHECK([overlayableContentsController_ activeContainer]); | 57 DCHECK([overlayableContentsController_ activeContainer]); |
| 65 DCHECK([[overlayableContentsController_ activeContainer] window]); | 58 DCHECK([[overlayableContentsController_ activeContainer] window]); |
| 66 tabStripController_.reset([[TabStripController alloc] | 59 tabStripController_.reset([[TabStripController alloc] |
| 67 initWithView:[self tabStripView] | 60 initWithView:[self tabStripView] |
| 68 switchView:[overlayableContentsController_ activeContainer] | 61 switchView:[overlayableContentsController_ activeContainer] |
| 69 browser:browser_.get() | 62 browser:browser_.get() |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 [self updateSubviewZOrder]; | 166 [self updateSubviewZOrder]; |
| 174 | 167 |
| 175 base::scoped_nsobject<BrowserWindowLayout> layout( | 168 base::scoped_nsobject<BrowserWindowLayout> layout( |
| 176 [[BrowserWindowLayout alloc] init]); | 169 [[BrowserWindowLayout alloc] init]); |
| 177 [self updateLayoutParameters:layout]; | 170 [self updateLayoutParameters:layout]; |
| 178 [self applyLayout:layout]; | 171 [self applyLayout:layout]; |
| 179 | 172 |
| 180 [toolbarController_ setDividerOpacity:[self toolbarDividerOpacity]]; | 173 [toolbarController_ setDividerOpacity:[self toolbarDividerOpacity]]; |
| 181 } | 174 } |
| 182 | 175 |
| 183 - (CGFloat)layoutTabStripAtMaxY:(CGFloat)maxY | 176 - (void)applyTabStripLayout:(const chrome::TabStripLayout&)layout { |
| 184 width:(CGFloat)width | 177 // Update the presence of the window controls. |
| 185 fullscreen:(BOOL)fullscreen { | 178 if (layout.addWindowControls) |
| 186 // Nothing to do if no tab strip. | |
| 187 if (![self hasTabStrip]) | |
| 188 return maxY; | |
| 189 | |
| 190 NSView* tabStripView = [self tabStripView]; | |
| 191 CGFloat tabStripHeight = NSHeight([tabStripView frame]); | |
| 192 maxY -= tabStripHeight; | |
| 193 NSRect tabStripFrame = NSMakeRect(0, maxY, width, tabStripHeight); | |
| 194 BOOL requiresRelayout = !NSEqualRects(tabStripFrame, [tabStripView frame]); | |
| 195 | |
| 196 // In Yosemite fullscreen, manually add the fullscreen controls to the tab | |
| 197 // strip. | |
| 198 BOOL addControlsInFullscreen = | |
| 199 [self isInAppKitFullscreen] && base::mac::IsOSYosemiteOrLater(); | |
| 200 | |
| 201 // Set left indentation based on fullscreen mode status. | |
| 202 CGFloat leftIndent = 0; | |
| 203 if (!fullscreen || addControlsInFullscreen) | |
| 204 leftIndent = [[tabStripController_ class] defaultLeftIndentForControls]; | |
| 205 if (leftIndent != [tabStripController_ leftIndentForControls]) { | |
| 206 [tabStripController_ setLeftIndentForControls:leftIndent]; | |
| 207 requiresRelayout = YES; | |
| 208 } | |
| 209 | |
| 210 if (addControlsInFullscreen) | |
| 211 [tabStripController_ addWindowControls]; | 179 [tabStripController_ addWindowControls]; |
| 212 else | 180 else |
| 213 [tabStripController_ removeWindowControls]; | 181 [tabStripController_ removeWindowControls]; |
| 214 | 182 |
| 215 // fullScreenButton is non-nil when isInAnyFullscreenMode is NO, and OS | 183 // Update the layout of the avatar. |
| 216 // version is in the range 10.7 <= version <= 10.9. Starting with 10.10, the | 184 if (!NSIsEmptyRect(layout.avatarFrame)) { |
| 217 // zoom/maximize button acts as the fullscreen button. | 185 NSView* avatarButton = [avatarButtonController_ view]; |
| 218 NSButton* fullScreenButton = | 186 [avatarButton setFrame:layout.avatarFrame]; |
| 219 [[self window] standardWindowButton:NSWindowFullScreenButton]; | 187 [avatarButton setHidden:NO]; |
| 220 | |
| 221 // Lay out the icognito/avatar badge because calculating the indentation on | |
| 222 // the right depends on it. | |
| 223 NSView* avatarButton = [avatarButtonController_ view]; | |
| 224 if ([self shouldShowAvatar]) { | |
| 225 CGFloat badgeXOffset = -kAvatarRightOffset; | |
| 226 CGFloat badgeYOffset = 0; | |
| 227 CGFloat buttonHeight = NSHeight([avatarButton frame]); | |
| 228 | |
| 229 if ([self shouldUseNewAvatarButton]) { | |
| 230 // The fullscreen icon is displayed to the right of the avatar button. | |
| 231 if (![self isInAnyFullscreenMode] && fullScreenButton) | |
| 232 badgeXOffset -= width - NSMinX([fullScreenButton frame]); | |
| 233 // Center the button vertically on the tabstrip. | |
| 234 badgeYOffset = (tabStripHeight - buttonHeight) / 2; | |
| 235 } else { | |
| 236 // Actually place the badge *above* |maxY|, by +2 to miss the divider. | |
| 237 badgeYOffset = 2 * [[avatarButton superview] cr_lineWidth]; | |
| 238 } | |
| 239 | |
| 240 [avatarButton setFrameSize:NSMakeSize(NSWidth([avatarButton frame]), | |
| 241 std::min(buttonHeight, tabStripHeight))]; | |
| 242 NSPoint origin = | |
| 243 NSMakePoint(width - NSWidth([avatarButton frame]) + badgeXOffset, | |
| 244 maxY + badgeYOffset); | |
| 245 [avatarButton setFrameOrigin:origin]; | |
| 246 [avatarButton setHidden:NO]; // Make sure it's shown. | |
| 247 } | 188 } |
| 248 | 189 |
| 249 // Calculate the right indentation. The default indentation built into the | 190 // Check if the tab strip's frame has changed. |
| 250 // tabstrip leaves enough room for the fullscreen button on Lion (10.7) to | 191 BOOL requiresRelayout = |
| 251 // Mavericks (10.9). On 10.6 and >=10.10, the right indent needs to be | 192 !NSEqualRects([[self tabStripView] frame], layout.frame); |
| 252 // adjusted to make room for the new tab button when an avatar is present. | |
| 253 CGFloat rightIndent = 0; | |
| 254 if (![self isInAnyFullscreenMode] && fullScreenButton) { | |
| 255 rightIndent = width - NSMinX([fullScreenButton frame]); | |
| 256 | 193 |
| 257 if ([self shouldUseNewAvatarButton]) { | 194 // Check if the left indent has changed. |
| 258 // The new avatar button is to the left of the fullscreen button. | 195 if (layout.leftIndent != [tabStripController_ leftIndentForControls]) { |
| 259 // (The old avatar button is to the right). | 196 [tabStripController_ setLeftIndentForControls:layout.leftIndent]; |
| 260 rightIndent += NSWidth([avatarButton frame]) + kAvatarRightOffset; | |
| 261 } | |
| 262 } else if ([self shouldShowAvatar]) { | |
| 263 rightIndent += NSWidth([avatarButton frame]) + kAvatarRightOffset; | |
| 264 } | |
| 265 | |
| 266 if (rightIndent != [tabStripController_ rightIndentForControls]) { | |
| 267 [tabStripController_ setRightIndentForControls:rightIndent]; | |
| 268 requiresRelayout = YES; | 197 requiresRelayout = YES; |
| 269 } | 198 } |
| 270 | 199 |
| 200 // Check if the right indent has changed. |
| 201 if (layout.rightIndent != [tabStripController_ rightIndentForControls]) { |
| 202 [tabStripController_ setRightIndentForControls:layout.rightIndent]; |
| 203 requiresRelayout = YES; |
| 204 } |
| 205 |
| 271 // It is undesirable to force tabs relayout when the tap strip's frame did | 206 // It is undesirable to force tabs relayout when the tap strip's frame did |
| 272 // not change, because it will interrupt tab animations in progress. | 207 // not change, because it will interrupt tab animations in progress. |
| 273 // In addition, there appears to be an AppKit bug on <10.9 where interrupting | 208 // In addition, there appears to be an AppKit bug on <10.9 where interrupting |
| 274 // a tab animation resulted in the tab frame being the animator's target | 209 // a tab animation resulted in the tab frame being the animator's target |
| 275 // frame instead of the interrupting setFrame. (See http://crbug.com/415093) | 210 // frame instead of the interrupting setFrame. (See http://crbug.com/415093) |
| 276 if (requiresRelayout) { | 211 if (requiresRelayout) { |
| 277 [tabStripView setFrame:tabStripFrame]; | 212 [[self tabStripView] setFrame:layout.frame]; |
| 278 [tabStripController_ layoutTabsWithoutAnimation]; | 213 [tabStripController_ layoutTabsWithoutAnimation]; |
| 279 } | 214 } |
| 280 | |
| 281 return maxY; | |
| 282 } | 215 } |
| 283 | 216 |
| 284 - (BOOL)placeBookmarkBarBelowInfoBar { | 217 - (BOOL)placeBookmarkBarBelowInfoBar { |
| 285 // If we are currently displaying the NTP detached bookmark bar or animating | 218 // If we are currently displaying the NTP detached bookmark bar or animating |
| 286 // to/from it (from/to anything else), we display the bookmark bar below the | 219 // to/from it (from/to anything else), we display the bookmark bar below the |
| 287 // info bar. | 220 // info bar. |
| 288 return [bookmarkBarController_ isInState:BookmarkBar::DETACHED] || | 221 return [bookmarkBarController_ isInState:BookmarkBar::DETACHED] || |
| 289 [bookmarkBarController_ isAnimatingToState:BookmarkBar::DETACHED] || | 222 [bookmarkBarController_ isAnimatingToState:BookmarkBar::DETACHED] || |
| 290 [bookmarkBarController_ isAnimatingFromState:BookmarkBar::DETACHED]; | 223 [bookmarkBarController_ isAnimatingFromState:BookmarkBar::DETACHED]; |
| 291 } | 224 } |
| (...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 841 | 774 |
| 842 [layout setInAnyFullscreen:[self isInFullscreenWithOmniboxSliding]]; | 775 [layout setInAnyFullscreen:[self isInFullscreenWithOmniboxSliding]]; |
| 843 [layout setFullscreenSlidingStyle: | 776 [layout setFullscreenSlidingStyle: |
| 844 presentationModeController_.get().slidingStyle]; | 777 presentationModeController_.get().slidingStyle]; |
| 845 [layout setFullscreenMenubarOffset: | 778 [layout setFullscreenMenubarOffset: |
| 846 [presentationModeController_ menubarOffset]]; | 779 [presentationModeController_ menubarOffset]]; |
| 847 [layout setFullscreenToolbarFraction: | 780 [layout setFullscreenToolbarFraction: |
| 848 [presentationModeController_ toolbarFraction]]; | 781 [presentationModeController_ toolbarFraction]]; |
| 849 | 782 |
| 850 [layout setHasTabStrip:[self hasTabStrip]]; | 783 [layout setHasTabStrip:[self hasTabStrip]]; |
| 784 NSButton* fullScreenButton = |
| 785 [[self window] standardWindowButton:NSWindowFullScreenButton]; |
| 786 [layout setFullscreenButtonFrame:fullScreenButton ? [fullScreenButton frame] |
| 787 : NSZeroRect]; |
| 788 if ([self shouldShowAvatar]) { |
| 789 NSView* avatar = [avatarButtonController_ view]; |
| 790 [layout setShouldShowAvatar:YES]; |
| 791 [layout setShouldUseNewAvatar:[self shouldUseNewAvatarButton]]; |
| 792 [layout setAvatarSize:[avatar frame].size]; |
| 793 [layout setAvatarLineWidth:[[avatar superview] cr_lineWidth]]; |
| 794 } |
| 851 | 795 |
| 852 [layout setHasToolbar:[self hasToolbar]]; | 796 [layout setHasToolbar:[self hasToolbar]]; |
| 853 [layout setToolbarHeight:NSHeight([[toolbarController_ view] bounds])]; | 797 [layout setToolbarHeight:NSHeight([[toolbarController_ view] bounds])]; |
| 854 | 798 |
| 855 [layout setHasLocationBar:[self hasLocationBar]]; | 799 [layout setHasLocationBar:[self hasLocationBar]]; |
| 856 | 800 |
| 857 [layout setPlaceBookmarkBarBelowInfoBar:[self placeBookmarkBarBelowInfoBar]]; | 801 [layout setPlaceBookmarkBarBelowInfoBar:[self placeBookmarkBarBelowInfoBar]]; |
| 858 [layout setBookmarkBarHidden:[bookmarkBarController_ view].isHidden]; | 802 [layout setBookmarkBarHidden:[bookmarkBarController_ view].isHidden]; |
| 859 [layout setBookmarkBarHeight: | 803 [layout setBookmarkBarHeight: |
| 860 NSHeight([[bookmarkBarController_ view] bounds])]; | 804 NSHeight([[bookmarkBarController_ view] bounds])]; |
| 861 | 805 |
| 862 [layout setInfoBarHeight:[infoBarContainerController_ heightOfInfoBars]]; | 806 [layout setInfoBarHeight:[infoBarContainerController_ heightOfInfoBars]]; |
| 863 [layout setPageInfoBubblePointY:[self pageInfoBubblePointY]]; | 807 [layout setPageInfoBubblePointY:[self pageInfoBubblePointY]]; |
| 864 | 808 |
| 865 [layout setHasDownloadShelf:(downloadShelfController_.get() != nil)]; | 809 [layout setHasDownloadShelf:(downloadShelfController_.get() != nil)]; |
| 866 [layout setDownloadShelfHeight: | 810 [layout setDownloadShelfHeight: |
| 867 NSHeight([[downloadShelfController_ view] bounds])]; | 811 NSHeight([[downloadShelfController_ view] bounds])]; |
| 868 } | 812 } |
| 869 | 813 |
| 870 - (void)applyLayout:(BrowserWindowLayout*)layout { | 814 - (void)applyLayout:(BrowserWindowLayout*)layout { |
| 871 chrome::LayoutOutput output = [layout computeLayout]; | 815 chrome::LayoutOutput output = [layout computeLayout]; |
| 872 | 816 |
| 873 if (!NSIsEmptyRect(output.tabStripFrame)) { | 817 if (!NSIsEmptyRect(output.tabStripLayout.frame)) |
| 874 // Note: The fullscreen parameter passed to the method is different from | 818 [self applyTabStripLayout:output.tabStripLayout]; |
| 875 // the field in |parameters| with the similar name. | |
| 876 [self layoutTabStripAtMaxY:NSMaxY(output.tabStripFrame) | |
| 877 width:NSWidth(output.tabStripFrame) | |
| 878 fullscreen:[self isInAnyFullscreenMode]]; | |
| 879 } | |
| 880 | 819 |
| 881 if (!NSIsEmptyRect(output.toolbarFrame)) { | 820 if (!NSIsEmptyRect(output.toolbarFrame)) |
| 882 [[toolbarController_ view] setFrame:output.toolbarFrame]; | 821 [[toolbarController_ view] setFrame:output.toolbarFrame]; |
| 883 } | |
| 884 | 822 |
| 885 if (!NSIsEmptyRect(output.bookmarkFrame)) { | 823 if (!NSIsEmptyRect(output.bookmarkFrame)) { |
| 886 NSView* bookmarkBarView = [bookmarkBarController_ view]; | 824 NSView* bookmarkBarView = [bookmarkBarController_ view]; |
| 887 [bookmarkBarView setFrame:output.bookmarkFrame]; | 825 [bookmarkBarView setFrame:output.bookmarkFrame]; |
| 888 | 826 |
| 889 // Pin the bookmark bar to the top of the window and make the width | 827 // Pin the bookmark bar to the top of the window and make the width |
| 890 // flexible. | 828 // flexible. |
| 891 [bookmarkBarView setAutoresizingMask:NSViewWidthSizable | NSViewMinYMargin]; | 829 [bookmarkBarView setAutoresizingMask:NSViewWidthSizable | NSViewMinYMargin]; |
| 892 | 830 |
| 893 [bookmarkBarController_ layoutSubviews]; | 831 [bookmarkBarController_ layoutSubviews]; |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1033 | 971 |
| 1034 [CATransaction commit]; | 972 [CATransaction commit]; |
| 1035 hasAdjustedTabStripWhileEnteringAppKitFullscreen_ = YES; | 973 hasAdjustedTabStripWhileEnteringAppKitFullscreen_ = YES; |
| 1036 } | 974 } |
| 1037 } else { | 975 } else { |
| 1038 hasAdjustedTabStripWhileEnteringAppKitFullscreen_ = NO; | 976 hasAdjustedTabStripWhileEnteringAppKitFullscreen_ = NO; |
| 1039 } | 977 } |
| 1040 } | 978 } |
| 1041 | 979 |
| 1042 @end // @implementation BrowserWindowController(Private) | 980 @end // @implementation BrowserWindowController(Private) |
| OLD | NEW |