| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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> |
| 8 |
| 7 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 8 #import "base/memory/scoped_nsobject.h" | 10 #import "base/memory/scoped_nsobject.h" |
| 9 #include "chrome/browser/browser_process.h" | 11 #include "chrome/browser/browser_process.h" |
| 10 #include "chrome/browser/prefs/pref_service.h" | 12 #include "chrome/browser/prefs/pref_service.h" |
| 11 #include "chrome/browser/prefs/scoped_user_pref_update.h" | 13 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
| 12 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
| 13 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" | 15 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" |
| 14 #include "chrome/browser/ui/browser_list.h" | 16 #include "chrome/browser/ui/browser_list.h" |
| 17 #import "chrome/browser/ui/cocoa/browser/avatar_button.h" |
| 15 #import "chrome/browser/ui/cocoa/fast_resize_view.h" | 18 #import "chrome/browser/ui/cocoa/fast_resize_view.h" |
| 16 #import "chrome/browser/ui/cocoa/find_bar/find_bar_cocoa_controller.h" | 19 #import "chrome/browser/ui/cocoa/find_bar/find_bar_cocoa_controller.h" |
| 17 #import "chrome/browser/ui/cocoa/floating_bar_backing_view.h" | 20 #import "chrome/browser/ui/cocoa/floating_bar_backing_view.h" |
| 21 #import "chrome/browser/ui/cocoa/focus_tracker.h" |
| 18 #import "chrome/browser/ui/cocoa/framed_browser_window.h" | 22 #import "chrome/browser/ui/cocoa/framed_browser_window.h" |
| 19 #import "chrome/browser/ui/cocoa/fullscreen_controller.h" | 23 #import "chrome/browser/ui/cocoa/fullscreen_window.h" |
| 20 #import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h" | 24 #import "chrome/browser/ui/cocoa/infobars/infobar_container_controller.h" |
| 25 #import "chrome/browser/ui/cocoa/presentation_mode_controller.h" |
| 26 #import "chrome/browser/ui/cocoa/status_bubble_mac.h" |
| 21 #import "chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.h" | 27 #import "chrome/browser/ui/cocoa/tab_contents/previewable_contents_controller.h" |
| 22 #import "chrome/browser/ui/cocoa/tabs/side_tab_strip_controller.h" | 28 #import "chrome/browser/ui/cocoa/tabs/side_tab_strip_controller.h" |
| 23 #import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h" | 29 #import "chrome/browser/ui/cocoa/tabs/tab_strip_controller.h" |
| 24 #import "chrome/browser/ui/cocoa/tabs/tab_strip_view.h" | 30 #import "chrome/browser/ui/cocoa/tabs/tab_strip_view.h" |
| 25 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" | 31 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" |
| 26 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 32 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| 27 #include "chrome/common/chrome_switches.h" | 33 #include "chrome/common/chrome_switches.h" |
| 28 #include "chrome/common/pref_names.h" | 34 #include "chrome/common/pref_names.h" |
| 29 #include "content/browser/renderer_host/render_widget_host_view.h" | 35 #include "content/browser/renderer_host/render_widget_host_view.h" |
| 30 #include "content/browser/tab_contents/tab_contents.h" | 36 #include "content/browser/tab_contents/tab_contents.h" |
| 31 #include "content/browser/tab_contents/tab_contents_view.h" | 37 #include "content/browser/tab_contents/tab_contents_view.h" |
| 32 | 38 |
| 33 // Provide the forward-declarations of new 10.7 SDK symbols so they can be | 39 // Forward-declare symbols that are part of the 10.6 SDK. |
| 34 // called when building with the 10.5 SDK. | 40 #if !defined(MAC_OS_X_VERSION_10_6) || \ |
| 35 #if !defined(MAC_OS_X_VERSION_10_7) || \ | 41 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6 |
| 36 MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7 | |
| 37 | |
| 38 @interface NSWindow (LionSDKDeclarations) | |
| 39 - (void)toggleFullScreen:(id)sender; | |
| 40 @end | |
| 41 | 42 |
| 42 enum { | 43 enum { |
| 43 NSWindowCollectionBehaviorFullScreenPrimary = 1 << 7, | 44 NSApplicationPresentationDefault = 0, |
| 44 NSWindowCollectionBehaviorFullScreenAuxiliary = 1 << 8 | 45 NSApplicationPresentationAutoHideDock = (1 << 0), |
| 46 NSApplicationPresentationHideDock = (1 << 1), |
| 47 NSApplicationPresentationAutoHideMenuBar = (1 << 2), |
| 48 NSApplicationPresentationHideMenuBar = (1 << 3), |
| 45 }; | 49 }; |
| 50 typedef NSUInteger NSApplicationPresentationOptions; |
| 46 | 51 |
| 47 enum { | 52 #endif // MAC_OS_X_VERSION_10_6 |
| 48 NSWindowFullScreenButton = 7 | |
| 49 }; | |
| 50 | |
| 51 #endif // MAC_OS_X_VERSION_10_7 | |
| 52 | 53 |
| 53 namespace { | 54 namespace { |
| 54 | 55 |
| 55 // Space between the incognito badge and the right edge of the window. | 56 // Space between the incognito badge and the right edge of the window. |
| 56 const CGFloat kIncognitoBadgeOffset = 4; | 57 const CGFloat kAvatarRightOffset = 4; |
| 58 |
| 59 // The amount by which to shrink the tab strip (on the right) when the |
| 60 // incognito badge is present. |
| 61 const CGFloat kAvatarTabStripShrink = 18; |
| 62 |
| 63 // The amount by which to shift the avatar to the right if on Lion. |
| 64 const CGFloat kAvatarShiftForLion = 20; |
| 57 | 65 |
| 58 // Insets for the location bar, used when the full toolbar is hidden. | 66 // Insets for the location bar, used when the full toolbar is hidden. |
| 59 // TODO(viettrungluu): We can argue about the "correct" insetting; I like the | 67 // TODO(viettrungluu): We can argue about the "correct" insetting; I like the |
| 60 // following best, though arguably 0 inset is better/more correct. | 68 // following best, though arguably 0 inset is better/more correct. |
| 61 const CGFloat kLocBarLeftRightInset = 1; | 69 const CGFloat kLocBarLeftRightInset = 1; |
| 62 const CGFloat kLocBarTopInset = 0; | 70 const CGFloat kLocBarTopInset = 0; |
| 63 const CGFloat kLocBarBottomInset = 1; | 71 const CGFloat kLocBarBottomInset = 1; |
| 64 | 72 |
| 65 } // namespace | 73 } // namespace |
| 66 | 74 |
| 67 @implementation BrowserWindowController(Private) | 75 @implementation BrowserWindowController(Private) |
| 68 | 76 |
| 69 // Create the appropriate tab strip controller based on whether or not side | 77 // Create the appropriate tab strip controller based on whether or not side |
| 70 // tabs are enabled. | 78 // tabs are enabled. |
| 71 - (void)createTabStripController { | 79 - (void)createTabStripController { |
| 72 Class factory = [TabStripController class]; | 80 Class factory = [TabStripController class]; |
| 73 if ([self useVerticalTabs]) | 81 if ([self useVerticalTabs]) |
| 74 factory = [SideTabStripController class]; | 82 factory = [SideTabStripController class]; |
| 75 | 83 |
| 76 DCHECK([previewableContentsController_ activeContainer]); | 84 DCHECK([previewableContentsController_ activeContainer]); |
| 77 DCHECK([[previewableContentsController_ activeContainer] window]); | 85 DCHECK([[previewableContentsController_ activeContainer] window]); |
| 78 tabStripController_.reset([[factory alloc] | 86 tabStripController_.reset([[factory alloc] |
| 79 initWithView:[self tabStripView] | 87 initWithView:[self tabStripView] |
| 80 switchView:[previewableContentsController_ activeContainer] | 88 switchView:[previewableContentsController_ activeContainer] |
| 81 browser:browser_.get() | 89 browser:browser_.get() |
| 82 delegate:self]); | 90 delegate:self]); |
| 83 } | 91 } |
| 84 | 92 |
| 93 - (void)createAndInstallPresentationModeToggleButton { |
| 94 DCHECK(base::mac::IsOSLionOrLater()); |
| 95 if (presentationModeToggleButton_.get()) |
| 96 return; |
| 97 |
| 98 // TODO(rohitrao): Make this button prettier. |
| 99 presentationModeToggleButton_.reset( |
| 100 [[NSButton alloc] initWithFrame:NSMakeRect(0, 0, 25, 25)]); |
| 101 NSButton* button = presentationModeToggleButton_.get(); |
| 102 [button setButtonType:NSMomentaryLightButton]; |
| 103 [button setBezelStyle:NSRegularSquareBezelStyle]; |
| 104 [button setBordered:NO]; |
| 105 [[button cell] setHighlightsBy:NSContentsCellMask]; |
| 106 [[button cell] setShowsStateBy:NSContentsCellMask]; |
| 107 [button setImage:[NSImage imageNamed:NSImageNameIChatTheaterTemplate]]; |
| 108 [button setTarget:self]; |
| 109 [button setAction:@selector(togglePresentationModeForLionOrLater:)]; |
| 110 [[[[self window] contentView] superview] addSubview:button]; |
| 111 } |
| 112 |
| 85 - (void)saveWindowPositionIfNeeded { | 113 - (void)saveWindowPositionIfNeeded { |
| 86 if (browser_ != BrowserList::GetLastActive()) | 114 if (browser_ != BrowserList::GetLastActive()) |
| 87 return; | 115 return; |
| 88 | 116 |
| 89 if (!browser_->profile()->GetPrefs() || | 117 if (!browser_->profile()->GetPrefs() || |
| 90 !browser_->ShouldSaveWindowPlacement()) { | 118 !browser_->ShouldSaveWindowPlacement()) { |
| 91 return; | 119 return; |
| 92 } | 120 } |
| 93 | 121 |
| 94 [self saveWindowPositionToPrefs:browser_->profile()->GetPrefs()]; | 122 [self saveWindowPositionToPrefs:browser_->profile()->GetPrefs()]; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 NSView* contentView = [window contentView]; | 205 NSView* contentView = [window contentView]; |
| 178 NSRect contentBounds = [contentView bounds]; | 206 NSRect contentBounds = [contentView bounds]; |
| 179 CGFloat minX = NSMinX(contentBounds); | 207 CGFloat minX = NSMinX(contentBounds); |
| 180 CGFloat minY = NSMinY(contentBounds); | 208 CGFloat minY = NSMinY(contentBounds); |
| 181 CGFloat width = NSWidth(contentBounds); | 209 CGFloat width = NSWidth(contentBounds); |
| 182 | 210 |
| 183 // Suppress title drawing if necessary. | 211 // Suppress title drawing if necessary. |
| 184 if ([window respondsToSelector:@selector(setShouldHideTitle:)]) | 212 if ([window respondsToSelector:@selector(setShouldHideTitle:)]) |
| 185 [(id)window setShouldHideTitle:![self hasTitleBar]]; | 213 [(id)window setShouldHideTitle:![self hasTitleBar]]; |
| 186 | 214 |
| 187 BOOL isFullscreen = [self isFullscreen]; | 215 BOOL inPresentationMode = [self inPresentationMode]; |
| 188 CGFloat floatingBarHeight = [self floatingBarHeight]; | 216 CGFloat floatingBarHeight = [self floatingBarHeight]; |
| 189 // In fullscreen mode, |yOffset| accounts for the sliding position of the | 217 // In presentation mode, |yOffset| accounts for the sliding position of the |
| 190 // floating bar and the extra offset needed to dodge the menu bar. | 218 // floating bar and the extra offset needed to dodge the menu bar. |
| 191 CGFloat yOffset = isFullscreen ? | 219 CGFloat yOffset = inPresentationMode ? |
| 192 (floor((1 - floatingBarShownFraction_) * floatingBarHeight) - | 220 (std::floor((1 - floatingBarShownFraction_) * floatingBarHeight) - |
| 193 [fullscreenController_ floatingBarVerticalOffset]) : 0; | 221 [presentationModeController_ floatingBarVerticalOffset]) : 0; |
| 194 CGFloat maxY = NSMaxY(contentBounds) + yOffset; | 222 CGFloat maxY = NSMaxY(contentBounds) + yOffset; |
| 195 CGFloat startMaxY = maxY; | 223 CGFloat startMaxY = maxY; |
| 196 | 224 |
| 225 CGFloat overlayMaxY = |
| 226 NSMaxY([window frame]) + |
| 227 std::floor((1 - floatingBarShownFraction_) * floatingBarHeight); |
| 228 [self layoutPresentationModeToggleAtOverlayMaxX:NSMaxX([window frame]) |
| 229 overlayMaxY:overlayMaxY]; |
| 230 |
| 197 if ([self hasTabStrip] && ![self useVerticalTabs]) { | 231 if ([self hasTabStrip] && ![self useVerticalTabs]) { |
| 198 // If we need to lay out the top tab strip, replace |maxY| and |startMaxY| | 232 // If we need to lay out the top tab strip, replace |maxY| and |startMaxY| |
| 199 // with higher values, and then lay out the tab strip. | 233 // with higher values, and then lay out the tab strip. |
| 200 NSRect windowFrame = [contentView convertRect:[window frame] fromView:nil]; | 234 NSRect windowFrame = [contentView convertRect:[window frame] fromView:nil]; |
| 201 startMaxY = maxY = NSHeight(windowFrame) + yOffset; | 235 startMaxY = maxY = NSHeight(windowFrame) + yOffset; |
| 202 maxY = [self layoutTabStripAtMaxY:maxY width:width fullscreen:isFullscreen]; | 236 maxY = [self layoutTabStripAtMaxY:maxY |
| 237 width:width |
| 238 fullscreen:[self isFullscreen]]; |
| 203 } | 239 } |
| 204 | 240 |
| 205 // Sanity-check |maxY|. | 241 // Sanity-check |maxY|. |
| 206 DCHECK_GE(maxY, minY); | 242 DCHECK_GE(maxY, minY); |
| 207 DCHECK_LE(maxY, NSMaxY(contentBounds) + yOffset); | 243 DCHECK_LE(maxY, NSMaxY(contentBounds) + yOffset); |
| 208 | 244 |
| 209 // The base class already positions the side tab strip on the left side | 245 // The base class already positions the side tab strip on the left side |
| 210 // of the window's content area and sizes it to take the entire vertical | 246 // of the window's content area and sizes it to take the entire vertical |
| 211 // height. All that's needed here is to push everything over to the right, | 247 // height. All that's needed here is to push everything over to the right, |
| 212 // if necessary. | 248 // if necessary. |
| 213 if ([self useVerticalTabs]) { | 249 if ([self useVerticalTabs]) { |
| 214 const CGFloat sideTabWidth = [[self tabStripView] bounds].size.width; | 250 const CGFloat sideTabWidth = [[self tabStripView] bounds].size.width; |
| 215 minX += sideTabWidth; | 251 minX += sideTabWidth; |
| 216 width -= sideTabWidth; | 252 width -= sideTabWidth; |
| 217 } | 253 } |
| 218 | 254 |
| 219 // Place the toolbar at the top of the reserved area. | 255 // Place the toolbar at the top of the reserved area. |
| 220 maxY = [self layoutToolbarAtMinX:minX maxY:maxY width:width]; | 256 maxY = [self layoutToolbarAtMinX:minX maxY:maxY width:width]; |
| 221 | 257 |
| 222 // If we're not displaying the bookmark bar below the infobar, then it goes | 258 // If we're not displaying the bookmark bar below the infobar, then it goes |
| 223 // immediately below the toolbar. | 259 // immediately below the toolbar. |
| 224 BOOL placeBookmarkBarBelowInfoBar = [self placeBookmarkBarBelowInfoBar]; | 260 BOOL placeBookmarkBarBelowInfoBar = [self placeBookmarkBarBelowInfoBar]; |
| 225 if (!placeBookmarkBarBelowInfoBar) | 261 if (!placeBookmarkBarBelowInfoBar) |
| 226 maxY = [self layoutBookmarkBarAtMinX:minX maxY:maxY width:width]; | 262 maxY = [self layoutBookmarkBarAtMinX:minX maxY:maxY width:width]; |
| 227 | 263 |
| 228 // The floating bar backing view doesn't actually add any height. | 264 // The floating bar backing view doesn't actually add any height. |
| 229 NSRect floatingBarBackingRect = | 265 NSRect floatingBarBackingRect = |
| 230 NSMakeRect(minX, maxY, width, floatingBarHeight); | 266 NSMakeRect(minX, maxY, width, floatingBarHeight); |
| 231 [self layoutFloatingBarBackingView:floatingBarBackingRect | 267 [self layoutFloatingBarBackingView:floatingBarBackingRect |
| 232 fullscreen:isFullscreen]; | 268 presentationMode:inPresentationMode]; |
| 233 | 269 |
| 234 // Place the find bar immediately below the toolbar/attached bookmark bar. In | 270 // Place the find bar immediately below the toolbar/attached bookmark bar. In |
| 235 // fullscreen mode, it hangs off the top of the screen when the bar is hidden. | 271 // presentation mode, it hangs off the top of the screen when the bar is |
| 236 // The find bar is unaffected by the side tab positioning. | 272 // hidden. The find bar is unaffected by the side tab positioning. |
| 237 [findBarCocoaController_ positionFindBarViewAtMaxY:maxY maxWidth:width]; | 273 [findBarCocoaController_ positionFindBarViewAtMaxY:maxY maxWidth:width]; |
| 238 | 274 |
| 239 // If in fullscreen mode, reset |maxY| to top of screen, so that the floating | 275 // If in presentation mode, reset |maxY| to top of screen, so that the |
| 240 // bar slides over the things which appear to be in the content area. | 276 // floating bar slides over the things which appear to be in the content area. |
| 241 if (isFullscreen) | 277 if (inPresentationMode) |
| 242 maxY = NSMaxY(contentBounds); | 278 maxY = NSMaxY(contentBounds); |
| 243 | 279 |
| 244 // Also place the infobar container immediate below the toolbar, except in | 280 // Also place the infobar container immediate below the toolbar, except in |
| 245 // fullscreen mode in which case it's at the top of the visual content area. | 281 // presentation mode in which case it's at the top of the visual content area. |
| 246 maxY = [self layoutInfoBarAtMinX:minX maxY:maxY width:width]; | 282 maxY = [self layoutInfoBarAtMinX:minX maxY:maxY width:width]; |
| 247 | 283 |
| 248 // If the bookmark bar is detached, place it next in the visual content area. | 284 // If the bookmark bar is detached, place it next in the visual content area. |
| 249 if (placeBookmarkBarBelowInfoBar) | 285 if (placeBookmarkBarBelowInfoBar) |
| 250 maxY = [self layoutBookmarkBarAtMinX:minX maxY:maxY width:width]; | 286 maxY = [self layoutBookmarkBarAtMinX:minX maxY:maxY width:width]; |
| 251 | 287 |
| 252 // Place the download shelf, if any, at the bottom of the view. | 288 // Place the download shelf, if any, at the bottom of the view. |
| 253 minY = [self layoutDownloadShelfAtMinX:minX minY:minY width:width]; | 289 minY = [self layoutDownloadShelfAtMinX:minX minY:minY width:width]; |
| 254 | 290 |
| 255 // Finally, the content area takes up all of the remaining space. | 291 // Finally, the content area takes up all of the remaining space. |
| 256 NSRect contentAreaRect = NSMakeRect(minX, minY, width, maxY - minY); | 292 NSRect contentAreaRect = NSMakeRect(minX, minY, width, maxY - minY); |
| 257 [self layoutTabContentArea:contentAreaRect]; | 293 [self layoutTabContentArea:contentAreaRect]; |
| 258 | 294 |
| 259 // Normally, we don't need to tell the toolbar whether or not to show the | 295 // Normally, we don't need to tell the toolbar whether or not to show the |
| 260 // divider, but things break down during animation. | 296 // divider, but things break down during animation. |
| 261 [toolbarController_ | 297 [toolbarController_ |
| 262 setDividerOpacity:[bookmarkBarController_ toolbarDividerOpacity]]; | 298 setDividerOpacity:[bookmarkBarController_ toolbarDividerOpacity]]; |
| 263 } | 299 } |
| 264 | 300 |
| 265 - (CGFloat)floatingBarHeight { | 301 - (CGFloat)floatingBarHeight { |
| 266 if (![self isFullscreen]) | 302 if (![self inPresentationMode]) |
| 267 return 0; | 303 return 0; |
| 268 | 304 |
| 269 CGFloat totalHeight = [fullscreenController_ floatingBarVerticalOffset]; | 305 CGFloat totalHeight = [presentationModeController_ floatingBarVerticalOffset]; |
| 270 | 306 |
| 271 if ([self hasTabStrip]) | 307 if ([self hasTabStrip]) |
| 272 totalHeight += NSHeight([[self tabStripView] frame]); | 308 totalHeight += NSHeight([[self tabStripView] frame]); |
| 273 | 309 |
| 274 if ([self hasToolbar]) { | 310 if ([self hasToolbar]) { |
| 275 totalHeight += NSHeight([[toolbarController_ view] frame]); | 311 totalHeight += NSHeight([[toolbarController_ view] frame]); |
| 276 } else if ([self hasLocationBar]) { | 312 } else if ([self hasLocationBar]) { |
| 277 totalHeight += NSHeight([[toolbarController_ view] frame]) + | 313 totalHeight += NSHeight([[toolbarController_ view] frame]) + |
| 278 kLocBarTopInset + kLocBarBottomInset; | 314 kLocBarTopInset + kLocBarBottomInset; |
| 279 } | 315 } |
| 280 | 316 |
| 281 if (![self placeBookmarkBarBelowInfoBar]) | 317 if (![self placeBookmarkBarBelowInfoBar]) |
| 282 totalHeight += NSHeight([[bookmarkBarController_ view] frame]); | 318 totalHeight += NSHeight([[bookmarkBarController_ view] frame]); |
| 283 | 319 |
| 284 return totalHeight; | 320 return totalHeight; |
| 285 } | 321 } |
| 286 | 322 |
| 323 - (void)layoutPresentationModeToggleAtOverlayMaxX:(CGFloat)maxX |
| 324 overlayMaxY:(CGFloat)maxY { |
| 325 // Lay out the presentation mode toggle button at the very top of the |
| 326 // tab strip. |
| 327 if ([self shouldShowPresentationModeToggle]) { |
| 328 [self createAndInstallPresentationModeToggleButton]; |
| 329 |
| 330 NSPoint origin = |
| 331 NSMakePoint(maxX - NSWidth([presentationModeToggleButton_ frame]), |
| 332 maxY - NSHeight([presentationModeToggleButton_ frame])); |
| 333 [presentationModeToggleButton_ setFrameOrigin:origin]; |
| 334 } else { |
| 335 [presentationModeToggleButton_ removeFromSuperview]; |
| 336 presentationModeToggleButton_.reset(); |
| 337 } |
| 338 } |
| 339 |
| 287 - (CGFloat)layoutTabStripAtMaxY:(CGFloat)maxY | 340 - (CGFloat)layoutTabStripAtMaxY:(CGFloat)maxY |
| 288 width:(CGFloat)width | 341 width:(CGFloat)width |
| 289 fullscreen:(BOOL)fullscreen { | 342 fullscreen:(BOOL)fullscreen { |
| 290 // Nothing to do if no tab strip. | 343 // Nothing to do if no tab strip. |
| 291 if (![self hasTabStrip]) | 344 if (![self hasTabStrip]) |
| 292 return maxY; | 345 return maxY; |
| 293 | 346 |
| 294 NSView* tabStripView = [self tabStripView]; | 347 NSView* tabStripView = [self tabStripView]; |
| 295 CGFloat tabStripHeight = NSHeight([tabStripView frame]); | 348 CGFloat tabStripHeight = NSHeight([tabStripView frame]); |
| 296 maxY -= tabStripHeight; | 349 maxY -= tabStripHeight; |
| 297 [tabStripView setFrame:NSMakeRect(0, maxY, width, tabStripHeight)]; | 350 [tabStripView setFrame:NSMakeRect(0, maxY, width, tabStripHeight)]; |
| 298 | 351 |
| 299 // Set indentation. | 352 // Set left indentation based on fullscreen mode status. |
| 300 [tabStripController_ setIndentForControls:(fullscreen ? 0 : | 353 [tabStripController_ setLeftIndentForControls:(fullscreen ? 0 : |
| 301 [[tabStripController_ class] defaultIndentForControls])]; | 354 [[tabStripController_ class] defaultLeftIndentForControls])]; |
| 302 | 355 |
| 303 // TODO(viettrungluu): Seems kind of bad -- shouldn't |-layoutSubviews| do | 356 // Calculate the right indentation. The default indentation built into the |
| 304 // this? Moreover, |-layoutTabs| will try to animate.... | 357 // tabstrip leaves enough room for the fullscreen button or presentation mode |
| 305 [tabStripController_ layoutTabs]; | 358 // toggle button on Lion. On non-Lion systems, the default indentation also |
| 359 // looks fine. If an avatar button is present, indent enough to account for |
| 360 // its width. |
| 361 const CGFloat possibleExtraShiftForLion = |
| 362 base::mac::IsOSLionOrLater() ? kAvatarShiftForLion : 0; |
| 363 |
| 364 CGFloat rightIndent = 0; |
| 365 if ([self shouldShowAvatar]) |
| 366 rightIndent += (kAvatarTabStripShrink + possibleExtraShiftForLion); |
| 367 [tabStripController_ setRightIndentForControls:rightIndent]; |
| 368 |
| 369 // Go ahead and layout the tabs. |
| 370 [tabStripController_ layoutTabsWithoutAnimation]; |
| 306 | 371 |
| 307 // Now lay out incognito badge together with the tab strip. | 372 // Now lay out incognito badge together with the tab strip. |
| 308 if (avatarButton_.get()) { | 373 if (avatarButton_.get()) { |
| 309 // Set the size of the avatar to be the (height of the tabstrip) - (padding) | |
| 310 // to let large icons fit. | |
| 311 CGFloat sizeSquare = tabStripHeight - 5.0; | 374 CGFloat sizeSquare = tabStripHeight - 5.0; |
| 312 [avatarButton_ setFrameSize:NSMakeSize(sizeSquare, sizeSquare)]; | 375 [avatarButton_ setFrameSize:NSMakeSize(sizeSquare, sizeSquare)]; |
| 313 | 376 |
| 314 // Actually place the badge *above* |maxY|, by +2 to miss the divider. | 377 // Actually place the badge *above* |maxY|, by +2 to miss the divider. On |
| 315 NSPoint origin = NSMakePoint(width - NSWidth([avatarButton_ frame]) - | 378 // Lion or later, shift the badge left to move it away from the fullscreen |
| 316 kIncognitoBadgeOffset, | 379 // button. |
| 317 maxY + 2); | 380 CGFloat badgeOffset = kAvatarRightOffset + possibleExtraShiftForLion; |
| 381 NSPoint origin = |
| 382 NSMakePoint(width - NSWidth([avatarButton_ frame]) - badgeOffset, |
| 383 maxY + 2); |
| 318 [avatarButton_ setFrameOrigin:origin]; | 384 [avatarButton_ setFrameOrigin:origin]; |
| 319 [avatarButton_ setHidden:NO]; // Make sure it's shown. | 385 [avatarButton_ setHidden:NO]; // Make sure it's shown. |
| 320 } | 386 } |
| 321 | 387 |
| 322 return maxY; | 388 return maxY; |
| 323 } | 389 } |
| 324 | 390 |
| 325 - (CGFloat)layoutToolbarAtMinX:(CGFloat)minX | 391 - (CGFloat)layoutToolbarAtMinX:(CGFloat)minX |
| 326 maxY:(CGFloat)maxY | 392 maxY:(CGFloat)maxY |
| 327 width:(CGFloat)width { | 393 width:(CGFloat)width { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 maxY -= NSHeight(bookmarkBarFrame); | 445 maxY -= NSHeight(bookmarkBarFrame); |
| 380 | 446 |
| 381 // TODO(viettrungluu): Does this really belong here? Calling it shouldn't be | 447 // TODO(viettrungluu): Does this really belong here? Calling it shouldn't be |
| 382 // necessary in the non-NTP case. | 448 // necessary in the non-NTP case. |
| 383 [bookmarkBarController_ layoutSubviews]; | 449 [bookmarkBarController_ layoutSubviews]; |
| 384 | 450 |
| 385 return maxY; | 451 return maxY; |
| 386 } | 452 } |
| 387 | 453 |
| 388 - (void)layoutFloatingBarBackingView:(NSRect)frame | 454 - (void)layoutFloatingBarBackingView:(NSRect)frame |
| 389 fullscreen:(BOOL)fullscreen { | 455 presentationMode:(BOOL)presentationMode { |
| 390 // Only display when in fullscreen mode. | 456 // Only display when in presentation mode. |
| 391 if (fullscreen) { | 457 if (presentationMode) { |
| 392 // For certain window types such as app windows (e.g., the dev tools | 458 // For certain window types such as app windows (e.g., the dev tools |
| 393 // window), there's no actual overlay. (Displaying one would result in an | 459 // window), there's no actual overlay. (Displaying one would result in an |
| 394 // overly sliding in only under the menu, which gives an ugly effect.) | 460 // overly sliding in only under the menu, which gives an ugly effect.) |
| 395 if (floatingBarBackingView_.get()) { | 461 if (floatingBarBackingView_.get()) { |
| 396 BOOL aboveBookmarkBar = [self placeBookmarkBarBelowInfoBar]; | 462 BOOL aboveBookmarkBar = [self placeBookmarkBarBelowInfoBar]; |
| 397 | 463 |
| 398 // Insert it into the view hierarchy if necessary. | 464 // Insert it into the view hierarchy if necessary. |
| 399 if (![floatingBarBackingView_ superview] || | 465 if (![floatingBarBackingView_ superview] || |
| 400 aboveBookmarkBar != floatingBarAboveBookmarkBar_) { | 466 aboveBookmarkBar != floatingBarAboveBookmarkBar_) { |
| 401 NSView* contentView = [[self window] contentView]; | 467 NSView* contentView = [[self window] contentView]; |
| 402 // z-order gets messed up unless we explicitly remove the floatingbar | 468 // z-order gets messed up unless we explicitly remove the floatingbar |
| 403 // view and re-add it. | 469 // view and re-add it. |
| 404 [floatingBarBackingView_ removeFromSuperview]; | 470 [floatingBarBackingView_ removeFromSuperview]; |
| 405 [contentView addSubview:floatingBarBackingView_ | 471 [contentView addSubview:floatingBarBackingView_ |
| 406 positioned:(aboveBookmarkBar ? | 472 positioned:(aboveBookmarkBar ? |
| 407 NSWindowAbove : NSWindowBelow) | 473 NSWindowAbove : NSWindowBelow) |
| 408 relativeTo:[bookmarkBarController_ view]]; | 474 relativeTo:[bookmarkBarController_ view]]; |
| 409 floatingBarAboveBookmarkBar_ = aboveBookmarkBar; | 475 floatingBarAboveBookmarkBar_ = aboveBookmarkBar; |
| 410 } | 476 } |
| 411 | 477 |
| 412 // Set its frame. | 478 // Set its frame. |
| 413 [floatingBarBackingView_ setFrame:frame]; | 479 [floatingBarBackingView_ setFrame:frame]; |
| 414 } | 480 } |
| 415 | 481 |
| 416 // But we want the logic to work as usual (for show/hide/etc. purposes). | 482 // But we want the logic to work as usual (for show/hide/etc. purposes). |
| 417 [fullscreenController_ overlayFrameChanged:frame]; | 483 [presentationModeController_ overlayFrameChanged:frame]; |
| 418 } else { | 484 } else { |
| 419 // Okay to call even if |floatingBarBackingView_| is nil. | 485 // Okay to call even if |floatingBarBackingView_| is nil. |
| 420 if ([floatingBarBackingView_ superview]) | 486 if ([floatingBarBackingView_ superview]) |
| 421 [floatingBarBackingView_ removeFromSuperview]; | 487 [floatingBarBackingView_ removeFromSuperview]; |
| 422 } | 488 } |
| 423 } | 489 } |
| 424 | 490 |
| 425 - (CGFloat)layoutInfoBarAtMinX:(CGFloat)minX | 491 - (CGFloat)layoutInfoBarAtMinX:(CGFloat)minX |
| 426 maxY:(CGFloat)maxY | 492 maxY:(CGFloat)maxY |
| 427 width:(CGFloat)width { | 493 width:(CGFloat)width { |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 return; | 564 return; |
| 499 | 565 |
| 500 toolbarFrame.size.height = newHeight; | 566 toolbarFrame.size.height = newHeight; |
| 501 NSRect bookmarkFrame = [[bookmarkBarController_ view] frame]; | 567 NSRect bookmarkFrame = [[bookmarkBarController_ view] frame]; |
| 502 bookmarkFrame.size.height = bookmarkFrame.size.height - deltaH; | 568 bookmarkFrame.size.height = bookmarkFrame.size.height - deltaH; |
| 503 [[toolbarController_ view] setFrame:toolbarFrame]; | 569 [[toolbarController_ view] setFrame:toolbarFrame]; |
| 504 [[bookmarkBarController_ view] setFrame:bookmarkFrame]; | 570 [[bookmarkBarController_ view] setFrame:bookmarkFrame]; |
| 505 [self layoutSubviews]; | 571 [self layoutSubviews]; |
| 506 } | 572 } |
| 507 | 573 |
| 574 // Fullscreen and presentation mode methods |
| 575 |
| 576 - (BOOL)shouldUsePresentationModeWhenEnteringFullscreen { |
| 577 return browser_->profile()->GetPrefs()->GetBoolean( |
| 578 prefs::kPresentationModeEnabled); |
| 579 } |
| 580 |
| 581 - (void)setShouldUsePresentationModeWhenEnteringFullscreen:(BOOL)flag { |
| 582 browser_->profile()->GetPrefs()->SetBoolean( |
| 583 prefs::kPresentationModeEnabled, flag); |
| 584 } |
| 585 |
| 586 - (BOOL)shouldShowPresentationModeToggle { |
| 587 return base::mac::IsOSLionOrLater() && [self isFullscreen]; |
| 588 } |
| 589 |
| 590 - (void)moveViewsForFullscreenForSnowLeopardOrEarlier:(BOOL)fullscreen |
| 591 regularWindow:(NSWindow*)regularWindow |
| 592 fullscreenWindow:(NSWindow*)fullscreenWindow { |
| 593 // This method is only for Snow Leopard and earlier. |
| 594 DCHECK(base::mac::IsOSSnowLeopardOrEarlier()); |
| 595 |
| 596 NSWindow* sourceWindow = fullscreen ? regularWindow : fullscreenWindow; |
| 597 NSWindow* destWindow = fullscreen ? fullscreenWindow : regularWindow; |
| 598 |
| 599 // Close the bookmark bubble, if it's open. Use |-ok:| instead of |-cancel:| |
| 600 // or |-close| because that matches the behavior when the bubble loses key |
| 601 // status. |
| 602 [bookmarkBubbleController_ ok:self]; |
| 603 |
| 604 // Save the current first responder so we can restore after views are moved. |
| 605 scoped_nsobject<FocusTracker> focusTracker( |
| 606 [[FocusTracker alloc] initWithWindow:sourceWindow]); |
| 607 |
| 608 // While we move views (and focus) around, disable any bar visibility changes. |
| 609 [self disableBarVisibilityUpdates]; |
| 610 |
| 611 // Destroy the tab strip's sheet controller. We will recreate it in the new |
| 612 // window when needed. |
| 613 [tabStripController_ destroySheetController]; |
| 614 |
| 615 // Retain the tab strip view while we remove it from its superview. |
| 616 scoped_nsobject<NSView> tabStripView; |
| 617 if ([self hasTabStrip] && ![self useVerticalTabs]) { |
| 618 tabStripView.reset([[self tabStripView] retain]); |
| 619 [tabStripView removeFromSuperview]; |
| 620 } |
| 621 |
| 622 // Ditto for the content view. |
| 623 scoped_nsobject<NSView> contentView([[sourceWindow contentView] retain]); |
| 624 // Disable autoresizing of subviews while we move views around. This prevents |
| 625 // spurious renderer resizes. |
| 626 [contentView setAutoresizesSubviews:NO]; |
| 627 [contentView removeFromSuperview]; |
| 628 |
| 629 // Have to do this here, otherwise later calls can crash because the window |
| 630 // has no delegate. |
| 631 [sourceWindow setDelegate:nil]; |
| 632 [destWindow setDelegate:self]; |
| 633 |
| 634 // With this call, valgrind complains that a "Conditional jump or move depends |
| 635 // on uninitialised value(s)". The error happens in -[NSThemeFrame |
| 636 // drawOverlayRect:]. I'm pretty convinced this is an Apple bug, but there is |
| 637 // no visual impact. I have been unable to tickle it away with other window |
| 638 // or view manipulation Cocoa calls. Stack added to suppressions_mac.txt. |
| 639 [contentView setAutoresizesSubviews:YES]; |
| 640 [destWindow setContentView:contentView]; |
| 641 |
| 642 // Move the incognito badge if present. |
| 643 if (avatarButton_.get()) { |
| 644 [avatarButton_ removeFromSuperview]; |
| 645 [avatarButton_ setHidden:YES]; // Will be shown in layout. |
| 646 [[[destWindow contentView] superview] addSubview:avatarButton_]; |
| 647 } |
| 648 |
| 649 // Add the tab strip after setting the content view and moving the incognito |
| 650 // badge (if any), so that the tab strip will be on top (in the z-order). |
| 651 if ([self hasTabStrip] && ![self useVerticalTabs]) |
| 652 [[[destWindow contentView] superview] addSubview:tabStripView]; |
| 653 |
| 654 [sourceWindow setWindowController:nil]; |
| 655 [self setWindow:destWindow]; |
| 656 [destWindow setWindowController:self]; |
| 657 |
| 658 // Move the status bubble over, if we have one. |
| 659 if (statusBubble_) |
| 660 statusBubble_->SwitchParentWindow(destWindow); |
| 661 |
| 662 // Move the title over. |
| 663 [destWindow setTitle:[sourceWindow title]]; |
| 664 |
| 665 // The window needs to be onscreen before we can set its first responder. |
| 666 // Ordering the window to the front can change the active Space (either to |
| 667 // the window's old Space or to the application's assigned Space). To prevent |
| 668 // this by temporarily change the collectionBehavior. |
| 669 NSWindowCollectionBehavior behavior = [sourceWindow collectionBehavior]; |
| 670 [destWindow setCollectionBehavior: |
| 671 NSWindowCollectionBehaviorMoveToActiveSpace]; |
| 672 [destWindow makeKeyAndOrderFront:self]; |
| 673 [destWindow setCollectionBehavior:behavior]; |
| 674 |
| 675 [focusTracker restoreFocusInWindow:destWindow]; |
| 676 [sourceWindow orderOut:self]; |
| 677 |
| 678 // We're done moving focus, so re-enable bar visibility changes. |
| 679 [self enableBarVisibilityUpdates]; |
| 680 } |
| 681 |
| 682 - (void)setPresentationModeInternal:(BOOL)presentationMode |
| 683 forceDropdown:(BOOL)forceDropdown { |
| 684 if (presentationMode == [self inPresentationMode]) |
| 685 return; |
| 686 |
| 687 if (presentationMode) { |
| 688 BOOL showDropdown = forceDropdown || [self floatingBarHasFocus]; |
| 689 NSView* contentView = [[self window] contentView]; |
| 690 presentationModeController_.reset( |
| 691 [[PresentationModeController alloc] initWithBrowserController:self]); |
| 692 [presentationModeController_ enterPresentationModeForContentView:contentView |
| 693 showDropdown:showDropdown]; |
| 694 } else { |
| 695 [presentationModeController_ exitPresentationMode]; |
| 696 presentationModeController_.reset(); |
| 697 } |
| 698 |
| 699 [self adjustUIForPresentationMode:presentationMode]; |
| 700 [self layoutSubviews]; |
| 701 } |
| 702 |
| 703 - (void)enterFullscreenForSnowLeopardOrEarlier { |
| 704 DCHECK(base::mac::IsOSSnowLeopardOrEarlier()); |
| 705 |
| 706 // Fade to black. |
| 707 const CGDisplayReservationInterval kFadeDurationSeconds = 0.6; |
| 708 Boolean didFadeOut = NO; |
| 709 CGDisplayFadeReservationToken token; |
| 710 if (CGAcquireDisplayFadeReservation(kFadeDurationSeconds, &token) |
| 711 == kCGErrorSuccess) { |
| 712 didFadeOut = YES; |
| 713 CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendNormal, |
| 714 kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, /*synchronous=*/true); |
| 715 } |
| 716 |
| 717 // Create the fullscreen window. After this line, isFullscreen will return |
| 718 // YES. |
| 719 fullscreenWindow_.reset([[self createFullscreenWindow] retain]); |
| 720 savedRegularWindow_ = [[self window] retain]; |
| 721 savedRegularWindowFrame_ = [savedRegularWindow_ frame]; |
| 722 |
| 723 [self moveViewsForFullscreenForSnowLeopardOrEarlier:YES |
| 724 regularWindow:[self window] |
| 725 fullscreenWindow:fullscreenWindow_.get()]; |
| 726 [self adjustUIForPresentationMode:YES]; |
| 727 [self setPresentationModeInternal:YES forceDropdown:NO]; |
| 728 [self layoutSubviews]; |
| 729 |
| 730 // Fade back in. |
| 731 if (didFadeOut) { |
| 732 CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendSolidColor, |
| 733 kCGDisplayBlendNormal, 0.0, 0.0, 0.0, /*synchronous=*/false); |
| 734 CGReleaseDisplayFadeReservation(token); |
| 735 } |
| 736 } |
| 737 |
| 738 - (void)exitFullscreenForSnowLeopardOrEarlier { |
| 739 DCHECK(base::mac::IsOSSnowLeopardOrEarlier()); |
| 740 |
| 741 // Fade to black. |
| 742 const CGDisplayReservationInterval kFadeDurationSeconds = 0.6; |
| 743 Boolean didFadeOut = NO; |
| 744 CGDisplayFadeReservationToken token; |
| 745 if (CGAcquireDisplayFadeReservation(kFadeDurationSeconds, &token) |
| 746 == kCGErrorSuccess) { |
| 747 didFadeOut = YES; |
| 748 CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendNormal, |
| 749 kCGDisplayBlendSolidColor, 0.0, 0.0, 0.0, /*synchronous=*/true); |
| 750 } |
| 751 |
| 752 [self setPresentationModeInternal:NO forceDropdown:NO]; |
| 753 [self moveViewsForFullscreenForSnowLeopardOrEarlier:NO |
| 754 regularWindow:savedRegularWindow_ |
| 755 fullscreenWindow:fullscreenWindow_.get()]; |
| 756 |
| 757 // When exiting fullscreen mode, we need to call layoutSubviews manually. |
| 758 [savedRegularWindow_ autorelease]; |
| 759 savedRegularWindow_ = nil; |
| 760 fullscreenWindow_.reset(); |
| 761 [self layoutSubviews]; |
| 762 |
| 763 // Fade back in. |
| 764 if (didFadeOut) { |
| 765 CGDisplayFade(token, kFadeDurationSeconds / 2, kCGDisplayBlendSolidColor, |
| 766 kCGDisplayBlendNormal, 0.0, 0.0, 0.0, /*synchronous=*/false); |
| 767 CGReleaseDisplayFadeReservation(token); |
| 768 } |
| 769 } |
| 770 |
| 508 // TODO(rohitrao): This function has shrunk into uselessness, and | 771 // TODO(rohitrao): This function has shrunk into uselessness, and |
| 509 // |-setFullscreen:| has grown rather large. Find a good way to break up | 772 // |-setFullscreen:| has grown rather large. Find a good way to break up |
| 510 // |-setFullscreen:| into smaller pieces. http://crbug.com/36449 | 773 // |-setFullscreen:| into smaller pieces. http://crbug.com/36449 |
| 511 - (void)adjustUIForFullscreen:(BOOL)fullscreen { | 774 - (void)adjustUIForPresentationMode:(BOOL)fullscreen { |
| 512 // Create the floating bar backing view if necessary. | 775 // Create the floating bar backing view if necessary. |
| 513 if (fullscreen && !floatingBarBackingView_.get() && | 776 if (fullscreen && !floatingBarBackingView_.get() && |
| 514 ([self hasTabStrip] || [self hasToolbar] || [self hasLocationBar])) { | 777 ([self hasTabStrip] || [self hasToolbar] || [self hasLocationBar])) { |
| 515 floatingBarBackingView_.reset( | 778 floatingBarBackingView_.reset( |
| 516 [[FloatingBarBackingView alloc] initWithFrame:NSZeroRect]); | 779 [[FloatingBarBackingView alloc] initWithFrame:NSZeroRect]); |
| 517 } | 780 [floatingBarBackingView_ setAutoresizingMask:(NSViewWidthSizable | |
| 781 NSViewMinYMargin)]; |
| 782 } |
| 783 |
| 784 // Adjust the infobar container. In fullscreen, it needs to be below all |
| 785 // top chrome elements so it only sits atop the web contents. When in normal |
| 786 // mode, it needs to draw over the bookmark bar and part of the toolbar. |
| 787 [[infoBarContainerController_ view] removeFromSuperview]; |
| 788 NSView* infoBarDest = [[self window] contentView]; |
| 789 [infoBarDest addSubview:[infoBarContainerController_ view] |
| 790 positioned:fullscreen ? NSWindowBelow : NSWindowAbove |
| 791 relativeTo:fullscreen ? nil |
| 792 : [bookmarkBarController_ view]]; |
| 793 } |
| 794 |
| 795 - (void)contentViewDidResize:(NSNotification*)notification { |
| 796 [self layoutSubviews]; |
| 797 } |
| 798 |
| 799 - (void)registerForContentViewResizeNotifications { |
| 800 [[NSNotificationCenter defaultCenter] |
| 801 addObserver:self |
| 802 selector:@selector(contentViewDidResize:) |
| 803 name:NSViewFrameDidChangeNotification |
| 804 object:[[self window] contentView]]; |
| 805 } |
| 806 |
| 807 - (void)deregisterForContentViewResizeNotifications { |
| 808 [[NSNotificationCenter defaultCenter] |
| 809 removeObserver:self |
| 810 name:NSViewFrameDidChangeNotification |
| 811 object:[[self window] contentView]]; |
| 812 } |
| 813 |
| 814 - (NSSize)window:(NSWindow*)window |
| 815 willUseFullScreenContentSize:(NSSize)proposedSize { |
| 816 return proposedSize; |
| 817 } |
| 818 |
| 819 - (NSApplicationPresentationOptions)window:(NSWindow*)window |
| 820 willUseFullScreenPresentationOptions:(NSApplicationPresentationOptions)opt { |
| 821 return (opt | |
| 822 NSApplicationPresentationAutoHideDock | |
| 823 NSApplicationPresentationAutoHideMenuBar); |
| 824 } |
| 825 |
| 826 - (void)windowWillEnterFullScreen:(NSNotification*)notification { |
| 827 [self registerForContentViewResizeNotifications]; |
| 828 |
| 829 NSWindow* window = [self window]; |
| 830 savedRegularWindowFrame_ = [window frame]; |
| 831 BOOL mode = [self shouldUsePresentationModeWhenEnteringFullscreen]; |
| 832 [self setPresentationModeInternal:mode forceDropdown:NO]; |
| 833 } |
| 834 |
| 835 - (void)windowDidEnterFullScreen:(NSNotification*)notification { |
| 836 [self deregisterForContentViewResizeNotifications]; |
| 837 } |
| 838 |
| 839 - (void)windowWillExitFullScreen:(NSNotification*)notification { |
| 840 [self registerForContentViewResizeNotifications]; |
| 841 [self setPresentationModeInternal:NO forceDropdown:NO]; |
| 842 } |
| 843 |
| 844 - (void)windowDidExitFullScreen:(NSNotification*)notification { |
| 845 [self deregisterForContentViewResizeNotifications]; |
| 846 } |
| 847 |
| 848 - (void)windowDidFailToEnterFullScreen:(NSWindow*)window { |
| 849 [self deregisterForContentViewResizeNotifications]; |
| 850 [self setPresentationModeInternal:NO forceDropdown:NO]; |
| 851 } |
| 852 |
| 853 - (void)windowDidFailToExitFullScreen:(NSWindow*)window { |
| 854 [self deregisterForContentViewResizeNotifications]; |
| 518 } | 855 } |
| 519 | 856 |
| 520 - (void)enableBarVisibilityUpdates { | 857 - (void)enableBarVisibilityUpdates { |
| 521 // Early escape if there's nothing to do. | 858 // Early escape if there's nothing to do. |
| 522 if (barVisibilityUpdatesEnabled_) | 859 if (barVisibilityUpdatesEnabled_) |
| 523 return; | 860 return; |
| 524 | 861 |
| 525 barVisibilityUpdatesEnabled_ = YES; | 862 barVisibilityUpdatesEnabled_ = YES; |
| 526 | 863 |
| 527 if ([barVisibilityLocks_ count]) | 864 if ([barVisibilityLocks_ count]) |
| 528 [fullscreenController_ ensureOverlayShownWithAnimation:NO delay:NO]; | 865 [presentationModeController_ ensureOverlayShownWithAnimation:NO delay:NO]; |
| 529 else | 866 else |
| 530 [fullscreenController_ ensureOverlayHiddenWithAnimation:NO delay:NO]; | 867 [presentationModeController_ ensureOverlayHiddenWithAnimation:NO delay:NO]; |
| 531 } | 868 } |
| 532 | 869 |
| 533 - (void)disableBarVisibilityUpdates { | 870 - (void)disableBarVisibilityUpdates { |
| 534 // Early escape if there's nothing to do. | 871 // Early escape if there's nothing to do. |
| 535 if (!barVisibilityUpdatesEnabled_) | 872 if (!barVisibilityUpdatesEnabled_) |
| 536 return; | 873 return; |
| 537 | 874 |
| 538 barVisibilityUpdatesEnabled_ = NO; | 875 barVisibilityUpdatesEnabled_ = NO; |
| 539 [fullscreenController_ cancelAnimationAndTimers]; | 876 [presentationModeController_ cancelAnimationAndTimers]; |
| 540 } | |
| 541 | |
| 542 - (void)setUpOSFullScreenButton { | |
| 543 // TOOD(rsesek): Properly implement Lion fullscreen <http://crbug.com/74065>. | |
| 544 } | 877 } |
| 545 | 878 |
| 546 @end // @implementation BrowserWindowController(Private) | 879 @end // @implementation BrowserWindowController(Private) |
| OLD | NEW |