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

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

Issue 8361021: Track all extension processes in ExtensionInfoMap (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: argh Created 9 years, 2 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
« no previous file with comments | « chrome/browser/extensions/extension_process_manager.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/extension_process_manager.cc
diff --git a/chrome/browser/extensions/extension_process_manager.cc b/chrome/browser/extensions/extension_process_manager.cc
index c2a61d8451f0dd49bb117887d043417f70e435ab..43b86aa2a1cc14288bca5c4d220c34fde1028fad 100644
--- a/chrome/browser/extensions/extension_process_manager.cc
+++ b/chrome/browser/extensions/extension_process_manager.cc
@@ -280,20 +280,16 @@ void ExtensionProcessManager::RegisterExtensionSiteInstance(
int site_instance_id = site_instance->id();
int render_process_id = site_instance->GetProcess()->id();
- process_ids_[render_process_id].insert(site_instance_id);
-
- // Register process hosting extensions that have access to extension bindings
- // with the ExtensionInfoMap on the IO thread.
- Profile* profile =
- Profile::FromBrowserContext(browsing_instance_->browser_context());
- ExtensionService* service = profile->GetExtensionService();
- if (service->ExtensionBindingsAllowed(extension->url())) {
- Profile* profile = Profile::FromBrowserContext(
- site_instance->GetProcess()->browser_context());
+ if (process_ids_[render_process_id].insert(site_instance_id).second) {
+ // Register process hosting extensions that have access to extension
+ // bindings with the ExtensionInfoMap on the IO thread.
+ Profile* profile =
+ Profile::FromBrowserContext(browsing_instance_->browser_context());
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
- base::Bind(&ExtensionInfoMap::BindingsEnabledForProcess,
+ base::Bind(&ExtensionInfoMap::RegisterExtensionProcess,
profile->GetExtensionInfoMap(),
+ extension->id(),
render_process_id));
}
@@ -310,27 +306,40 @@ void ExtensionProcessManager::RegisterExtensionSiteInstance(
void ExtensionProcessManager::UnregisterExtensionSiteInstance(
SiteInstance* site_instance) {
int site_instance_id = site_instance->id();
- SiteInstanceIDMap::iterator it = extension_ids_.find(site_instance_id);
- if (it != extension_ids_.end()) {
- extension_ids_.erase(it++);
- }
- if (site_instance->HasProcess()) {
- int render_process_id = site_instance->GetProcess()->id();
- ProcessIDMap::iterator host = process_ids_.find(render_process_id);
- if (host != process_ids_.end()) {
- host->second.erase(site_instance_id);
- if (host->second.empty()) {
- process_ids_.erase(host);
- Profile* profile = Profile::FromBrowserContext(
- site_instance->GetProcess()->browser_context());
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&ExtensionInfoMap::BindingsDisabledForProcess,
- profile->GetExtensionInfoMap(),
- render_process_id));
+ std::string extension_id = extension_ids_[site_instance_id];
+ if (!extension_id.empty())
+ extension_ids_.erase(site_instance_id);
+
+ int render_process_id = ClearSiteInstanceID(site_instance_id);
+ if (render_process_id == -1)
+ return;
+
+ Profile* profile = Profile::FromBrowserContext(
+ browsing_instance_->browser_context());
+ BrowserThread::PostTask(
+ BrowserThread::IO, FROM_HERE,
+ base::Bind(&ExtensionInfoMap::UnregisterExtensionProcess,
+ profile->GetExtensionInfoMap(),
+ extension_id,
+ render_process_id));
+}
+
+int ExtensionProcessManager::ClearSiteInstanceID(int site_instance_id) {
+ for (ProcessIDMap::iterator i = process_ids_.begin();
+ i != process_ids_.end(); ++i) {
+ SiteInstanceIDSet& site_instance_id_set = i->second;
+ for (SiteInstanceIDSet::iterator j = site_instance_id_set.begin();
+ j != site_instance_id_set.end(); ++j) {
+ if (*j == site_instance_id) {
+ int render_process_id = i->first;
+ site_instance_id_set.erase(j);
+ if (site_instance_id_set.empty())
+ process_ids_.erase(i);
+ return render_process_id;
}
}
}
+ return -1;
}
bool ExtensionProcessManager::IsExtensionProcess(int render_process_id) {
« no previous file with comments | « chrome/browser/extensions/extension_process_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698