Index: chrome/browser/extensions/extension_service.cc |
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc |
index 3da62e6129189f5b1a1854ab7b17bf5b6dc8c73b..9c61f40510bdd65a269dee567421a4b17da9754f 100644 |
--- a/chrome/browser/extensions/extension_service.cc |
+++ b/chrome/browser/extensions/extension_service.cc |
@@ -573,6 +573,11 @@ void ExtensionService::Init() { |
// rather than running immediately at startup. |
CheckForExternalUpdates(); |
+ InstallVerifier* verifier = |
+ extensions::ExtensionSystem::Get(profile_)->install_verifier(); |
+ if (verifier->NeedsBootstrap()) |
+ VerifyAllExtensions(); |
+ |
base::MessageLoop::current()->PostDelayedTask( |
FROM_HERE, |
base::Bind(&ExtensionService::GarbageCollectExtensions, AsWeakPtr()), |
@@ -590,6 +595,55 @@ void ExtensionService::Init() { |
base::Time::Now() - begin_time); |
} |
+void ExtensionService::VerifyAllExtensions() { |
+ ExtensionIdSet to_add; |
+ scoped_ptr<ExtensionSet> all_extensions = GenerateInstalledExtensionsSet(); |
+ |
+ for (ExtensionSet::const_iterator i = all_extensions->begin(); |
+ i != all_extensions->end(); ++i) { |
+ const Extension& extension = **i; |
+ |
+ if (extensions::ManifestURL::UpdatesFromGallery(&extension) && |
+ extension.is_extension()) |
+ to_add.insert(extension.id()); |
+ } |
+ extensions::ExtensionSystem::Get(profile_)->install_verifier()->AddMany( |
+ to_add, base::Bind(&ExtensionService::FinishVerifyAllExtensions, |
+ AsWeakPtr())); |
+} |
+ |
+void ExtensionService::FinishVerifyAllExtensions(bool success) { |
+ if (success) { |
+ // Check to see if any currently unverified extensions became verified. |
+ InstallVerifier* verifier = |
+ extensions::ExtensionSystem::Get(profile_)->install_verifier(); |
+ for (ExtensionSet::const_iterator i = disabled_extensions_.begin(); |
+ i != disabled_extensions_.end(); ++i) { |
+ const Extension& extension = **i; |
+ int disable_reasons = extension_prefs_->GetDisableReasons(extension.id()); |
+ if (disable_reasons & Extension::DISABLE_NOT_VERIFIED && |
+ !verifier->MustRemainDisabled(&extension, NULL, NULL)) { |
+ extension_prefs_->RemoveDisableReason(extension.id(), |
+ Extension::DISABLE_NOT_VERIFIED); |
+ // Notify interested observers (eg the extensions settings page) by |
+ // sending an UNLOADED notification. |
+ // |
+ // TODO(asargent) - this is a slight hack because it's already |
+ // disabled; the right solution might be to add a separate listener |
+ // interface for DisableReason's changing. http://crbug.com/328916 |
+ UnloadedExtensionInfo details(&extension, |
+ UnloadedExtensionInfo::REASON_DISABLE); |
+ content::NotificationService::current()->Notify( |
+ chrome::NOTIFICATION_EXTENSION_UNLOADED, |
+ content::Source<Profile>(profile_), |
+ content::Details<UnloadedExtensionInfo>(&details)); |
+ } |
+ } |
+ // Might disable some extensions. |
+ CheckManagementPolicy(); |
+ } |
+} |
+ |
bool ExtensionService::UpdateExtension(const std::string& id, |
const base::FilePath& extension_path, |
const GURL& download_url, |