summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-05 00:39:46 +0000
committermpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-05 00:39:46 +0000
commitae5497ff6e21823ba303e34ed4506bc43af29eba (patch)
treec68decc9e535c738e68e087c95c0dcfa82281b78
parenta783d0cb601b8f500d4d729a3b667b0e5bac42d9 (diff)
downloadchromium_src-ae5497ff6e21823ba303e34ed4506bc43af29eba.zip
chromium_src-ae5497ff6e21823ba303e34ed4506bc43af29eba.tar.gz
chromium_src-ae5497ff6e21823ba303e34ed4506bc43af29eba.tar.bz2
Fix a bug where we'd leak ResourceMessageFilters and BrowserRenderProcessHosts
on shutdown when extensions were running. BUG=15708 BUG=26652 Review URL: http://codereview.chromium.org/355032 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31045 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/extensions/extension_process_manager.cc27
-rw-r--r--chrome/browser/extensions/extension_process_manager.h3
2 files changed, 24 insertions, 6 deletions
diff --git a/chrome/browser/extensions/extension_process_manager.cc b/chrome/browser/extensions/extension_process_manager.cc
index 6718691..06f3d58 100644
--- a/chrome/browser/extensions/extension_process_manager.cc
+++ b/chrome/browser/extensions/extension_process_manager.cc
@@ -44,15 +44,12 @@ ExtensionProcessManager::ExtensionProcessManager(Profile* profile)
NotificationService::AllSources());
registrar_.Add(this, NotificationType::RENDERER_PROCESS_CLOSED,
NotificationService::AllSources());
+ registrar_.Add(this, NotificationType::BROWSER_CLOSED,
+ NotificationService::AllSources());
}
ExtensionProcessManager::~ExtensionProcessManager() {
- // Copy all_hosts_ to avoid iterator invalidation issues.
- ExtensionHostSet to_delete(background_hosts_.begin(),
- background_hosts_.end());
- ExtensionHostSet::iterator iter;
- for (iter = to_delete.begin(); iter != to_delete.end(); ++iter)
- delete *iter;
+ DCHECK(background_hosts_.empty());
}
ExtensionHost* ExtensionProcessManager::CreateView(Extension* extension,
@@ -217,6 +214,16 @@ void ExtensionProcessManager::Observe(NotificationType type,
break;
}
+ case NotificationType::BROWSER_CLOSED: {
+ // Close background hosts when the last browser is closed so that they
+ // have time to shutdown various objects on different threads. Our
+ // destructor is called too late in the shutdown sequence.
+ bool app_closing = *Details<bool>(details).ptr();
+ if (app_closing)
+ CloseBackgroundHosts();
+ break;
+ }
+
default:
NOTREACHED();
}
@@ -232,3 +239,11 @@ void ExtensionProcessManager::OnExtensionHostCreated(ExtensionHost* host,
Source<ExtensionProcessManager>(this),
Details<ExtensionHost>(host));
}
+
+void ExtensionProcessManager::CloseBackgroundHosts() {
+ for (ExtensionHostSet::iterator iter = background_hosts_.begin();
+ iter != background_hosts_.end(); ) {
+ ExtensionHostSet::iterator current = iter++;
+ delete *current;
+ }
+}
diff --git a/chrome/browser/extensions/extension_process_manager.h b/chrome/browser/extensions/extension_process_manager.h
index e154a33..d2d62ef 100644
--- a/chrome/browser/extensions/extension_process_manager.h
+++ b/chrome/browser/extensions/extension_process_manager.h
@@ -83,6 +83,9 @@ class ExtensionProcessManager : public NotificationObserver {
// Called just after |host| is created so it can be registered in our lists.
void OnExtensionHostCreated(ExtensionHost* host, bool is_background);
+ // Called on browser shutdown to close our extension hosts.
+ void CloseBackgroundHosts();
+
NotificationRegistrar registrar_;
// The set of all ExtensionHosts managed by this process manager.