| Index: chrome/browser/apps/ephemeral_app_service.cc
|
| diff --git a/chrome/browser/apps/ephemeral_app_service.cc b/chrome/browser/apps/ephemeral_app_service.cc
|
| index da4a5d19ab9b5b79956e6ffd82be4a38ea52e4de..de05309a3670c1d224e7d1c1167813b2d00d6ef1 100644
|
| --- a/chrome/browser/apps/ephemeral_app_service.cc
|
| +++ b/chrome/browser/apps/ephemeral_app_service.cc
|
| @@ -23,6 +23,7 @@
|
|
|
| using extensions::Extension;
|
| using extensions::ExtensionPrefs;
|
| +using extensions::ExtensionRegistry;
|
| using extensions::ExtensionSet;
|
| using extensions::ExtensionSystem;
|
|
|
| @@ -60,8 +61,7 @@ EphemeralAppService::EphemeralAppService(Profile* profile)
|
| switches::kEnableEphemeralApps))
|
| return;
|
|
|
| - extension_registry_observer_.Add(
|
| - extensions::ExtensionRegistry::Get(profile_));
|
| + extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
|
| registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY,
|
| content::Source<Profile>(profile_));
|
| registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
|
| @@ -71,6 +71,41 @@ EphemeralAppService::EphemeralAppService(Profile* profile)
|
| EphemeralAppService::~EphemeralAppService() {
|
| }
|
|
|
| +void EphemeralAppService::ClearCachedApps() {
|
| + // Cancel any pending garbage collects.
|
| + garbage_collect_apps_timer_.Stop();
|
| +
|
| + ExtensionRegistry* registry = ExtensionRegistry::Get(profile_);
|
| + DCHECK(registry);
|
| + ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_);
|
| + DCHECK(prefs);
|
| + ExtensionService* service =
|
| + ExtensionSystem::Get(profile_)->extension_service();
|
| + DCHECK(service);
|
| +
|
| + scoped_ptr<ExtensionSet> extensions =
|
| + registry->GenerateInstalledExtensionsSet();
|
| +
|
| + for (ExtensionSet::const_iterator it = extensions->begin();
|
| + it != extensions->end();
|
| + ++it) {
|
| + std::string extension_id = (*it)->id();
|
| + if (!prefs->IsEphemeralApp(extension_id))
|
| + continue;
|
| +
|
| + // Do not remove apps that are running.
|
| + if (!extensions::util::IsExtensionIdle(extension_id, profile_))
|
| + continue;
|
| +
|
| + DCHECK(registry->GetExtensionById(extension_id,
|
| + ExtensionRegistry::EVERYTHING));
|
| + service->UninstallExtension(
|
| + extension_id,
|
| + ExtensionService::UNINSTALL_REASON_ORPHANED_EPHEMERAL_EXTENSION,
|
| + NULL);
|
| + }
|
| +}
|
| +
|
| void EphemeralAppService::Observe(
|
| int type,
|
| const content::NotificationSource& source,
|
| @@ -127,8 +162,7 @@ void EphemeralAppService::Init() {
|
|
|
| void EphemeralAppService::InitEphemeralAppCount() {
|
| scoped_ptr<ExtensionSet> extensions =
|
| - extensions::ExtensionRegistry::Get(profile_)
|
| - ->GenerateInstalledExtensionsSet();
|
| + ExtensionRegistry::Get(profile_)->GenerateInstalledExtensionsSet();
|
| ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_);
|
| DCHECK(prefs);
|
|
|
| @@ -152,12 +186,14 @@ void EphemeralAppService::TriggerGarbageCollect(const base::TimeDelta& delay) {
|
| }
|
|
|
| void EphemeralAppService::GarbageCollectApps() {
|
| - scoped_ptr<ExtensionSet> extensions =
|
| - extensions::ExtensionRegistry::Get(profile_)
|
| - ->GenerateInstalledExtensionsSet();
|
| + ExtensionRegistry* registry = ExtensionRegistry::Get(profile_);
|
| + DCHECK(registry);
|
| ExtensionPrefs* prefs = ExtensionPrefs::Get(profile_);
|
| DCHECK(prefs);
|
|
|
| + scoped_ptr<ExtensionSet> extensions =
|
| + registry->GenerateInstalledExtensionsSet();
|
| +
|
| int app_count = 0;
|
| LaunchTimeAppMap app_launch_times;
|
| std::set<std::string> remove_app_ids;
|
| @@ -189,21 +225,22 @@ void EphemeralAppService::GarbageCollectApps() {
|
| ExtensionService* service =
|
| ExtensionSystem::Get(profile_)->extension_service();
|
| DCHECK(service);
|
| - // Execute the replacement policies and remove apps marked for deletion.
|
| + // Execute the eviction policies and remove apps marked for deletion.
|
| if (!app_launch_times.empty()) {
|
| GetAppsToRemove(app_count, app_launch_times, &remove_app_ids);
|
| +
|
| for (std::set<std::string>::const_iterator id = remove_app_ids.begin();
|
| id != remove_app_ids.end(); ++id) {
|
| - if (service->UninstallExtension(
|
| - *id,
|
| - ExtensionService::UNINSTALL_REASON_ORPHANED_EPHEMERAL_EXTENSION,
|
| - NULL)) {
|
| - --app_count;
|
| - }
|
| + // Protect against cascading uninstalls.
|
| + if (!registry->GetExtensionById(*id, ExtensionRegistry::EVERYTHING))
|
| + continue;
|
| +
|
| + service->UninstallExtension(
|
| + *id,
|
| + ExtensionService::UNINSTALL_REASON_ORPHANED_EPHEMERAL_EXTENSION,
|
| + NULL);
|
| }
|
| }
|
| -
|
| - ephemeral_app_count_ = app_count;
|
| }
|
|
|
| // static
|
|
|