Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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.h" | 5 #import "chrome/browser/ui/cocoa/browser_window_controller.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <numeric> | 8 #include <numeric> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 356 | 356 |
| 357 // We don't want to try and show the bar before it gets placed in its parent | 357 // We don't want to try and show the bar before it gets placed in its parent |
| 358 // view, so this step shoudn't be inside the bookmark bar controller's | 358 // view, so this step shoudn't be inside the bookmark bar controller's |
| 359 // |-awakeFromNib|. | 359 // |-awakeFromNib|. |
| 360 windowShim_->BookmarkBarStateChanged( | 360 windowShim_->BookmarkBarStateChanged( |
| 361 BookmarkBar::DONT_ANIMATE_STATE_CHANGE); | 361 BookmarkBar::DONT_ANIMATE_STATE_CHANGE); |
| 362 | 362 |
| 363 // Allow bar visibility to be changed. | 363 // Allow bar visibility to be changed. |
| 364 [self enableBarVisibilityUpdates]; | 364 [self enableBarVisibilityUpdates]; |
| 365 | 365 |
| 366 // Set the window to participate in Lion Fullscreen mode. Setting this flag | 366 [self updateFullscreenCollectionBehavior]; |
| 367 // has no effect on Snow Leopard or earlier. Panels can share a fullscreen | |
| 368 // space with a tabbed window, but they can not be primary fullscreen | |
| 369 // windows. | |
| 370 // This ensures the fullscreen button is appropriately positioned. It must | |
| 371 // be done before calling layoutSubviews because the new avatar button's | |
| 372 // position depends on the fullscreen button's position, as well as | |
| 373 // TabStripController's rightIndentForControls. | |
| 374 // The fullscreen button's position may depend on the old avatar button's | |
| 375 // width, but that does not require calling layoutSubviews first. | |
| 376 NSUInteger collectionBehavior = [window collectionBehavior]; | |
| 377 collectionBehavior |= | |
| 378 browser_->type() == Browser::TYPE_TABBED || | |
| 379 browser_->type() == Browser::TYPE_POPUP ? | |
| 380 NSWindowCollectionBehaviorFullScreenPrimary : | |
| 381 NSWindowCollectionBehaviorFullScreenAuxiliary; | |
| 382 [window setCollectionBehavior:collectionBehavior]; | |
| 383 | 367 |
| 384 [self layoutSubviews]; | 368 [self layoutSubviews]; |
| 385 | 369 |
| 386 // For non-trusted, non-app popup windows, |desiredContentRect| contains the | 370 // For non-trusted, non-app popup windows, |desiredContentRect| contains the |
| 387 // desired height of the content, not of the whole window. Now that all the | 371 // desired height of the content, not of the whole window. Now that all the |
| 388 // views are laid out, measure the current content area size and grow if | 372 // views are laid out, measure the current content area size and grow if |
| 389 // needed. The window has not been placed onscreen yet, so this extra resize | 373 // needed. The window has not been placed onscreen yet, so this extra resize |
| 390 // will not cause visible jank. | 374 // will not cause visible jank. |
| 391 if (chrome::SavedBoundsAreContentBounds(browser_.get())) { | 375 if (chrome::SavedBoundsAreContentBounds(browser_.get())) { |
| 392 CGFloat deltaH = desiredContentRect.height() - | 376 CGFloat deltaH = desiredContentRect.height() - |
| (...skipping 805 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1198 | 1182 |
| 1199 // Disable screen updates so that this appears as a single visual change. | 1183 // Disable screen updates so that this appears as a single visual change. |
| 1200 gfx::ScopedCocoaDisableScreenUpdates disabler; | 1184 gfx::ScopedCocoaDisableScreenUpdates disabler; |
| 1201 | 1185 |
| 1202 // Set the window size. Need to do this before we detach the tab so it's | 1186 // Set the window size. Need to do this before we detach the tab so it's |
| 1203 // still in the window. We have to flip the coordinates as that's what | 1187 // still in the window. We have to flip the coordinates as that's what |
| 1204 // is expected by the Browser code. | 1188 // is expected by the Browser code. |
| 1205 NSWindow* sourceWindow = [draggedTab window]; | 1189 NSWindow* sourceWindow = [draggedTab window]; |
| 1206 NSRect windowRect = [sourceWindow frame]; | 1190 NSRect windowRect = [sourceWindow frame]; |
| 1207 NSScreen* screen = [sourceWindow screen]; | 1191 NSScreen* screen = [sourceWindow screen]; |
| 1208 windowRect.origin.y = NSHeight([screen frame]) - NSMaxY(windowRect); | 1192 windowRect.origin.y = |
| 1193 NSHeight([screen frame]) - NSMaxY(windowRect) + [self menubarOffset]; | |
| 1209 gfx::Rect browserRect(windowRect.origin.x, windowRect.origin.y, | 1194 gfx::Rect browserRect(windowRect.origin.x, windowRect.origin.y, |
| 1210 NSWidth(windowRect), NSHeight(windowRect)); | 1195 NSWidth(windowRect), NSHeight(windowRect)); |
| 1211 | 1196 |
| 1212 std::vector<TabStripModelDelegate::NewStripContents> contentses; | 1197 std::vector<TabStripModelDelegate::NewStripContents> contentses; |
| 1213 TabStripModel* model = browser_->tab_strip_model(); | 1198 TabStripModel* model = browser_->tab_strip_model(); |
| 1214 | 1199 |
| 1215 for (TabView* tabView in tabViews) { | 1200 for (TabView* tabView in tabViews) { |
| 1216 // Fetch the tab contents for the tab being dragged. | 1201 // Fetch the tab contents for the tab being dragged. |
| 1217 int index = [tabStripController_ modelIndexForTabView:tabView]; | 1202 int index = [tabStripController_ modelIndexForTabView:tabView]; |
| 1218 bool isPinned = model->IsTabPinned(index); | 1203 bool isPinned = model->IsTabPinned(index); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1238 // Create a new window with the dragged tabs in its model. | 1223 // Create a new window with the dragged tabs in its model. |
| 1239 Browser* newBrowser = browser_->tab_strip_model()->delegate()-> | 1224 Browser* newBrowser = browser_->tab_strip_model()->delegate()-> |
| 1240 CreateNewStripWithContents(contentses, browserRect, false); | 1225 CreateNewStripWithContents(contentses, browserRect, false); |
| 1241 | 1226 |
| 1242 // Get the new controller by asking the new window for its delegate. | 1227 // Get the new controller by asking the new window for its delegate. |
| 1243 BrowserWindowController* controller = | 1228 BrowserWindowController* controller = |
| 1244 reinterpret_cast<BrowserWindowController*>( | 1229 reinterpret_cast<BrowserWindowController*>( |
| 1245 [newBrowser->window()->GetNativeWindow() delegate]); | 1230 [newBrowser->window()->GetNativeWindow() delegate]); |
| 1246 DCHECK(controller && [controller isKindOfClass:[TabWindowController class]]); | 1231 DCHECK(controller && [controller isKindOfClass:[TabWindowController class]]); |
| 1247 | 1232 |
| 1233 // Ensure that the window will appear on top of the source window in | |
| 1234 // fullscreen mode. | |
| 1235 if ([self isInAppKitFullscreen]) { | |
| 1236 NSWindow* window = [controller window]; | |
| 1237 NSUInteger collectionBehavior = [window collectionBehavior]; | |
| 1238 collectionBehavior &= ~NSWindowCollectionBehaviorFullScreenPrimary; | |
| 1239 collectionBehavior |= NSWindowCollectionBehaviorFullScreenAuxiliary; | |
| 1240 [window setCollectionBehavior:collectionBehavior]; | |
| 1241 [window setLevel:NSFloatingWindowLevel]; | |
| 1242 | |
| 1243 controller->savedRegularWindowFrame_ = savedRegularWindowFrame_; | |
| 1244 } | |
| 1245 | |
| 1248 // And make sure we use the correct frame in the new view. | 1246 // And make sure we use the correct frame in the new view. |
| 1249 TabStripController* tabStripController = [controller tabStripController]; | 1247 TabStripController* tabStripController = [controller tabStripController]; |
| 1250 NSView* tabStrip = [self tabStripView]; | 1248 NSView* tabStrip = [self tabStripView]; |
| 1251 NSEnumerator* tabEnumerator = [tabViews objectEnumerator]; | 1249 NSEnumerator* tabEnumerator = [tabViews objectEnumerator]; |
| 1252 for (NSView* newView in [tabStripController tabViews]) { | 1250 for (NSView* newView in [tabStripController tabViews]) { |
| 1253 NSView* oldView = [tabEnumerator nextObject]; | 1251 NSView* oldView = [tabEnumerator nextObject]; |
| 1254 if (oldView) { | 1252 if (oldView) { |
| 1255 // Pushes tabView's frame back inside the tabstrip. | 1253 // Pushes tabView's frame back inside the tabstrip. |
| 1256 NSRect sourceTabRect = [oldView frame]; | 1254 NSRect sourceTabRect = [oldView frame]; |
| 1257 NSSize tabOverflow = | 1255 NSSize tabOverflow = |
| 1258 [self overflowFrom:[tabStrip convertRect:sourceTabRect toView:nil] | 1256 [self overflowFrom:[tabStrip convertRect:sourceTabRect toView:nil] |
| 1259 to:[tabStrip frame]]; | 1257 to:[tabStrip frame]]; |
| 1260 NSRect tabRect = | 1258 NSRect tabRect = |
| 1261 NSOffsetRect(sourceTabRect, -tabOverflow.width, -tabOverflow.height); | 1259 NSOffsetRect(sourceTabRect, -tabOverflow.width, -tabOverflow.height); |
| 1262 // Force the added tab to the right size (remove stretching.) | 1260 // Force the added tab to the right size (remove stretching.) |
| 1263 tabRect.size.height = [TabStripController defaultTabHeight]; | 1261 tabRect.size.height = [TabStripController defaultTabHeight]; |
| 1264 | 1262 |
| 1265 [tabStripController setFrame:tabRect ofTabView:newView]; | 1263 [tabStripController setFrame:tabRect ofTabView:newView]; |
| 1266 } | 1264 } |
| 1267 } | 1265 } |
| 1268 | 1266 |
| 1269 return controller; | 1267 return controller; |
| 1270 } | 1268 } |
| 1271 | 1269 |
| 1270 - (void)detachedWindowEnterFullscreenIfNeeded:(TabWindowController*)source { | |
| 1271 // Ensure that this is only called when the tab is detached into its own | |
| 1272 // window (in which the overlay window will be present). | |
| 1273 DCHECK([self overlayWindow]); | |
| 1274 | |
| 1275 if (([[source window] styleMask] | |
| 1276 & NSFullScreenWindowMask) == NSFullScreenWindowMask) { | |
|
Robert Sesek
2016/04/12 22:14:25
nit & goes on the previous line. Break after the =
spqchan
2016/04/13 00:44:22
Done.
| |
| 1277 [self updateFullscreenCollectionBehavior]; | |
| 1278 | |
| 1279 // Since the detached window in fullscreen will have the size of the | |
| 1280 // screen, it will set |savedRegularWindowFrame_| to the screen size after | |
| 1281 // it enters fullscreen. Make sure that we have the correct value for the | |
| 1282 // |savedRegularWindowFrame_|. | |
| 1283 NSRect regularWindowFrame = savedRegularWindowFrame_; | |
| 1284 [[self window] toggleFullScreen:nil]; | |
| 1285 savedRegularWindowFrame_ = regularWindowFrame; | |
| 1286 } | |
| 1287 } | |
| 1288 | |
| 1272 - (void)insertPlaceholderForTab:(TabView*)tab | 1289 - (void)insertPlaceholderForTab:(TabView*)tab |
| 1273 frame:(NSRect)frame { | 1290 frame:(NSRect)frame { |
| 1274 [super insertPlaceholderForTab:tab frame:frame]; | 1291 [super insertPlaceholderForTab:tab frame:frame]; |
| 1275 [tabStripController_ insertPlaceholderForTab:tab frame:frame]; | 1292 [tabStripController_ insertPlaceholderForTab:tab frame:frame]; |
| 1276 } | 1293 } |
| 1277 | 1294 |
| 1278 - (void)removePlaceholder { | 1295 - (void)removePlaceholder { |
| 1279 [super removePlaceholder]; | 1296 [super removePlaceholder]; |
| 1280 [tabStripController_ insertPlaceholderForTab:nil frame:NSZeroRect]; | 1297 [tabStripController_ insertPlaceholderForTab:nil frame:NSZeroRect]; |
| 1281 } | 1298 } |
| 1282 | 1299 |
| 1283 - (BOOL)isDragSessionActive { | 1300 - (BOOL)isDragSessionActive { |
| 1284 // The tab can be dragged within the existing tab strip or detached | 1301 // The tab can be dragged within the existing tab strip or detached |
| 1285 // into its own window (then the overlay window will be present). | 1302 // into its own window (then the overlay window will be present). |
| 1286 return [[self tabStripController] isDragSessionActive] || | 1303 return [[self tabStripController] isDragSessionActive] || |
| 1287 [self overlayWindow] != nil; | 1304 [self overlayWindow] != nil; |
| 1288 } | 1305 } |
| 1289 | 1306 |
| 1290 - (BOOL)tabDraggingAllowed { | 1307 - (BOOL)tabDraggingAllowed { |
| 1291 return [tabStripController_ tabDraggingAllowed]; | 1308 return [tabStripController_ tabDraggingAllowed]; |
| 1292 } | 1309 } |
| 1293 | 1310 |
| 1294 - (BOOL)tabTearingAllowed { | 1311 - (BOOL)tabTearingAllowed { |
| 1295 return ![self isInAnyFullscreenMode]; | 1312 return ![self isInAnyFullscreenMode] || |
| 1313 base::CommandLine::ForCurrentProcess()->HasSwitch( | |
| 1314 switches::kEnableFullscreenTabDetaching); | |
| 1296 } | 1315 } |
| 1297 | 1316 |
| 1298 - (BOOL)windowMovementAllowed { | 1317 - (BOOL)windowMovementAllowed { |
| 1299 return ![self isInAnyFullscreenMode]; | 1318 return ![self isInAnyFullscreenMode] || [self overlayWindow]; |
| 1300 } | 1319 } |
| 1301 | 1320 |
| 1302 - (BOOL)isTabFullyVisible:(TabView*)tab { | 1321 - (BOOL)isTabFullyVisible:(TabView*)tab { |
| 1303 return [tabStripController_ isTabFullyVisible:tab]; | 1322 return [tabStripController_ isTabFullyVisible:tab]; |
| 1304 } | 1323 } |
| 1305 | 1324 |
| 1306 - (void)showNewTabButton:(BOOL)show { | 1325 - (void)showNewTabButton:(BOOL)show { |
| 1307 [tabStripController_ showNewTabButton:show]; | 1326 [tabStripController_ showNewTabButton:show]; |
| 1308 } | 1327 } |
| 1309 | 1328 |
| (...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1901 return fullscreenWindow_.get() != nil || enteringImmersiveFullscreen_; | 1920 return fullscreenWindow_.get() != nil || enteringImmersiveFullscreen_; |
| 1902 } | 1921 } |
| 1903 | 1922 |
| 1904 - (BOOL)isInAppKitFullscreen { | 1923 - (BOOL)isInAppKitFullscreen { |
| 1905 return !exitingAppKitFullscreen_ && | 1924 return !exitingAppKitFullscreen_ && |
| 1906 (([[self window] styleMask] & NSFullScreenWindowMask) == | 1925 (([[self window] styleMask] & NSFullScreenWindowMask) == |
| 1907 NSFullScreenWindowMask || | 1926 NSFullScreenWindowMask || |
| 1908 enteringAppKitFullscreen_); | 1927 enteringAppKitFullscreen_); |
| 1909 } | 1928 } |
| 1910 | 1929 |
| 1930 - (CGFloat)menubarOffset { | |
| 1931 return [presentationModeController_ menubarOffset]; | |
| 1932 } | |
| 1933 | |
| 1911 - (void)enterExtensionFullscreen { | 1934 - (void)enterExtensionFullscreen { |
| 1912 if (chrome::mac::SupportsSystemFullscreen()) { | 1935 if (chrome::mac::SupportsSystemFullscreen()) { |
| 1913 [self enterBrowserFullscreenWithToolbar:NO]; | 1936 [self enterBrowserFullscreenWithToolbar:NO]; |
| 1914 } else { | 1937 } else { |
| 1915 [self enterImmersiveFullscreen]; | 1938 [self enterImmersiveFullscreen]; |
| 1916 DCHECK(!exclusiveAccessController_->url().is_empty()); | 1939 DCHECK(!exclusiveAccessController_->url().is_empty()); |
| 1917 [self updateFullscreenExitBubble]; | 1940 [self updateFullscreenExitBubble]; |
| 1918 } | 1941 } |
| 1919 } | 1942 } |
| 1920 | 1943 |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2046 | 2069 |
| 2047 - (BOOL)isTabbedWindow { | 2070 - (BOOL)isTabbedWindow { |
| 2048 return browser_->is_type_tabbed(); | 2071 return browser_->is_type_tabbed(); |
| 2049 } | 2072 } |
| 2050 | 2073 |
| 2051 - (NSRect)savedRegularWindowFrame { | 2074 - (NSRect)savedRegularWindowFrame { |
| 2052 return savedRegularWindowFrame_; | 2075 return savedRegularWindowFrame_; |
| 2053 } | 2076 } |
| 2054 | 2077 |
| 2055 @end // @implementation BrowserWindowController(WindowType) | 2078 @end // @implementation BrowserWindowController(WindowType) |
| OLD | NEW |