 Chromium Code Reviews
 Chromium Code Reviews Issue 1208143002:
  Move existing kSitePerProcess checks to a policy-oracle object  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@swapped_out_cmdline_checks
    
  
    Issue 1208143002:
  Move existing kSitePerProcess checks to a policy-oracle object  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@swapped_out_cmdline_checks| Index: content/browser/loader/cross_site_resource_handler.cc | 
| diff --git a/content/browser/loader/cross_site_resource_handler.cc b/content/browser/loader/cross_site_resource_handler.cc | 
| index ebf40eb023a6abfd0047b64e11de9ef04dd57eb7..a070f16b6d940c25c28b6ab9a6e4d077591f4522 100644 | 
| --- a/content/browser/loader/cross_site_resource_handler.cc | 
| +++ b/content/browser/loader/cross_site_resource_handler.cc | 
| @@ -23,6 +23,7 @@ | 
| #include "content/public/browser/site_instance.h" | 
| #include "content/public/common/content_switches.h" | 
| #include "content/public/common/resource_response.h" | 
| +#include "content/public/common/site_isolation_policy.h" | 
| #include "content/public/common/url_constants.h" | 
| #include "net/http/http_response_headers.h" | 
| #include "net/url_request/url_request.h" | 
| @@ -71,8 +72,7 @@ void OnCrossSiteResponseHelper(const CrossSiteResponseParams& params) { | 
| // We should only swap processes for subframes in --site-per-process mode. | 
| // CrossSiteResourceHandler is not installed on subframe requests in | 
| // default Chrome. | 
| - CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 
| - switches::kSitePerProcess)); | 
| + CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); | 
| } | 
| rfh->OnCrossSiteResponse( | 
| params.global_request_id, cross_site_transferring_request.Pass(), | 
| @@ -87,8 +87,7 @@ void OnCrossSiteResponseHelper(const CrossSiteResponseParams& params) { | 
| // Returns whether a transfer is needed by doing a check on the UI thread. | 
| bool CheckNavigationPolicyOnUI(GURL url, int process_id, int render_frame_id) { | 
| - CHECK(base::CommandLine::ForCurrentProcess()->HasSwitch( | 
| - switches::kSitePerProcess)); | 
| + CHECK(SiteIsolationPolicy::AreCrossProcessFramesPossible()); | 
| RenderFrameHostImpl* rfh = | 
| RenderFrameHostImpl::FromID(process_id, render_frame_id); | 
| if (!rfh) | 
| @@ -99,12 +98,18 @@ bool CheckNavigationPolicyOnUI(GURL url, int process_id, int render_frame_id) { | 
| if (!rfh->GetSiteInstance()->HasSite()) | 
| return false; | 
| - // TODO(nasko): This check is very simplistic and is used temporarily only | 
| - // for --site-per-process. It should be updated to match the check performed | 
| - // by RenderFrameHostManager::UpdateStateForNavigate. | 
| - return !SiteInstance::IsSameWebSite( | 
| - rfh->GetSiteInstance()->GetBrowserContext(), | 
| - rfh->GetSiteInstance()->GetSiteURL(), url); | 
| + // TODO(nasko, nick): These following --site-per-process checks are | 
| + // overly simplistic. Update them to match all the cases | 
| + // considered by RenderFrameHostManager::UpdateStateForNavigate. | 
| 
nasko
2015/07/08 12:52:23
We should update this comment to point to RenderFr
 
ncarter (slow)
2015/07/10 23:29:18
Done.
 | 
| + if (SiteInstance::IsSameWebSite(rfh->GetSiteInstance()->GetBrowserContext(), | 
| + rfh->GetSiteInstance()->GetSiteURL(), url)) { | 
| + return false; // The same site, no transition needed. | 
| + } | 
| + | 
| + // The sites differ. If either one requires a dedicated process, | 
| + // then a transfer is needed. | 
| + return rfh->GetSiteInstance()->RequiresDedicatedProcess() || | 
| + SiteIsolationPolicy::DoesSiteRequireDedicatedProcess(url); | 
| } | 
| } // namespace | 
| @@ -162,9 +167,11 @@ bool CrossSiteResourceHandler::OnNormalResponseStarted( | 
| // We only need to pause the response if a transfer to a different process is | 
| // required. Other cross-process navigations can proceed immediately, since | 
| // we run the unload handler at commit time. | 
| + // TODO(nick): What does "other cross-process navigations" mean in the | 
| 
nasko
2015/07/08 12:52:23
There are two types of cross-process navigations:
 
ncarter (slow)
2015/07/10 23:29:18
Done.
 | 
| + // above language. Is that a typo? | 
| // Note that a process swap may no longer be necessary if we transferred back | 
| // into the original process due to a redirect. | 
| - bool should_transfer = | 
| + bool embedder_requests_transfer = | 
| 
nasko
2015/07/08 12:52:23
What is "embedder" in this context?
 
ncarter (slow)
2015/07/10 23:29:18
I meant the content embedder (GetContentClient()).
 | 
| GetContentClient()->browser()->ShouldSwapProcessesForRedirect( | 
| info->GetContext(), request()->original_url(), request()->url()); | 
| @@ -189,30 +196,30 @@ bool CrossSiteResourceHandler::OnNormalResponseStarted( | 
| return next_handler_->OnResponseStarted(response, defer); | 
| } | 
| - // When the --site-per-process flag is passed, we transfer processes for | 
| - // cross-site navigations. This is skipped if a transfer is already required | 
| - // or for WebUI processes for now, since pages like the NTP host multiple | 
| - // cross-site WebUI iframes. | 
| - if (!should_transfer && | 
| - base::CommandLine::ForCurrentProcess()->HasSwitch( | 
| - switches::kSitePerProcess) && | 
| + if (embedder_requests_transfer) { | 
| + // Now that we know a transfer is needed and we have something to commit, we | 
| + // pause to let the UI thread set up the transfer. | 
| + StartCrossSiteTransition(response); | 
| + | 
| + // Defer loading until after the new renderer process has issued a | 
| + // corresponding request. | 
| + *defer = true; | 
| + OnDidDefer(); | 
| + return true; | 
| + } | 
| + | 
| + // Under the --site-per-process flag, we'll need to consult the policy to | 
| + // determine whether to transfer processes. Process transfers are skipped for | 
| + // WebUI processes for now, since pages like the NTP host multiple cross-site | 
| + // WebUI iframes. | 
| + if (SiteIsolationPolicy::AreCrossProcessFramesPossible() && | 
| !ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( | 
| info->GetChildID())) { | 
| return DeferForNavigationPolicyCheck(info, response, defer); | 
| } | 
| - if (!should_transfer) | 
| - return next_handler_->OnResponseStarted(response, defer); | 
| - | 
| - // Now that we know a transfer is needed and we have something to commit, we | 
| - // pause to let the UI thread set up the transfer. | 
| - StartCrossSiteTransition(response); | 
| - | 
| - // Defer loading until after the new renderer process has issued a | 
| - // corresponding request. | 
| - *defer = true; | 
| - OnDidDefer(); | 
| - return true; | 
| + // No process transfer needed. Pass the response through. | 
| + return next_handler_->OnResponseStarted(response, defer); | 
| } | 
| void CrossSiteResourceHandler::ResumeOrTransfer(bool is_transfer) { |