| Index: chrome/browser/extensions/extension_service.cc
|
| diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
|
| index cfd8ba1316b94777c6c2c993b93f40956a8acbfb..3222e47c0b71d6fea4a4f3ff7fba23473d8bcf37 100644
|
| --- a/chrome/browser/extensions/extension_service.cc
|
| +++ b/chrome/browser/extensions/extension_service.cc
|
| @@ -203,11 +203,14 @@ bool ExtensionService::OnExternalExtensionUpdateUrlFound(
|
|
|
| const Extension* extension = GetExtensionById(info.extension_id, true);
|
| if (extension) {
|
| - // Already installed. Skip this install if the current location has
|
| - // higher priority than |info.download_location|.
|
| + // Already installed. Skip this install if the current location has higher
|
| + // priority than |info.download_location|, and we aren't doing a
|
| + // reinstall of a corrupt policy force-installed extension.
|
| Manifest::Location current = extension->location();
|
| - if (current ==
|
| - Manifest::GetHigherPriorityLocation(current, info.download_location)) {
|
| + if (!pending_extension_manager_.IsPolicyReinstallForCorruptionExpected(
|
| + info.extension_id) &&
|
| + current == Manifest::GetHigherPriorityLocation(
|
| + current, info.download_location)) {
|
| return false;
|
| }
|
| // Otherwise, overwrite the current installation.
|
| @@ -909,6 +912,7 @@ void ExtensionService::DisableExtension(const std::string& extension_id,
|
| // can be uninstalled by the browser if the user sets extension-specific
|
| // preferences.
|
| if (extension && !(disable_reasons & Extension::DISABLE_RELOAD) &&
|
| + !(disable_reasons & Extension::DISABLE_CORRUPTED) &&
|
| !(disable_reasons & Extension::DISABLE_UPDATE_REQUIRED_BY_POLICY) &&
|
| !system_->management_policy()->UserMayModifySettings(extension,
|
| nullptr) &&
|
|
|