summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authordpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-30 06:51:03 +0000
committerdpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-30 06:51:03 +0000
commit19eac6d673dcf516a5976c6a241963f0374fec2f (patch)
treee04dc96d5967523862285a9842e088cedabc4639 /chrome
parentd9bcf70c4a2650ab0155d2d57d5c9468ff3a7034 (diff)
downloadchromium_src-19eac6d673dcf516a5976c6a241963f0374fec2f.zip
chromium_src-19eac6d673dcf516a5976c6a241963f0374fec2f.tar.gz
chromium_src-19eac6d673dcf516a5976c6a241963f0374fec2f.tar.bz2
Add ability to keep external extension for existing user but don't install it for new users
This feature is required to prevent user base expansion without removing extension for user that use the app. See crbug.com/242806 to see more details. BUG=242806 TEST=ExtensionServiceTest.ExternalPrefProvider R=asargent@chromium.org Review URL: https://codereview.chromium.org/15899007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@203101 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/extensions/default_apps.cc2
-rw-r--r--chrome/browser/extensions/extension_service_unittest.cc16
-rw-r--r--chrome/browser/extensions/external_policy_loader_unittest.cc1
-rw-r--r--chrome/browser/extensions/external_provider_impl.cc31
-rw-r--r--chrome/browser/extensions/external_provider_impl.h5
5 files changed, 51 insertions, 4 deletions
diff --git a/chrome/browser/extensions/default_apps.cc b/chrome/browser/extensions/default_apps.cc
index 14fdb3b..8e684e0 100644
--- a/chrome/browser/extensions/default_apps.cc
+++ b/chrome/browser/extensions/default_apps.cc
@@ -139,7 +139,7 @@ Provider::Provider(Profile* profile,
extensions::Manifest::Location crx_location,
extensions::Manifest::Location download_location,
int creation_flags)
- : extensions::ExternalProviderImpl(service, loader, crx_location,
+ : extensions::ExternalProviderImpl(service, loader, profile, crx_location,
download_location, creation_flags),
profile_(profile),
is_migration_(false) {
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 92a48b6..e947a5f 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -284,6 +284,7 @@ class MockProviderVisitor
: ids_found_(0),
fake_base_path_(fake_base_path),
expected_creation_flags_(Extension::NO_FLAGS) {
+ profile_.reset(new TestingProfile);
}
MockProviderVisitor(base::FilePath fake_base_path,
@@ -298,6 +299,7 @@ class MockProviderVisitor
provider_.reset(new extensions::ExternalProviderImpl(
this,
new extensions::ExternalTestingLoader(json_data, fake_base_path_),
+ profile_.get(),
Manifest::EXTERNAL_PREF,
Manifest::EXTERNAL_PREF_DOWNLOAD,
Extension::NO_FLAGS));
@@ -407,6 +409,7 @@ class MockProviderVisitor
int expected_creation_flags_;
scoped_ptr<extensions::ExternalProviderImpl> provider_;
scoped_ptr<DictionaryValue> prefs_;
+ scoped_ptr<TestingProfile> profile_;
DISALLOW_COPY_AND_ASSIGN(MockProviderVisitor);
};
@@ -4580,6 +4583,19 @@ TEST_F(ExtensionServiceTest, ExternalPrefProvider) {
EXPECT_EQ(2, visitor.Visit(json_data));
}
+ // Test keep_if_present.
+ json_data =
+ "{"
+ " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\": {"
+ " \"external_crx\": \"RandomExtension.crx\","
+ " \"external_version\": \"1.0\","
+ " \"keep_if_present\": true"
+ " }"
+ "}";
+ {
+ EXPECT_EQ(0, visitor.Visit(json_data));
+ }
+
// Test is_bookmark_app.
MockProviderVisitor from_bookmark_visitor(
base_path, Extension::FROM_BOOKMARK);
diff --git a/chrome/browser/extensions/external_policy_loader_unittest.cc b/chrome/browser/extensions/external_policy_loader_unittest.cc
index 28ce8aa..f8e0340 100644
--- a/chrome/browser/extensions/external_policy_loader_unittest.cc
+++ b/chrome/browser/extensions/external_policy_loader_unittest.cc
@@ -57,6 +57,7 @@ class MockExternalPolicyProviderVisitor
provider_.reset(new ExternalProviderImpl(
this,
new ExternalPolicyLoader(profile_.get()),
+ profile_.get(),
Manifest::INVALID_LOCATION,
Manifest::EXTERNAL_POLICY_DOWNLOAD,
Extension::NO_FLAGS));
diff --git a/chrome/browser/extensions/external_provider_impl.cc b/chrome/browser/extensions/external_provider_impl.cc
index 0a0b519..fb29bd5 100644
--- a/chrome/browser/extensions/external_provider_impl.cc
+++ b/chrome/browser/extensions/external_provider_impl.cc
@@ -19,6 +19,7 @@
#include "chrome/browser/app_mode/app_mode_utils.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_system.h"
#include "chrome/browser/extensions/external_component_loader.h"
#include "chrome/browser/extensions/external_policy_loader.h"
#include "chrome/browser/extensions/external_pref_loader.h"
@@ -60,10 +61,12 @@ const char ExternalProviderImpl::kExternalUpdateUrl[] = "external_update_url";
const char ExternalProviderImpl::kSupportedLocales[] = "supported_locales";
const char ExternalProviderImpl::kIsBookmarkApp[] = "is_bookmark_app";
const char ExternalProviderImpl::kIsFromWebstore[] = "is_from_webstore";
+const char ExternalProviderImpl::kKeepIfPresent[] = "keep_if_present";
ExternalProviderImpl::ExternalProviderImpl(
VisitorInterface* service,
ExternalLoader* loader,
+ Profile* profile,
Manifest::Location crx_location,
Manifest::Location download_location,
int creation_flags)
@@ -73,6 +76,7 @@ ExternalProviderImpl::ExternalProviderImpl(
prefs_(NULL),
ready_(false),
loader_(loader),
+ profile_(profile),
creation_flags_(creation_flags),
auto_acknowledge_(false) {
loader_->Init(this);
@@ -184,9 +188,9 @@ void ExternalProviderImpl::SetPrefs(DictionaryValue* prefs) {
if (!locale_supported) {
unsupported_extensions.insert(extension_id);
- LOG(INFO) << "Skip installing (or uninstall) external extension: "
- << extension_id << " because the extension doesn't support "
- << "the browser locale.";
+ VLOG(1) << "Skip installing (or uninstall) external extension: "
+ << extension_id << " because the extension doesn't support "
+ << "the browser locale.";
continue;
}
}
@@ -202,6 +206,20 @@ void ExternalProviderImpl::SetPrefs(DictionaryValue* prefs) {
is_from_webstore) {
creation_flags |= Extension::FROM_WEBSTORE;
}
+ bool keep_if_present;
+ if (extension->GetBoolean(kKeepIfPresent, &keep_if_present) &&
+ keep_if_present && profile_) {
+ ExtensionServiceInterface* extension_service =
+ ExtensionSystem::Get(profile_)->extension_service();
+ const Extension* extension = extension_service ?
+ extension_service->GetExtensionById(extension_id, true) : NULL;
+ if (!extension) {
+ VLOG(1) << "Skip installing (or uninstall) external extension: "
+ << extension_id << " because the extension should be kept "
+ << "only if it is already installed.";
+ continue;
+ }
+ }
if (has_external_crx) {
if (crx_location_ == Manifest::INVALID_LOCATION) {
@@ -331,6 +349,7 @@ void ExternalProviderImpl::CreateExternalProviders(
new ExternalProviderImpl(
service,
new ExternalPolicyLoader(profile),
+ profile,
Manifest::INVALID_LOCATION,
Manifest::EXTERNAL_POLICY_DOWNLOAD,
Extension::NO_FLAGS)));
@@ -384,6 +403,7 @@ void ExternalProviderImpl::CreateExternalProviders(
service,
new ExternalPrefLoader(external_apps_path_id,
check_admin_permissions_on_mac),
+ profile,
Manifest::EXTERNAL_PREF,
Manifest::EXTERNAL_PREF_DOWNLOAD,
bundled_extension_creation_flags)));
@@ -399,6 +419,7 @@ void ExternalProviderImpl::CreateExternalProviders(
service,
new ExternalPrefLoader(chrome::DIR_USER_EXTERNAL_EXTENSIONS,
ExternalPrefLoader::NONE),
+ profile,
Manifest::EXTERNAL_PREF,
Manifest::EXTERNAL_PREF_DOWNLOAD,
Extension::NO_FLAGS)));
@@ -410,6 +431,7 @@ void ExternalProviderImpl::CreateExternalProviders(
new ExternalProviderImpl(
service,
new ExternalRegistryLoader,
+ profile,
Manifest::EXTERNAL_REGISTRY,
Manifest::INVALID_LOCATION,
Extension::NO_FLAGS)));
@@ -423,6 +445,7 @@ void ExternalProviderImpl::CreateExternalProviders(
new ExternalPrefLoader(
chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS,
ExternalPrefLoader::NONE),
+ profile,
Manifest::EXTERNAL_PREF,
Manifest::EXTERNAL_PREF_DOWNLOAD,
bundled_extension_creation_flags)));
@@ -454,6 +477,7 @@ void ExternalProviderImpl::CreateExternalProviders(
new ExternalProviderImpl(
service,
app_pack_updater->CreateExternalLoader(),
+ profile,
Manifest::EXTERNAL_PREF,
Manifest::INVALID_LOCATION,
Extension::NO_FLAGS)));
@@ -466,6 +490,7 @@ void ExternalProviderImpl::CreateExternalProviders(
new ExternalProviderImpl(
service,
new ExternalComponentLoader(),
+ profile,
Manifest::INVALID_LOCATION,
Manifest::EXTERNAL_POLICY_DOWNLOAD,
Extension::FROM_WEBSTORE | Extension::WAS_INSTALLED_BY_DEFAULT)));
diff --git a/chrome/browser/extensions/external_provider_impl.h b/chrome/browser/extensions/external_provider_impl.h
index 6c31b90..ef6a890 100644
--- a/chrome/browser/extensions/external_provider_impl.h
+++ b/chrome/browser/extensions/external_provider_impl.h
@@ -38,6 +38,7 @@ class ExternalProviderImpl : public ExternalProviderInterface {
// be initialized as Manifest::INVALID_LOCATION.
ExternalProviderImpl(VisitorInterface* service,
ExternalLoader* loader,
+ Profile* profile,
Manifest::Location crx_location,
Manifest::Location download_location,
int creation_flags);
@@ -71,6 +72,7 @@ class ExternalProviderImpl : public ExternalProviderInterface {
static const char kSupportedLocales[];
static const char kIsBookmarkApp[];
static const char kIsFromWebstore[];
+ static const char kKeepIfPresent[];
void set_auto_acknowledge(bool auto_acknowledge) {
auto_acknowledge_ = auto_acknowledge;
@@ -100,6 +102,9 @@ class ExternalProviderImpl : public ExternalProviderInterface {
// via |SetPrefs|.
scoped_refptr<ExternalLoader> loader_;
+ // The profile that will be used to install external extensions.
+ Profile* profile_;
+
// Creation flags to use for the extension. These flags will be used
// when calling Extension::Create() by the crx installer.
int creation_flags_;