Chromium Code Reviews| 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..f789415d3882446a4a64d2a9de0fbd78f76539c9 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,44 @@ 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++); |
| + std::string extension_id = extension_ids_[site_instance_id]; |
| + if (!extension_id.empty()) |
| + extension_ids_.erase(site_instance_id); |
| + |
| + int render_process_id = GetProcessIDBySiteInstanceID(site_instance_id); |
| + if (render_process_id == -1) |
| + return; |
| + |
| + ProcessIDMap::iterator iter = process_ids_.find(render_process_id); |
|
Matt Perry
2011/10/21 18:28:51
This code might be cleaner if the helper was inste
|
| + if (iter != process_ids_.end()) { |
| + SiteInstanceIDSet& site_instance_id_set = iter->second; |
| + site_instance_id_set.erase(site_instance_id); |
| + if (site_instance_id_set.empty()) |
| + process_ids_.erase(iter); |
| } |
| - 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)); |
| - } |
| + |
| + Profile* profile = Profile::FromBrowserContext( |
| + site_instance->GetProcess()->browser_context()); |
|
Matt Perry
2011/10/21 18:28:51
Is GetProcess guaranteed to be non-NULL? The old c
Aaron Boodman
2011/10/22 04:02:42
Done.
|
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&ExtensionInfoMap::UnregisterExtensionProcess, |
| + profile->GetExtensionInfoMap(), |
| + extension_id, |
| + render_process_id)); |
| +} |
| + |
| +int ExtensionProcessManager::GetProcessIDBySiteInstanceID( |
| + int site_instance_id) const { |
| + for (ProcessIDMap::const_iterator i = process_ids_.begin(); |
| + i != process_ids_.end(); ++i) { |
| + const SiteInstanceIDSet& site_instance_id_set = i->second; |
| + for (SiteInstanceIDSet::const_iterator j = site_instance_id_set.begin(); |
| + j != site_instance_id_set.end(); ++j) { |
| + if (*j == site_instance_id) |
| + return i->first; |
| } |
| } |
| + return -1; |
| } |
| bool ExtensionProcessManager::IsExtensionProcess(int render_process_id) { |