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 869a8dd99b53acad8468184a7f086e9fbae5cf6d..a5c44446221488a227208e5413b3489909891b78 100644 |
| --- a/chrome/browser/extensions/extension_service.cc |
| +++ b/chrome/browser/extensions/extension_service.cc |
| @@ -195,6 +195,14 @@ void ExtensionService::AddProviderForTesting( |
| linked_ptr<extensions::ExternalProviderInterface>(test_provider)); |
| } |
| +void ExtensionService::BlacklistExtensionForTest( |
| + const std::string& extension_id) { |
| + ExtensionIdSet blocked; |
| + ExtensionIdSet unchanged; |
| + blocked.insert(extension_id); |
| + UpdateBlockedExtensions(blocked, unchanged); |
| +} |
| + |
| bool ExtensionService::OnExternalExtensionUpdateUrlFound( |
| const std::string& id, |
| const std::string& install_parameter, |
| @@ -880,9 +888,11 @@ void ExtensionService::DisableExtension( |
| Extension::DisableReason disable_reason) { |
| CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| - // The extension may have been disabled already. |
| - if (!IsExtensionEnabled(extension_id)) |
| + // The extension may have been disabled already. Just add a disable reason. |
| + if (!IsExtensionEnabled(extension_id)) { |
| + extension_prefs_->AddDisableReason(extension_id, disable_reason); |
|
tmdiep
2014/07/02 07:13:39
yoz: Are multiple disable reasons meant to be supp
Yoyo Zhou
2014/07/10 23:30:12
Yes, they are meant to be supported. This is most
|
| return; |
| + } |
| const Extension* extension = GetInstalledExtension(extension_id); |
| // |extension| can be NULL if sync disables an extension that is not |
| @@ -1746,6 +1756,12 @@ void ExtensionService::OnExtensionInstalled( |
| extension->GetType(), 100); |
| UMA_HISTOGRAM_ENUMERATION("Extensions.UpdateSource", |
| extension->location(), Manifest::NUM_LOCATIONS); |
| + |
| + // A fully installed app cannot be demoted to an ephemeral app. |
| + if ((install_flags & extensions::kInstallFlagIsEphemeral) && |
| + !extension_prefs_->IsEphemeralApp(id)) { |
| + install_flags &= ~static_cast<int>(extensions::kInstallFlagIsEphemeral); |
| + } |
| } |
| // Certain extension locations are specific enough that we can |
| @@ -1946,11 +1962,6 @@ void ExtensionService::PromoteEphemeralApp( |
| extension_prefs_->app_sorting()->EnsureValidOrdinals( |
| extension->id(), syncer::StringOrdinal()); |
| } |
| - |
| - // Cached ephemeral apps may be updated and disabled due to permissions |
| - // increase. The app can be enabled as the install was user-acknowledged. |
| - if (extension_prefs_->DidExtensionEscalatePermissions(extension->id())) |
| - GrantPermissionsAndEnableExtension(extension); |
| } |
| // Remove the ephemeral flags from the preferences. |
| @@ -1975,12 +1986,30 @@ void ExtensionService::PromoteEphemeralApp( |
| extension->name() /* old name */); |
| if (registry_->enabled_extensions().Contains(extension->id())) { |
| + // If the app is already enabled and loaded, fire the load events to allow |
| + // observers to handle the promotion of the ephemeral app. |
| content::NotificationService::current()->Notify( |
| chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, |
| content::Source<Profile>(profile_), |
| content::Details<const Extension>(extension)); |
| registry_->TriggerOnLoaded(extension); |
| + } else { |
| + // Cached ephemeral apps may be updated and disabled due to permissions |
| + // increase. The app can be enabled (as long as no other disable reasons |
| + // exist) as the install was user-acknowledged. |
| + int disable_mask = Extension::DISABLE_NONE; |
| + if (!is_from_sync) |
| + disable_mask |= Extension::DISABLE_PERMISSIONS_INCREASE; |
| + |
| + int other_disable_reasons = |
| + extension_prefs_->GetDisableReasons(extension->id()) & ~disable_mask; |
| + if (!other_disable_reasons) { |
| + if (extension_prefs_->DidExtensionEscalatePermissions(extension->id())) |
| + GrantPermissionsAndEnableExtension(extension); |
| + else |
| + EnableExtension(extension->id()); |
| + } |
| } |
| registry_->TriggerOnInstalled(extension); |