Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/predictors/resource_prefetcher.h" | 5 #include "chrome/browser/predictors/resource_prefetcher.h" |
| 6 | 6 |
| 7 #include <algorithm> | |
| 7 #include <iterator> | 8 #include <iterator> |
| 8 #include <utility> | 9 #include <utility> |
| 9 | 10 |
| 10 #include "base/metrics/histogram_macros.h" | 11 #include "base/metrics/histogram_macros.h" |
| 11 #include "base/trace_event/trace_event.h" | 12 #include "base/trace_event/trace_event.h" |
| 12 #include "content/public/browser/browser_thread.h" | 13 #include "content/public/browser/browser_thread.h" |
| 13 #include "net/base/io_buffer.h" | 14 #include "net/base/io_buffer.h" |
| 14 #include "net/base/load_flags.h" | 15 #include "net/base/load_flags.h" |
| 15 #include "net/base/request_priority.h" | 16 #include "net/base/request_priority.h" |
| 16 #include "net/url_request/url_request_context.h" | 17 #include "net/url_request/url_request_context.h" |
| 17 #include "url/origin.h" | 18 #include "url/origin.h" |
| 18 | 19 |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| 21 // The size of the buffer used to read the resource. | 22 // The size of the buffer used to read the resource. |
| 22 static const size_t kResourceBufferSizeBytes = 50000; | 23 static const size_t kResourceBufferSizeBytes = 50000; |
| 23 | 24 |
| 24 } // namespace | 25 } // namespace |
| 25 | 26 |
| 26 namespace predictors { | 27 namespace predictors { |
| 27 | 28 |
| 29 ResourcePrefetcher::PrefetchedRequestStats::PrefetchedRequestStats( | |
| 30 const GURL& resource_url, | |
| 31 bool was_cached, | |
| 32 size_t total_received_bytes) | |
| 33 : resource_url(resource_url), | |
| 34 was_cached(was_cached), | |
| 35 total_received_bytes(total_received_bytes) {} // | |
|
alexilin
2017/02/09 15:24:18
What is "//" for?
Benoit L
2017/02/13 16:13:15
Oops.
Done.
| |
| 36 | |
| 37 ResourcePrefetcher::PrefetchedRequestStats::~PrefetchedRequestStats() {} | |
| 38 | |
| 39 ResourcePrefetcher::PrefetcherStats::PrefetcherStats(const GURL& url) | |
| 40 : url(url) {} | |
| 41 | |
| 42 ResourcePrefetcher::PrefetcherStats::~PrefetcherStats() {} | |
| 43 | |
| 44 ResourcePrefetcher::PrefetcherStats::PrefetcherStats( | |
| 45 const PrefetcherStats& other) | |
| 46 : url(other.url), | |
| 47 start_time(other.start_time), | |
| 48 requests_stats(other.requests_stats) {} | |
| 49 | |
| 28 ResourcePrefetcher::ResourcePrefetcher( | 50 ResourcePrefetcher::ResourcePrefetcher( |
| 29 Delegate* delegate, | 51 Delegate* delegate, |
| 30 const ResourcePrefetchPredictorConfig& config, | 52 const ResourcePrefetchPredictorConfig& config, |
| 31 const GURL& main_frame_url, | 53 const GURL& main_frame_url, |
| 32 const std::vector<GURL>& urls) | 54 const std::vector<GURL>& urls) |
| 33 : state_(INITIALIZED), | 55 : state_(INITIALIZED), |
| 34 delegate_(delegate), | 56 delegate_(delegate), |
| 35 config_(config), | 57 config_(config), |
| 36 main_frame_url_(main_frame_url), | 58 main_frame_url_(main_frame_url), |
| 37 prefetched_count_(0), | 59 prefetched_count_(0), |
| 38 prefetched_bytes_(0) { | 60 prefetched_bytes_(0), |
| 61 stats_(main_frame_url) { | |
| 39 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 62 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 40 | 63 |
| 41 std::copy(urls.begin(), urls.end(), std::back_inserter(request_queue_)); | 64 std::copy(urls.begin(), urls.end(), std::back_inserter(request_queue_)); |
| 42 } | 65 } |
| 43 | 66 |
| 44 ResourcePrefetcher::~ResourcePrefetcher() {} | 67 ResourcePrefetcher::~ResourcePrefetcher() {} |
| 45 | 68 |
| 46 void ResourcePrefetcher::Start() { | 69 void ResourcePrefetcher::Start() { |
| 47 TRACE_EVENT_ASYNC_BEGIN0("browser", "ResourcePrefetcher::Prefetch", this); | 70 TRACE_EVENT_ASYNC_BEGIN0("browser", "ResourcePrefetcher::Prefetch", this); |
| 48 DCHECK(thread_checker_.CalledOnValidThread()); | 71 DCHECK(thread_checker_.CalledOnValidThread()); |
| 49 | 72 |
| 50 CHECK_EQ(state_, INITIALIZED); | 73 CHECK_EQ(state_, INITIALIZED); |
| 51 state_ = RUNNING; | 74 state_ = RUNNING; |
| 52 | 75 |
| 76 stats_.start_time = base::TimeTicks::Now(); | |
| 53 TryToLaunchPrefetchRequests(); | 77 TryToLaunchPrefetchRequests(); |
| 54 } | 78 } |
| 55 | 79 |
| 56 void ResourcePrefetcher::Stop() { | 80 void ResourcePrefetcher::Stop() { |
| 57 TRACE_EVENT_ASYNC_END0("browser", "ResourcePrefetcher::Prefetch", this); | 81 TRACE_EVENT_ASYNC_END0("browser", "ResourcePrefetcher::Prefetch", this); |
| 58 DCHECK(thread_checker_.CalledOnValidThread()); | 82 DCHECK(thread_checker_.CalledOnValidThread()); |
| 59 | 83 |
| 60 if (state_ == FINISHED) | 84 if (state_ == FINISHED) |
| 61 return; | 85 return; |
| 62 | 86 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 103 CHECK(request_queue_.empty() || state_ == STOPPED); | 127 CHECK(request_queue_.empty() || state_ == STOPPED); |
| 104 | 128 |
| 105 UMA_HISTOGRAM_COUNTS_100( | 129 UMA_HISTOGRAM_COUNTS_100( |
| 106 internal::kResourcePrefetchPredictorPrefetchedCountHistogram, | 130 internal::kResourcePrefetchPredictorPrefetchedCountHistogram, |
| 107 prefetched_count_); | 131 prefetched_count_); |
| 108 UMA_HISTOGRAM_COUNTS_10000( | 132 UMA_HISTOGRAM_COUNTS_10000( |
| 109 internal::kResourcePrefetchPredictorPrefetchedSizeHistogram, | 133 internal::kResourcePrefetchPredictorPrefetchedSizeHistogram, |
| 110 prefetched_bytes_ / 1024); | 134 prefetched_bytes_ / 1024); |
| 111 | 135 |
| 112 state_ = FINISHED; | 136 state_ = FINISHED; |
| 113 delegate_->ResourcePrefetcherFinished(this); | 137 delegate_->ResourcePrefetcherFinished(this, stats_); |
| 114 } | 138 } |
| 115 } | 139 } |
| 116 | 140 |
| 117 void ResourcePrefetcher::SendRequest(const GURL& url) { | 141 void ResourcePrefetcher::SendRequest(const GURL& url) { |
| 118 std::unique_ptr<net::URLRequest> url_request = | 142 std::unique_ptr<net::URLRequest> url_request = |
| 119 delegate_->GetURLRequestContext()->CreateRequest(url, net::LOW, this); | 143 delegate_->GetURLRequestContext()->CreateRequest(url, net::LOW, this); |
| 120 host_inflight_counts_[url.host()] += 1; | 144 host_inflight_counts_[url.host()] += 1; |
| 121 | 145 |
| 122 url_request->set_method("GET"); | 146 url_request->set_method("GET"); |
| 123 url_request->set_first_party_for_cookies(main_frame_url_); | 147 url_request->set_first_party_for_cookies(main_frame_url_); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 157 kResourceBufferSizeBytes)); | 181 kResourceBufferSizeBytes)); |
| 158 bytes_read = request->Read(buffer.get(), kResourceBufferSizeBytes); | 182 bytes_read = request->Read(buffer.get(), kResourceBufferSizeBytes); |
| 159 if (bytes_read == net::ERR_IO_PENDING) { | 183 if (bytes_read == net::ERR_IO_PENDING) { |
| 160 return; | 184 return; |
| 161 } else if (bytes_read <= 0) { | 185 } else if (bytes_read <= 0) { |
| 162 if (bytes_read == 0) | 186 if (bytes_read == 0) |
| 163 RequestComplete(request); | 187 RequestComplete(request); |
| 164 FinishRequest(request); | 188 FinishRequest(request); |
| 165 return; | 189 return; |
| 166 } | 190 } |
| 167 | |
| 168 } while (bytes_read > 0); | 191 } while (bytes_read > 0); |
| 169 } | 192 } |
| 170 | 193 |
| 171 void ResourcePrefetcher::RequestComplete(net::URLRequest* request) { | 194 void ResourcePrefetcher::RequestComplete(net::URLRequest* request) { |
| 172 ++prefetched_count_; | 195 ++prefetched_count_; |
| 173 prefetched_bytes_ += request->GetTotalReceivedBytes(); | 196 size_t total_received_bytes = request->GetTotalReceivedBytes(); |
|
alexilin
2017/02/09 15:24:18
request->GetTotalReceivedBytes() returns int64_t
I
Benoit L
2017/02/13 16:13:15
Done.
| |
| 197 prefetched_bytes_ += total_received_bytes; | |
| 174 | 198 |
| 175 UMA_HISTOGRAM_ENUMERATION( | 199 UMA_HISTOGRAM_ENUMERATION( |
| 176 internal::kResourcePrefetchPredictorCachePatternHistogram, | 200 internal::kResourcePrefetchPredictorCachePatternHistogram, |
| 177 request->response_info().cache_entry_status, | 201 request->response_info().cache_entry_status, |
| 178 net::HttpResponseInfo::CacheEntryStatus::ENTRY_MAX); | 202 net::HttpResponseInfo::CacheEntryStatus::ENTRY_MAX); |
| 203 | |
| 204 stats_.requests_stats.emplace_back(request->url(), request->was_cached(), | |
| 205 total_received_bytes); | |
| 179 } | 206 } |
| 180 | 207 |
| 181 void ResourcePrefetcher::OnReceivedRedirect( | 208 void ResourcePrefetcher::OnReceivedRedirect( |
| 182 net::URLRequest* request, | 209 net::URLRequest* request, |
| 183 const net::RedirectInfo& redirect_info, | 210 const net::RedirectInfo& redirect_info, |
| 184 bool* defer_redirect) { | 211 bool* defer_redirect) { |
| 185 FinishRequest(request); | 212 FinishRequest(request); |
| 186 } | 213 } |
| 187 | 214 |
| 188 void ResourcePrefetcher::OnAuthRequired(net::URLRequest* request, | 215 void ResourcePrefetcher::OnAuthRequired(net::URLRequest* request, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 222 if (bytes_read <= 0) { | 249 if (bytes_read <= 0) { |
| 223 FinishRequest(request); | 250 FinishRequest(request); |
| 224 return; | 251 return; |
| 225 } | 252 } |
| 226 | 253 |
| 227 if (bytes_read > 0) | 254 if (bytes_read > 0) |
| 228 ReadFullResponse(request); | 255 ReadFullResponse(request); |
| 229 } | 256 } |
| 230 | 257 |
| 231 } // namespace predictors | 258 } // namespace predictors |
| OLD | NEW |