diff options
author | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-13 18:44:21 +0000 |
---|---|---|
committer | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-13 18:44:21 +0000 |
commit | 22eeb168b8bfd02c8a4a9521a819067e25674b95 (patch) | |
tree | 7301665e67526024260e52478ebebde760f1ec1f /chrome/browser/cocoa/tab_strip_controller.mm | |
parent | d37fe632a386d29653f91564677186ff7403d8dc (diff) | |
download | chromium_src-22eeb168b8bfd02c8a4a9521a819067e25674b95.zip chromium_src-22eeb168b8bfd02c8a4a9521a819067e25674b95.tar.gz chromium_src-22eeb168b8bfd02c8a4a9521a819067e25674b95.tar.bz2 |
Mac: Only show one per-tab sheet at a time per tab.
BUG=26900
TEST=Go to http://www/~thakis/cgi-bin/test.html . Test that two sheets show up (the first expects "u" as user and no pass, the other "v" and no pass). The first sheet appears immediately, the second after 2 seconds. Try entering u for the first faster than 2 seconds and switch tabs, when coming back to the original tab, the 2nd sheet should wait for you. Try closing the window and the tab while a sheet is showing, both when the tab with the sheet is in the background and in the foreground.
Review URL: http://codereview.chromium.org/384113
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31920 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa/tab_strip_controller.mm')
-rw-r--r-- | chrome/browser/cocoa/tab_strip_controller.mm | 51 |
1 files changed, 44 insertions, 7 deletions
diff --git a/chrome/browser/cocoa/tab_strip_controller.mm b/chrome/browser/cocoa/tab_strip_controller.mm index dfc70a7..a971808 100644 --- a/chrome/browser/cocoa/tab_strip_controller.mm +++ b/chrome/browser/cocoa/tab_strip_controller.mm @@ -370,11 +370,13 @@ private: DCHECK(newTab); if (newTab) { TabContents::ConstrainedWindowList::iterator it, end; + it = newTab->constrained_window_begin(); end = newTab->constrained_window_end(); - NSWindowController* controller = [[newView window] windowController]; - DCHECK([controller isKindOfClass:[BrowserWindowController class]]); - for (it = newTab->constrained_window_begin(); it != end; ++it) { + // GTMWindowSheetController supports only one sheet at a time. + if (it != end) { + NSWindowController* controller = [[newView window] windowController]; + DCHECK([controller isKindOfClass:[BrowserWindowController class]]); ConstrainedWindow* constrainedWindow = *it; static_cast<ConstrainedWindowMac*>(constrainedWindow)->Realize( static_cast<BrowserWindowController*>(controller)); @@ -1292,7 +1294,7 @@ private: tabModel_->SelectTabContentsAt(index, false /* not a user gesture */); } -- (void)attachConstrainedWindow:(ConstrainedWindowMac*)window { +- (BOOL)attachConstrainedWindow:(ConstrainedWindowMac*)window { // TODO(thakis, avi): Figure out how to make this work when tabs are dragged // out or if fullscreen mode is toggled. @@ -1305,7 +1307,6 @@ private: // to pass it to the sheet controller here. NSView* tabContentsView = [[window->owner()->GetNativeView() superview] superview]; - window->delegate()->RunSheet([self sheetController], tabContentsView); // TODO(avi, thakis): GTMWindowSheetController has no api to move tabsheets // between windows. Until then, we have to prevent having to move a tabsheet @@ -1317,8 +1318,23 @@ private: DCHECK(controller != nil); DCHECK(index >= 0); if (index >= 0) { - [controller setTab:[self viewAtIndex:index] isDraggable:NO]; + NSView* tab = [self viewAtIndex:index]; + [controller setTab:tab isDraggable:NO]; + + std::deque<ConstrainedWindowMac*>& windows = constrainedWindows_[tab]; + std::deque<ConstrainedWindowMac*>::iterator it = + find(windows.begin(), windows.end(), window); + if (it == windows.end()) + constrainedWindows_[tab].push_back(window); + + if (constrainedWindows_[tab].size() == 1) { + [controller setTab:tab isDraggable:NO]; + window->SetVisible(); + window->delegate()->RunSheet([self sheetController], tabContentsView); + return YES; + } } + return NO; } - (void)removeConstrainedWindow:(ConstrainedWindowMac*)window { @@ -1334,7 +1350,28 @@ private: (BrowserWindowController*)[[switchView_ window] windowController]; DCHECK(index >= 0); if (index >= 0) { - [controller setTab:[self viewAtIndex:index] isDraggable:YES]; + NSView* tab = [self viewAtIndex:index]; + + std::deque<ConstrainedWindowMac*>& windows = constrainedWindows_[tab]; + std::deque<ConstrainedWindowMac*>::iterator it = + find(windows.begin(), windows.end(), window); + DCHECK(it != windows.end()); + + bool removedVisibleSheet = it == windows.begin(); + + if (it != windows.end()) + windows.erase(it); + + if (windows.size() == 0) { + [controller setTab:tab isDraggable:YES]; + constrainedWindows_.erase(tab); + } else if (removedVisibleSheet && tab == [self selectedTabView]) { + // Show next sheet + NSWindowController* controller = [[tab window] windowController]; + DCHECK([controller isKindOfClass:[BrowserWindowController class]]); + windows.front()->Realize( + static_cast<BrowserWindowController*>(controller)); + } } } |