Index: content/browser/loader/resource_loader.cc |
diff --git a/content/browser/loader/resource_loader.cc b/content/browser/loader/resource_loader.cc |
index 00f700d40d997dcd6828840677f1fb5700b42d07..5bc7035b499bbd49b5cd6f5ae93ec27f96373230 100644 |
--- a/content/browser/loader/resource_loader.cc |
+++ b/content/browser/loader/resource_loader.cc |
@@ -172,12 +172,11 @@ void ResourceLoader::WillCompleteTransfer() { |
} |
void ResourceLoader::CompleteTransfer(scoped_ptr<ResourceHandler> new_handler) { |
- DCHECK_EQ(DEFERRED_REDIRECT, deferred_stage_); |
+ DCHECK_EQ(DEFERRED_READ, deferred_stage_); |
DCHECK(!handler_.get()); |
handler_ = new_handler.Pass(); |
handler_->SetController(this); |
- is_transferring_ = false; |
Resume(); |
} |
@@ -426,7 +425,8 @@ void ResourceLoader::ContinueSSLRequest(const GlobalRequestID& id) { |
} |
void ResourceLoader::Resume() { |
- DCHECK(!is_transferring_); |
+ bool was_transfer = is_transferring_; |
+ is_transferring_ = false; |
DeferredStage stage = deferred_stage_; |
deferred_stage_ = DEFERRED_NONE; |
@@ -441,10 +441,16 @@ void ResourceLoader::Resume() { |
request_->FollowDeferredRedirect(); |
break; |
case DEFERRED_READ: |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&ResourceLoader::ResumeReading, |
- weak_ptr_factory_.GetWeakPtr())); |
+ if (was_transfer) { |
+ // We need to go through the OnResponseStarted steps again in the new |
+ // resource handler. |
+ OnResponseStarted(request_.get()); |
+ } else { |
+ base::MessageLoop::current()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&ResourceLoader::ResumeReading, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ } |
break; |
case DEFERRED_FINISH: |
// Delay self-destruction since we don't know how we were reached. |