Index: content/browser/loader/intercepting_resource_handler.cc |
diff --git a/content/browser/loader/intercepting_resource_handler.cc b/content/browser/loader/intercepting_resource_handler.cc |
index 77b28b41240600b797627cc0d61001299838b3c8..201e88d343c793885ff1f35b555de290c39297e0 100644 |
--- a/content/browser/loader/intercepting_resource_handler.cc |
+++ b/content/browser/loader/intercepting_resource_handler.cc |
@@ -98,62 +98,27 @@ void InterceptingResourceHandler::OnWillRead( |
scoped_refptr<net::IOBuffer>* buf, |
int* buf_size, |
std::unique_ptr<ResourceController> controller) { |
- if (state_ == State::PASS_THROUGH) { |
- next_handler_->OnWillRead(buf, buf_size, std::move(controller)); |
- return; |
- } |
- |
- DCHECK_EQ(State::STARTING, state_); |
- DCHECK(!first_read_buffer_); |
- DCHECK_EQ(0, first_read_buffer_size_); |
- DCHECK(!parent_read_buffer_); |
- DCHECK(!parent_read_buffer_size_); |
- |
- parent_read_buffer_ = buf; |
- parent_read_buffer_size_ = buf_size; |
- |
- state_ = State::SENDING_ON_WILL_READ_TO_OLD_HANDLER; |
- HoldController(std::move(controller)); |
- DoLoop(); |
+ DCHECK_EQ(state_, State::PASS_THROUGH); |
+ return next_handler_->OnWillRead(buf, buf_size, std::move(controller)); |
} |
void InterceptingResourceHandler::OnReadCompleted( |
int bytes_read, |
std::unique_ptr<ResourceController> controller) { |
DCHECK(!has_controller()); |
- |
+ DCHECK_EQ(state_, State::PASS_THROUGH); |
DCHECK_GE(bytes_read, 0); |
- if (state_ == State::PASS_THROUGH) { |
- if (first_read_buffer_double_) { |
- // |first_read_buffer_double_| was allocated and the user wrote data to |
- // the buffer, but switching has not been done after all. |
- memcpy(first_read_buffer_->data(), first_read_buffer_double_->data(), |
- bytes_read); |
- first_read_buffer_ = nullptr; |
- first_read_buffer_double_ = nullptr; |
- } |
- next_handler_->OnReadCompleted(bytes_read, std::move(controller)); |
- return; |
- } |
- DCHECK_EQ(State::WAITING_FOR_ON_READ_COMPLETED, state_); |
- first_read_buffer_bytes_read_ = bytes_read; |
- state_ = State::SENDING_BUFFER_TO_NEW_HANDLER; |
- HoldController(std::move(controller)); |
- DoLoop(); |
+ next_handler_->OnReadCompleted(bytes_read, std::move(controller)); |
} |
void InterceptingResourceHandler::OnResponseCompleted( |
const net::URLRequestStatus& status, |
std::unique_ptr<ResourceController> controller) { |
- if (state_ == State::PASS_THROUGH) { |
- LayeredResourceHandler::OnResponseCompleted(status, std::move(controller)); |
- return; |
- } |
- if (!new_handler_) { |
- // Therer is only one ResourceHandler in this InterceptingResourceHandler. |
+ if (!new_handler_) |
state_ = State::PASS_THROUGH; |
- first_read_buffer_double_ = nullptr; |
+ |
+ if (state_ == State::PASS_THROUGH) { |
next_handler_->OnResponseCompleted(status, std::move(controller)); |
return; |
} |
@@ -170,7 +135,6 @@ void InterceptingResourceHandler::OnResponseCompleted( |
DCHECK(was_resumed); |
state_ = State::PASS_THROUGH; |
- first_read_buffer_double_ = nullptr; |
next_handler_ = std::move(new_handler_); |
next_handler_->OnResponseCompleted(status, std::move(controller)); |
} |
@@ -195,32 +159,12 @@ void InterceptingResourceHandler::DoLoop() { |
switch (state_) { |
case State::STARTING: |
- case State::WAITING_FOR_ON_READ_COMPLETED: |
case State::PASS_THROUGH: |
NOTREACHED(); |
break; |
- case State::SENDING_ON_WILL_READ_TO_OLD_HANDLER: |
- SendOnWillReadToOldHandler(); |
- break; |
- case State::WAITING_FOR_OLD_HANDLERS_BUFFER: |
- OnBufferReceived(); |
- break; |
case State::SENDING_ON_WILL_START_TO_NEW_HANDLER: |
SendOnResponseStartedToNewHandler(); |
break; |
- case State::SENDING_ON_RESPONSE_STARTED_TO_NEW_HANDLER: |
- if (first_read_buffer_double_) { |
- // OnWillRead has been called, so copying the data from |
- // |first_read_buffer_double_| to |first_read_buffer_| will be needed |
- // when OnReadCompleted is called. |
- state_ = State::WAITING_FOR_ON_READ_COMPLETED; |
- } else { |
- // OnWillRead has not been called, so no special handling will be |
- // needed from now on. |
- state_ = State::PASS_THROUGH; |
- } |
- ResumeInternal(); |
- break; |
case State::SWAPPING_HANDLERS: |
SendOnResponseStartedToOldHandler(); |
break; |
@@ -230,12 +174,6 @@ void InterceptingResourceHandler::DoLoop() { |
case State::RECEIVING_BUFFER_FROM_OLD_HANDLER: |
ReceivedBufferFromOldHandler(); |
break; |
- case State::SENDING_BUFFER_TO_NEW_HANDLER: |
- SendFirstReadBufferToNewHandler(); |
- break; |
- case State::SENDING_BUFFER_TO_NEW_HANDLER_WAITING_FOR_BUFFER: |
- ReceivedBufferFromNewHandler(); |
- break; |
} |
} |
} |
@@ -243,7 +181,6 @@ void InterceptingResourceHandler::DoLoop() { |
void InterceptingResourceHandler::ResumeInternal() { |
DCHECK(has_controller()); |
if (state_ == State::STARTING || |
- state_ == State::WAITING_FOR_ON_READ_COMPLETED || |
state_ == State::PASS_THROUGH) { |
// Uninteresting Resume: just delegate to the original resource controller. |
Resume(); |
@@ -265,36 +202,6 @@ void InterceptingResourceHandler::ResumeInternal() { |
weak_ptr_factory_.GetWeakPtr())); |
} |
-void InterceptingResourceHandler::SendOnWillReadToOldHandler() { |
- DCHECK_EQ(State::SENDING_ON_WILL_READ_TO_OLD_HANDLER, state_); |
- |
- state_ = State::WAITING_FOR_OLD_HANDLERS_BUFFER; |
- next_handler_->OnWillRead(&first_read_buffer_, &first_read_buffer_size_, |
- base::MakeUnique<Controller>(this)); |
-} |
- |
-void InterceptingResourceHandler::OnBufferReceived() { |
- DCHECK_EQ(State::WAITING_FOR_OLD_HANDLERS_BUFFER, state_); |
- |
- // TODO(mmenke): If this method is just going to allocate a double buffer |
- // anyways, can the call to the old handler's OnWillRead be removed? That |
- // would mean handling replaying data in the case that |next_handler_|'s |
- // buffer is smaller than the double buffer, but SendPayloadToOldHandler |
- // already handles that case, anyways, so could share that code with the |
- // no-swap path as well. Or better, just have MimeSniffingResourceHandler |
- // create and manage the buffer itself. |
- first_read_buffer_double_ = |
- new net::IOBuffer(static_cast<size_t>(first_read_buffer_size_)); |
- *parent_read_buffer_ = first_read_buffer_double_; |
- *parent_read_buffer_size_ = first_read_buffer_size_; |
- |
- parent_read_buffer_ = nullptr; |
- parent_read_buffer_size_ = nullptr; |
- |
- state_ = State::STARTING; |
- Resume(); |
-} |
- |
void InterceptingResourceHandler::SendOnResponseStartedToOldHandler() { |
state_ = State::SENDING_PAYLOAD_TO_OLD_HANDLER; |
next_handler_->OnResponseStarted(response_.get(), |
@@ -321,6 +228,10 @@ void InterceptingResourceHandler::SendPayloadToOldHandler() { |
next_handler_ = std::move(new_handler_); |
state_ = State::SENDING_ON_WILL_START_TO_NEW_HANDLER; |
+ |
+ // Note that this call may be a lie--the new handler will often have been |
+ // substituted in after the request has actually started, so the new |
+ // handler will not have the chance to cancel the request before it starts. |
next_handler_->OnWillStart(request()->url(), |
base::MakeUnique<Controller>(this)); |
return; |
@@ -328,37 +239,26 @@ void InterceptingResourceHandler::SendPayloadToOldHandler() { |
state_ = State::RECEIVING_BUFFER_FROM_OLD_HANDLER; |
- scoped_refptr<net::IOBuffer> buffer; |
- // If |first_read_buffer_| is non-NULL, it was already received from |
- // |next_handler_| via OnWillRead. Can just use the buffer. |
- if (first_read_buffer_) { |
- DCHECK_GT(first_read_buffer_size_, 0); |
- |
- ResumeInternal(); |
- return; |
- } |
- |
- DCHECK(!first_read_buffer_size_); |
- next_handler_->OnWillRead(&first_read_buffer_, &first_read_buffer_size_, |
+ DCHECK_EQ(read_buffer_size_, 0); |
+ next_handler_->OnWillRead(&read_buffer_, &read_buffer_size_, |
base::MakeUnique<Controller>(this)); |
} |
void InterceptingResourceHandler::ReceivedBufferFromOldHandler() { |
DCHECK_EQ(State::RECEIVING_BUFFER_FROM_OLD_HANDLER, state_); |
- DCHECK(first_read_buffer_); |
- DCHECK_GT(first_read_buffer_size_, 0); |
- |
- int bytes_to_copy = |
- std::min(first_read_buffer_size_, |
- static_cast<int>(payload_for_old_handler_.size() - |
- payload_bytes_written_)); |
- memcpy(first_read_buffer_->data(), |
+ DCHECK(read_buffer_); |
+ DCHECK_GT(read_buffer_size_, 0); |
+ |
+ int bytes_to_copy = std::min( |
+ read_buffer_size_, static_cast<int>(payload_for_old_handler_.size() - |
+ payload_bytes_written_)); |
+ memcpy(read_buffer_->data(), |
payload_for_old_handler_.data() + payload_bytes_written_, |
bytes_to_copy); |
payload_bytes_written_ += bytes_to_copy; |
- first_read_buffer_ = nullptr; |
- first_read_buffer_size_ = 0; |
+ read_buffer_ = nullptr; |
+ read_buffer_size_ = 0; |
state_ = State::SENDING_PAYLOAD_TO_OLD_HANDLER; |
next_handler_->OnReadCompleted(bytes_to_copy, |
@@ -366,49 +266,9 @@ void InterceptingResourceHandler::ReceivedBufferFromOldHandler() { |
} |
void InterceptingResourceHandler::SendOnResponseStartedToNewHandler() { |
- state_ = State::SENDING_ON_RESPONSE_STARTED_TO_NEW_HANDLER; |
+ state_ = State::PASS_THROUGH; |
next_handler_->OnResponseStarted(response_.get(), |
base::MakeUnique<Controller>(this)); |
} |
-void InterceptingResourceHandler::SendFirstReadBufferToNewHandler() { |
- DCHECK_EQ(state_, State::SENDING_BUFFER_TO_NEW_HANDLER); |
- DCHECK(!new_handler_read_buffer_); |
- DCHECK(!new_handler_read_buffer_size_); |
- |
- if (first_read_buffer_bytes_written_ == first_read_buffer_bytes_read_) { |
- state_ = State::PASS_THROUGH; |
- first_read_buffer_double_ = nullptr; |
- ResumeInternal(); |
- return; |
- } |
- |
- state_ = State::SENDING_BUFFER_TO_NEW_HANDLER_WAITING_FOR_BUFFER; |
- next_handler_->OnWillRead(&new_handler_read_buffer_, |
- &new_handler_read_buffer_size_, |
- base::MakeUnique<Controller>(this)); |
-} |
- |
-void InterceptingResourceHandler::ReceivedBufferFromNewHandler() { |
- DCHECK_EQ(state_, State::SENDING_BUFFER_TO_NEW_HANDLER_WAITING_FOR_BUFFER); |
- DCHECK(new_handler_read_buffer_); |
- DCHECK(new_handler_read_buffer_size_); |
- |
- int bytes_to_copy = |
- std::min(new_handler_read_buffer_size_, |
- static_cast<int>(first_read_buffer_bytes_read_ - |
- first_read_buffer_bytes_written_)); |
- memcpy(new_handler_read_buffer_->data(), |
- first_read_buffer_double_->data() + first_read_buffer_bytes_written_, |
- bytes_to_copy); |
- first_read_buffer_bytes_written_ += bytes_to_copy; |
- |
- new_handler_read_buffer_ = nullptr; |
- new_handler_read_buffer_size_ = 0; |
- |
- state_ = State::SENDING_BUFFER_TO_NEW_HANDLER; |
- next_handler_->OnReadCompleted(bytes_to_copy, |
- base::MakeUnique<Controller>(this)); |
-} |
- |
} // namespace content |