Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1010)

Unified Diff: chrome/browser/extensions/external_install_manager.cc

Issue 2885143003: [Extensions] Remove external errors on profile shutdown (Closed)
Patch Set: . Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/external_install_manager.cc
diff --git a/chrome/browser/extensions/external_install_manager.cc b/chrome/browser/extensions/external_install_manager.cc
index 69ed87af2c315822ba2cb3bd040c52840e427996..d1419d025fe2b5aa9942091f105e3cc7e7e6eadd 100644
--- a/chrome/browser/extensions/external_install_manager.cc
+++ b/chrome/browser/extensions/external_install_manager.cc
@@ -68,10 +68,11 @@ ExternalInstallManager::ExternalInstallManager(
extension_registry_observer_(this) {
DCHECK(browser_context_);
extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_));
- registrar_.Add(
- this,
- extensions::NOTIFICATION_EXTENSION_REMOVED,
- content::Source<Profile>(Profile::FromBrowserContext(browser_context_)));
+ Profile* profile = Profile::FromBrowserContext(browser_context_);
+ registrar_.Add(this, extensions::NOTIFICATION_EXTENSION_REMOVED,
+ content::Source<Profile>(profile));
+ registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
+ content::Source<Profile>(profile));
// Populate the set of unacknowledged external extensions now. We can't just
// rely on IsUnacknowledgedExternalExtension() for cases like
// OnExtensionLoaded(), since we need to examine the disable reasons, which
@@ -246,15 +247,28 @@ void ExternalInstallManager::Observe(
int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
- DCHECK_EQ(extensions::NOTIFICATION_EXTENSION_REMOVED, type);
- // The error is invalidated if the extension has been loaded or removed.
- // It's a shame we have to use the notification system (instead of the
- // registry observer) for this, but the ExtensionUnloaded notification is
- // not sent out if the extension is disabled (which it is here).
- const std::string& extension_id =
- content::Details<const Extension>(details).ptr()->id();
- if (base::ContainsKey(errors_, extension_id))
- RemoveExternalInstallError(extension_id);
+ switch (type) {
+ case extensions::NOTIFICATION_EXTENSION_REMOVED: {
+ // The error is invalidated if the extension has been loaded or removed.
+ // It's a shame we have to use the notification system (instead of the
+ // registry observer) for this, but the ExtensionUnloaded notification is
+ // not sent out if the extension is disabled (which it is here).
+ const std::string& extension_id =
+ content::Details<const Extension>(details).ptr()->id();
+ if (base::ContainsKey(errors_, extension_id))
+ RemoveExternalInstallError(extension_id);
+ break;
+ }
+ case chrome::NOTIFICATION_PROFILE_DESTROYED:
+ DCHECK_EQ(Profile::FromBrowserContext(browser_context_),
+ content::Source<const Profile>(source).ptr());
+ // Delete all errors when the profile is shutting down, before associated
+ // services are deleted.
+ errors_.clear();
+ break;
+ default:
+ NOTREACHED();
+ }
}
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698