| Index: content/browser/renderer_host/redirect_to_file_resource_handler.cc
|
| ===================================================================
|
| --- content/browser/renderer_host/redirect_to_file_resource_handler.cc (revision 136397)
|
| +++ content/browser/renderer_host/redirect_to_file_resource_handler.cc (working copy)
|
| @@ -45,12 +45,13 @@
|
|
|
| bool RedirectToFileResourceHandler::OnResponseStarted(
|
| int request_id,
|
| - content::ResourceResponse* response) {
|
| + content::ResourceResponse* response,
|
| + bool* defer) {
|
| if (response->status.is_success()) {
|
| DCHECK(deletable_file_ && !deletable_file_->path().empty());
|
| response->download_file_path = deletable_file_->path();
|
| }
|
| - return next_handler_->OnResponseStarted(request_id, response);
|
| + return next_handler_->OnResponseStarted(request_id, response, defer);
|
| }
|
|
|
| bool RedirectToFileResourceHandler::OnWillStart(int request_id,
|
| @@ -92,15 +93,16 @@
|
| }
|
|
|
| bool RedirectToFileResourceHandler::OnReadCompleted(int request_id,
|
| - int* bytes_read) {
|
| + int* bytes_read,
|
| + bool* defer) {
|
| if (!buf_write_pending_) {
|
| - // Ignore spurious OnReadCompleted! PauseRequest(true) called from within
|
| - // OnReadCompleted tells the ResourceDispatcherHost that we did not consume
|
| - // the data. PauseRequest(false) then repeats the last OnReadCompleted
|
| - // call. We pause the request so that we can copy our buffer to disk, so
|
| - // we need to consume the data now. The ResourceDispatcherHost pause
|
| - // mechanism does not fit our use case very well.
|
| - // TODO(darin): Fix the ResourceDispatcherHost to avoid this hack!
|
| + // Ignore spurious OnReadCompleted! Deferring from OnReadCompleted tells
|
| + // the ResourceDispatcherHost that we did not consume the data.
|
| + // ResumeDeferredRequest then repeats the last OnReadCompleted call. We
|
| + // pause the request so that we can copy our buffer to disk, so we need to
|
| + // consume the data now. The ResourceDispatcherHost pause mechanism does
|
| + // not fit our use case very well. TODO(darin): Fix the
|
| + // ResourceDispatcherHost to avoid this hack!
|
| return true;
|
| }
|
|
|
| @@ -113,7 +115,7 @@
|
| buf_->set_offset(new_offset);
|
|
|
| if (BufIsFull())
|
| - host_->PauseRequest(process_id_, request_id, true);
|
| + *defer = true;
|
|
|
| return WriteMore();
|
| }
|
| @@ -191,6 +193,8 @@
|
| } else if (completed_during_write_) {
|
| next_handler_->OnResponseCompleted(request_id_, completed_status_,
|
| completed_security_info_);
|
| + // TODO(darin): OnResponseCompleted can return false to defer
|
| + // RemovePendingRequest.
|
| host_->RemovePendingRequest(process_id_, request_id_);
|
| }
|
| }
|
| @@ -203,7 +207,7 @@
|
| // appending more data to the buffer.
|
| if (!buf_write_pending_) {
|
| if (BufIsFull())
|
| - host_->PauseRequest(process_id_, request_id_, false);
|
| + host_->ResumeDeferredRequest(process_id_, request_id_);
|
| buf_->set_offset(0);
|
| write_cursor_ = 0;
|
| }
|
|
|