Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(234)

Side by Side Diff: chrome/browser/predictors/resource_prefetch_predictor.cc

Issue 2896713003: Create LoadingDataCollector class and have observers rely on it instead of ResourcePrefetchPredictor (Closed)
Patch Set: Rebase, merge loading_stats_collector. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_prefetch_predictor.h" 5 #include "chrome/browser/predictors/resource_prefetch_predictor.h"
6 6
7 #include <map> 7 #include <map>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 "font/ttf", 48 "font/ttf",
49 "application/x-font-otf", 49 "application/x-font-otf",
50 "x-font/woff", 50 "x-font/woff",
51 "application/font-sfnt", 51 "application/font-sfnt",
52 "application/font-ttf"}; 52 "application/font-ttf"};
53 53
54 const size_t kMaxManifestByteSize = 16 * 1024; 54 const size_t kMaxManifestByteSize = 16 * 1024;
55 const size_t kNumSampleHosts = 50; 55 const size_t kNumSampleHosts = 50;
56 const size_t kReportReadinessThreshold = 50; 56 const size_t kReportReadinessThreshold = 50;
57 57
58 bool g_allow_port_in_urls = false;
59
60 // For reporting events of interest that are not tied to any navigation. 58 // For reporting events of interest that are not tied to any navigation.
61 enum ReportingEvent { 59 enum ReportingEvent {
62 REPORTING_EVENT_ALL_HISTORY_CLEARED = 0, 60 REPORTING_EVENT_ALL_HISTORY_CLEARED = 0,
63 REPORTING_EVENT_PARTIAL_HISTORY_CLEARED = 1, 61 REPORTING_EVENT_PARTIAL_HISTORY_CLEARED = 1,
64 REPORTING_EVENT_COUNT = 2 62 REPORTING_EVENT_COUNT = 2
65 }; 63 };
66 64
67 float ComputeRedirectConfidence(const predictors::RedirectStat& redirect) { 65 float ComputeRedirectConfidence(const predictors::RedirectStat& redirect) {
68 return (redirect.number_of_hits() + 0.0) / 66 return (redirect.number_of_hits() + 0.0) /
69 (redirect.number_of_hits() + redirect.number_of_misses()); 67 (redirect.number_of_hits() + redirect.number_of_misses());
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 const precache::PrecacheManifest& rhs) const { 163 const precache::PrecacheManifest& rhs) const {
166 return lhs.id().id() < rhs.id().id(); 164 return lhs.id().id() < rhs.id().id();
167 } 165 }
168 166
169 } // namespace internal 167 } // namespace internal
170 168
171 //////////////////////////////////////////////////////////////////////////////// 169 ////////////////////////////////////////////////////////////////////////////////
172 // ResourcePrefetchPredictor static functions. 170 // ResourcePrefetchPredictor static functions.
173 171
174 // static 172 // static
175 bool ResourcePrefetchPredictor::ShouldRecordRequest(
176 net::URLRequest* request,
177 content::ResourceType resource_type) {
178 const content::ResourceRequestInfo* request_info =
179 content::ResourceRequestInfo::ForRequest(request);
180 if (!request_info)
181 return false;
182
183 if (!request_info->IsMainFrame())
184 return false;
185
186 return resource_type == content::RESOURCE_TYPE_MAIN_FRAME &&
187 IsHandledMainPage(request);
188 }
189
190 // static
191 bool ResourcePrefetchPredictor::ShouldRecordResponse(
192 net::URLRequest* response) {
193 const content::ResourceRequestInfo* request_info =
194 content::ResourceRequestInfo::ForRequest(response);
195 if (!request_info)
196 return false;
197
198 if (!request_info->IsMainFrame())
199 return false;
200
201 content::ResourceType resource_type = request_info->GetResourceType();
202 return resource_type == content::RESOURCE_TYPE_MAIN_FRAME
203 ? IsHandledMainPage(response)
204 : IsHandledSubresource(response, resource_type);
205 }
206
207 // static
208 bool ResourcePrefetchPredictor::ShouldRecordRedirect(
209 net::URLRequest* response) {
210 return ShouldRecordResponse(response);
211 }
212
213 // static
214 bool ResourcePrefetchPredictor::IsHandledMainPage(net::URLRequest* request) {
215 const GURL& url = request->url();
216 bool bad_port = !g_allow_port_in_urls && url.has_port();
217 return url.SchemeIsHTTPOrHTTPS() && !bad_port;
218 }
219
220 // static
221 bool ResourcePrefetchPredictor::IsHandledSubresource(
222 net::URLRequest* response,
223 content::ResourceType resource_type) {
224 const GURL& url = response->url();
225 bool bad_port = !g_allow_port_in_urls && url.has_port();
226 if (!response->first_party_for_cookies().SchemeIsHTTPOrHTTPS() ||
227 !url.SchemeIsHTTPOrHTTPS() || bad_port) {
228 return false;
229 }
230
231 std::string mime_type;
232 response->GetMimeType(&mime_type);
233 if (!IsHandledResourceType(resource_type, mime_type))
234 return false;
235
236 if (response->method() != "GET")
237 return false;
238
239 if (response->original_url().spec().length() >
240 ResourcePrefetchPredictorTables::kMaxStringLength) {
241 return false;
242 }
243
244 if (!response->response_info().headers.get())
245 return false;
246
247 return true;
248 }
249
250 // static
251 bool ResourcePrefetchPredictor::IsHandledResourceType(
252 content::ResourceType resource_type,
253 const std::string& mime_type) {
254 content::ResourceType actual_resource_type =
255 GetResourceType(resource_type, mime_type);
256 return actual_resource_type == content::RESOURCE_TYPE_STYLESHEET ||
257 actual_resource_type == content::RESOURCE_TYPE_SCRIPT ||
258 actual_resource_type == content::RESOURCE_TYPE_IMAGE ||
259 actual_resource_type == content::RESOURCE_TYPE_FONT_RESOURCE;
260 }
261
262 // static
263 content::ResourceType ResourcePrefetchPredictor::GetResourceType( 173 content::ResourceType ResourcePrefetchPredictor::GetResourceType(
264 content::ResourceType resource_type, 174 content::ResourceType resource_type,
265 const std::string& mime_type) { 175 const std::string& mime_type) {
266 // Restricts content::RESOURCE_TYPE_{PREFETCH,SUB_RESOURCE,XHR} to a small set 176 // Restricts content::RESOURCE_TYPE_{PREFETCH,SUB_RESOURCE,XHR} to a small set
267 // of mime types, because these resource types don't communicate how the 177 // of mime types, because these resource types don't communicate how the
268 // resources will be used. 178 // resources will be used.
269 if (resource_type == content::RESOURCE_TYPE_PREFETCH || 179 if (resource_type == content::RESOURCE_TYPE_PREFETCH ||
270 resource_type == content::RESOURCE_TYPE_SUB_RESOURCE || 180 resource_type == content::RESOURCE_TYPE_SUB_RESOURCE ||
271 resource_type == content::RESOURCE_TYPE_XHR) { 181 resource_type == content::RESOURCE_TYPE_XHR) {
272 return GetResourceTypeFromMimeType(mime_type, 182 return GetResourceTypeFromMimeType(mime_type,
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 kMinRedirectConfidenceToTriggerPrefetch || 256 kMinRedirectConfidenceToTriggerPrefetch ||
347 (redirect.number_of_hits() < kMinRedirectHitsToTriggerPrefetch && 257 (redirect.number_of_hits() < kMinRedirectHitsToTriggerPrefetch &&
348 redirect.url() != entry_point)) { 258 redirect.url() != entry_point)) {
349 return false; 259 return false;
350 } 260 }
351 261
352 *redirect_endpoint = redirect.url(); 262 *redirect_endpoint = redirect.url();
353 return true; 263 return true;
354 } 264 }
355 265
356 // static
357 void ResourcePrefetchPredictor::SetAllowPortInUrlsForTesting(bool state) {
358 g_allow_port_in_urls = state;
359 }
360
361 //////////////////////////////////////////////////////////////////////////////// 266 ////////////////////////////////////////////////////////////////////////////////
362 // ResourcePrefetchPredictor nested types. 267 // ResourcePrefetchPredictor nested types.
363 268
364 ResourcePrefetchPredictor::OriginRequestSummary::OriginRequestSummary() 269 ResourcePrefetchPredictor::OriginRequestSummary::OriginRequestSummary()
365 : origin(), 270 : origin(),
366 always_access_network(false), 271 always_access_network(false),
367 accessed_network(false), 272 accessed_network(false),
368 first_occurrence(0) {} 273 first_occurrence(0) {}
369 274
370 ResourcePrefetchPredictor::OriginRequestSummary::OriginRequestSummary( 275 ResourcePrefetchPredictor::OriginRequestSummary::OriginRequestSummary(
(...skipping 1066 matching lines...) Expand 10 before | Expand all | Expand 10 after
1437 TestObserver::~TestObserver() { 1342 TestObserver::~TestObserver() {
1438 predictor_->SetObserverForTesting(nullptr); 1343 predictor_->SetObserverForTesting(nullptr);
1439 } 1344 }
1440 1345
1441 TestObserver::TestObserver(ResourcePrefetchPredictor* predictor) 1346 TestObserver::TestObserver(ResourcePrefetchPredictor* predictor)
1442 : predictor_(predictor) { 1347 : predictor_(predictor) {
1443 predictor_->SetObserverForTesting(this); 1348 predictor_->SetObserverForTesting(this);
1444 } 1349 }
1445 1350
1446 } // namespace predictors 1351 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698