| Index: chrome/browser/extensions/app_restore_service.cc
|
| diff --git a/chrome/browser/extensions/app_restore_service.cc b/chrome/browser/extensions/app_restore_service.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..99a3ea2337154a3327d7f57d6af4144d9fbd488b
|
| --- /dev/null
|
| +++ b/chrome/browser/extensions/app_restore_service.cc
|
| @@ -0,0 +1,97 @@
|
| +// Copyright (c) 2012 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 "chrome/browser/extensions/app_restore_service.h"
|
| +
|
| +#include "chrome/browser/extensions/api/app_runtime/app_runtime_api.h"
|
| +#include "chrome/browser/extensions/event_router.h"
|
| +#include "chrome/browser/extensions/extension_host.h"
|
| +#include "chrome/browser/extensions/extension_service.h"
|
| +#include "chrome/browser/extensions/extension_system.h"
|
| +#include "chrome/browser/prefs/pref_service.h"
|
| +#include "chrome/browser/prefs/scoped_user_pref_update.h"
|
| +#include "chrome/common/extensions/extension.h"
|
| +#include "chrome/common/extensions/extension_set.h"
|
| +#include "chrome/common/chrome_notification_types.h"
|
| +#include "chrome/common/pref_names.h"
|
| +#include "content/public/browser/notification_details.h"
|
| +#include "content/public/browser/notification_service.h"
|
| +#include "content/public/browser/notification_types.h"
|
| +
|
| +namespace extensions {
|
| +
|
| +AppRestoreService::AppRestoreService(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());
|
| +}
|
| +
|
| +void AppRestoreService::RestoreApps() {
|
| + ExtensionService* extension_service =
|
| + ExtensionSystem::Get(profile_)->extension_service();
|
| + const ExtensionSet* extensions = extension_service->extensions();
|
| + ExtensionPrefs* extension_prefs = extension_service->extension_prefs();
|
| +
|
| + for (ExtensionSet::const_iterator it = extensions->begin();
|
| + it != extensions->end(); ++it) {
|
| + const Extension* extension = *it;
|
| + if (extension_prefs->IsExtensionRunning(extension->id()))
|
| + RestoreApp(extension);
|
| + }
|
| +}
|
| +
|
| +void AppRestoreService::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();
|
| + if (host->extension()->is_platform_app()) {
|
| + RecordAppStart(host->extension()->id());
|
| + }
|
| + break;
|
| + }
|
| +
|
| + case chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED: {
|
| + ExtensionHost* host = content::Details<ExtensionHost>(details).ptr();
|
| + if (host->extension()->is_platform_app()) {
|
| + RecordAppStop(host->extension()->id());
|
| + }
|
| + break;
|
| + }
|
| +
|
| + case chrome::NOTIFICATION_APP_TERMINATING: {
|
| + // Stop listening to NOTIFICATION_EXTENSION_HOST_DESTROYED in particular
|
| + // as all extension hosts will be destroyed as a result of shutdown.
|
| + registrar_.RemoveAll();
|
| + break;
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +void AppRestoreService::RecordAppStart(const std::string& extension_id) {
|
| + ExtensionPrefs* extension_prefs =
|
| + ExtensionSystem::Get(profile_)->extension_service()->extension_prefs();
|
| + extension_prefs->SetExtensionRunning(extension_id, true);
|
| +}
|
| +
|
| +void AppRestoreService::RecordAppStop(const std::string& extension_id) {
|
| + ExtensionPrefs* extension_prefs =
|
| + ExtensionSystem::Get(profile_)->extension_service()->extension_prefs();
|
| + extension_prefs->SetExtensionRunning(extension_id, false);
|
| +}
|
| +
|
| +void AppRestoreService::RestoreApp(const Extension* extension) {
|
| + AppEventRouter::DispatchOnRestartedEvent(profile_, extension);
|
| +}
|
| +
|
| +} // namespace extensions
|
|
|