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 |