browser_list.cc 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "weblayer/browser/browser_list.h"
  5. #include <algorithm>
  6. #include <functional>
  7. #include "base/no_destructor.h"
  8. #include "build/build_config.h"
  9. #include "weblayer/browser/browser_impl.h"
  10. #include "weblayer/browser/browser_list_observer.h"
  11. #if BUILDFLAG(IS_ANDROID)
  12. #include "weblayer/browser/browser_list_proxy.h"
  13. #endif
  14. namespace weblayer {
  15. // static
  16. BrowserList* BrowserList::GetInstance() {
  17. static base::NoDestructor<BrowserList> browser_list;
  18. return browser_list.get();
  19. }
  20. #if BUILDFLAG(IS_ANDROID)
  21. bool BrowserList::HasAtLeastOneResumedBrowser() {
  22. return std::any_of(browsers_.begin(), browsers_.end(),
  23. std::mem_fn(&BrowserImpl::fragment_resumed));
  24. }
  25. #endif
  26. void BrowserList::AddObserver(BrowserListObserver* observer) {
  27. observers_.AddObserver(observer);
  28. }
  29. void BrowserList::RemoveObserver(BrowserListObserver* observer) {
  30. observers_.RemoveObserver(observer);
  31. }
  32. BrowserList::BrowserList() {
  33. #if BUILDFLAG(IS_ANDROID)
  34. browser_list_proxy_ = std::make_unique<BrowserListProxy>();
  35. AddObserver(browser_list_proxy_.get());
  36. #endif
  37. }
  38. BrowserList::~BrowserList() {
  39. #if BUILDFLAG(IS_ANDROID)
  40. RemoveObserver(browser_list_proxy_.get());
  41. #endif
  42. }
  43. void BrowserList::AddBrowser(BrowserImpl* browser) {
  44. DCHECK(!browsers_.contains(browser));
  45. #if BUILDFLAG(IS_ANDROID)
  46. // Browsers should not start out resumed.
  47. DCHECK(!browser->fragment_resumed());
  48. #endif
  49. browsers_.insert(browser);
  50. for (BrowserListObserver& observer : observers_)
  51. observer.OnBrowserCreated(browser);
  52. }
  53. void BrowserList::RemoveBrowser(BrowserImpl* browser) {
  54. DCHECK(browsers_.contains(browser));
  55. #if BUILDFLAG(IS_ANDROID)
  56. // Browsers should not be resumed when being destroyed.
  57. DCHECK(!browser->fragment_resumed());
  58. #endif
  59. browsers_.erase(browser);
  60. for (BrowserListObserver& observer : observers_)
  61. observer.OnBrowserDestroyed(browser);
  62. }
  63. #if BUILDFLAG(IS_ANDROID)
  64. void BrowserList::NotifyHasAtLeastOneResumedBrowserChanged() {
  65. const bool value = HasAtLeastOneResumedBrowser();
  66. for (BrowserListObserver& observer : observers_)
  67. observer.OnHasAtLeastOneResumedBrowserStateChanged(value);
  68. }
  69. #endif
  70. } // namespace weblayer