| Index: content/child/url_response_body_consumer.cc
|
| diff --git a/content/child/url_response_body_consumer.cc b/content/child/url_response_body_consumer.cc
|
| index 9d5c017d6e35597d4c6a9813dca9866a60f8f149..97484af53ebf4ccccaf234dd9d9f69f4eab48822 100644
|
| --- a/content/child/url_response_body_consumer.cc
|
| +++ b/content/child/url_response_body_consumer.cc
|
| @@ -76,6 +76,15 @@ void URLResponseBodyConsumer::Cancel() {
|
| handle_watcher_.Cancel();
|
| }
|
|
|
| +void URLResponseBodyConsumer::SetDefersLoading() {
|
| + is_deferred_ = true;
|
| +}
|
| +
|
| +void URLResponseBodyConsumer::UnsetDefersLoading() {
|
| + is_deferred_ = false;
|
| + OnReadable(MOJO_RESULT_OK);
|
| +}
|
| +
|
| void URLResponseBodyConsumer::Reclaim(uint32_t size) {
|
| MojoResult result = mojo::EndReadDataRaw(handle_.get(), size);
|
| DCHECK_EQ(MOJO_RESULT_OK, result);
|
| @@ -89,17 +98,17 @@ void URLResponseBodyConsumer::Reclaim(uint32_t size) {
|
| }
|
|
|
| void URLResponseBodyConsumer::OnReadable(MojoResult unused) {
|
| - DCHECK(!is_in_on_readable_);
|
| -
|
| - if (has_been_cancelled_ || has_seen_end_of_data_)
|
| + if (has_been_cancelled_ || has_seen_end_of_data_ || is_deferred_)
|
| return;
|
|
|
| + DCHECK(!is_in_on_readable_);
|
| +
|
| // Protect |this| as RequestPeer::OnReceivedData may call deref.
|
| scoped_refptr<URLResponseBodyConsumer> protect(this);
|
| base::AutoReset<bool> is_in_on_readable(&is_in_on_readable_, true);
|
|
|
| // TODO(yhirano): Suppress notification when deferred.
|
| - while (!has_been_cancelled_) {
|
| + while (!has_been_cancelled_ && !is_deferred_) {
|
| const void* buffer = nullptr;
|
| uint32_t available = 0;
|
| MojoResult result = mojo::BeginReadDataRaw(
|
|
|