Index: chrome/browser/cocoa/browser_window_controller.mm |
diff --git a/chrome/browser/cocoa/browser_window_controller.mm b/chrome/browser/cocoa/browser_window_controller.mm |
index 69868858f224f437f5ebee53fbf4c027d1155d31..4dd21260f0583a6f2d0608ee33db0cd62c77314c 100644 |
--- a/chrome/browser/cocoa/browser_window_controller.mm |
+++ b/chrome/browser/cocoa/browser_window_controller.mm |
@@ -365,7 +365,8 @@ |
// from this method. |
- (void)windowWillClose:(NSNotification*)notification { |
DCHECK_EQ([notification object], [self window]); |
- DCHECK(!browser_->tabstrip_model()->count()); |
+ DCHECK(!browser_->tabstrip_model()->HasNonPhantomTabs() || |
+ !browser_->tabstrip_model()->count()); |
[savedRegularWindow_ close]; |
// We delete statusBubble here because we need to kill off the dependency |
// that its window has on our window before our window goes away. |
@@ -1067,6 +1068,10 @@ |
tabOrigin = [[self tabStripView] convertPoint:tabOrigin fromView:nil]; |
destinationFrame.origin = tabOrigin; |
+ // Before the tab is detached from its originating tab strip, store the |
+ // pinned state so that it can be maintained between the windows. |
+ bool isPinned = dragBWC->browser_->tabstrip_model()->IsTabPinned(index); |
+ |
// Now that we have enough information about the tab, we can remove it from |
// the dragging window. We need to do this *before* we add it to the new |
// window as this will remove the TabContents' delegate. |
@@ -1075,7 +1080,9 @@ |
// Deposit it into our model at the appropriate location (it already knows |
// where it should go from tracking the drag). Doing this sets the tab's |
// delegate to be the Browser. |
- [tabStripController_ dropTabContents:contents withFrame:destinationFrame]; |
+ [tabStripController_ dropTabContents:contents |
+ withFrame:destinationFrame |
+ asPinnedTab:isPinned]; |
} else { |
// Moving within a window. |
int index = [tabStripController_ modelIndexForTabView:view]; |
@@ -1118,7 +1125,7 @@ |
// Disable screen updates so that this appears as a single visual change. |
base::ScopedNSDisableScreenUpdates disabler; |
- // Fetch the tab contents for the tab being dragged |
+ // Fetch the tab contents for the tab being dragged. |
int index = [tabStripController_ modelIndexForTabView:tabView]; |
TabContents* contents = browser_->tabstrip_model()->GetTabContentsAt(index); |
@@ -1136,6 +1143,9 @@ |
NSRect tabRect = [tabView frame]; |
+ // Before detaching the tab, store the pinned state. |
+ bool isPinned = browser_->tabstrip_model()->IsTabPinned(index); |
+ |
// Detach it from the source window, which just updates the model without |
// deleting the tab contents. This needs to come before creating the new |
// Browser because it clears the TabContents' delegate, which gets hooked |
@@ -1150,6 +1160,10 @@ |
browserRect, |
dockInfo); |
+ // Propagate the tab pinned state of the new tab (which is the only tab in |
+ // this new window). |
+ newBrowser->tabstrip_model()->SetTabPinned(0, isPinned); |
+ |
// Get the new controller by asking the new window for its delegate. |
BrowserWindowController* controller = |
reinterpret_cast<BrowserWindowController*>( |