Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/child/url_response_body_consumer.h" | 5 #include "content/child/url_response_body_consumer.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 69 has_received_completion_ = true; | 69 has_received_completion_ = true; |
| 70 completion_status_ = status; | 70 completion_status_ = status; |
| 71 NotifyCompletionIfAppropriate(); | 71 NotifyCompletionIfAppropriate(); |
| 72 } | 72 } |
| 73 | 73 |
| 74 void URLResponseBodyConsumer::Cancel() { | 74 void URLResponseBodyConsumer::Cancel() { |
| 75 has_been_cancelled_ = true; | 75 has_been_cancelled_ = true; |
| 76 handle_watcher_.Cancel(); | 76 handle_watcher_.Cancel(); |
| 77 } | 77 } |
| 78 | 78 |
| 79 void URLResponseBodyConsumer::SetDefersLoading() { | |
| 80 is_deferred_ = true; | |
| 81 } | |
| 82 | |
| 83 void URLResponseBodyConsumer::UnsetDefersLoading() { | |
| 84 is_deferred_ = false; | |
| 85 OnReadable(MOJO_RESULT_OK); | |
| 86 } | |
| 87 | |
| 79 void URLResponseBodyConsumer::Reclaim(uint32_t size) { | 88 void URLResponseBodyConsumer::Reclaim(uint32_t size) { |
| 80 MojoResult result = mojo::EndReadDataRaw(handle_.get(), size); | 89 MojoResult result = mojo::EndReadDataRaw(handle_.get(), size); |
| 81 DCHECK_EQ(MOJO_RESULT_OK, result); | 90 DCHECK_EQ(MOJO_RESULT_OK, result); |
| 82 | 91 |
| 83 if (is_in_on_readable_) | 92 if (is_in_on_readable_) |
| 84 return; | 93 return; |
| 85 | 94 |
| 86 task_runner_->PostTask( | 95 task_runner_->PostTask( |
| 87 FROM_HERE, base::Bind(&URLResponseBodyConsumer::OnReadable, AsWeakPtr(), | 96 FROM_HERE, base::Bind(&URLResponseBodyConsumer::OnReadable, AsWeakPtr(), |
| 88 MOJO_RESULT_OK)); | 97 MOJO_RESULT_OK)); |
| 89 } | 98 } |
| 90 | 99 |
| 91 void URLResponseBodyConsumer::OnReadable(MojoResult unused) { | 100 void URLResponseBodyConsumer::OnReadable(MojoResult unused) { |
| 101 if (has_been_cancelled_ || has_seen_end_of_data_ || is_deferred_) | |
| 102 return; | |
| 103 | |
| 92 DCHECK(!is_in_on_readable_); | 104 DCHECK(!is_in_on_readable_); |
| 93 | 105 |
| 94 if (has_been_cancelled_ || has_seen_end_of_data_) | |
| 95 return; | |
| 96 | |
| 97 // Protect |this| as RequestPeer::OnReceivedData may call deref. | 106 // Protect |this| as RequestPeer::OnReceivedData may call deref. |
| 98 scoped_refptr<URLResponseBodyConsumer> protect(this); | 107 scoped_refptr<URLResponseBodyConsumer> protect(this); |
| 99 base::AutoReset<bool> is_in_on_readable(&is_in_on_readable_, true); | 108 base::AutoReset<bool> is_in_on_readable(&is_in_on_readable_, true); |
| 100 | 109 |
| 101 // TODO(yhirano): Suppress notification when deferred. | 110 while (!has_been_cancelled_ && !is_deferred_) { |
| 102 while (!has_been_cancelled_) { | |
| 103 const void* buffer = nullptr; | 111 const void* buffer = nullptr; |
| 104 uint32_t available = 0; | 112 uint32_t available = 0; |
| 105 MojoResult result = mojo::BeginReadDataRaw( | 113 MojoResult result = mojo::BeginReadDataRaw( |
| 106 handle_.get(), &buffer, &available, MOJO_READ_DATA_FLAG_NONE); | 114 handle_.get(), &buffer, &available, MOJO_READ_DATA_FLAG_NONE); |
| 107 if (result == MOJO_RESULT_SHOULD_WAIT || result == MOJO_RESULT_BUSY) | 115 if (result == MOJO_RESULT_SHOULD_WAIT || result == MOJO_RESULT_BUSY) |
| 108 return; | 116 return; |
| 109 if (result == MOJO_RESULT_FAILED_PRECONDITION) { | 117 if (result == MOJO_RESULT_FAILED_PRECONDITION) { |
| 110 has_seen_end_of_data_ = true; | 118 has_seen_end_of_data_ = true; |
| 111 NotifyCompletionIfAppropriate(); | 119 NotifyCompletionIfAppropriate(); |
| 112 return; | 120 return; |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 127 } | 135 } |
| 128 | 136 |
| 129 void URLResponseBodyConsumer::NotifyCompletionIfAppropriate() { | 137 void URLResponseBodyConsumer::NotifyCompletionIfAppropriate() { |
| 130 if (has_been_cancelled_) | 138 if (has_been_cancelled_) |
| 131 return; | 139 return; |
| 132 if (!has_received_completion_ || !has_seen_end_of_data_) | 140 if (!has_received_completion_ || !has_seen_end_of_data_) |
| 133 return; | 141 return; |
| 134 // Cancel this instance in order not to notify twice. | 142 // Cancel this instance in order not to notify twice. |
| 135 Cancel(); | 143 Cancel(); |
| 136 | 144 |
| 137 resource_dispatcher_->OnMessageReceived( | 145 resource_dispatcher_->OnMessageReceived( |
|
kinuko
2016/12/27 01:52:21
No need to be in the same change, but I think this
yhirano
2016/12/27 07:32:54
Done.
| |
| 138 ResourceMsg_RequestComplete(request_id_, completion_status_)); | 146 ResourceMsg_RequestComplete(request_id_, completion_status_)); |
| 139 // |this| may be deleted. | 147 // |this| may be deleted. |
| 140 } | 148 } |
| 141 | 149 |
| 142 } // namespace content | 150 } // namespace content |
| OLD | NEW |