| Index: content/browser/renderer_host/redirect_to_file_resource_handler.cc
|
| diff --git a/content/browser/renderer_host/redirect_to_file_resource_handler.cc b/content/browser/renderer_host/redirect_to_file_resource_handler.cc
|
| index 8ebba69a259a904d9adbd1c44fc59e235b088735..5344b0663a34ffc909ee620c2706a20bba194f7a 100644
|
| --- a/content/browser/renderer_host/redirect_to_file_resource_handler.cc
|
| +++ b/content/browser/renderer_host/redirect_to_file_resource_handler.cc
|
| @@ -36,7 +36,6 @@ RedirectToFileResourceHandler::RedirectToFileResourceHandler(
|
| request_id_(-1),
|
| buf_(new net::GrowableIOBuffer()),
|
| buf_write_pending_(false),
|
| - write_cursor_(0),
|
| write_callback_pending_(false),
|
| request_was_closed_(false),
|
| completed_during_write_(false) {
|
| @@ -111,6 +110,17 @@ bool RedirectToFileResourceHandler::OnReadCompleted(int request_id,
|
| DCHECK(new_offset <= buf_->capacity());
|
| buf_->set_offset(new_offset);
|
|
|
| + // Reset the cursor per the new offset.
|
| + if (write_cursor_) {
|
| + // If we already have the write cursor, create a new one and advance
|
| + // to where we were.
|
| + int consumed_so_far = write_cursor_->BytesConsumed();
|
| + write_cursor_ = new net::DrainableIOBuffer(buf_, buf_->offset());
|
| + write_cursor_->DidConsume(consumed_so_far);
|
| + } else {
|
| + write_cursor_ = new net::DrainableIOBuffer(buf_, buf_->offset());
|
| + }
|
| +
|
| if (BufIsFull())
|
| host_->PauseRequest(process_id_, request_id, true);
|
|
|
| @@ -179,7 +189,7 @@ void RedirectToFileResourceHandler::DidWriteToFile(int result) {
|
| bool failed = false;
|
| if (result > 0) {
|
| next_handler_->OnDataDownloaded(request_id_, result);
|
| - write_cursor_ += result;
|
| + write_cursor_->DidConsume(result);
|
| failed = !WriteMore();
|
| } else {
|
| failed = true;
|
| @@ -197,23 +207,22 @@ void RedirectToFileResourceHandler::DidWriteToFile(int result) {
|
| bool RedirectToFileResourceHandler::WriteMore() {
|
| DCHECK(file_stream_.get());
|
| for (;;) {
|
| - if (write_cursor_ == buf_->offset()) {
|
| + if (write_cursor_->BytesRemaining() == 0) {
|
| // We've caught up to the network load, but it may be in the process of
|
| // appending more data to the buffer.
|
| if (!buf_write_pending_) {
|
| if (BufIsFull())
|
| host_->PauseRequest(process_id_, request_id_, false);
|
| buf_->set_offset(0);
|
| - write_cursor_ = 0;
|
| + write_cursor_ = NULL;
|
| }
|
| return true;
|
| }
|
| if (write_callback_pending_)
|
| return true;
|
| - DCHECK(write_cursor_ < buf_->offset());
|
| + DCHECK_LT(0, write_cursor_->BytesRemaining());
|
| int rv = file_stream_->Write(
|
| - buf_->StartOfBuffer() + write_cursor_,
|
| - buf_->offset() - write_cursor_,
|
| + write_cursor_, write_cursor_->BytesRemaining(),
|
| base::Bind(&RedirectToFileResourceHandler::DidWriteToFile,
|
| base::Unretained(this)));
|
| if (rv == net::ERR_IO_PENDING) {
|
| @@ -223,7 +232,7 @@ bool RedirectToFileResourceHandler::WriteMore() {
|
| if (rv <= 0)
|
| return false;
|
| next_handler_->OnDataDownloaded(request_id_, rv);
|
| - write_cursor_ += rv;
|
| + write_cursor_->DidConsume(rv);
|
| }
|
| }
|
|
|
|
|