| Index: chrome/browser/extensions/external_provider_impl.cc
|
| diff --git a/chrome/browser/extensions/external_provider_impl.cc b/chrome/browser/extensions/external_provider_impl.cc
|
| index f3122881c0af2f3125e81b935d67ddd48c7b4fc1..12ab37ed85d7438b951be9c2668a21c4055e5555 100644
|
| --- a/chrome/browser/extensions/external_provider_impl.cc
|
| +++ b/chrome/browser/extensions/external_provider_impl.cc
|
| @@ -12,6 +12,7 @@
|
| #include "base/logging.h"
|
| #include "base/memory/linked_ptr.h"
|
| #include "base/metrics/field_trial.h"
|
| +#include "base/prefs/pref_service.h"
|
| #include "base/strings/string_util.h"
|
| #include "base/trace_event/trace_event.h"
|
| #include "base/values.h"
|
| @@ -26,6 +27,7 @@
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/common/chrome_paths.h"
|
| #include "chrome/common/chrome_switches.h"
|
| +#include "chrome/common/pref_names.h"
|
| #include "components/crx_file/id_util.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "extensions/browser/extension_system.h"
|
| @@ -66,6 +68,8 @@ const char ExternalProviderImpl::kKeepIfPresent[] = "keep_if_present";
|
| const char ExternalProviderImpl::kWasInstalledByOem[] = "was_installed_by_oem";
|
| const char ExternalProviderImpl::kSupportedLocales[] = "supported_locales";
|
| const char ExternalProviderImpl::kMayBeUntrusted[] = "may_be_untrusted";
|
| +const char ExternalProviderImpl::kMinProfileCreatedByVersion[] =
|
| + "min_profile_created_by_version";
|
|
|
| ExternalProviderImpl::ExternalProviderImpl(
|
| VisitorInterface* service,
|
| @@ -218,6 +222,7 @@ void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) {
|
| const Extension* extension = extension_service ?
|
| extension_service->GetExtensionById(extension_id, true) : NULL;
|
| if (!extension) {
|
| + unsupported_extensions.insert(extension_id);
|
| VLOG(1) << "Skip installing (or uninstall) external extension: "
|
| << extension_id << " because the extension should be kept "
|
| << "only if it is already installed.";
|
| @@ -235,6 +240,10 @@ void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) {
|
| creation_flags |= Extension::MAY_BE_UNTRUSTED;
|
| }
|
|
|
| + if (!ExternalProviderImpl::HandleMinProfileVersion(extension, extension_id,
|
| + &unsupported_extensions))
|
| + continue;
|
| +
|
| std::string install_parameter;
|
| extension->GetString(kInstallParam, &install_parameter);
|
|
|
| @@ -360,6 +369,30 @@ bool ExternalProviderImpl::GetExtensionDetails(
|
| return true;
|
| }
|
|
|
| +bool ExternalProviderImpl::HandleMinProfileVersion(
|
| + const base::DictionaryValue* extension,
|
| + const std::string& extension_id,
|
| + std::set<std::string>* unsupported_extensions) {
|
| + std::string min_profile_created_by_version;
|
| + if (profile_ &&
|
| + extension->GetString(kMinProfileCreatedByVersion,
|
| + &min_profile_created_by_version)) {
|
| + Version profile_version(
|
| + profile_->GetPrefs()->GetString(prefs::kProfileCreatedByVersion));
|
| + Version min_version(min_profile_created_by_version);
|
| + if (min_version.IsValid() && profile_version.CompareTo(min_version) < 0) {
|
| + unsupported_extensions->insert(extension_id);
|
| + VLOG(1) << "Skip installing (or uninstall) external extension: "
|
| + << extension_id
|
| + << " profile.created_by_version: " << profile_version.GetString()
|
| + << " min_profile_created_by_version: "
|
| + << min_profile_created_by_version;
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| +}
|
| +
|
| // static
|
| void ExternalProviderImpl::CreateExternalProviders(
|
| VisitorInterface* service,
|
|
|