| 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 65e55ff4b962286a8382503ed5beb5533cbd49ac..1944478e0e7205f3ad66660dc8d3f6aada6bd304 100644
|
| --- a/chrome/browser/extensions/extension_process_manager.cc
|
| +++ b/chrome/browser/extensions/extension_process_manager.cc
|
| @@ -37,6 +37,7 @@ class IncognitoExtensionProcessManager : public ExtensionProcessManager {
|
| const GURL& url);
|
| virtual SiteInstance* GetSiteInstanceForURL(const GURL& url);
|
| virtual RenderProcessHost* GetExtensionProcess(const GURL& url);
|
| + virtual const Extension* GetExtensionForSiteInstance(int site_instance_id);
|
|
|
| private:
|
| // NotificationObserver:
|
| @@ -95,9 +96,7 @@ ExtensionProcessManager::ExtensionProcessManager(Profile* profile)
|
| Source<Profile>(original_profile));
|
| registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED,
|
| Source<Profile>(profile));
|
| - registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
|
| - NotificationService::AllSources());
|
| - registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
|
| + registrar_.Add(this, content::NOTIFICATION_SITE_INSTANCE_DELETED,
|
| NotificationService::AllSources());
|
| registrar_.Add(this, content::NOTIFICATION_APP_TERMINATING,
|
| NotificationService::AllSources());
|
| @@ -221,28 +220,23 @@ ExtensionHost* ExtensionProcessManager::GetBackgroundHostForExtension(
|
| return NULL;
|
| }
|
|
|
| -void ExtensionProcessManager::RegisterExtensionProcess(
|
| - const std::string& extension_id, int process_id) {
|
| - // TODO(mpcomplete): This is the only place we actually read process_ids_.
|
| - // Is it necessary?
|
| - ProcessIDMap::const_iterator it = process_ids_.find(extension_id);
|
| - if (it != process_ids_.end() && (*it).second == process_id)
|
| +void ExtensionProcessManager::RegisterExtensionSiteInstance(
|
| + int site_instance_id, const std::string& extension_id) {
|
| + SiteInstanceIDMap::const_iterator it = extension_ids_.find(site_instance_id);
|
| + if (it != extension_ids_.end() && (*it).second == extension_id)
|
| return;
|
|
|
| - // Extension ids should get removed from the map before the process ids get
|
| - // reused from a dead renderer.
|
| - DCHECK(it == process_ids_.end());
|
| - process_ids_[extension_id] = process_id;
|
| + // SiteInstance ids should get removed from the map before the extension ids
|
| + // get used for a new SiteInstance.
|
| + DCHECK(it == extension_ids_.end());
|
| + extension_ids_[site_instance_id] = extension_id;
|
| }
|
|
|
| -void ExtensionProcessManager::UnregisterExtensionProcess(int process_id) {
|
| - ProcessIDMap::iterator it = process_ids_.begin();
|
| - while (it != process_ids_.end()) {
|
| - if (it->second == process_id)
|
| - process_ids_.erase(it++);
|
| - else
|
| - ++it;
|
| - }
|
| +void ExtensionProcessManager::UnregisterExtensionSiteInstance(
|
| + int site_instance_id) {
|
| + SiteInstanceIDMap::iterator it = extension_ids_.find(site_instance_id);
|
| + if (it != extension_ids_.end())
|
| + extension_ids_.erase(it++);
|
| }
|
|
|
| RenderProcessHost* ExtensionProcessManager::GetExtensionProcess(
|
| @@ -262,6 +256,20 @@ RenderProcessHost* ExtensionProcessManager::GetExtensionProcess(
|
| Extension::GetBaseURLFromExtensionId(extension_id));
|
| }
|
|
|
| +const Extension* ExtensionProcessManager::GetExtensionForSiteInstance(
|
| + int site_instance_id) {
|
| + SiteInstanceIDMap::const_iterator it = extension_ids_.find(site_instance_id);
|
| + if (it != extension_ids_.end()) {
|
| + // Look up the extension by ID, including disabled extensions in case
|
| + // this gets called while an old process is still around.
|
| + ExtensionService* service =
|
| + browsing_instance_->profile()->GetExtensionService();
|
| + return service->GetExtensionById(it->second, false);
|
| + }
|
| +
|
| + return NULL;
|
| +}
|
| +
|
| SiteInstance* ExtensionProcessManager::GetSiteInstanceForURL(const GURL& url) {
|
| return browsing_instance_->GetSiteInstanceForURL(url);
|
| }
|
| @@ -313,10 +321,9 @@ void ExtensionProcessManager::Observe(int type,
|
| break;
|
| }
|
|
|
| - case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED:
|
| - case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: {
|
| - RenderProcessHost* host = Source<RenderProcessHost>(source).ptr();
|
| - UnregisterExtensionProcess(host->id());
|
| + case content::NOTIFICATION_SITE_INSTANCE_DELETED: {
|
| + SiteInstance* site_instance = Source<SiteInstance>(source).ptr();
|
| + UnregisterExtensionSiteInstance(site_instance->id());
|
| break;
|
| }
|
|
|
| @@ -422,6 +429,17 @@ RenderProcessHost* IncognitoExtensionProcessManager::GetExtensionProcess(
|
| }
|
| }
|
|
|
| +const Extension* IncognitoExtensionProcessManager::GetExtensionForSiteInstance(
|
| + int site_instance_id) {
|
| + const Extension* extension =
|
| + ExtensionProcessManager::GetExtensionForSiteInstance(site_instance_id);
|
| + if (extension && extension->incognito_split_mode()) {
|
| + return extension;
|
| + } else {
|
| + return original_manager_->GetExtensionForSiteInstance(site_instance_id);
|
| + }
|
| +}
|
| +
|
| const Extension* IncognitoExtensionProcessManager::GetExtensionOrAppByURL(
|
| const GURL& url) {
|
| ExtensionService* service =
|
|
|