Chromium Code Reviews| Index: net/base/network_quality_estimator.cc |
| diff --git a/net/base/network_quality_estimator.cc b/net/base/network_quality_estimator.cc |
| index 6415ee6e6d7eb36b47ab4fd568d3537283b27729..cf3fdacf3d0bd26304a3f0c2ef4e18860adf75dc 100644 |
| --- a/net/base/network_quality_estimator.cc |
| +++ b/net/base/network_quality_estimator.cc |
| @@ -8,6 +8,7 @@ |
| #include "base/logging.h" |
| #include "base/metrics/histogram.h" |
| +#include "net/base/load_timing_info.h" |
| #include "net/base/net_util.h" |
| #include "net/base/network_quality.h" |
| #include "net/url_request/url_request.h" |
| @@ -52,22 +53,49 @@ void NetworkQualityEstimator::NotifyDataReceived(const URLRequest& request, |
| } |
| base::TimeTicks now = base::TimeTicks::Now(); |
| - base::TimeDelta request_duration = now - request.creation_time(); |
| - DCHECK_GE(request_duration, base::TimeDelta()); |
| + |
| + LoadTimingInfo load_timing_info; |
| + request.GetLoadTimingInfo(&load_timing_info); |
| + |
| + // Time when the resource was requested. Use the timings from LoadTimingInfo, |
| + // if it is available since it is recorded after DNS is resolved and secure |
|
bengr
2015/06/11 00:22:58
secure -> a secure
tbansal1
2015/06/11 03:01:36
Done.
|
| + // connection is established. |
| + base::TimeTicks request_start_time = !load_timing_info.send_start.is_null() |
| + ? load_timing_info.send_start |
| + : request.creation_time(); |
| + DCHECK(!request_start_time.is_null()); |
| + |
| + // Time when the headers were received. Use timings from LoadTimingInfo, if |
|
bengr
2015/06/11 00:22:58
Are they available at this point? When wouldn't th
tbansal1
2015/06/11 03:01:35
I think they are MOSTLY available, except for one
|
| + // available. |
| + base::TimeTicks headers_received_time = |
| + !load_timing_info.receive_headers_end.is_null() |
| + ? load_timing_info.receive_headers_end |
| + : now; |
| + DCHECK(!headers_received_time.is_null()); |
| + |
| + // Duration between when the resource was requested and when response headers |
| + // were received. |
| + base::TimeDelta observed_rtt = headers_received_time - request_start_time; |
| + DCHECK_GE(observed_rtt, base::TimeDelta()); |
| + |
| + // Time since the resource was requested. |
| + base::TimeDelta since_request_start = now - request_start_time; |
| + DCHECK_GE(since_request_start, base::TimeDelta()); |
| + |
| if (!bytes_read_since_last_connection_change_) |
| - fastest_RTT_since_last_connection_change_ = request_duration; |
| + fastest_RTT_since_last_connection_change_ = observed_rtt; |
| bytes_read_since_last_connection_change_ = true; |
| - if (request_duration < fastest_RTT_since_last_connection_change_) |
| - fastest_RTT_since_last_connection_change_ = request_duration; |
| + if (observed_rtt < fastest_RTT_since_last_connection_change_) |
| + fastest_RTT_since_last_connection_change_ = observed_rtt; |
| // Ignore tiny transfers which will not produce accurate rates. |
| // Ignore short duration transfers. |
| if (prefilter_bytes_read >= kMinTransferSizeInBytes && |
| - request_duration >= |
| + since_request_start >= |
| base::TimeDelta::FromMicroseconds(kMinRequestDurationMicroseconds)) { |
| uint64_t kbps = static_cast<uint64_t>(prefilter_bytes_read * 8 * 1000 / |
| - request_duration.InMicroseconds()); |
| + since_request_start.InMicroseconds()); |
| if (kbps > peak_kbps_since_last_connection_change_) |
| peak_kbps_since_last_connection_change_ = kbps; |
| } |