Commit 4327bb89 authored by Arthur Sonzogni's avatar Arthur Sonzogni Committed by Commit Bot

DevtoolsUrlLoaderInterceptor: Instrument for bug 882661.

In bug 882661: one mojo::URLLoader is sending OnStartLoadingResponseBody
without sending OnReceiveResponse before.

Add instrumentation to check this never happen with this class.

Bug: 882661
Change-Id: I8a157949feacfe65f0ea1aa8c32b28352d6d6f57
Reviewed-on: https://chromium-review.googlesource.com/c/1288595
Commit-Queue: Arthur Sonzogni <arthursonzogni@chromium.org>
Reviewed-by: default avatarAndrey Kosyakov <caseq@chromium.org>
Cr-Commit-Position: refs/heads/master@{#601087}
parent a872d413
...@@ -317,6 +317,9 @@ class InterceptionJob : public network::mojom::URLLoaderClient, ...@@ -317,6 +317,9 @@ class InterceptionJob : public network::mojom::URLLoaderClient,
pending_auth_callback_; pending_auth_callback_;
TakeResponseBodyPipeCallback pending_response_body_pipe_callback_; TakeResponseBodyPipeCallback pending_response_body_pipe_callback_;
// TODO(https://crbug.com/882661): Remove this as soon as the bug is fixed.
bool on_receive_response_sent_ = false;
base::WeakPtrFactory<InterceptionJob> weak_factory_; base::WeakPtrFactory<InterceptionJob> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(InterceptionJob); DISALLOW_COPY_AND_ASSIGN(InterceptionJob);
...@@ -889,6 +892,7 @@ Response InterceptionJob::InnerContinueRequest( ...@@ -889,6 +892,7 @@ Response InterceptionJob::InnerContinueRequest(
DCHECK_EQ(State::kResponseReceived, state_); DCHECK_EQ(State::kResponseReceived, state_);
DCHECK(!body_reader_); DCHECK(!body_reader_);
client_->OnReceiveResponse(response_metadata_->head); client_->OnReceiveResponse(response_metadata_->head);
on_receive_response_sent_ = true;
response_metadata_.reset(); response_metadata_.reset();
loader_->ResumeReadingBodyFromNet(); loader_->ResumeReadingBodyFromNet();
client_binding_.ResumeIncomingMethodCallProcessing(); client_binding_.ResumeIncomingMethodCallProcessing();
...@@ -1091,6 +1095,7 @@ void InterceptionJob::ProcessRedirectByClient(const GURL& redirect_url) { ...@@ -1091,6 +1095,7 @@ void InterceptionJob::ProcessRedirectByClient(const GURL& redirect_url) {
void InterceptionJob::SendResponse(const base::StringPiece& body) { void InterceptionJob::SendResponse(const base::StringPiece& body) {
client_->OnReceiveResponse(response_metadata_->head); client_->OnReceiveResponse(response_metadata_->head);
on_receive_response_sent_ = true;
// We shouldn't be able to transfer a string that big over the protocol, // We shouldn't be able to transfer a string that big over the protocol,
// but just in case... // but just in case...
...@@ -1105,6 +1110,7 @@ void InterceptionJob::SendResponse(const base::StringPiece& body) { ...@@ -1105,6 +1110,7 @@ void InterceptionJob::SendResponse(const base::StringPiece& body) {
if (!response_metadata_->cached_metadata.empty()) if (!response_metadata_->cached_metadata.empty())
client_->OnReceiveCachedMetadata(response_metadata_->cached_metadata); client_->OnReceiveCachedMetadata(response_metadata_->cached_metadata);
CHECK(on_receive_response_sent_);
client_->OnStartLoadingResponseBody(std::move(pipe.consumer_handle)); client_->OnStartLoadingResponseBody(std::move(pipe.consumer_handle));
if (response_metadata_->transfer_size) if (response_metadata_->transfer_size)
client_->OnTransferSizeUpdated(response_metadata_->transfer_size); client_->OnTransferSizeUpdated(response_metadata_->transfer_size);
...@@ -1359,6 +1365,7 @@ void InterceptionJob::OnReceiveResponse( ...@@ -1359,6 +1365,7 @@ void InterceptionJob::OnReceiveResponse(
DCHECK(!response_metadata_); DCHECK(!response_metadata_);
if (!(stage_ & InterceptionStage::RESPONSE)) { if (!(stage_ & InterceptionStage::RESPONSE)) {
client_->OnReceiveResponse(head); client_->OnReceiveResponse(head);
on_receive_response_sent_ = true;
return; return;
} }
loader_->PauseReadingBodyFromNet(); loader_->PauseReadingBodyFromNet();
...@@ -1432,10 +1439,13 @@ void InterceptionJob::OnStartLoadingResponseBody( ...@@ -1432,10 +1439,13 @@ void InterceptionJob::OnStartLoadingResponseBody(
return; return;
} }
DCHECK_EQ(State::kResponseReceived, state_); DCHECK_EQ(State::kResponseReceived, state_);
if (ShouldBypassForResponse()) if (ShouldBypassForResponse()) {
// Remove this CHECK once https://crbug.com/882661 is fixed.
CHECK(on_receive_response_sent_);
client_->OnStartLoadingResponseBody(std::move(body)); client_->OnStartLoadingResponseBody(std::move(body));
else } else {
body_reader_->StartReading(std::move(body)); body_reader_->StartReading(std::move(body));
}
} }
void InterceptionJob::OnComplete( void InterceptionJob::OnComplete(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment