Index: content/browser/loader/resource_loader.cc |
diff --git a/content/browser/loader/resource_loader.cc b/content/browser/loader/resource_loader.cc |
index 519065fac9cf4baa6d6dbb2b89930be4a11dbaea..1a181a704077c9fca7f8b5f84942b9750cfdbd42 100644 |
--- a/content/browser/loader/resource_loader.cc |
+++ b/content/browser/loader/resource_loader.cc |
@@ -189,6 +189,13 @@ void ResourceLoader::MarkAsTransferring() { |
CHECK(IsResourceTypeFrame(GetRequestInfo()->GetResourceType())) |
<< "Can only transfer for navigations"; |
is_transferring_ = true; |
+ |
+ int child_id = GetRequestInfo()->GetChildID(); |
+ AppCacheInterceptor::PrepareForCrossSiteTransfer(request(), child_id); |
+ ServiceWorkerRequestHandler* handler = |
+ ServiceWorkerRequestHandler::GetHandler(request()); |
+ if (handler) |
+ handler->PrepareForCrossSiteTransfer(child_id); |
} |
void ResourceLoader::CompleteTransfer() { |
@@ -198,6 +205,18 @@ void ResourceLoader::CompleteTransfer() { |
// a later read stage. |
DCHECK(DEFERRED_READ == deferred_stage_ || |
DEFERRED_RESPONSE_COMPLETE == deferred_stage_); |
+ DCHECK(is_transferring_); |
+ |
+ // In some cases, a process transfer doesn't really happen and the |
+ // request is resumed in the original process. Real transfers to a new process |
+ // are completed via ResourceDispatcherHostImpl::UpdateRequestForTransfer. |
+ int child_id = GetRequestInfo()->GetChildID(); |
+ AppCacheInterceptor::MaybeCompleteCrossSiteTransferInOldProcess( |
+ request(), child_id); |
+ ServiceWorkerRequestHandler* handler = |
+ ServiceWorkerRequestHandler::GetHandler(request()); |
+ if (handler) |
+ handler->MaybeCompleteCrossSiteTransferInOldProcess(child_id); |
is_transferring_ = false; |
GetRequestInfo()->cross_site_handler()->ResumeResponse(); |