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
diff --git a/chrome/browser/extensions/extensions_service.cc b/chrome/browser/extensions/extensions_service.cc
index 017890f..737f6894 100644
--- a/chrome/browser/extensions/extensions_service.cc
+++ b/chrome/browser/extensions/extensions_service.cc
@@ -272,7 +272,9 @@
   // 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 @@
   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 @@
 
   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(