diff options
author | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-29 23:28:10 +0000 |
---|---|---|
committer | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-29 23:28:10 +0000 |
commit | 38409b83ae4f9c25b6c87d9b035f5eb4c1ae3214 (patch) | |
tree | 7582f9fd65104a42de74aa73a844cb16a5c9d8cf /chrome | |
parent | 4a87dcd3b5bc959f4be9e10e747b51120aa81b91 (diff) | |
download | chromium_src-38409b83ae4f9c25b6c87d9b035f5eb4c1ae3214.zip chromium_src-38409b83ae4f9c25b6c87d9b035f5eb4c1ae3214.tar.gz chromium_src-38409b83ae4f9c25b6c87d9b035f5eb4c1ae3214.tar.bz2 |
Rework the way the FindBrowserWithProfile/Type methods work.
We now always walk the last active list backwards rather than consulting the last active then walking the registered browser list forwards.
This ensures that when the last active browser is a popup or app frame the last active TYPE_NORMAL browser is located when opening a new tab.
http://crbug.com/17498
TEST=Open an app frame. Open a browser window (Ctrl+N) and load a page. Minimize it. Open another browser window and minimize it. Activate the app frame. Press Ctrl+T. The second browser window should be restored and have a new tab added to it rather than the first.
Review URL: http://codereview.chromium.org/330013
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@30531 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/browser.cc | 5 | ||||
-rw-r--r-- | chrome/browser/browser.h | 7 | ||||
-rw-r--r-- | chrome/browser/browser_list.cc | 52 | ||||
-rw-r--r-- | chrome/browser/browser_list.h | 12 |
4 files changed, 36 insertions, 40 deletions
diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc index 619e855..74652e7 100644 --- a/chrome/browser/browser.cc +++ b/chrome/browser/browser.cc @@ -1600,7 +1600,8 @@ void Browser::DuplicateContentsAt(int index) { } else { Browser* browser = NULL; if (type_ & TYPE_APP) { - browser = Browser::CreateForApp(app_name_, profile_, type_ & TYPE_POPUP); + browser = Browser::CreateForApp(app_name_, profile_, + !!(type_ & TYPE_POPUP)); } else if (type_ == TYPE_POPUP) { browser = Browser::CreateForPopup(profile_); } @@ -1957,7 +1958,7 @@ void Browser::DetachContents(TabContents* source) { bool Browser::IsPopup(TabContents* source) { // A non-tabbed BROWSER is an unconstrained popup. - return (type() & TYPE_POPUP); + return !!(type() & TYPE_POPUP); } void Browser::ToolbarSizeChanged(TabContents* source, bool is_animating) { diff --git a/chrome/browser/browser.h b/chrome/browser/browser.h index a6c15c2..0274d9e 100644 --- a/chrome/browser/browser.h +++ b/chrome/browser/browser.h @@ -48,10 +48,11 @@ class Browser : public TabStripModelDelegate, // TODO(sky): move into a common place that is referenced by both ui_tests // and chrome. enum Type { - TYPE_NORMAL = 0, - TYPE_POPUP = 1, - TYPE_APP = 2, + TYPE_NORMAL = 1, + TYPE_POPUP = 2, + TYPE_APP = 4, TYPE_APP_POPUP = TYPE_APP | TYPE_POPUP, + TYPE_ANY = TYPE_NORMAL | TYPE_POPUP | TYPE_APP }; // Possible elements of the Browser window. diff --git a/chrome/browser/browser_list.cc b/chrome/browser/browser_list.cc index aba80b7..f934943 100644 --- a/chrome/browser/browser_list.cc +++ b/chrome/browser/browser_list.cc @@ -79,6 +79,16 @@ class BrowserActivityObserver : public NotificationObserver { BrowserActivityObserver* activity_observer = NULL; +// Returns true if the specified |browser| has a matching profile and type to +// those specified. |type| can also be TYPE_ANY, which means only |profile| +// must be matched. +bool BrowserMatchesProfileAndType(Browser* browser, + Profile* profile, + Browser::Type type) { + return (type == Browser::TYPE_ANY || browser->type() == type) && + browser->profile() == profile; +} + } // namespace BrowserList::list_type BrowserList::browsers_; @@ -242,7 +252,7 @@ void BrowserList::WindowsSessionEnding() { bool BrowserList::HasBrowserWithProfile(Profile* profile) { BrowserList::const_iterator iter; for (size_t i = 0; i < browsers_.size(); ++i) { - if (browsers_[i]->profile() == profile) + if (BrowserMatchesProfileAndType(browsers_[i], profile, Browser::TYPE_ANY)) return true; } return false; @@ -272,44 +282,28 @@ Browser* BrowserList::GetLastActive() { Browser* BrowserList::GetLastActiveWithProfile(Profile* p) { list_type::reverse_iterator browser = last_active_browsers_.rbegin(); for (; browser != last_active_browsers_.rend(); ++browser) { - if ((*browser)->profile() == p) { + if (BrowserMatchesProfileAndType(*browser, p, Browser::TYPE_ANY)) return *browser; - } } - return NULL; } // static Browser* BrowserList::FindBrowserWithType(Profile* p, Browser::Type t) { - Browser* last_active = GetLastActive(); - if (last_active && last_active->profile() == p && last_active->type() == t) - return last_active; - - BrowserList::const_iterator i; - for (i = BrowserList::begin(); i != BrowserList::end(); ++i) { - if (*i == last_active) - continue; - - if ((*i)->profile() == p && (*i)->type() == t) - return *i; + list_type::reverse_iterator browser = last_active_browsers_.rbegin(); + for (; browser != last_active_browsers_.rend(); ++browser) { + if (BrowserMatchesProfileAndType(*browser, p, t)) + return *browser; } return NULL; } // static Browser* BrowserList::FindBrowserWithProfile(Profile* p) { - Browser* last_active = GetLastActive(); - if (last_active && last_active->profile() == p) - return last_active; - - BrowserList::const_iterator i; - for (i = BrowserList::begin(); i != BrowserList::end(); ++i) { - if (*i == last_active) - continue; - - if ((*i)->profile() == p) - return *i; + list_type::reverse_iterator browser = last_active_browsers_.rbegin(); + for (; browser != last_active_browsers_.rend(); ++browser) { + if (BrowserMatchesProfileAndType(*browser, p, Browser::TYPE_ANY)) + return *browser; } return NULL; } @@ -329,8 +323,8 @@ size_t BrowserList::GetBrowserCountForType(Profile* p, Browser::Type type) { BrowserList::const_iterator i; size_t result = 0; for (i = BrowserList::begin(); i != BrowserList::end(); ++i) { - if ((*i)->profile() == p && (*i)->type() == type) - result++; + if (BrowserMatchesProfileAndType(*i, p, type)) + ++result; } return result; } @@ -340,7 +334,7 @@ size_t BrowserList::GetBrowserCount(Profile* p) { BrowserList::const_iterator i; size_t result = 0; for (i = BrowserList::begin(); i != BrowserList::end(); ++i) { - if ((*i)->profile() == p) + if (BrowserMatchesProfileAndType(*i, p, Browser::TYPE_ANY)) result++; } return result; diff --git a/chrome/browser/browser_list.h b/chrome/browser/browser_list.h index b510b8c..45a0246 100644 --- a/chrome/browser/browser_list.h +++ b/chrome/browser/browser_list.h @@ -58,14 +58,14 @@ class BrowserList { // open browser owned by |profile| is returned. If none exist, returns NULL. static Browser* GetLastActiveWithProfile(Profile *profile); - // Find an existing browser window with the provided type. If the last active - // has the right type, it is returned. Otherwise, the next available browser - // is returned. Returns NULL if no such browser currently exists. + // Find an existing browser window with the provided type. Searches in the + // order of last activation. Only browsers that have been active can be + // returned. Returns NULL if no such browser currently exists. static Browser* FindBrowserWithType(Profile* p, Browser::Type t); - // Find an existing browser window with the provided profile. If the last - // active has the right profile, it is returned. Returns NULL if no such - // browser currently exists. + // Find an existing browser window with the provided profile. Searches in the + // order of last activation. Only browsers that have been active can be + // returned. Returns NULL if no such browser currently exists. static Browser* FindBrowserWithProfile(Profile* p); // Find an existing browser with the provided ID. Returns NULL if no such |