Index: chrome/browser/extensions/extension_service.cc |
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc |
index 790071b96b012f0fcdf5b1831b8d9ff87ded60df..4651a3db7c28ff95a6513f76105b1b1f5f127b43 100644 |
--- a/chrome/browser/extensions/extension_service.cc |
+++ b/chrome/browser/extensions/extension_service.cc |
@@ -239,7 +239,7 @@ ExtensionServiceBackend::~ExtensionServiceBackend() { |
void ExtensionServiceBackend::LoadSingleExtension( |
const FilePath& path_in, scoped_refptr<ExtensionService> frontend) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
frontend_ = frontend; |
@@ -272,7 +272,7 @@ void ExtensionServiceBackend::LoadSingleExtension( |
void ExtensionServiceBackend::ReportExtensionLoadError( |
const FilePath& extension_path, const std::string &error) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
NewRunnableMethod( |
@@ -282,7 +282,7 @@ void ExtensionServiceBackend::ReportExtensionLoadError( |
} |
void ExtensionService::CheckExternalUninstall(const std::string& id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
// Check if the providers know about this extension. |
ProviderCollection::const_iterator i; |
@@ -303,7 +303,7 @@ void ExtensionService::ClearProvidersForTesting() { |
void ExtensionService::AddProviderForTesting( |
ExternalExtensionProviderInterface* test_provider) { |
- DCHECK(test_provider); |
+ CHECK(test_provider); |
external_extension_providers_.push_back( |
linked_ptr<ExternalExtensionProviderInterface>(test_provider)); |
} |
@@ -320,11 +320,11 @@ void ExtensionService::OnExternalExtensionUpdateUrlFound( |
return; |
} |
AddPendingExtensionFromExternalUpdateUrl(id, update_url, location); |
- external_extension_added_ |= true; |
+ external_extension_url_added_ |= true; |
} |
bool ExtensionService::IsDownloadFromGallery(const GURL& download_url, |
- const GURL& referrer_url) { |
+ const GURL& referrer_url) { |
// Special-case the themes mini-gallery. |
// TODO(erikkay) When that gallery goes away, remove this code. |
if (IsDownloadFromMiniGallery(download_url) && |
@@ -392,7 +392,6 @@ bool ExtensionService::IsInstalledApp(const GURL& url) { |
bool ExtensionService::UninstallExtensionHelper( |
ExtensionService* extensions_service, |
const std::string& extension_id) { |
- DCHECK(extensions_service); |
// We can't call UninstallExtension with an invalid extension ID, so check it |
// first. |
@@ -422,7 +421,7 @@ ExtensionService::ExtensionService(Profile* profile, |
default_apps_(profile->GetPrefs(), |
g_browser_process->GetApplicationLocale()), |
event_routers_initialized_(false) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
// Figure out if extension installation should be enabled. |
if (command_line->HasSwitch(switches::kDisableExtensions)) { |
@@ -519,7 +518,7 @@ const Extension* ExtensionService::GetExtensionById(const std::string& id, |
} |
void ExtensionService::Init() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
DCHECK(!ready_); // Can't redo init. |
DCHECK_EQ(extensions_.size(), 0u); |
@@ -549,7 +548,7 @@ namespace { |
// TODO(akalin): Put this somewhere where both crx_installer.cc and |
// this file can use it. |
void DeleteFileHelper(const FilePath& path, bool recursive) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
file_util::Delete(path, recursive); |
} |
} // namespace |
@@ -557,7 +556,7 @@ namespace { |
void ExtensionService::UpdateExtension(const std::string& id, |
const FilePath& extension_path, |
const GURL& download_url) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
PendingExtensionMap::const_iterator it = pending_extensions_.find(id); |
bool is_pending_extension = (it != pending_extensions_.end()); |
@@ -675,7 +674,7 @@ void ExtensionService::AddPendingExtensionInternal( |
bool is_from_sync, bool install_silently, |
bool enable_on_install, bool enable_incognito_on_install, |
Extension::Location install_source) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
// If a non-sync update is pending, a sync request should not |
// overwrite it. This is important for external extensions. |
@@ -702,7 +701,7 @@ void ExtensionService::AddPendingExtensionInternal( |
} |
void ExtensionService::ReloadExtension(const std::string& extension_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
FilePath path; |
const Extension* current_extension = GetExtensionById(extension_id, false); |
@@ -746,7 +745,7 @@ void ExtensionService::ReloadExtension(const std::string& extension_id) { |
void ExtensionService::UninstallExtension(const std::string& extension_id, |
bool external_uninstall) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
const Extension* extension = |
GetExtensionByIdInternal(extension_id, true, true); |
@@ -803,7 +802,7 @@ void ExtensionService::ClearExtensionData(const GURL& extension_url) { |
} |
void ExtensionService::EnableExtension(const std::string& extension_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
const Extension* extension = |
GetExtensionByIdInternal(extension_id, false, true); |
@@ -830,7 +829,7 @@ void ExtensionService::EnableExtension(const std::string& extension_id) { |
} |
void ExtensionService::DisableExtension(const std::string& extension_id) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
const Extension* extension = |
GetExtensionByIdInternal(extension_id, true, false); |
@@ -912,7 +911,7 @@ void ExtensionService::LoadComponentExtensions() { |
} |
void ExtensionService::LoadAllExtensions() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
base::TimeTicks start_time = base::TimeTicks::Now(); |
@@ -1338,14 +1337,18 @@ void ExtensionService::SetBrowserActionVisibility(const Extension* extension, |
// Errors are reported through ExtensionErrorReporter. Succcess is not |
// reported. |
void ExtensionService::CheckForExternalUpdates() { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
// Note that this installation is intentionally silent (since it didn't |
// go through the front-end). Extensions that are registered in this |
// way are effectively considered 'pre-bundled', and so implicitly |
// trusted. In general, if something has HKLM or filesystem access, |
// they could install an extension manually themselves anyway. |
- external_extension_added_ = false; |
+ |
+ // If any external extension records give a URL, a provider will set |
+ // this to true. Used by OnExternalProviderReady() to see if we need |
+ // to start an update check to fetch a new external extension. |
+ external_extension_url_added_ = false; |
// Ask each external extension provider to give us a call back for each |
// extension they know about. See OnExternalExtension(File|UpdateUrl)Found. |
@@ -1357,26 +1360,30 @@ void ExtensionService::CheckForExternalUpdates() { |
} |
// Uninstall of unclaimed extensions will happen after all the providers |
- // had reported ready. Trigger uninstall even if there are no providers |
- // installed: |
- OnExternalProviderReady(); |
+ // had reported ready. Every provider calls OnExternalProviderReady() |
+ // when it finishes, and OnExternalProviderReady() only acts when all |
+ // providers are ready. In case there are no providers, we call it |
+ // to trigger removal of extensions that used to have an external source. |
+ if (external_extension_providers_.empty()) |
+ OnExternalProviderReady(); |
} |
void ExtensionService::OnExternalProviderReady() { |
- // An external provider has finished loading. We only take action |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ // An external provider has finished loading. We only take action |
// if all of them are finished. So we check them first. |
ProviderCollection::const_iterator i; |
for (i = external_extension_providers_.begin(); |
i != external_extension_providers_.end(); ++i) { |
ExternalExtensionProviderInterface* provider = i->get(); |
- if (!provider->IsReady()) { |
+ if (!provider->IsReady()) |
return; |
- } |
} |
- // All the providers are ready. Install any pending extensions. |
- if (external_extension_added_ && updater()) { |
- external_extension_added_ = false; |
+ // All the providers are ready. Install any pending extensions. |
+ if (external_extension_url_added_ && updater()) { |
+ external_extension_url_added_ = false; |
updater()->CheckNow(); |
} |
@@ -1649,7 +1656,7 @@ void ExtensionService::UpdateActiveExtensionsInCrashReporter() { |
} |
void ExtensionService::OnExtensionInstalled(const Extension* extension) { |
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
// Ensure extension is deleted unless we transfer ownership. |
scoped_refptr<const Extension> scoped_extension(extension); |