| Index: content/browser/loader/resource_loader.cc
|
| diff --git a/content/browser/loader/resource_loader.cc b/content/browser/loader/resource_loader.cc
|
| index 251fc2eb79594e3ef127f72026dda618204e9fcf..450f1934762f5fbd0b2f2c263f10a35ccca6c9b1 100644
|
| --- a/content/browser/loader/resource_loader.cc
|
| +++ b/content/browser/loader/resource_loader.cc
|
| @@ -168,7 +168,12 @@ void ResourceLoader::MarkAsTransferring() {
|
| }
|
|
|
| void ResourceLoader::CompleteTransfer() {
|
| - DCHECK_EQ(DEFERRED_READ, deferred_stage_);
|
| + // Although CrossSiteResourceHandler defers at OnResponseStarted
|
| + // (DEFERRED_READ), it may be seeing a replay of events via
|
| + // BufferedResourceHandler, and so the request itself is actually deferred at
|
| + // a later read stage.
|
| + DCHECK(DEFERRED_READ == deferred_stage_ ||
|
| + DEFERRED_RESPONSE_COMPLETE == deferred_stage_);
|
|
|
| is_transferring_ = false;
|
| GetRequestInfo()->cross_site_handler()->ResumeResponse();
|
| @@ -363,7 +368,7 @@ void ResourceLoader::OnReadCompleted(net::URLRequest* unused, int bytes_read) {
|
| // do nothing until resumed.
|
| //
|
| // Note: if bytes_read is 0 (EOF) and the handler defers, resumption will call
|
| - // Read() on the URLRequest again and get a second EOF.
|
| + // ResponseCompleted().
|
| if (is_deferred() || !request_->status().is_success())
|
| return;
|
|
|
| @@ -426,6 +431,12 @@ void ResourceLoader::Resume() {
|
| base::Bind(&ResourceLoader::ResumeReading,
|
| weak_ptr_factory_.GetWeakPtr()));
|
| break;
|
| + case DEFERRED_RESPONSE_COMPLETE:
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&ResourceLoader::ResponseCompleted,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| + break;
|
| case DEFERRED_FINISH:
|
| // Delay self-destruction since we don't know how we were reached.
|
| base::MessageLoop::current()->PostTask(
|
| @@ -622,7 +633,8 @@ void ResourceLoader::CompleteRead(int bytes_read) {
|
| if (!handler_->OnReadCompleted(info->GetRequestID(), bytes_read, &defer)) {
|
| Cancel();
|
| } else if (defer) {
|
| - deferred_stage_ = DEFERRED_READ; // Read next chunk when resumed.
|
| + deferred_stage_ =
|
| + bytes_read > 0 ? DEFERRED_READ : DEFERRED_RESPONSE_COMPLETE;
|
| }
|
|
|
| // Note: the request may still have been cancelled while OnReadCompleted
|
|
|