| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/loader/cross_site_resource_handler.h" | 5 #include "content/browser/loader/cross_site_resource_handler.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 // cross-site navigations. This is skipped if a transfer is already required | 193 // cross-site navigations. This is skipped if a transfer is already required |
| 194 // or for WebUI processes for now, since pages like the NTP host multiple | 194 // or for WebUI processes for now, since pages like the NTP host multiple |
| 195 // cross-site WebUI iframes. | 195 // cross-site WebUI iframes. |
| 196 if (!should_transfer && | 196 if (!should_transfer && |
| 197 CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess) && | 197 CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess) && |
| 198 !ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( | 198 !ChildProcessSecurityPolicyImpl::GetInstance()->HasWebUIBindings( |
| 199 info->GetChildID())) { | 199 info->GetChildID())) { |
| 200 return DeferForNavigationPolicyCheck(info, response, defer); | 200 return DeferForNavigationPolicyCheck(info, response, defer); |
| 201 } | 201 } |
| 202 | 202 |
| 203 bool swap_needed = | 203 bool swap_needed = should_transfer || |
| 204 should_transfer || | 204 CrossSiteRequestManager::GetInstance()-> |
| 205 CrossSiteRequestManager::GetInstance()->HasPendingCrossSiteRequest( | 205 HasPendingCrossSiteRequest(info->GetChildID(), info->GetRouteID()); |
| 206 info->GetChildID(), info->GetRenderFrameID()); | |
| 207 | 206 |
| 208 // If this is a download, just pass the response through without doing a | 207 // If this is a download, just pass the response through without doing a |
| 209 // cross-site check. The renderer will see it is a download and abort the | 208 // cross-site check. The renderer will see it is a download and abort the |
| 210 // request. | 209 // request. |
| 211 // | 210 // |
| 212 // Similarly, HTTP 204 (No Content) responses leave us showing the previous | 211 // Similarly, HTTP 204 (No Content) responses leave us showing the previous |
| 213 // page. We should allow the navigation to finish without running the unload | 212 // page. We should allow the navigation to finish without running the unload |
| 214 // handler or swapping in the pending RenderFrameHost. | 213 // handler or swapping in the pending RenderFrameHost. |
| 215 // | 214 // |
| 216 // In both cases, any pending RenderFrameHost (if one was created for this | 215 // In both cases, any pending RenderFrameHost (if one was created for this |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 const std::string& security_info, | 285 const std::string& security_info, |
| 287 bool* defer) { | 286 bool* defer) { |
| 288 if (!in_cross_site_transition_) { | 287 if (!in_cross_site_transition_) { |
| 289 ResourceRequestInfoImpl* info = GetRequestInfo(); | 288 ResourceRequestInfoImpl* info = GetRequestInfo(); |
| 290 // If we've already completed the transition, or we're canceling the | 289 // If we've already completed the transition, or we're canceling the |
| 291 // request, or an error occurred with no cross-process navigation in | 290 // request, or an error occurred with no cross-process navigation in |
| 292 // progress, then we should just pass this through. | 291 // progress, then we should just pass this through. |
| 293 if (has_started_response_ || | 292 if (has_started_response_ || |
| 294 status.status() != net::URLRequestStatus::FAILED || | 293 status.status() != net::URLRequestStatus::FAILED || |
| 295 !CrossSiteRequestManager::GetInstance()->HasPendingCrossSiteRequest( | 294 !CrossSiteRequestManager::GetInstance()->HasPendingCrossSiteRequest( |
| 296 info->GetChildID(), info->GetRenderFrameID())) { | 295 info->GetChildID(), info->GetRouteID())) { |
| 297 next_handler_->OnResponseCompleted(status, security_info, defer); | 296 next_handler_->OnResponseCompleted(status, security_info, defer); |
| 298 return; | 297 return; |
| 299 } | 298 } |
| 300 | 299 |
| 301 // An error occurred. We should wait now for the cross-process transition, | 300 // An error occurred. We should wait now for the cross-process transition, |
| 302 // so that the error message (e.g., 404) can be displayed to the user. | 301 // so that the error message (e.g., 404) can be displayed to the user. |
| 303 // Also continue with the logic below to remember that we completed | 302 // Also continue with the logic below to remember that we completed |
| 304 // during the cross-site transition. | 303 // during the cross-site transition. |
| 305 StartCrossSiteTransition(NULL, false); | 304 StartCrossSiteTransition(NULL, false); |
| 306 } | 305 } |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 442 controller()->Resume(); | 441 controller()->Resume(); |
| 443 } | 442 } |
| 444 } | 443 } |
| 445 | 444 |
| 446 void CrossSiteResourceHandler::OnDidDefer() { | 445 void CrossSiteResourceHandler::OnDidDefer() { |
| 447 did_defer_ = true; | 446 did_defer_ = true; |
| 448 request()->LogBlockedBy("CrossSiteResourceHandler"); | 447 request()->LogBlockedBy("CrossSiteResourceHandler"); |
| 449 } | 448 } |
| 450 | 449 |
| 451 } // namespace content | 450 } // namespace content |
| OLD | NEW |