| Index: chrome/browser/browser_list.cc
|
| ===================================================================
|
| --- chrome/browser/browser_list.cc (revision 30661)
|
| +++ chrome/browser/browser_list.cc (working copy)
|
| @@ -79,6 +79,45 @@
|
|
|
| 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;
|
| +}
|
| +
|
| +// Finds a registered Browser object matching |profile| and |type|. This
|
| +// walks the list of Browsers that have ever been activated from most recently
|
| +// activated to least. If a Browser has never been activated, such as in a test
|
| +// scenario, this function will _not_ find it. Fall back to
|
| +// FindBrowserMatching() in that case.
|
| +Browser* FindInLastActiveMatching(Profile* profile, Browser::Type type) {
|
| + BrowserList::list_type::const_reverse_iterator browser =
|
| + BrowserList::begin_last_active();
|
| + for (; browser != BrowserList::end_last_active(); ++browser) {
|
| + if (BrowserMatchesProfileAndType(*browser, profile, type))
|
| + return *browser;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| +// Finds a registered Browser object matching |profile| and |type| even if that
|
| +// Browser has never been activated. This is a forward walk, and intended as a
|
| +// last ditch fallback mostly to handle tests run on machines where no window is
|
| +// ever activated. The user experience if this function is relied on is not good
|
| +// since matching browsers will be returned in registration (creation) order.
|
| +Browser* FindBrowserMatching(Profile* profile, Browser::Type type) {
|
| + BrowserList::const_iterator browser = BrowserList::begin();
|
| + for (; browser != BrowserList::end(); ++browser) {
|
| + if (BrowserMatchesProfileAndType(*browser, profile, type))
|
| + return *browser;
|
| + }
|
| + return NULL;
|
| +}
|
| +
|
| } // namespace
|
|
|
| BrowserList::list_type BrowserList::browsers_;
|
| @@ -242,7 +281,7 @@
|
| 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;
|
| @@ -270,48 +309,23 @@
|
|
|
| // static
|
| 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) {
|
| - return *browser;
|
| - }
|
| - }
|
| -
|
| - return NULL;
|
| + // We are only interested in last active browsers, so we don't fall back to all
|
| + // browsers like FindBrowserWith* do.
|
| + return FindInLastActiveMatching(p, Browser::TYPE_ANY);
|
| }
|
|
|
| // 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;
|
| - }
|
| - return NULL;
|
| + Browser* browser = FindInLastActiveMatching(p, t);
|
| + // Fall back to a forward scan of all Browsers if no active one was found.
|
| + return browser ? browser : FindBrowserMatching(p, t);
|
| }
|
|
|
| // 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;
|
| - }
|
| - return NULL;
|
| + Browser* browser = FindInLastActiveMatching(p, Browser::TYPE_ANY);
|
| + // Fall back to a forward scan of all Browsers if no active one was found.
|
| + return browser ? browser : FindBrowserMatching(p, Browser::TYPE_ANY);
|
| }
|
|
|
| // static
|
| @@ -329,8 +343,8 @@
|
| 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 +354,7 @@
|
| 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;
|
|
|