summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorskerner@chromium.org <skerner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-29 15:04:46 +0000
committerskerner@chromium.org <skerner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-29 15:04:46 +0000
commit55196e9cd02dcb4e85249587367dc08e46d77e93 (patch)
tree3e84156aa4f852e6cb7c86e5cf41b4e7ef876f08 /chrome/browser
parent02ecae41bda937a6536e3807c1b1b4a1f909b53e (diff)
downloadchromium_src-55196e9cd02dcb4e85249587367dc08e46d77e93.zip
chromium_src-55196e9cd02dcb4e85249587367dc08e46d77e93.tar.gz
chromium_src-55196e9cd02dcb4e85249587367dc08e46d77e93.tar.bz2
External extensions should be uninstalled when removed from external source.
This was broken for external_extensions.json key "update_url". BUG=57044 TEST=ExtensionsServiceTest.ExternalInstallPrefUpdateUrl Review URL: http://codereview.chromium.org/3471022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@60944 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/extensions/extensions_service.cc11
-rw-r--r--chrome/browser/extensions/extensions_service_unittest.cc12
2 files changed, 20 insertions, 3 deletions
diff --git a/chrome/browser/extensions/extensions_service.cc b/chrome/browser/extensions/extensions_service.cc
index 017890f..737f689 100644
--- a/chrome/browser/extensions/extensions_service.cc
+++ b/chrome/browser/extensions/extensions_service.cc
@@ -272,7 +272,9 @@ class ExtensionsServiceBackend
// Whether errors result in noisy alerts.
bool alert_on_error_;
- // A map of all external extension providers.
+ // A map from external extension type to the external extension provider
+ // for that type. Because a single provider may handle more than one
+ // external extension type, more than one key may map to the same object.
typedef std::map<Extension::Location,
linked_ptr<ExternalExtensionProvider> > ProviderMap;
ProviderMap external_extension_providers_;
@@ -301,6 +303,10 @@ ExtensionsServiceBackend::ExtensionsServiceBackend(
external_extension_providers_[Extension::EXTERNAL_PREF] =
linked_ptr<ExternalExtensionProvider>(
new ExternalPrefExtensionProvider());
+ // EXTERNAL_PREF_DOWNLOAD and EXTERNAL_PREF extensions are handled by the
+ // same object.
+ external_extension_providers_[Extension::EXTERNAL_PREF_DOWNLOAD] =
+ external_extension_providers_[Extension::EXTERNAL_PREF];
#if defined(OS_WIN)
external_extension_providers_[Extension::EXTERNAL_REGISTRY] =
linked_ptr<ExternalExtensionProvider>(
@@ -1024,8 +1030,7 @@ void ExtensionsService::LoadInstalledExtension(const ExtensionInfo& info,
OnExtensionLoaded(extension, true);
- if (info.extension_location == Extension::EXTERNAL_PREF ||
- info.extension_location == Extension::EXTERNAL_REGISTRY) {
+ if (Extension::IsExternalLocation(info.extension_location)) {
ChromeThread::PostTask(
ChromeThread::FILE, FROM_HERE,
NewRunnableMethod(
diff --git a/chrome/browser/extensions/extensions_service_unittest.cc b/chrome/browser/extensions/extensions_service_unittest.cc
index 7781945..9fddb71 100644
--- a/chrome/browser/extensions/extensions_service_unittest.cc
+++ b/chrome/browser/extensions/extensions_service_unittest.cc
@@ -2321,6 +2321,18 @@ TEST_F(ExtensionsServiceTest, ExternalInstallPref) {
TestExternalProvider(pref_provider, Extension::EXTERNAL_PREF);
}
+TEST_F(ExtensionsServiceTest, ExternalInstallPrefUpdateUrl) {
+ // This should all work, even when normal extension installation is disabled.
+ InitializeEmptyExtensionsService();
+ set_extensions_enabled(false);
+
+ // Now add providers. Extension system takes ownership of the objects.
+ MockExtensionProvider* pref_provider =
+ new MockExtensionProvider(Extension::EXTERNAL_PREF_DOWNLOAD);
+ SetMockExternalProvider(Extension::EXTERNAL_PREF_DOWNLOAD, pref_provider);
+ TestExternalProvider(pref_provider, Extension::EXTERNAL_PREF_DOWNLOAD);
+}
+
TEST_F(ExtensionsServiceTest, ExternalPrefProvider) {
InitializeEmptyExtensionsService();
std::string json_data =