Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(704)

Side by Side Diff: content/browser/loader/test_resource_handler.cc

Issue 2668603003: Make ResourceHandler::OnWillRead able to complete asynchronously. (Closed)
Patch Set: Response to comments Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/browser/loader/test_resource_handler.h ('k') | content/test/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/browser/loader/test_resource_handler.h" 5 #include "content/browser/loader/test_resource_handler.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "content/browser/loader/resource_controller.h" 9 #include "content/browser/loader/resource_controller.h"
10 #include "content/public/common/resource_response.h" 10 #include "content/public/common/resource_response.h"
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 if (defer_on_will_start_) { 134 if (defer_on_will_start_) {
135 defer_on_will_start_ = false; 135 defer_on_will_start_ = false;
136 HoldController(std::move(controller)); 136 HoldController(std::move(controller));
137 deferred_run_loop_->Quit(); 137 deferred_run_loop_->Quit();
138 return; 138 return;
139 } 139 }
140 140
141 controller->Resume(); 141 controller->Resume();
142 } 142 }
143 143
144 bool TestResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, 144 void TestResourceHandler::OnWillRead(
145 int* buf_size) { 145 scoped_refptr<net::IOBuffer>* buf,
146 int* buf_size,
147 std::unique_ptr<ResourceController> controller) {
146 EXPECT_FALSE(canceled_); 148 EXPECT_FALSE(canceled_);
147 EXPECT_FALSE(expect_on_data_downloaded_); 149 EXPECT_FALSE(expect_on_data_downloaded_);
148 EXPECT_EQ(0, on_response_completed_called_); 150 EXPECT_EQ(0, on_response_completed_called_);
149 // Only create a ScopedCallDepthTracker if not called re-entrantly, as 151 // Only create a ScopedCallDepthTracker if not called re-entrantly, as
150 // OnWillRead may be called synchronously in response to a Resume(), but 152 // OnWillRead may be called synchronously in response to a Resume(), but
151 // nothing may be called synchronously in response to the OnWillRead call. 153 // nothing may be called synchronously in response to the OnWillRead call.
152 std::unique_ptr<ScopedCallDepthTracker> call_depth_tracker; 154 std::unique_ptr<ScopedCallDepthTracker> call_depth_tracker;
153 if (call_depth_ == 0) 155 if (call_depth_ == 0)
154 call_depth_tracker = base::MakeUnique<ScopedCallDepthTracker>(&call_depth_); 156 call_depth_tracker = base::MakeUnique<ScopedCallDepthTracker>(&call_depth_);
155 157
156 ++on_will_read_called_; 158 ++on_will_read_called_;
157 159
158 if (!on_will_read_result_) { 160 if (!on_will_read_result_) {
159 canceled_ = true; 161 canceled_ = true;
160 } else { 162 controller->Cancel();
161 *buf = buffer_; 163 return;
162 *buf_size = buffer_size_;
163 memset(buffer_->data(), '\0', buffer_size_);
164 } 164 }
165 165
166 return on_will_read_result_; 166 if (defer_on_will_read_) {
167 parent_read_buffer_ = buf;
168 parent_read_buffer_size_ = buf_size;
169 defer_on_will_read_ = false;
170 HoldController(std::move(controller));
171 deferred_run_loop_->Quit();
172 return;
173 }
174
175 *buf = buffer_;
176 *buf_size = buffer_size_;
177 controller->Resume();
167 } 178 }
168 179
169 void TestResourceHandler::OnReadCompleted( 180 void TestResourceHandler::OnReadCompleted(
170 int bytes_read, 181 int bytes_read,
171 std::unique_ptr<ResourceController> controller) { 182 std::unique_ptr<ResourceController> controller) {
172 EXPECT_FALSE(canceled_); 183 EXPECT_FALSE(canceled_);
173 EXPECT_FALSE(expect_on_data_downloaded_); 184 EXPECT_FALSE(expect_on_data_downloaded_);
174 EXPECT_EQ(1, on_will_start_called_); 185 EXPECT_EQ(1, on_will_start_called_);
175 EXPECT_EQ(1, on_response_started_called_); 186 EXPECT_EQ(1, on_response_started_called_);
176 EXPECT_EQ(0, on_response_completed_called_); 187 EXPECT_EQ(0, on_response_completed_called_);
177 EXPECT_EQ(0, on_read_eof_); 188 EXPECT_EQ(0, on_read_eof_called_);
178 ScopedCallDepthTracker call_depth_tracker(&call_depth_); 189 ScopedCallDepthTracker call_depth_tracker(&call_depth_);
179 190
180 ++on_read_completed_called_; 191 ++on_read_completed_called_;
181 if (bytes_read == 0) 192 if (bytes_read == 0)
182 ++on_read_eof_; 193 ++on_read_eof_called_;
183 194
184 EXPECT_LE(static_cast<size_t>(bytes_read), buffer_size_); 195 EXPECT_LE(static_cast<size_t>(bytes_read), buffer_size_);
185 if (body_ptr_) 196 if (body_ptr_)
186 body_ptr_->append(buffer_->data(), bytes_read); 197 body_ptr_->append(buffer_->data(), bytes_read);
187 body_.append(buffer_->data(), bytes_read); 198 body_.append(buffer_->data(), bytes_read);
188 199
189 if (!on_read_completed_result_ || (!on_read_eof_result_ && bytes_read == 0)) { 200 if (!on_read_completed_result_ || (!on_read_eof_result_ && bytes_read == 0)) {
190 canceled_ = true; 201 canceled_ = true;
191 controller->Cancel(); 202 controller->Cancel();
192 return; 203 return;
193 } 204 }
194 205
195 if (defer_on_read_completed_ || (bytes_read == 0 && defer_on_read_eof_)) { 206 if (defer_on_read_completed_ || (bytes_read == 0 && defer_on_read_eof_)) {
196 defer_on_read_completed_ = false; 207 defer_on_read_completed_ = false;
197 HoldController(std::move(controller)); 208 HoldController(std::move(controller));
198 deferred_run_loop_->Quit(); 209 deferred_run_loop_->Quit();
199 return; 210 return;
200 } 211 }
201 212
202 controller->Resume(); 213 controller->Resume();
203 } 214 }
204 215
205 void TestResourceHandler::OnResponseCompleted( 216 void TestResourceHandler::OnResponseCompleted(
206 const net::URLRequestStatus& status, 217 const net::URLRequestStatus& status,
207 std::unique_ptr<ResourceController> controller) { 218 std::unique_ptr<ResourceController> controller) {
208 ScopedCallDepthTracker call_depth_tracker(&call_depth_); 219 ScopedCallDepthTracker call_depth_tracker(&call_depth_);
209 220
221 // These may be non-NULL if there was an out-of-band cancel.
222 parent_read_buffer_ = nullptr;
223 parent_read_buffer_size_ = nullptr;
224
210 EXPECT_EQ(0, on_response_completed_called_); 225 EXPECT_EQ(0, on_response_completed_called_);
211 if (status.is_success() && !expect_on_data_downloaded_ && expect_eof_read_) 226 if (status.is_success() && !expect_on_data_downloaded_ && expect_eof_read_)
212 EXPECT_EQ(1, on_read_eof_); 227 EXPECT_EQ(1, on_read_eof_called_);
213 228
214 ++on_response_completed_called_; 229 ++on_response_completed_called_;
215 230
216 if (request_status_ptr_) 231 if (request_status_ptr_)
217 *request_status_ptr_ = status; 232 *request_status_ptr_ = status;
218 final_status_ = status; 233 final_status_ = status;
219 234
220 // Consider response completed. Even if deferring, the TestResourceHandler 235 // Consider response completed. Even if deferring, the TestResourceHandler
221 // won't be called again. 236 // won't be called again.
222 response_complete_run_loop_.Quit(); 237 response_complete_run_loop_.Quit();
(...skipping 12 matching lines...) Expand all
235 EXPECT_TRUE(expect_on_data_downloaded_); 250 EXPECT_TRUE(expect_on_data_downloaded_);
236 EXPECT_EQ(1, on_will_start_called_); 251 EXPECT_EQ(1, on_will_start_called_);
237 EXPECT_EQ(1, on_response_started_called_); 252 EXPECT_EQ(1, on_response_started_called_);
238 EXPECT_EQ(0, on_response_completed_called_); 253 EXPECT_EQ(0, on_response_completed_called_);
239 254
240 total_bytes_downloaded_ += bytes_downloaded; 255 total_bytes_downloaded_ += bytes_downloaded;
241 } 256 }
242 257
243 void TestResourceHandler::Resume() { 258 void TestResourceHandler::Resume() {
244 ScopedCallDepthTracker call_depth_tracker(&call_depth_); 259 ScopedCallDepthTracker call_depth_tracker(&call_depth_);
260
261 if (parent_read_buffer_) {
262 *parent_read_buffer_ = buffer_;
263 *parent_read_buffer_size_ = buffer_size_;
264 parent_read_buffer_ = nullptr;
265 parent_read_buffer_size_ = nullptr;
266 memset(buffer_->data(), '\0', buffer_size_);
267 }
268
245 ResourceHandler::Resume(); 269 ResourceHandler::Resume();
246 } 270 }
247 271
248 void TestResourceHandler::CancelWithError(net::Error net_error) { 272 void TestResourceHandler::CancelWithError(net::Error net_error) {
249 ScopedCallDepthTracker call_depth_tracker(&call_depth_); 273 ScopedCallDepthTracker call_depth_tracker(&call_depth_);
250 canceled_ = true; 274 canceled_ = true;
275
276 // Don't want to populate these after a cancel.
277 parent_read_buffer_ = nullptr;
278 parent_read_buffer_size_ = nullptr;
279
251 ResourceHandler::CancelWithError(net_error); 280 ResourceHandler::CancelWithError(net_error);
252 } 281 }
253 282
254 void TestResourceHandler::SetBufferSize(int buffer_size) { 283 void TestResourceHandler::SetBufferSize(int buffer_size) {
255 buffer_ = new net::IOBuffer(buffer_size); 284 buffer_ = new net::IOBuffer(buffer_size);
256 buffer_size_ = buffer_size; 285 buffer_size_ = buffer_size;
257 memset(buffer_->data(), '\0', buffer_size); 286 memset(buffer_->data(), '\0', buffer_size);
258 } 287 }
259 288
260 void TestResourceHandler::WaitUntilDeferred() { 289 void TestResourceHandler::WaitUntilDeferred() {
261 deferred_run_loop_->Run(); 290 deferred_run_loop_->Run();
262 deferred_run_loop_.reset(new base::RunLoop()); 291 deferred_run_loop_.reset(new base::RunLoop());
263 } 292 }
264 293
265 void TestResourceHandler::WaitUntilResponseComplete() { 294 void TestResourceHandler::WaitUntilResponseComplete() {
266 response_complete_run_loop_.Run(); 295 response_complete_run_loop_.Run();
267 } 296 }
268 297
269 base::WeakPtr<TestResourceHandler> TestResourceHandler::GetWeakPtr() { 298 base::WeakPtr<TestResourceHandler> TestResourceHandler::GetWeakPtr() {
270 return weak_ptr_factory_.GetWeakPtr(); 299 return weak_ptr_factory_.GetWeakPtr();
271 } 300 }
272 301
273 } // namespace content 302 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/test_resource_handler.h ('k') | content/test/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698