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

Unified Diff: chrome/browser/chrome_content_browser_client.cc

Issue 86973002: Clean up ChromeContentBrowserClient::ShouldSwapProcessesForNavigation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years 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 | « no previous file | chrome/browser/extensions/app_process_apitest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 37faaf8c449c745fe866c41bd4991e55fdbe38cf..541c5d9bb390787150cc0432b14290c84d9b082e 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -1326,26 +1326,8 @@ bool ChromeContentBrowserClient::ShouldSwapBrowsingInstancesForNavigation(
SiteInstance* site_instance,
const GURL& current_url,
const GURL& new_url) {
- if (current_url.is_empty()) {
- // Always choose a new process when navigating to extension URLs. The
- // process grouping logic will combine all of a given extension's pages
- // into the same process.
- if (new_url.SchemeIs(extensions::kExtensionScheme))
- return true;
-
- return false;
- }
-
- // Also, we must switch if one is an extension and the other is not the exact
- // same extension.
- if (current_url.SchemeIs(extensions::kExtensionScheme) ||
- new_url.SchemeIs(extensions::kExtensionScheme)) {
- if (current_url.GetOrigin() != new_url.GetOrigin())
- return true;
- }
-
- // The checks below only matter if we can retrieve which extensions are
- // installed.
+ // If we don't have an ExtensionService, then rely on the SiteInstance logic
+ // in RenderViewHostManager to decide when to swap.
nasko 2013/12/03 18:06:59 drive-by nit: There is no RenderViewHostManager an
Charlie Reis 2013/12/03 19:22:55 Oops! I'll fix those comments in another CL. Tha
Profile* profile =
Profile::FromBrowserContext(site_instance->GetBrowserContext());
ExtensionService* service =
@@ -1353,23 +1335,41 @@ bool ChromeContentBrowserClient::ShouldSwapBrowsingInstancesForNavigation(
if (!service)
return false;
- // We must swap if the URL is for an extension and we are not using an
- // extension process.
+ // We must use a new BrowsingInstance (forcing a process swap and disabling
+ // scripting by existing tabs) if one of the URLs is an extension and the
+ // other is not the exact same extension.
+ //
+ // We ignore hosted apps here so that other tabs in their BrowsingInstance can
+ // use postMessage with them. (The exception is the Chrome Web Store, which
+ // is a hosted app that requires its own BrowsingInstance.) Navigations
+ // to/from a hosted app will still trigger a SiteInstance swap in
+ // RenderViewHostManager.
+ const Extension* current_extension =
+ service->extensions()->GetExtensionOrAppByURL(current_url);
+ if (current_extension &&
+ current_extension->is_hosted_app() &&
+ current_extension->id() != extension_misc::kWebStoreAppId)
+ current_extension = NULL;
+
const Extension* new_extension =
service->extensions()->GetExtensionOrAppByURL(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;
+
+ // First do a process check. We should force a BrowsingInstance swap if the
+ // current process doesn't know about new_extension, even if current_extension
+ // is somehow the same as new_extension.
if (new_extension &&
site_instance->HasProcess() &&
!service->process_map()->Contains(new_extension->id(),
site_instance->GetProcess()->GetID()))
return true;
- return false;
+ // Otherwise, swap BrowsingInstances if current_extension and new_extension
+ // differ.
+ return current_extension != new_extension;
}
bool ChromeContentBrowserClient::ShouldSwapProcessesForRedirect(
« no previous file with comments | « no previous file | chrome/browser/extensions/app_process_apitest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698