Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(330)

Side by Side Diff: chrome/browser/browser_list.cc

Issue 330013: Rework the way the FindBrowserWithProfile/Type methods work.... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/browser/browser_list.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 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 #include "chrome/browser/browser_list.h" 5 #include "chrome/browser/browser_list.h"
6 6
7 #include "base/histogram.h" 7 #include "base/histogram.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/message_loop.h" 9 #include "base/message_loop.h"
10 #include "build/build_config.h" 10 #include "build/build_config.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 UMA_HISTOGRAM_CUSTOM_COUNTS("Tabs.TabCountPerLoad", tab_count, 1, 200, 50); 72 UMA_HISTOGRAM_CUSTOM_COUNTS("Tabs.TabCountPerLoad", tab_count, 1, 200, 50);
73 } 73 }
74 74
75 NotificationRegistrar registrar_; 75 NotificationRegistrar registrar_;
76 76
77 DISALLOW_COPY_AND_ASSIGN(BrowserActivityObserver); 77 DISALLOW_COPY_AND_ASSIGN(BrowserActivityObserver);
78 }; 78 };
79 79
80 BrowserActivityObserver* activity_observer = NULL; 80 BrowserActivityObserver* activity_observer = NULL;
81 81
82 // Returns true if the specified |browser| has a matching profile and type to
83 // those specified. |type| can also be TYPE_ANY, which means only |profile|
84 // must be matched.
85 bool BrowserMatchesProfileAndType(Browser* browser,
86 Profile* profile,
87 Browser::Type type) {
88 return (type == Browser::TYPE_ANY || browser->type() == type) &&
89 browser->profile() == profile;
90 }
91
92 // Finds a registered Browser object matching |profile| and |type|. This
93 // walks the list of Browsers that have ever been activated from most recently
94 // activated to least. If a Browser has never been activated, such as in a test
95 // scenario, this function will _not_ find it. Fall back to
96 // FindBrowserMatching() in that case.
97 Browser* FindInLastActiveMatching(Profile* profile, Browser::Type type) {
98 BrowserList::list_type::const_reverse_iterator browser =
99 BrowserList::begin_last_active();
100 for (; browser != BrowserList::end_last_active(); ++browser) {
101 if (BrowserMatchesProfileAndType(*browser, profile, type))
102 return *browser;
103 }
104 return NULL;
105 }
106
107 // Finds a registered Browser object matching |profile| and |type| even if that
108 // Browser has never been activated. This is a forward walk, and intended as a
109 // last ditch fallback mostly to handle tests run on machines where no window is
110 // ever activated. The user experience if this function is relied on is not good
111 // since matching browsers will be returned in registration (creation) order.
112 Browser* FindBrowserMatching(Profile* profile, Browser::Type type) {
113 BrowserList::const_iterator browser = BrowserList::begin();
114 for (; browser != BrowserList::end(); ++browser) {
115 if (BrowserMatchesProfileAndType(*browser, profile, type))
116 return *browser;
117 }
118 return NULL;
119 }
120
82 } // namespace 121 } // namespace
83 122
84 BrowserList::list_type BrowserList::browsers_; 123 BrowserList::list_type BrowserList::browsers_;
85 std::vector<BrowserList::Observer*> BrowserList::observers_; 124 std::vector<BrowserList::Observer*> BrowserList::observers_;
86 125
87 // static 126 // static
88 void BrowserList::AddBrowser(Browser* browser) { 127 void BrowserList::AddBrowser(Browser* browser) {
89 DCHECK(browser); 128 DCHECK(browser);
90 browsers_.push_back(browser); 129 browsers_.push_back(browser);
91 130
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 ExitProcess(ResultCodes::NORMAL_EXIT); 274 ExitProcess(ResultCodes::NORMAL_EXIT);
236 #else 275 #else
237 NOTIMPLEMENTED(); 276 NOTIMPLEMENTED();
238 #endif 277 #endif
239 } 278 }
240 279
241 // static 280 // static
242 bool BrowserList::HasBrowserWithProfile(Profile* profile) { 281 bool BrowserList::HasBrowserWithProfile(Profile* profile) {
243 BrowserList::const_iterator iter; 282 BrowserList::const_iterator iter;
244 for (size_t i = 0; i < browsers_.size(); ++i) { 283 for (size_t i = 0; i < browsers_.size(); ++i) {
245 if (browsers_[i]->profile() == profile) 284 if (BrowserMatchesProfileAndType(browsers_[i], profile, Browser::TYPE_ANY))
246 return true; 285 return true;
247 } 286 }
248 return false; 287 return false;
249 } 288 }
250 289
251 // static 290 // static
252 BrowserList::list_type BrowserList::last_active_browsers_; 291 BrowserList::list_type BrowserList::last_active_browsers_;
253 292
254 // static 293 // static
255 void BrowserList::SetLastActive(Browser* browser) { 294 void BrowserList::SetLastActive(Browser* browser) {
256 RemoveBrowserFrom(browser, &last_active_browsers_); 295 RemoveBrowserFrom(browser, &last_active_browsers_);
257 last_active_browsers_.push_back(browser); 296 last_active_browsers_.push_back(browser);
258 297
259 for (int i = 0; i < static_cast<int>(observers_.size()); i++) 298 for (int i = 0; i < static_cast<int>(observers_.size()); i++)
260 observers_[i]->OnBrowserSetLastActive(browser); 299 observers_[i]->OnBrowserSetLastActive(browser);
261 } 300 }
262 301
263 // static 302 // static
264 Browser* BrowserList::GetLastActive() { 303 Browser* BrowserList::GetLastActive() {
265 if (!last_active_browsers_.empty()) 304 if (!last_active_browsers_.empty())
266 return *(last_active_browsers_.rbegin()); 305 return *(last_active_browsers_.rbegin());
267 306
268 return NULL; 307 return NULL;
269 } 308 }
270 309
271 // static 310 // static
272 Browser* BrowserList::GetLastActiveWithProfile(Profile* p) { 311 Browser* BrowserList::GetLastActiveWithProfile(Profile* p) {
273 list_type::reverse_iterator browser = last_active_browsers_.rbegin(); 312 // We are only interested in last active browsers, so we don't fall back to al l
274 for (; browser != last_active_browsers_.rend(); ++browser) { 313 // browsers like FindBrowserWith* do.
275 if ((*browser)->profile() == p) { 314 return FindInLastActiveMatching(p, Browser::TYPE_ANY);
276 return *browser;
277 }
278 }
279
280 return NULL;
281 } 315 }
282 316
283 // static 317 // static
284 Browser* BrowserList::FindBrowserWithType(Profile* p, Browser::Type t) { 318 Browser* BrowserList::FindBrowserWithType(Profile* p, Browser::Type t) {
285 Browser* last_active = GetLastActive(); 319 Browser* browser = FindInLastActiveMatching(p, t);
286 if (last_active && last_active->profile() == p && last_active->type() == t) 320 // Fall back to a forward scan of all Browsers if no active one was found.
287 return last_active; 321 return browser ? browser : FindBrowserMatching(p, t);
288
289 BrowserList::const_iterator i;
290 for (i = BrowserList::begin(); i != BrowserList::end(); ++i) {
291 if (*i == last_active)
292 continue;
293
294 if ((*i)->profile() == p && (*i)->type() == t)
295 return *i;
296 }
297 return NULL;
298 } 322 }
299 323
300 // static 324 // static
301 Browser* BrowserList::FindBrowserWithProfile(Profile* p) { 325 Browser* BrowserList::FindBrowserWithProfile(Profile* p) {
302 Browser* last_active = GetLastActive(); 326 Browser* browser = FindInLastActiveMatching(p, Browser::TYPE_ANY);
303 if (last_active && last_active->profile() == p) 327 // Fall back to a forward scan of all Browsers if no active one was found.
304 return last_active; 328 return browser ? browser : FindBrowserMatching(p, Browser::TYPE_ANY);
305
306 BrowserList::const_iterator i;
307 for (i = BrowserList::begin(); i != BrowserList::end(); ++i) {
308 if (*i == last_active)
309 continue;
310
311 if ((*i)->profile() == p)
312 return *i;
313 }
314 return NULL;
315 } 329 }
316 330
317 // static 331 // static
318 Browser* BrowserList::FindBrowserWithID(SessionID::id_type desired_id) { 332 Browser* BrowserList::FindBrowserWithID(SessionID::id_type desired_id) {
319 BrowserList::const_iterator i; 333 BrowserList::const_iterator i;
320 for (i = BrowserList::begin(); i != BrowserList::end(); ++i) { 334 for (i = BrowserList::begin(); i != BrowserList::end(); ++i) {
321 if ((*i)->session_id().id() == desired_id) 335 if ((*i)->session_id().id() == desired_id)
322 return *i; 336 return *i;
323 } 337 }
324 return NULL; 338 return NULL;
325 } 339 }
326 340
327 // static 341 // static
328 size_t BrowserList::GetBrowserCountForType(Profile* p, Browser::Type type) { 342 size_t BrowserList::GetBrowserCountForType(Profile* p, Browser::Type type) {
329 BrowserList::const_iterator i; 343 BrowserList::const_iterator i;
330 size_t result = 0; 344 size_t result = 0;
331 for (i = BrowserList::begin(); i != BrowserList::end(); ++i) { 345 for (i = BrowserList::begin(); i != BrowserList::end(); ++i) {
332 if ((*i)->profile() == p && (*i)->type() == type) 346 if (BrowserMatchesProfileAndType(*i, p, type))
333 result++; 347 ++result;
334 } 348 }
335 return result; 349 return result;
336 } 350 }
337 351
338 // static 352 // static
339 size_t BrowserList::GetBrowserCount(Profile* p) { 353 size_t BrowserList::GetBrowserCount(Profile* p) {
340 BrowserList::const_iterator i; 354 BrowserList::const_iterator i;
341 size_t result = 0; 355 size_t result = 0;
342 for (i = BrowserList::begin(); i != BrowserList::end(); ++i) { 356 for (i = BrowserList::begin(); i != BrowserList::end(); ++i) {
343 if ((*i)->profile() == p) 357 if (BrowserMatchesProfileAndType(*i, p, Browser::TYPE_ANY))
344 result++; 358 result++;
345 } 359 }
346 return result; 360 return result;
347 } 361 }
348 362
349 // static 363 // static
350 bool BrowserList::IsOffTheRecordSessionActive() { 364 bool BrowserList::IsOffTheRecordSessionActive() {
351 BrowserList::const_iterator i; 365 BrowserList::const_iterator i;
352 for (i = BrowserList::begin(); i != BrowserList::end(); ++i) { 366 for (i = BrowserList::begin(); i != BrowserList::end(); ++i) {
353 if ((*i)->profile()->IsOffTheRecord()) 367 if ((*i)->profile()->IsOffTheRecord())
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
392 } 406 }
393 407
394 TabContents* next_tab = 408 TabContents* next_tab =
395 (*browser_iterator_)->GetTabContentsAt(web_view_index_); 409 (*browser_iterator_)->GetTabContentsAt(web_view_index_);
396 if (next_tab) { 410 if (next_tab) {
397 cur_ = next_tab; 411 cur_ = next_tab;
398 return; 412 return;
399 } 413 }
400 } 414 }
401 } 415 }
OLDNEW
« no previous file with comments | « chrome/browser/browser_list.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698