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

Unified Diff: content/browser/site_instance_impl.cc

Issue 2921063003: Fix process reuse for dedicated processes when over process limit. (Closed)
Patch Set: Fix IsSuitableHost for sites that require a dedicated process but don't set an origin lock Created 3 years, 6 months 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
Index: content/browser/site_instance_impl.cc
diff --git a/content/browser/site_instance_impl.cc b/content/browser/site_instance_impl.cc
index 0e47c20885ad4e5e8b7396062cf192290c32b3fb..82ccd1b24e591977ad53a57db8f2c31040a920be 100644
--- a/content/browser/site_instance_impl.cc
+++ b/content/browser/site_instance_impl.cc
@@ -124,7 +124,7 @@ RenderProcessHost* SiteInstanceImpl::GetProcess() {
GetContentClient()->browser()->SiteInstanceGotProcess(this);
if (has_site_)
- LockToOrigin();
+ LockToOriginIfNeeded();
}
DCHECK(process_);
@@ -161,7 +161,7 @@ void SiteInstanceImpl::SetSite(const GURL& url) {
}
if (process_) {
- LockToOrigin();
+ LockToOriginIfNeeded();
// Ensure the process is registered for this site if necessary.
if (should_use_process_per_site) {
@@ -211,6 +211,10 @@ bool SiteInstanceImpl::HasWrongProcessForURL(const GURL& url) {
if (IsRendererDebugURL(url))
return false;
+ // Any process can host an about:blank URL.
+ if (url == url::kAboutBlankURL)
+ return false;
+
// If the site URL is an extension (e.g., for hosted apps or WebUI) but the
// process is not (or vice versa), make sure we notice and fix it.
GURL site_url = GetSiteForURL(browsing_instance_->browser_context(), url);
@@ -402,6 +406,38 @@ bool SiteInstanceImpl::DoesSiteRequireDedicatedProcess(
return false;
}
+// static
+bool SiteInstanceImpl::ShouldLockToOrigin(BrowserContext* browser_context,
+ GURL site_url) {
+ if (!DoesSiteRequireDedicatedProcess(browser_context, site_url))
+ return false;
+
+ // Guest processes cannot be locked to its site because guests always have
Charlie Reis 2017/06/17 23:13:53 nit: s/its/their/
alexmos 2017/06/19 20:03:59 Done.
+ // a fixed SiteInstance. The site of GURLs a guest loads doesn't match that
+ // SiteInstance. So we skip locking the guest process to the site.
+ // TODO(ncarter): Remove this exclusion once we can make origin lock per
+ // RenderFrame routing id.
+ if (site_url.SchemeIs(content::kGuestScheme))
+ return false;
+
+ // TODO(creis, nick) https://crbug.com/510588 Chrome UI pages use the same
Charlie Reis 2017/06/17 23:13:53 Oh, I see. Actually, dbeam@ was just working on a
alexmos 2017/06/19 20:03:58 Ack - thanks for the pointer!
+ // site (chrome://chrome), so they can't be locked because the site being
+ // loaded doesn't match the SiteInstance.
+ if (site_url.SchemeIs(content::kChromeUIScheme))
+ return false;
+
+ // TODO(creis, nick): Until we can handle sites with effective URLs at the
+ // call sites of ChildProcessSecurityPolicy::CanAccessDataForOrigin, we
+ // must give the embedder a chance to exempt some sites to avoid process
+ // kills.
+ if (!GetContentClient()->browser()->ShouldLockToOrigin(browser_context,
+ site_url)) {
+ return false;
+ }
+
+ return true;
+}
+
void SiteInstanceImpl::RenderProcessHostDestroyed(RenderProcessHost* host) {
DCHECK_EQ(process_, host);
process_->RemoveObserver(this);
@@ -422,34 +458,26 @@ void SiteInstanceImpl::RenderProcessExited(RenderProcessHost* host,
observer.RenderProcessGone(this);
}
-void SiteInstanceImpl::LockToOrigin() {
+void SiteInstanceImpl::LockToOriginIfNeeded() {
+ DCHECK(HasSite());
+
+ // From now on, this process should be considered "tainted" for future
+ // process reuse decisions:
+ // (1) If |site_| required a dedicated process, this SiteInstance's process
+ // can only host URLs for the same site.
+ // (2) Even if |site_| does not require a dedicated process, this
+ // SiteInstance's process still cannot be reused to host other sites
+ // requiring dedicated sites in the future.
+ // We can get here either when we commit a URL into a SiteInstance that does
+ // not yet have a site, or when we create a process for a SiteInstance with a
+ // preassigned site.
+ process_->SetIsUsed();
+
// TODO(nick): When all sites are isolated, this operation provides strong
// protection. If only some sites are isolated, we need additional logic to
// prevent the non-isolated sites from requesting resources for isolated
// sites. https://crbug.com/509125
- if (RequiresDedicatedProcess()) {
- // Guest processes cannot be locked to its site because guests always have
- // a fixed SiteInstance. The site of GURLs a guest loads doesn't match that
- // SiteInstance. So we skip locking the guest process to the site.
- // TODO(ncarter): Remove this exclusion once we can make origin lock per
- // RenderFrame routing id.
- if (site_.SchemeIs(content::kGuestScheme))
- return;
-
- // TODO(creis, nick) https://crbug.com/510588 Chrome UI pages use the same
- // site (chrome://chrome), so they can't be locked because the site being
- // loaded doesn't match the SiteInstance.
- if (site_.SchemeIs(content::kChromeUIScheme))
- return;
-
- // TODO(creis, nick): Until we can handle sites with effective URLs at the
- // call sites of ChildProcessSecurityPolicy::CanAccessDataForOrigin, we
- // must give the embedder a chance to exempt some sites to avoid process
- // kills.
- if (!GetContentClient()->browser()->ShouldLockToOrigin(
- browsing_instance_->browser_context(), site_))
- return;
-
+ if (ShouldLockToOrigin(GetBrowserContext(), site_)) {
ChildProcessSecurityPolicyImpl* policy =
ChildProcessSecurityPolicyImpl::GetInstance();
policy->LockToOrigin(process_->GetID(), site_);

Powered by Google App Engine
This is Rietveld 408576698