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) { |