Chromium Code Reviews| Index: chrome/browser/extensions/extension_service.cc |
| diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc |
| index 2390554fa8c0ebb2fe41eab5cf5f01f3bb2e9e48..357f61ad4c0579fc6501ba010ae7a52ca39aabde 100644 |
| --- a/chrome/browser/extensions/extension_service.cc |
| +++ b/chrome/browser/extensions/extension_service.cc |
| @@ -1890,6 +1890,7 @@ void ExtensionService::AddNewOrUpdatedExtension( |
| CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| const bool blacklisted_for_malware = |
| blacklist_state == extensions::BLACKLISTED_MALWARE; |
| + bool was_ephemeral = extension_prefs_->IsEphemeralApp(extension->id()); |
| extension_prefs_->OnExtensionInstalled(extension, |
| initial_state, |
| blacklisted_for_malware, |
| @@ -1899,7 +1900,7 @@ void ExtensionService::AddNewOrUpdatedExtension( |
| delayed_installs_.Remove(extension->id()); |
| if (InstallVerifier::NeedsVerification(*extension)) |
| system_->install_verifier()->VerifyExtension(extension->id()); |
| - FinishInstallation(extension); |
| + FinishInstallation(extension, was_ephemeral); |
| } |
| void ExtensionService::MaybeFinishDelayedInstallation( |
| @@ -1944,13 +1945,15 @@ void ExtensionService::FinishDelayedInstallation( |
| CHECK(extension.get()); |
| delayed_installs_.Remove(extension_id); |
| + bool was_ephemeral = extension_prefs_->IsEphemeralApp(extension->id()); |
| if (!extension_prefs_->FinishDelayedInstallInfo(extension_id)) |
|
benwells
2014/05/27 01:42:56
This is interesting, looks like for delayed instal
|
| NOTREACHED(); |
| - FinishInstallation(extension.get()); |
| + FinishInstallation(extension.get(), was_ephemeral); |
| } |
| -void ExtensionService::FinishInstallation(const Extension* extension) { |
| +void ExtensionService::FinishInstallation( |
| + const Extension* extension, bool was_ephemeral) { |
| const extensions::Extension* existing_extension = |
| GetInstalledExtension(extension->id()); |
| bool is_update = false; |
| @@ -1959,14 +1962,17 @@ void ExtensionService::FinishInstallation(const Extension* extension) { |
| is_update = true; |
| old_name = existing_extension->name(); |
| } |
| - extensions::InstalledExtensionInfo details(extension, is_update, old_name); |
| + bool from_ephemeral = |
| + was_ephemeral && !extension_prefs_->IsEphemeralApp(extension->id()); |
| + extensions::InstalledExtensionInfo details( |
| + extension, is_update, from_ephemeral, old_name); |
| content::NotificationService::current()->Notify( |
| chrome::NOTIFICATION_EXTENSION_INSTALLED_DEPRECATED, |
| content::Source<Profile>(profile_), |
| content::Details<const extensions::InstalledExtensionInfo>(&details)); |
| - ExtensionRegistry::Get(profile_) |
| - ->TriggerOnWillBeInstalled(extension, is_update, old_name); |
| + ExtensionRegistry::Get(profile_)->TriggerOnWillBeInstalled( |
| + extension, is_update, from_ephemeral, old_name); |
| bool unacknowledged_external = IsUnacknowledgedExternalExtension(extension); |
| @@ -2005,6 +2011,67 @@ void ExtensionService::FinishInstallation(const Extension* extension) { |
| } |
| } |
| +void ExtensionService::InstallEphemeralApp( |
| + const extensions::Extension* extension, bool user_acknowledged) { |
| + DCHECK(GetInstalledExtension(extension->id()) && |
| + extension_prefs_->IsEphemeralApp(extension->id())); |
| + |
| + if (user_acknowledged) { |
| + if (extension->RequiresSortOrdinal()) { |
|
benwells
2014/05/27 01:42:56
Why don't we do this if it wasn't user_acknowledge
tmdiep
2014/05/27 01:58:54
If the app came from sync, we probably don't want
benwells
2014/05/27 03:11:11
The flag is user_acknowledged, not from_sync, so t
tmdiep
2014/05/27 03:21:53
ChromeAppSorting::Set[Page|AppLaunch]Ordinal() wil
|
| + // Reset the sort ordinals of the app to ensure it is added to the default |
| + // position, like newly installed apps would. |
| + extension_prefs_->app_sorting()->ClearOrdinals(extension->id()); |
| + extension_prefs_->app_sorting()->EnsureValidOrdinals( |
| + extension->id(), syncer::StringOrdinal()); |
| + } |
| + |
| + if (!IsExtensionEnabled(extension->id())) { |
| + // If the installation of this app was user acknowledged it can be |
| + // re-enabled if a permission increase or user action were the only |
| + // reasons. |
| + extension_prefs_->RemoveDisableReason( |
| + extension->id(), |
| + Extension::DISABLE_PERMISSIONS_INCREASE); |
| + extension_prefs_->RemoveDisableReason( |
| + extension->id(), |
| + Extension::DISABLE_USER_ACTION); |
| + if (!extension_prefs_->GetDisableReasons(extension->id())) |
| + EnableExtension(extension->id()); |
| + } |
| + } |
| + |
| + // Remove the ephemeral flags from the preferences. |
| + extension_prefs_->OnEphemeralAppInstalled(extension->id()); |
| + |
| + // Fire install-related events to allow observers to handle the promotion |
| + // of the ephemeral app. |
| + extensions::InstalledExtensionInfo details( |
| + extension, |
| + true /* is update */, |
| + true /* from ephemeral */, |
| + extension->name() /* old name */); |
| + content::NotificationService::current()->Notify( |
| + chrome::NOTIFICATION_EXTENSION_INSTALLED_DEPRECATED, |
| + content::Source<Profile>(profile_), |
| + content::Details<const extensions::InstalledExtensionInfo>(&details)); |
| + |
| + registry_->TriggerOnWillBeInstalled( |
| + extension, |
| + true /* is update */, |
| + true /* from ephemeral */, |
| + extension->name() /* old name */); |
| + |
| + content::NotificationService::current()->Notify( |
| + chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, |
| + content::Source<Profile>(profile_), |
| + content::Details<const Extension>(extension)); |
| + |
| + registry_->TriggerOnLoaded(extension); |
| + |
| + if (user_acknowledged && extension_sync_service_) |
| + extension_sync_service_->SyncExtensionChangeIfNeeded(*extension); |
|
benwells
2014/05/27 01:42:56
Have you got any tests to check that it is synced
tmdiep
2014/05/27 01:58:54
I've only tested this manually. I'll look into a b
tmdiep
2014/05/27 07:46:05
Done - see EphemeralAppBrowserTests.
|
| +} |
| + |
| const Extension* ExtensionService::GetPendingExtensionUpdate( |
| const std::string& id) const { |
| return delayed_installs_.GetByID(id); |