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

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

Issue 2526983002: Refactor ResourceHandler API. (Closed)
Patch Set: Response to comments Created 3 years, 10 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
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/mojo_async_resource_handler.h" 5 #include "content/browser/loader/mojo_async_resource_handler.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 } else { 138 } else {
139 GetRequestInfo()->set_on_transfer(base::Bind(&NotReached)); 139 GetRequestInfo()->set_on_transfer(base::Bind(&NotReached));
140 } 140 }
141 } 141 }
142 142
143 MojoAsyncResourceHandler::~MojoAsyncResourceHandler() { 143 MojoAsyncResourceHandler::~MojoAsyncResourceHandler() {
144 if (has_checked_for_sufficient_resources_) 144 if (has_checked_for_sufficient_resources_)
145 rdh_->FinishedWithResourcesForRequest(request()); 145 rdh_->FinishedWithResourcesForRequest(request());
146 } 146 }
147 147
148 bool MojoAsyncResourceHandler::OnRequestRedirected( 148 void MojoAsyncResourceHandler::OnRequestRedirected(
149 const net::RedirectInfo& redirect_info, 149 const net::RedirectInfo& redirect_info,
150 ResourceResponse* response, 150 ResourceResponse* response,
151 bool* defer) { 151 std::unique_ptr<ResourceController> controller) {
152 // Unlike OnResponseStarted, OnRequestRedirected will NOT be preceded by 152 // Unlike OnResponseStarted, OnRequestRedirected will NOT be preceded by
153 // OnWillRead. 153 // OnWillRead.
154 DCHECK(!has_controller());
154 DCHECK(!shared_writer_); 155 DCHECK(!shared_writer_);
155 156
156 *defer = true;
157 request()->LogBlockedBy("MojoAsyncResourceHandler"); 157 request()->LogBlockedBy("MojoAsyncResourceHandler");
158 HoldController(std::move(controller));
158 did_defer_on_redirect_ = true; 159 did_defer_on_redirect_ = true;
159 160
160 NetLogObserver::PopulateResponseInfo(request(), response); 161 NetLogObserver::PopulateResponseInfo(request(), response);
161 response->head.encoded_data_length = request()->GetTotalReceivedBytes(); 162 response->head.encoded_data_length = request()->GetTotalReceivedBytes();
162 response->head.request_start = request()->creation_time(); 163 response->head.request_start = request()->creation_time();
163 response->head.response_start = base::TimeTicks::Now(); 164 response->head.response_start = base::TimeTicks::Now();
164 // TODO(davidben): Is it necessary to pass the new first party URL for 165 // TODO(davidben): Is it necessary to pass the new first party URL for
165 // cookies? The only case where it can change is top-level navigation requests 166 // cookies? The only case where it can change is top-level navigation requests
166 // and hopefully those will eventually all be owned by the browser. It's 167 // and hopefully those will eventually all be owned by the browser. It's
167 // possible this is still needed while renderer-owned ones exist. 168 // possible this is still needed while renderer-owned ones exist.
168 url_loader_client_->OnReceiveRedirect(redirect_info, response->head); 169 url_loader_client_->OnReceiveRedirect(redirect_info, response->head);
169 return true;
170 } 170 }
171 171
172 bool MojoAsyncResourceHandler::OnResponseStarted(ResourceResponse* response, 172 void MojoAsyncResourceHandler::OnResponseStarted(
173 bool* defer) { 173 ResourceResponse* response,
174 std::unique_ptr<ResourceController> controller) {
175 DCHECK(!has_controller());
176
174 if (upload_progress_tracker_) { 177 if (upload_progress_tracker_) {
175 upload_progress_tracker_->OnUploadCompleted(); 178 upload_progress_tracker_->OnUploadCompleted();
176 upload_progress_tracker_ = nullptr; 179 upload_progress_tracker_ = nullptr;
177 } 180 }
178 181
179 const ResourceRequestInfoImpl* info = GetRequestInfo(); 182 const ResourceRequestInfoImpl* info = GetRequestInfo();
180 if (rdh_->delegate()) { 183 if (rdh_->delegate()) {
181 rdh_->delegate()->OnResponseStarted(request(), info->GetContext(), 184 rdh_->delegate()->OnResponseStarted(request(), info->GetContext(),
182 response); 185 response);
183 } 186 }
(...skipping 17 matching lines...) Expand all
201 url_loader_client_->OnReceiveResponse(response->head, 204 url_loader_client_->OnReceiveResponse(response->head,
202 std::move(downloaded_file_ptr)); 205 std::move(downloaded_file_ptr));
203 206
204 net::IOBufferWithSize* metadata = GetResponseMetadata(request()); 207 net::IOBufferWithSize* metadata = GetResponseMetadata(request());
205 if (metadata) { 208 if (metadata) {
206 const uint8_t* data = reinterpret_cast<const uint8_t*>(metadata->data()); 209 const uint8_t* data = reinterpret_cast<const uint8_t*>(metadata->data());
207 210
208 url_loader_client_->OnReceiveCachedMetadata( 211 url_loader_client_->OnReceiveCachedMetadata(
209 std::vector<uint8_t>(data, data + metadata->size())); 212 std::vector<uint8_t>(data, data + metadata->size()));
210 } 213 }
211 return true; 214
215 controller->Resume();
212 } 216 }
213 217
214 bool MojoAsyncResourceHandler::OnWillStart(const GURL& url, bool* defer) { 218 void MojoAsyncResourceHandler::OnWillStart(
219 const GURL& url,
220 std::unique_ptr<ResourceController> controller) {
215 if (GetRequestInfo()->is_upload_progress_enabled() && 221 if (GetRequestInfo()->is_upload_progress_enabled() &&
216 request()->has_upload()) { 222 request()->has_upload()) {
217 upload_progress_tracker_ = CreateUploadProgressTracker( 223 upload_progress_tracker_ = CreateUploadProgressTracker(
218 FROM_HERE, 224 FROM_HERE,
219 base::BindRepeating(&MojoAsyncResourceHandler::SendUploadProgress, 225 base::BindRepeating(&MojoAsyncResourceHandler::SendUploadProgress,
220 base::Unretained(this))); 226 base::Unretained(this)));
221 } 227 }
222 228
223 return true; 229 controller->Resume();
224 } 230 }
225 231
226 bool MojoAsyncResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, 232 bool MojoAsyncResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf,
227 int* buf_size, 233 int* buf_size,
228 int min_size) { 234 int min_size) {
229 DCHECK_EQ(-1, min_size); 235 DCHECK_EQ(-1, min_size);
230 236
237 // TODO(mmenke): Cancel with net::ERR_INSUFFICIENT_RESOURCES instead.
231 if (!CheckForSufficientResource()) 238 if (!CheckForSufficientResource())
232 return false; 239 return false;
233 240
234 if (!shared_writer_) { 241 if (!shared_writer_) {
235 MojoCreateDataPipeOptions options; 242 MojoCreateDataPipeOptions options;
236 options.struct_size = sizeof(MojoCreateDataPipeOptions); 243 options.struct_size = sizeof(MojoCreateDataPipeOptions);
237 options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; 244 options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE;
238 options.element_num_bytes = 1; 245 options.element_num_bytes = 1;
239 options.capacity_num_bytes = g_allocation_size; 246 options.capacity_num_bytes = g_allocation_size;
240 mojo::DataPipe data_pipe(options); 247 mojo::DataPipe data_pipe(options);
(...skipping 26 matching lines...) Expand all
267 is_using_io_buffer_not_from_writer_ = true; 274 is_using_io_buffer_not_from_writer_ = true;
268 buffer_ = new net::IOBufferWithSize(kMinAllocationSize); 275 buffer_ = new net::IOBufferWithSize(kMinAllocationSize);
269 } 276 }
270 277
271 DCHECK_EQ(0u, buffer_offset_); 278 DCHECK_EQ(0u, buffer_offset_);
272 *buf = buffer_; 279 *buf = buffer_;
273 *buf_size = buffer_->size(); 280 *buf_size = buffer_->size();
274 return true; 281 return true;
275 } 282 }
276 283
277 bool MojoAsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { 284 void MojoAsyncResourceHandler::OnReadCompleted(
285 int bytes_read,
286 std::unique_ptr<ResourceController> controller) {
287 DCHECK(!has_controller());
278 DCHECK_GE(bytes_read, 0); 288 DCHECK_GE(bytes_read, 0);
279 DCHECK(buffer_); 289 DCHECK(buffer_);
280 290
281 if (!bytes_read) 291 if (!bytes_read) {
282 return true; 292 controller->Resume();
293 return;
294 }
283 295
284 const ResourceRequestInfoImpl* info = GetRequestInfo(); 296 const ResourceRequestInfoImpl* info = GetRequestInfo();
285 if (info->ShouldReportRawHeaders()) { 297 if (info->ShouldReportRawHeaders()) {
286 auto transfer_size_diff = CalculateRecentlyReceivedBytes(); 298 auto transfer_size_diff = CalculateRecentlyReceivedBytes();
287 if (transfer_size_diff > 0) 299 if (transfer_size_diff > 0)
288 url_loader_client_->OnTransferSizeUpdated(transfer_size_diff); 300 url_loader_client_->OnTransferSizeUpdated(transfer_size_diff);
289 } 301 }
290 302
291 if (response_body_consumer_handle_.is_valid()) { 303 if (response_body_consumer_handle_.is_valid()) {
292 // Send the data pipe on the first OnReadCompleted call. 304 // Send the data pipe on the first OnReadCompleted call.
293 url_loader_client_->OnStartLoadingResponseBody( 305 url_loader_client_->OnStartLoadingResponseBody(
294 std::move(response_body_consumer_handle_)); 306 std::move(response_body_consumer_handle_));
295 response_body_consumer_handle_.reset(); 307 response_body_consumer_handle_.reset();
296 } 308 }
297 309
298 if (is_using_io_buffer_not_from_writer_) { 310 if (is_using_io_buffer_not_from_writer_) {
299 // Couldn't allocate a buffer on the data pipe in OnWillRead. 311 // Couldn't allocate a buffer on the data pipe in OnWillRead.
300 DCHECK_EQ(0u, buffer_bytes_read_); 312 DCHECK_EQ(0u, buffer_bytes_read_);
301 buffer_bytes_read_ = bytes_read; 313 buffer_bytes_read_ = bytes_read;
302 if (!CopyReadDataToDataPipe(defer)) 314 bool defer = false;
303 return false; 315 if (!CopyReadDataToDataPipe(&defer)) {
304 if (*defer) { 316 controller->Cancel();
317 return;
318 }
319 if (defer) {
305 request()->LogBlockedBy("MojoAsyncResourceHandler"); 320 request()->LogBlockedBy("MojoAsyncResourceHandler");
306 did_defer_on_writing_ = true; 321 did_defer_on_writing_ = true;
322 HoldController(std::move(controller));
323 return;
307 } 324 }
308 return true; 325 controller->Resume();
326 return;
309 } 327 }
310 328
311 if (EndWrite(bytes_read) != MOJO_RESULT_OK) 329 if (EndWrite(bytes_read) != MOJO_RESULT_OK) {
312 return false; 330 controller->Cancel();
331 return;
332 }
313 // Allocate a buffer for the next OnWillRead call here, because OnWillRead 333 // Allocate a buffer for the next OnWillRead call here, because OnWillRead
314 // doesn't have |defer| parameter. 334 // doesn't have |defer| parameter.
315 if (!AllocateWriterIOBuffer(&buffer_, defer)) 335 bool defer = false;
316 return false; 336 if (!AllocateWriterIOBuffer(&buffer_, &defer)) {
317 if (*defer) { 337 controller->Cancel();
338 return;
339 }
340 if (defer) {
318 request()->LogBlockedBy("MojoAsyncResourceHandler"); 341 request()->LogBlockedBy("MojoAsyncResourceHandler");
319 did_defer_on_writing_ = true; 342 did_defer_on_writing_ = true;
343 HoldController(std::move(controller));
344 return;
320 } 345 }
321 return true; 346
347 controller->Resume();
322 } 348 }
323 349
324 void MojoAsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { 350 void MojoAsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) {
325 url_loader_client_->OnDataDownloaded(bytes_downloaded, 351 url_loader_client_->OnDataDownloaded(bytes_downloaded,
326 CalculateRecentlyReceivedBytes()); 352 CalculateRecentlyReceivedBytes());
327 } 353 }
328 354
329 void MojoAsyncResourceHandler::FollowRedirect() { 355 void MojoAsyncResourceHandler::FollowRedirect() {
330 if (!request()->status().is_success()) { 356 if (!request()->status().is_success()) {
331 DVLOG(1) << "FollowRedirect for invalid request"; 357 DVLOG(1) << "FollowRedirect for invalid request";
332 return; 358 return;
333 } 359 }
334 if (!did_defer_on_redirect_) { 360 if (!did_defer_on_redirect_) {
335 DVLOG(1) << "Malformed FollowRedirect request"; 361 DVLOG(1) << "Malformed FollowRedirect request";
336 ReportBadMessage("Malformed FollowRedirect request"); 362 ReportBadMessage("Malformed FollowRedirect request");
337 return; 363 return;
338 } 364 }
339 365
340 DCHECK(!did_defer_on_writing_); 366 DCHECK(!did_defer_on_writing_);
341 did_defer_on_redirect_ = false; 367 did_defer_on_redirect_ = false;
342 request()->LogUnblocked(); 368 request()->LogUnblocked();
343 controller()->Resume(); 369 Resume();
344 } 370 }
345 371
346 void MojoAsyncResourceHandler::SetPriority(net::RequestPriority priority, 372 void MojoAsyncResourceHandler::SetPriority(net::RequestPriority priority,
347 int32_t intra_priority_value) { 373 int32_t intra_priority_value) {
348 ResourceDispatcherHostImpl::Get()->scheduler()->ReprioritizeRequest( 374 ResourceDispatcherHostImpl::Get()->scheduler()->ReprioritizeRequest(
349 request(), priority, intra_priority_value); 375 request(), priority, intra_priority_value);
350 } 376 }
351 377
352 void MojoAsyncResourceHandler::OnWritableForTesting() { 378 void MojoAsyncResourceHandler::OnWritableForTesting() {
353 OnWritable(MOJO_RESULT_OK); 379 OnWritable(MOJO_RESULT_OK);
(...skipping 16 matching lines...) Expand all
370 return mojo::EndWriteDataRaw(shared_writer_->writer(), written); 396 return mojo::EndWriteDataRaw(shared_writer_->writer(), written);
371 } 397 }
372 398
373 net::IOBufferWithSize* MojoAsyncResourceHandler::GetResponseMetadata( 399 net::IOBufferWithSize* MojoAsyncResourceHandler::GetResponseMetadata(
374 net::URLRequest* request) { 400 net::URLRequest* request) {
375 return request->response_info().metadata.get(); 401 return request->response_info().metadata.get();
376 } 402 }
377 403
378 void MojoAsyncResourceHandler::OnResponseCompleted( 404 void MojoAsyncResourceHandler::OnResponseCompleted(
379 const net::URLRequestStatus& status, 405 const net::URLRequestStatus& status,
380 bool* defer) { 406 std::unique_ptr<ResourceController> controller) {
381 // Ensure sending the final upload progress message here, since 407 // Ensure sending the final upload progress message here, since
382 // OnResponseCompleted can be called without OnResponseStarted on cancellation 408 // OnResponseCompleted can be called without OnResponseStarted on cancellation
383 // or error cases. 409 // or error cases.
384 if (upload_progress_tracker_) { 410 if (upload_progress_tracker_) {
385 upload_progress_tracker_->OnUploadCompleted(); 411 upload_progress_tracker_->OnUploadCompleted();
386 upload_progress_tracker_ = nullptr; 412 upload_progress_tracker_ = nullptr;
387 } 413 }
388 414
389 shared_writer_ = nullptr; 415 shared_writer_ = nullptr;
390 buffer_ = nullptr; 416 buffer_ = nullptr;
(...skipping 21 matching lines...) Expand all
412 ResourceRequestCompletionStatus request_complete_data; 438 ResourceRequestCompletionStatus request_complete_data;
413 request_complete_data.error_code = error_code; 439 request_complete_data.error_code = error_code;
414 request_complete_data.was_ignored_by_handler = was_ignored_by_handler; 440 request_complete_data.was_ignored_by_handler = was_ignored_by_handler;
415 request_complete_data.exists_in_cache = request()->response_info().was_cached; 441 request_complete_data.exists_in_cache = request()->response_info().was_cached;
416 request_complete_data.completion_time = base::TimeTicks::Now(); 442 request_complete_data.completion_time = base::TimeTicks::Now();
417 request_complete_data.encoded_data_length = 443 request_complete_data.encoded_data_length =
418 request()->GetTotalReceivedBytes(); 444 request()->GetTotalReceivedBytes();
419 request_complete_data.encoded_body_length = request()->GetRawBodyBytes(); 445 request_complete_data.encoded_body_length = request()->GetRawBodyBytes();
420 446
421 url_loader_client_->OnComplete(request_complete_data); 447 url_loader_client_->OnComplete(request_complete_data);
448 controller->Resume();
422 } 449 }
423 450
424 bool MojoAsyncResourceHandler::CopyReadDataToDataPipe(bool* defer) { 451 bool MojoAsyncResourceHandler::CopyReadDataToDataPipe(bool* defer) {
425 while (true) { 452 while (true) {
426 scoped_refptr<net::IOBufferWithSize> dest; 453 scoped_refptr<net::IOBufferWithSize> dest;
427 if (!AllocateWriterIOBuffer(&dest, defer)) 454 if (!AllocateWriterIOBuffer(&dest, defer))
428 return false; 455 return false;
429 if (*defer) 456 if (*defer)
430 return true; 457 return true;
431 if (buffer_bytes_read_ == 0) { 458 if (buffer_bytes_read_ == 0) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 } 494 }
468 495
469 bool MojoAsyncResourceHandler::CheckForSufficientResource() { 496 bool MojoAsyncResourceHandler::CheckForSufficientResource() {
470 if (has_checked_for_sufficient_resources_) 497 if (has_checked_for_sufficient_resources_)
471 return true; 498 return true;
472 has_checked_for_sufficient_resources_ = true; 499 has_checked_for_sufficient_resources_ = true;
473 500
474 if (rdh_->HasSufficientResourcesForRequest(request())) 501 if (rdh_->HasSufficientResourcesForRequest(request()))
475 return true; 502 return true;
476 503
477 controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES);
478 return false; 504 return false;
479 } 505 }
480 506
481 void MojoAsyncResourceHandler::OnWritable(MojoResult result) { 507 void MojoAsyncResourceHandler::OnWritable(MojoResult result) {
482 if (!did_defer_on_writing_) 508 if (!did_defer_on_writing_)
483 return; 509 return;
510 DCHECK(has_controller());
484 DCHECK(!did_defer_on_redirect_); 511 DCHECK(!did_defer_on_redirect_);
485 did_defer_on_writing_ = false; 512 did_defer_on_writing_ = false;
486 513
487 if (is_using_io_buffer_not_from_writer_) { 514 if (is_using_io_buffer_not_from_writer_) {
488 // |buffer_| is set to a net::IOBufferWithSize. Write the buffer contents 515 // |buffer_| is set to a net::IOBufferWithSize. Write the buffer contents
489 // to the data pipe. 516 // to the data pipe.
490 DCHECK_GT(buffer_bytes_read_, 0u); 517 DCHECK_GT(buffer_bytes_read_, 0u);
491 if (!CopyReadDataToDataPipe(&did_defer_on_writing_)) { 518 if (!CopyReadDataToDataPipe(&did_defer_on_writing_)) {
492 controller()->CancelWithError(net::ERR_FAILED); 519 CancelWithError(net::ERR_FAILED);
493 return; 520 return;
494 } 521 }
495 } else { 522 } else {
496 // Allocate a buffer for the next OnWillRead call here. 523 // Allocate a buffer for the next OnWillRead call here.
497 if (!AllocateWriterIOBuffer(&buffer_, &did_defer_on_writing_)) { 524 if (!AllocateWriterIOBuffer(&buffer_, &did_defer_on_writing_)) {
498 controller()->CancelWithError(net::ERR_FAILED); 525 CancelWithError(net::ERR_FAILED);
499 return; 526 return;
500 } 527 }
501 } 528 }
502 529
503 if (did_defer_on_writing_) { 530 if (did_defer_on_writing_) {
504 // Continue waiting. 531 // Continue waiting.
505 return; 532 return;
506 } 533 }
507 request()->LogUnblocked(); 534 request()->LogUnblocked();
508 controller()->Resume(); 535 Resume();
509 } 536 }
510 537
511 void MojoAsyncResourceHandler::Cancel() { 538 void MojoAsyncResourceHandler::Cancel() {
512 const ResourceRequestInfoImpl* info = GetRequestInfo(); 539 const ResourceRequestInfoImpl* info = GetRequestInfo();
513 ResourceDispatcherHostImpl::Get()->CancelRequestFromRenderer( 540 ResourceDispatcherHostImpl::Get()->CancelRequestFromRenderer(
514 GlobalRequestID(info->GetChildID(), info->GetRequestID())); 541 GlobalRequestID(info->GetChildID(), info->GetRequestID()));
515 } 542 }
516 543
517 int64_t MojoAsyncResourceHandler::CalculateRecentlyReceivedBytes() { 544 int64_t MojoAsyncResourceHandler::CalculateRecentlyReceivedBytes() {
518 int64_t total_received_bytes = request()->GetTotalReceivedBytes(); 545 int64_t total_received_bytes = request()->GetTotalReceivedBytes();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
552 base::Bind(&MojoAsyncResourceHandler::OnUploadProgressACK, 579 base::Bind(&MojoAsyncResourceHandler::OnUploadProgressACK,
553 weak_factory_.GetWeakPtr())); 580 weak_factory_.GetWeakPtr()));
554 } 581 }
555 582
556 void MojoAsyncResourceHandler::OnUploadProgressACK() { 583 void MojoAsyncResourceHandler::OnUploadProgressACK() {
557 if (upload_progress_tracker_) 584 if (upload_progress_tracker_)
558 upload_progress_tracker_->OnAckReceived(); 585 upload_progress_tracker_->OnAckReceived();
559 } 586 }
560 587
561 } // namespace content 588 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/mojo_async_resource_handler.h ('k') | content/browser/loader/mojo_async_resource_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698