diff options
author | jackhou@chromium.org <jackhou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-18 14:22:12 +0000 |
---|---|---|
committer | jackhou@chromium.org <jackhou@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-18 14:22:12 +0000 |
commit | 4b7111f2c1f379da798835b9a7f7985138542d84 (patch) | |
tree | 38e6e22dad15dcf948a0eac1c83bac50998a97f4 /apps/app_lifetime_monitor.cc | |
parent | 42265601854dfe527c6fd2522d4c9b6c15752273 (diff) | |
download | chromium_src-4b7111f2c1f379da798835b9a7f7985138542d84.zip chromium_src-4b7111f2c1f379da798835b9a7f7985138542d84.tar.gz chromium_src-4b7111f2c1f379da798835b9a7f7985138542d84.tar.bz2 |
Factor out AppLifetimeMonitor.
AppLifetimeMonitor listens to extension host notifications and observes
ShellWindowRegistry. It sends out notifications when:
- an app starts
- the first shell window opens
- the last shell window closes
- the app stops
BUG=
Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=204487
Review URL: https://chromiumcodereview.appspot.com/16412002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@206988 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'apps/app_lifetime_monitor.cc')
-rw-r--r-- | apps/app_lifetime_monitor.cc | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/apps/app_lifetime_monitor.cc b/apps/app_lifetime_monitor.cc new file mode 100644 index 0000000..6c2b9b9 --- /dev/null +++ b/apps/app_lifetime_monitor.cc @@ -0,0 +1,129 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "apps/app_lifetime_monitor.h" + +#include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/ui/extensions/shell_window.h" +#include "chrome/common/chrome_notification_types.h" +#include "chrome/common/extensions/extension.h" +#include "content/public/browser/notification_details.h" +#include "content/public/browser/notification_service.h" + +namespace apps { + +using extensions::Extension; +using extensions::ExtensionHost; +using extensions::ShellWindowRegistry; + +AppLifetimeMonitor::AppLifetimeMonitor(Profile* profile) + : profile_(profile) { + registrar_.Add( + this, chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING, + content::NotificationService::AllSources()); + registrar_.Add( + this, chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED, + content::NotificationService::AllSources()); + registrar_.Add( + this, chrome::NOTIFICATION_APP_TERMINATING, + content::NotificationService::AllSources()); + + ShellWindowRegistry* shell_window_registry = + ShellWindowRegistry::Factory::GetForProfile( + profile_, false /* create */); + DCHECK(shell_window_registry); + shell_window_registry->AddObserver(this); +} + +AppLifetimeMonitor::~AppLifetimeMonitor() {} + +void AppLifetimeMonitor::AddObserver(Observer* observer) { + observers_.AddObserver(observer); +} + +void AppLifetimeMonitor::RemoveObserver(Observer* observer) { + observers_.RemoveObserver(observer); +} + +void AppLifetimeMonitor::Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) { + switch (type) { + case chrome::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING: { + ExtensionHost* host = content::Details<ExtensionHost>(details).ptr(); + const Extension* extension = host->extension(); + if (!extension || !extension->is_platform_app()) + return; + + NotifyAppStart(extension->id()); + break; + } + + case chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED: { + ExtensionHost* host = content::Details<ExtensionHost>(details).ptr(); + const Extension* extension = host->extension(); + if (!extension || !extension->is_platform_app()) + return; + + NotifyAppStop(extension->id()); + break; + } + + case chrome::NOTIFICATION_APP_TERMINATING: { + NotifyChromeTerminating(); + break; + } + } +} + +void AppLifetimeMonitor::OnShellWindowAdded(ShellWindow* shell_window) { + if (shell_window->window_type() != ShellWindow::WINDOW_TYPE_DEFAULT) + return; + + ShellWindowRegistry::ShellWindowList windows = + ShellWindowRegistry::Get(shell_window->profile())-> + GetShellWindowsForApp(shell_window->extension_id()); + if (windows.size() == 1) + NotifyAppActivated(shell_window->extension_id()); +} + +void AppLifetimeMonitor::OnShellWindowIconChanged(ShellWindow* shell_window) {} + +void AppLifetimeMonitor::OnShellWindowRemoved(ShellWindow* shell_window) { + ShellWindowRegistry::ShellWindowList windows = + ShellWindowRegistry::Get(shell_window->profile())-> + GetShellWindowsForApp(shell_window->extension_id()); + if (windows.empty()) + NotifyAppDeactivated(shell_window->extension_id()); +} + +void AppLifetimeMonitor::Shutdown() { + ShellWindowRegistry* shell_window_registry = + ShellWindowRegistry::Factory::GetForProfile( + profile_, false /* create */); + if (shell_window_registry) + shell_window_registry->RemoveObserver(this); +} + +void AppLifetimeMonitor::NotifyAppStart(const std::string& app_id) { + FOR_EACH_OBSERVER(Observer, observers_, OnAppStart(profile_, app_id)); +} + +void AppLifetimeMonitor::NotifyAppActivated(const std::string& app_id) { + FOR_EACH_OBSERVER(Observer, observers_, OnAppActivated(profile_, app_id)); +} + +void AppLifetimeMonitor::NotifyAppDeactivated(const std::string& app_id) { + FOR_EACH_OBSERVER(Observer, observers_, OnAppDeactivated(profile_, app_id)); +} + +void AppLifetimeMonitor::NotifyAppStop(const std::string& app_id) { + FOR_EACH_OBSERVER(Observer, observers_, OnAppStop(profile_, app_id)); +} + +void AppLifetimeMonitor::NotifyChromeTerminating() { + FOR_EACH_OBSERVER(Observer, observers_, OnChromeTerminating()); +} + +} // namespace apps |