diff options
author | skerner@chromium.org <skerner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-29 15:04:46 +0000 |
---|---|---|
committer | skerner@chromium.org <skerner@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-29 15:04:46 +0000 |
commit | 55196e9cd02dcb4e85249587367dc08e46d77e93 (patch) | |
tree | 3e84156aa4f852e6cb7c86e5cf41b4e7ef876f08 /chrome/browser | |
parent | 02ecae41bda937a6536e3807c1b1b4a1f909b53e (diff) | |
download | chromium_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.cc | 11 | ||||
-rw-r--r-- | chrome/browser/extensions/extensions_service_unittest.cc | 12 |
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 = |