| 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 <iterator> | 7 #include <iterator> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/metrics/histogram_macros.h" |
| 10 #include "base/trace_event/trace_event.h" | 11 #include "base/trace_event/trace_event.h" |
| 11 #include "content/public/browser/browser_thread.h" | 12 #include "content/public/browser/browser_thread.h" |
| 12 #include "net/base/io_buffer.h" | 13 #include "net/base/io_buffer.h" |
| 13 #include "net/base/load_flags.h" | 14 #include "net/base/load_flags.h" |
| 14 #include "net/base/request_priority.h" | 15 #include "net/base/request_priority.h" |
| 15 #include "net/url_request/url_request_context.h" | 16 #include "net/url_request/url_request_context.h" |
| 16 #include "url/origin.h" | 17 #include "url/origin.h" |
| 17 | 18 |
| 18 namespace { | 19 namespace { |
| 19 | 20 |
| 20 // The size of the buffer used to read the resource. | 21 // The size of the buffer used to read the resource. |
| 21 static const size_t kResourceBufferSizeBytes = 50000; | 22 static const size_t kResourceBufferSizeBytes = 50000; |
| 22 | 23 |
| 23 } // namespace | 24 } // namespace |
| 24 | 25 |
| 25 namespace predictors { | 26 namespace predictors { |
| 26 | 27 |
| 27 ResourcePrefetcher::ResourcePrefetcher( | 28 ResourcePrefetcher::ResourcePrefetcher( |
| 28 Delegate* delegate, | 29 Delegate* delegate, |
| 29 const ResourcePrefetchPredictorConfig& config, | 30 const ResourcePrefetchPredictorConfig& config, |
| 30 const GURL& main_frame_url, | 31 const GURL& main_frame_url, |
| 31 const std::vector<GURL>& urls) | 32 const std::vector<GURL>& urls) |
| 32 : state_(INITIALIZED), | 33 : state_(INITIALIZED), |
| 33 delegate_(delegate), | 34 delegate_(delegate), |
| 34 config_(config), | 35 config_(config), |
| 35 main_frame_url_(main_frame_url) { | 36 main_frame_url_(main_frame_url), |
| 37 prefetched_count_(0), |
| 38 prefetched_bytes_(0) { |
| 36 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 39 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
| 37 | 40 |
| 38 std::copy(urls.begin(), urls.end(), std::back_inserter(request_queue_)); | 41 std::copy(urls.begin(), urls.end(), std::back_inserter(request_queue_)); |
| 39 } | 42 } |
| 40 | 43 |
| 41 ResourcePrefetcher::~ResourcePrefetcher() {} | 44 ResourcePrefetcher::~ResourcePrefetcher() {} |
| 42 | 45 |
| 43 void ResourcePrefetcher::Start() { | 46 void ResourcePrefetcher::Start() { |
| 44 TRACE_EVENT_ASYNC_BEGIN0("browser", "ResourcePrefetcher::Prefetch", this); | 47 TRACE_EVENT_ASYNC_BEGIN0("browser", "ResourcePrefetcher::Prefetch", this); |
| 45 DCHECK(thread_checker_.CalledOnValidThread()); | 48 DCHECK(thread_checker_.CalledOnValidThread()); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 request_queue_.erase(request_it); | 95 request_queue_.erase(request_it); |
| 93 } | 96 } |
| 94 } | 97 } |
| 95 } | 98 } |
| 96 | 99 |
| 97 // If the inflight_requests_ is empty, we can't launch any more. Finish. | 100 // If the inflight_requests_ is empty, we can't launch any more. Finish. |
| 98 if (inflight_requests_.empty()) { | 101 if (inflight_requests_.empty()) { |
| 99 CHECK(host_inflight_counts_.empty()); | 102 CHECK(host_inflight_counts_.empty()); |
| 100 CHECK(request_queue_.empty() || state_ == STOPPED); | 103 CHECK(request_queue_.empty() || state_ == STOPPED); |
| 101 | 104 |
| 105 UMA_HISTOGRAM_COUNTS_100( |
| 106 internal::kResourcePrefetchPredictorPrefetchedCountHistogram, |
| 107 prefetched_count_); |
| 108 UMA_HISTOGRAM_COUNTS_10000( |
| 109 internal::kResourcePrefetchPredictorPrefetchedSizeHistogram, |
| 110 prefetched_bytes_ / 1024); |
| 111 |
| 102 state_ = FINISHED; | 112 state_ = FINISHED; |
| 103 delegate_->ResourcePrefetcherFinished(this); | 113 delegate_->ResourcePrefetcherFinished(this); |
| 104 } | 114 } |
| 105 } | 115 } |
| 106 | 116 |
| 107 void ResourcePrefetcher::SendRequest(const GURL& url) { | 117 void ResourcePrefetcher::SendRequest(const GURL& url) { |
| 108 std::unique_ptr<net::URLRequest> url_request = | 118 std::unique_ptr<net::URLRequest> url_request = |
| 109 delegate_->GetURLRequestContext()->CreateRequest(url, net::LOW, this); | 119 delegate_->GetURLRequestContext()->CreateRequest(url, net::LOW, this); |
| 110 host_inflight_counts_[url.host()] += 1; | 120 host_inflight_counts_[url.host()] += 1; |
| 111 | 121 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 142 | 152 |
| 143 void ResourcePrefetcher::ReadFullResponse(net::URLRequest* request) { | 153 void ResourcePrefetcher::ReadFullResponse(net::URLRequest* request) { |
| 144 int bytes_read = 0; | 154 int bytes_read = 0; |
| 145 do { | 155 do { |
| 146 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer( | 156 scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer( |
| 147 kResourceBufferSizeBytes)); | 157 kResourceBufferSizeBytes)); |
| 148 bytes_read = request->Read(buffer.get(), kResourceBufferSizeBytes); | 158 bytes_read = request->Read(buffer.get(), kResourceBufferSizeBytes); |
| 149 if (bytes_read == net::ERR_IO_PENDING) { | 159 if (bytes_read == net::ERR_IO_PENDING) { |
| 150 return; | 160 return; |
| 151 } else if (bytes_read <= 0) { | 161 } else if (bytes_read <= 0) { |
| 162 if (bytes_read == 0) |
| 163 RequestComplete(request); |
| 152 FinishRequest(request); | 164 FinishRequest(request); |
| 153 return; | 165 return; |
| 154 } | 166 } |
| 155 | 167 |
| 156 } while (bytes_read > 0); | 168 } while (bytes_read > 0); |
| 157 } | 169 } |
| 158 | 170 |
| 171 void ResourcePrefetcher::RequestComplete(net::URLRequest* request) { |
| 172 ++prefetched_count_; |
| 173 prefetched_bytes_ += request->GetTotalReceivedBytes(); |
| 174 |
| 175 UMA_HISTOGRAM_ENUMERATION( |
| 176 internal::kResourcePrefetchPredictorCachePatternHistogram, |
| 177 request->response_info().cache_entry_status, |
| 178 net::HttpResponseInfo::CacheEntryStatus::ENTRY_MAX); |
| 179 } |
| 180 |
| 159 void ResourcePrefetcher::OnReceivedRedirect( | 181 void ResourcePrefetcher::OnReceivedRedirect( |
| 160 net::URLRequest* request, | 182 net::URLRequest* request, |
| 161 const net::RedirectInfo& redirect_info, | 183 const net::RedirectInfo& redirect_info, |
| 162 bool* defer_redirect) { | 184 bool* defer_redirect) { |
| 163 FinishRequest(request); | 185 FinishRequest(request); |
| 164 } | 186 } |
| 165 | 187 |
| 166 void ResourcePrefetcher::OnAuthRequired(net::URLRequest* request, | 188 void ResourcePrefetcher::OnAuthRequired(net::URLRequest* request, |
| 167 net::AuthChallengeInfo* auth_info) { | 189 net::AuthChallengeInfo* auth_info) { |
| 168 FinishRequest(request); | 190 FinishRequest(request); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 if (bytes_read <= 0) { | 222 if (bytes_read <= 0) { |
| 201 FinishRequest(request); | 223 FinishRequest(request); |
| 202 return; | 224 return; |
| 203 } | 225 } |
| 204 | 226 |
| 205 if (bytes_read > 0) | 227 if (bytes_read > 0) |
| 206 ReadFullResponse(request); | 228 ReadFullResponse(request); |
| 207 } | 229 } |
| 208 | 230 |
| 209 } // namespace predictors | 231 } // namespace predictors |
| OLD | NEW |