OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/resource_loader.h" | 5 #include "content/browser/loader/resource_loader.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
349 } | 349 } |
350 | 350 |
351 CompleteResponseStarted(); | 351 CompleteResponseStarted(); |
352 | 352 |
353 // If the handler deferred the request, it will resume the request later. If | 353 // If the handler deferred the request, it will resume the request later. If |
354 // the request was cancelled, the request will call back into |this| with a | 354 // the request was cancelled, the request will call back into |this| with a |
355 // bogus read completed error. | 355 // bogus read completed error. |
356 if (is_deferred() || !request_->status().is_success()) | 356 if (is_deferred() || !request_->status().is_success()) |
357 return; | 357 return; |
358 | 358 |
359 StartReading(false); // Read the first chunk. | 359 ReadMore(false); // Read the first chunk. |
360 } | 360 } |
361 | 361 |
362 void ResourceLoader::OnReadCompleted(net::URLRequest* unused, int bytes_read) { | 362 void ResourceLoader::OnReadCompleted(net::URLRequest* unused, int bytes_read) { |
363 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("loading"), | 363 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("loading"), |
364 "ResourceLoader::OnReadCompleted"); | 364 "ResourceLoader::OnReadCompleted"); |
365 DCHECK_EQ(request_.get(), unused); | 365 DCHECK_EQ(request_.get(), unused); |
366 DVLOG(1) << "OnReadCompleted: \"" << request_->url().spec() << "\"" | 366 DVLOG(1) << "OnReadCompleted: \"" << request_->url().spec() << "\"" |
367 << " bytes_read = " << bytes_read; | 367 << " bytes_read = " << bytes_read; |
368 | 368 |
369 // bytes_read == -1 always implies an error. | 369 // bytes_read == -1 always implies an error. |
370 if (bytes_read == -1 || !request_->status().is_success()) { | 370 if (bytes_read == -1 || !request_->status().is_success()) { |
371 ResponseCompleted(); | 371 ResponseCompleted(); |
372 return; | 372 return; |
373 } | 373 } |
374 | 374 |
375 CompleteRead(bytes_read); | 375 CompleteRead(bytes_read); |
376 | 376 |
377 // If the handler cancelled or deferred the request, do not continue | 377 // If the handler cancelled or deferred the request, do not continue |
378 // processing the read. If canceled, either the request will call into |this| | 378 // processing the read. If canceled, either the request will call into |this| |
379 // with a bogus read error, or, if the request was completed, a task posted | 379 // with a bogus read error, or, if the request was completed, a task posted |
380 // from ResourceLoader::CancelREquestInternal will run OnResponseCompleted. | 380 // from ResourceLoader::CancelREquestInternal will run OnResponseCompleted. |
381 if (is_deferred() || !request_->status().is_success()) | 381 if (is_deferred() || !request_->status().is_success()) |
382 return; | 382 return; |
383 | 383 |
384 if (bytes_read > 0) { | 384 if (bytes_read > 0) { |
385 StartReading(true); // Read the next chunk. | 385 ReadMore(true); // Read the next chunk. |
386 } else { | 386 } else { |
387 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed. | 387 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed. |
388 tracked_objects::ScopedTracker tracking_profile( | 388 tracked_objects::ScopedTracker tracking_profile( |
389 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 ResponseCompleted()")); | 389 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 ResponseCompleted()")); |
390 | 390 |
391 // URLRequest reported an EOF. Call ResponseCompleted. | 391 // URLRequest reported an EOF. Call ResponseCompleted. |
392 DCHECK_EQ(0, bytes_read); | 392 DCHECK_EQ(0, bytes_read); |
393 ResponseCompleted(); | 393 ResponseCompleted(); |
394 } | 394 } |
395 } | 395 } |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
547 | 547 |
548 bool defer = false; | 548 bool defer = false; |
549 if (!handler_->OnResponseStarted(response.get(), &defer)) { | 549 if (!handler_->OnResponseStarted(response.get(), &defer)) { |
550 Cancel(); | 550 Cancel(); |
551 } else if (defer) { | 551 } else if (defer) { |
552 read_deferral_start_time_ = base::TimeTicks::Now(); | 552 read_deferral_start_time_ = base::TimeTicks::Now(); |
553 deferred_stage_ = DEFERRED_READ; // Read first chunk when resumed. | 553 deferred_stage_ = DEFERRED_READ; // Read first chunk when resumed. |
554 } | 554 } |
555 } | 555 } |
556 | 556 |
557 void ResourceLoader::StartReading(bool is_continuation) { | 557 void ResourceLoader::ReadMore(bool is_continuation) { |
Randy Smith (Not in Mondays)
2016/12/06 23:44:43
This file looks like pure refactoring rather than
mmenke
2016/12/07 16:17:15
In the cancel path from the old ReadMore(), we wan
| |
558 int bytes_read = 0; | |
559 ReadMore(&bytes_read); | |
560 | |
561 // If IO is pending, wait for the URLRequest to call OnReadCompleted. | |
562 // On error or cancellation, wait for notification of failure. | |
563 if (request_->status().is_io_pending() || !request_->status().is_success()) | |
564 return; | |
565 | |
566 if (!is_continuation || bytes_read <= 0) { | |
567 OnReadCompleted(request_.get(), bytes_read); | |
568 } else { | |
569 // Else, trigger OnReadCompleted asynchronously to avoid starving the IO | |
570 // thread in case the URLRequest can provide data synchronously. | |
571 base::ThreadTaskRunnerHandle::Get()->PostTask( | |
572 FROM_HERE, | |
573 base::Bind(&ResourceLoader::OnReadCompleted, | |
574 weak_ptr_factory_.GetWeakPtr(), request_.get(), bytes_read)); | |
575 } | |
576 } | |
577 | |
578 void ResourceLoader::ResumeReading() { | |
579 DCHECK(!is_deferred()); | |
580 | |
581 if (!read_deferral_start_time_.is_null()) { | |
582 UMA_HISTOGRAM_TIMES("Net.ResourceLoader.ReadDeferral", | |
583 base::TimeTicks::Now() - read_deferral_start_time_); | |
584 read_deferral_start_time_ = base::TimeTicks(); | |
585 } | |
586 if (request_->status().is_success()) { | |
587 StartReading(false); // Read the next chunk (OK to complete synchronously). | |
588 } else { | |
589 ResponseCompleted(); | |
590 } | |
591 } | |
592 | |
593 void ResourceLoader::ReadMore(int* bytes_read) { | |
594 TRACE_EVENT_WITH_FLOW0("loading", "ResourceLoader::ReadMore", this, | 558 TRACE_EVENT_WITH_FLOW0("loading", "ResourceLoader::ReadMore", this, |
595 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); | 559 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); |
596 DCHECK(!is_deferred()); | 560 DCHECK(!is_deferred()); |
597 | 561 |
598 // Make sure we track the buffer in at least one place. This ensures it gets | 562 // Make sure we track the buffer in at least one place. This ensures it gets |
599 // deleted even in the case the request has already finished its job and | 563 // deleted even in the case the request has already finished its job and |
600 // doesn't use the buffer. | 564 // doesn't use the buffer. |
601 scoped_refptr<net::IOBuffer> buf; | 565 scoped_refptr<net::IOBuffer> buf; |
602 int buf_size; | 566 int buf_size; |
603 { | 567 { |
604 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed. | 568 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed. |
605 tracked_objects::ScopedTracker tracking_profile2( | 569 tracked_objects::ScopedTracker tracking_profile2( |
606 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnWillRead()")); | 570 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnWillRead()")); |
607 | 571 |
608 if (!handler_->OnWillRead(&buf, &buf_size, -1)) { | 572 if (!handler_->OnWillRead(&buf, &buf_size, -1)) { |
573 // Cancel the request, which will then call back into |this| to it of | |
Randy Smith (Not in Mondays)
2016/12/06 23:44:43
nit: "to it"?
mmenke
2016/12/07 16:17:15
Done.
| |
574 // a "read error". | |
609 Cancel(); | 575 Cancel(); |
610 return; | 576 return; |
611 } | 577 } |
612 } | 578 } |
613 | 579 |
614 DCHECK(buf.get()); | 580 DCHECK(buf.get()); |
615 DCHECK(buf_size > 0); | 581 DCHECK(buf_size > 0); |
616 | 582 |
617 request_->Read(buf.get(), buf_size, bytes_read); | 583 int result = request_->Read(buf.get(), buf_size); |
618 | 584 |
619 // No need to check the return value here as we'll detect errors by | 585 if (result == net::ERR_IO_PENDING) |
620 // inspecting the URLRequest's status. | 586 return; |
587 | |
588 if (!is_continuation || result <= 0) { | |
589 OnReadCompleted(request_.get(), result); | |
590 } else { | |
591 // Else, trigger OnReadCompleted asynchronously to avoid starving the IO | |
592 // thread in case the URLRequest can provide data synchronously. | |
593 base::ThreadTaskRunnerHandle::Get()->PostTask( | |
594 FROM_HERE, | |
595 base::Bind(&ResourceLoader::OnReadCompleted, | |
596 weak_ptr_factory_.GetWeakPtr(), request_.get(), result)); | |
597 } | |
598 } | |
599 | |
600 void ResourceLoader::ResumeReading() { | |
601 DCHECK(!is_deferred()); | |
602 | |
603 if (!read_deferral_start_time_.is_null()) { | |
604 UMA_HISTOGRAM_TIMES("Net.ResourceLoader.ReadDeferral", | |
605 base::TimeTicks::Now() - read_deferral_start_time_); | |
606 read_deferral_start_time_ = base::TimeTicks(); | |
607 } | |
608 if (request_->status().is_success()) { | |
609 ReadMore(false); // Read the next chunk (OK to complete synchronously). | |
610 } else { | |
611 ResponseCompleted(); | |
612 } | |
621 } | 613 } |
622 | 614 |
623 void ResourceLoader::CompleteRead(int bytes_read) { | 615 void ResourceLoader::CompleteRead(int bytes_read) { |
624 TRACE_EVENT_WITH_FLOW0("loading", "ResourceLoader::CompleteRead", this, | 616 TRACE_EVENT_WITH_FLOW0("loading", "ResourceLoader::CompleteRead", this, |
625 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); | 617 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); |
626 | 618 |
627 DCHECK(bytes_read >= 0); | 619 DCHECK(bytes_read >= 0); |
628 DCHECK(request_->status().is_success()); | 620 DCHECK(request_->status().is_success()); |
629 | 621 |
630 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed. | 622 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed. |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
735 UMA_HISTOGRAM_ENUMERATION("Net.Prefetch.Pattern", prefetch_status, | 727 UMA_HISTOGRAM_ENUMERATION("Net.Prefetch.Pattern", prefetch_status, |
736 STATUS_MAX); | 728 STATUS_MAX); |
737 } | 729 } |
738 } else if (request_->response_info().unused_since_prefetch) { | 730 } else if (request_->response_info().unused_since_prefetch) { |
739 TimeDelta total_time = base::TimeTicks::Now() - request_->creation_time(); | 731 TimeDelta total_time = base::TimeTicks::Now() - request_->creation_time(); |
740 UMA_HISTOGRAM_TIMES("Net.Prefetch.TimeSpentOnPrefetchHit", total_time); | 732 UMA_HISTOGRAM_TIMES("Net.Prefetch.TimeSpentOnPrefetchHit", total_time); |
741 } | 733 } |
742 } | 734 } |
743 | 735 |
744 } // namespace content | 736 } // namespace content |
OLD | NEW |