Index: chrome/browser/chrome_content_browser_client.cc |
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc |
index e1908ecd0cfaf524fefaf5a55872100f4c988ffa..db7b4173b68299dbe2c50b75fd5bed3ae9e0e094 100644 |
--- a/chrome/browser/chrome_content_browser_client.cc |
+++ b/chrome/browser/chrome_content_browser_client.cc |
@@ -975,6 +975,7 @@ void ChromeContentBrowserClient::SiteInstanceDeleting( |
} |
bool ChromeContentBrowserClient::ShouldSwapProcessesForNavigation( |
+ SiteInstance* site_instance, |
const GURL& current_url, |
const GURL& new_url) { |
if (current_url.is_empty()) { |
@@ -995,6 +996,31 @@ bool ChromeContentBrowserClient::ShouldSwapProcessesForNavigation( |
return true; |
} |
+ // The checks below only matter if we can retrieve which extensions are |
+ // installed. |
+ Profile* profile = |
+ Profile::FromBrowserContext(site_instance->GetBrowserContext()); |
+ ExtensionService* service = |
+ extensions::ExtensionSystem::Get(profile)->extension_service(); |
+ if (!service) |
+ return false; |
+ |
+ // We must swap if the URL is for an extension and we are not using an |
+ // extension process. |
+ const Extension* new_extension = |
+ service->extensions()->GetExtensionOrAppByURL(ExtensionURLInfo(new_url)); |
+ // Ignore all hosted apps except the Chrome Web Store, since they do not |
+ // require their own BrowsingInstance (e.g., postMessage is ok). |
+ if (new_extension && |
+ new_extension->is_hosted_app() && |
+ new_extension->id() != extension_misc::kWebStoreAppId) |
+ new_extension = NULL; |
+ if (new_extension && |
+ site_instance->HasProcess() && |
+ !service->process_map()->Contains(new_extension->id(), |
+ site_instance->GetProcess()->GetID())) |
+ return true; |
+ |
return false; |
} |