app_lifetime_monitor.cc 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // Copyright 2013 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 "apps/app_lifetime_monitor.h"
  5. #include "base/observer_list.h"
  6. #include "content/public/browser/browser_context.h"
  7. #include "extensions/browser/app_window/app_window.h"
  8. #include "extensions/browser/extension_host.h"
  9. #include "extensions/common/extension.h"
  10. namespace apps {
  11. using extensions::AppWindow;
  12. using extensions::AppWindowRegistry;
  13. using extensions::Extension;
  14. using extensions::ExtensionHost;
  15. AppLifetimeMonitor::AppLifetimeMonitor(content::BrowserContext* context)
  16. : context_(context) {
  17. extension_host_registry_observation_.Observe(
  18. extensions::ExtensionHostRegistry::Get(context_));
  19. AppWindowRegistry* app_window_registry =
  20. AppWindowRegistry::Factory::GetForBrowserContext(context_,
  21. false /* create */);
  22. DCHECK(app_window_registry);
  23. app_window_registry->AddObserver(this);
  24. }
  25. AppLifetimeMonitor::~AppLifetimeMonitor() = default;
  26. void AppLifetimeMonitor::AddObserver(Observer* observer) {
  27. observers_.AddObserver(observer);
  28. }
  29. void AppLifetimeMonitor::RemoveObserver(Observer* observer) {
  30. observers_.RemoveObserver(observer);
  31. }
  32. void AppLifetimeMonitor::OnExtensionHostCompletedFirstLoad(
  33. content::BrowserContext* browser_context,
  34. ExtensionHost* host) {
  35. const Extension* extension = host->extension();
  36. if (!extension || !extension->is_platform_app())
  37. return;
  38. NotifyAppStart(extension->id());
  39. }
  40. void AppLifetimeMonitor::OnExtensionHostDestroyed(
  41. content::BrowserContext* browser_context,
  42. extensions::ExtensionHost* host) {
  43. const Extension* extension = host->extension();
  44. if (!extension || !extension->is_platform_app())
  45. return;
  46. NotifyAppStop(extension->id());
  47. }
  48. void AppLifetimeMonitor::OnAppWindowRemoved(AppWindow* app_window) {
  49. if (!HasOtherVisibleAppWindows(app_window))
  50. NotifyAppDeactivated(app_window->extension_id());
  51. }
  52. void AppLifetimeMonitor::OnAppWindowHidden(AppWindow* app_window) {
  53. if (!HasOtherVisibleAppWindows(app_window))
  54. NotifyAppDeactivated(app_window->extension_id());
  55. }
  56. void AppLifetimeMonitor::OnAppWindowShown(AppWindow* app_window,
  57. bool was_hidden) {
  58. if (app_window->window_type() != AppWindow::WINDOW_TYPE_DEFAULT)
  59. return;
  60. // The app is being activated if this is the first window to become visible.
  61. if (was_hidden && !HasOtherVisibleAppWindows(app_window)) {
  62. NotifyAppActivated(app_window->extension_id());
  63. }
  64. }
  65. void AppLifetimeMonitor::Shutdown() {
  66. AppWindowRegistry* app_window_registry =
  67. AppWindowRegistry::Factory::GetForBrowserContext(context_,
  68. false /* create */);
  69. if (app_window_registry)
  70. app_window_registry->RemoveObserver(this);
  71. }
  72. bool AppLifetimeMonitor::HasOtherVisibleAppWindows(
  73. AppWindow* app_window) const {
  74. AppWindowRegistry::AppWindowList windows =
  75. AppWindowRegistry::Get(app_window->browser_context())
  76. ->GetAppWindowsForApp(app_window->extension_id());
  77. for (AppWindowRegistry::AppWindowList::const_iterator i = windows.begin();
  78. i != windows.end();
  79. ++i) {
  80. if (*i != app_window && !(*i)->is_hidden())
  81. return true;
  82. }
  83. return false;
  84. }
  85. void AppLifetimeMonitor::NotifyAppStart(const std::string& app_id) {
  86. for (auto& observer : observers_)
  87. observer.OnAppStart(context_, app_id);
  88. }
  89. void AppLifetimeMonitor::NotifyAppActivated(const std::string& app_id) {
  90. for (auto& observer : observers_)
  91. observer.OnAppActivated(context_, app_id);
  92. }
  93. void AppLifetimeMonitor::NotifyAppDeactivated(const std::string& app_id) {
  94. for (auto& observer : observers_)
  95. observer.OnAppDeactivated(context_, app_id);
  96. }
  97. void AppLifetimeMonitor::NotifyAppStop(const std::string& app_id) {
  98. for (auto& observer : observers_)
  99. observer.OnAppStop(context_, app_id);
  100. }
  101. } // namespace apps