OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/predictors/resource_prefetch_common.h" | |
6 | |
7 #include "base/command_line.h" | |
8 #include "base/metrics/field_trial.h" | |
9 #include "base/prefs/pref_service.h" | |
10 #include "chrome/browser/profiles/profile.h" | |
11 #include "chrome/common/chrome_switches.h" | |
12 #include "chrome/common/pref_names.h" | |
13 #include "content/public/browser/render_process_host.h" | |
14 #include "content/public/browser/render_view_host.h" | |
15 #include "content/public/browser/web_contents.h" | |
16 | |
17 namespace predictors { | |
18 | |
19 const char kSpeculativePrefetchingTrialName[] = | |
20 "SpeculativeResourcePrefetching"; | |
21 | |
22 bool IsSpeculativeResourcePrefetchingEnabled( | |
23 Profile* profile, | |
24 ResourcePrefetchPredictorConfig* config) { | |
25 DCHECK(config); | |
26 | |
27 // Off the record - disabled. | |
28 if (!profile || profile->IsOffTheRecord()) | |
29 return false; | |
30 | |
31 // If the user has explicitly disabled "predictive actions" - disabled. | |
32 if (!profile->GetPrefs() || | |
33 !profile->GetPrefs()->GetBoolean(prefs::kNetworkPredictionEnabled)) { | |
34 return false; | |
35 } | |
36 | |
37 // The config has the default params already set. The command line with just | |
38 // enable them with the default params. | |
39 if (CommandLine::ForCurrentProcess()->HasSwitch( | |
40 switches::kSpeculativeResourcePrefetching)) { | |
41 const std::string value = | |
42 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | |
43 switches::kSpeculativeResourcePrefetching); | |
44 | |
45 if (value == switches::kSpeculativeResourcePrefetchingDisabled) { | |
46 return false; | |
47 } else if (value == switches::kSpeculativeResourcePrefetchingLearning) { | |
48 config->mode |= ResourcePrefetchPredictorConfig::URL_LEARNING; | |
49 config->mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING; | |
50 return true; | |
51 } else if (value == switches::kSpeculativeResourcePrefetchingEnabled) { | |
52 config->mode |= ResourcePrefetchPredictorConfig::URL_LEARNING; | |
53 config->mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING; | |
54 config->mode |= ResourcePrefetchPredictorConfig::URL_PREFETCHING; | |
55 config->mode |= ResourcePrefetchPredictorConfig::HOST_PRFETCHING; | |
56 return true; | |
57 } | |
58 } | |
59 | |
60 std::string trial = base::FieldTrialList::FindFullName( | |
61 kSpeculativePrefetchingTrialName); | |
62 | |
63 if (trial == "LearningHost") { | |
64 config->mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING; | |
65 return true; | |
66 } else if (trial == "LearningURL") { | |
67 config->mode |= ResourcePrefetchPredictorConfig::URL_LEARNING; | |
68 return true; | |
69 } else if (trial == "Learning") { | |
70 config->mode |= ResourcePrefetchPredictorConfig::URL_LEARNING; | |
71 config->mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING; | |
72 return true; | |
73 } else if (trial == "PrefetchingHost") { | |
74 config->mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING; | |
75 config->mode |= ResourcePrefetchPredictorConfig::HOST_PRFETCHING; | |
76 return true; | |
77 } else if (trial == "PrefetchingURL") { | |
78 config->mode |= ResourcePrefetchPredictorConfig::URL_LEARNING; | |
79 config->mode |= ResourcePrefetchPredictorConfig::URL_PREFETCHING; | |
80 return true; | |
81 } else if (trial == "Prefetching") { | |
82 config->mode |= ResourcePrefetchPredictorConfig::URL_LEARNING; | |
83 config->mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING; | |
84 config->mode |= ResourcePrefetchPredictorConfig::URL_PREFETCHING; | |
85 config->mode |= ResourcePrefetchPredictorConfig::HOST_PRFETCHING; | |
86 return true; | |
87 } else if (trial == "PrefetchingLowConfidence") { | |
88 config->mode |= ResourcePrefetchPredictorConfig::URL_LEARNING; | |
89 config->mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING; | |
90 config->mode |= ResourcePrefetchPredictorConfig::URL_PREFETCHING; | |
91 config->mode |= ResourcePrefetchPredictorConfig::HOST_PRFETCHING; | |
92 | |
93 config->min_url_visit_count = 1; | |
94 config->min_resource_confidence_to_trigger_prefetch = 0.5f; | |
95 config->min_resource_hits_to_trigger_prefetch = 1; | |
96 return true; | |
97 } else if (trial == "PrefetchingHighConfidence") { | |
98 config->mode |= ResourcePrefetchPredictorConfig::URL_LEARNING; | |
99 config->mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING; | |
100 config->mode |= ResourcePrefetchPredictorConfig::URL_PREFETCHING; | |
101 config->mode |= ResourcePrefetchPredictorConfig::HOST_PRFETCHING; | |
102 | |
103 config->min_url_visit_count = 3; | |
104 config->min_resource_confidence_to_trigger_prefetch = 0.9f; | |
105 config->min_resource_hits_to_trigger_prefetch = 3; | |
106 return true; | |
107 } else if (trial == "PrefetchingMoreResources") { | |
108 config->mode |= ResourcePrefetchPredictorConfig::URL_LEARNING; | |
109 config->mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING; | |
110 config->mode |= ResourcePrefetchPredictorConfig::URL_PREFETCHING; | |
111 config->mode |= ResourcePrefetchPredictorConfig::HOST_PRFETCHING; | |
112 | |
113 config->max_resources_per_entry = 100; | |
114 return true; | |
115 } else if (trial == "LearningSmallDB") { | |
116 config->mode |= ResourcePrefetchPredictorConfig::URL_LEARNING; | |
117 config->mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING; | |
118 | |
119 config->max_urls_to_track = 200; | |
120 config->max_hosts_to_track = 100; | |
121 return true; | |
122 } else if (trial == "PrefetchingSmallDB") { | |
123 config->mode |= ResourcePrefetchPredictorConfig::URL_LEARNING; | |
124 config->mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING; | |
125 config->mode |= ResourcePrefetchPredictorConfig::URL_PREFETCHING; | |
126 config->mode |= ResourcePrefetchPredictorConfig::HOST_PRFETCHING; | |
127 | |
128 config->max_urls_to_track = 200; | |
129 config->max_hosts_to_track = 100; | |
130 return true; | |
131 } else if (trial == "PrefetchingSmallDBLowConfidence") { | |
132 config->mode |= ResourcePrefetchPredictorConfig::URL_LEARNING; | |
133 config->mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING; | |
134 config->mode |= ResourcePrefetchPredictorConfig::URL_PREFETCHING; | |
135 config->mode |= ResourcePrefetchPredictorConfig::HOST_PRFETCHING; | |
136 | |
137 config->max_urls_to_track = 200; | |
138 config->max_hosts_to_track = 100; | |
139 config->min_url_visit_count = 1; | |
140 config->min_resource_confidence_to_trigger_prefetch = 0.5f; | |
141 config->min_resource_hits_to_trigger_prefetch = 1; | |
142 return true; | |
143 } else if (trial == "PrefetchingSmallDBHighConfidence") { | |
144 config->mode |= ResourcePrefetchPredictorConfig::URL_LEARNING; | |
145 config->mode |= ResourcePrefetchPredictorConfig::HOST_LEARNING; | |
146 config->mode |= ResourcePrefetchPredictorConfig::URL_PREFETCHING; | |
147 config->mode |= ResourcePrefetchPredictorConfig::HOST_PRFETCHING; | |
148 | |
149 config->max_urls_to_track = 200; | |
150 config->max_hosts_to_track = 100; | |
151 config->min_url_visit_count = 3; | |
152 config->min_resource_confidence_to_trigger_prefetch = 0.9f; | |
153 config->min_resource_hits_to_trigger_prefetch = 3; | |
154 return true; | |
155 } | |
156 | |
157 return false; | |
158 } | |
159 | |
160 NavigationID::NavigationID() | |
161 : render_process_id(-1), | |
162 render_frame_id(-1) { | |
163 } | |
164 | |
165 NavigationID::NavigationID(const NavigationID& other) | |
166 : render_process_id(other.render_process_id), | |
167 render_frame_id(other.render_frame_id), | |
168 main_frame_url(other.main_frame_url), | |
169 creation_time(other.creation_time) { | |
170 } | |
171 | |
172 NavigationID::NavigationID(content::WebContents* web_contents) | |
173 : render_process_id(web_contents->GetRenderProcessHost()->GetID()), | |
174 render_frame_id(web_contents->GetRenderViewHost()->GetRoutingID()), | |
175 main_frame_url(web_contents->GetURL()) { | |
176 } | |
177 | |
178 bool NavigationID::is_valid() const { | |
179 return render_process_id != -1 && render_frame_id != -1 && | |
180 !main_frame_url.is_empty(); | |
181 } | |
182 | |
183 bool NavigationID::operator<(const NavigationID& rhs) const { | |
184 DCHECK(is_valid() && rhs.is_valid()); | |
185 if (render_process_id != rhs.render_process_id) | |
186 return render_process_id < rhs.render_process_id; | |
187 else if (render_frame_id != rhs.render_frame_id) | |
188 return render_frame_id < rhs.render_frame_id; | |
189 else | |
190 return main_frame_url < rhs.main_frame_url; | |
191 } | |
192 | |
193 bool NavigationID::operator==(const NavigationID& rhs) const { | |
194 DCHECK(is_valid() && rhs.is_valid()); | |
195 return IsSameRenderer(rhs) && main_frame_url == rhs.main_frame_url; | |
196 } | |
197 | |
198 bool NavigationID::IsSameRenderer(const NavigationID& other) const { | |
199 DCHECK(is_valid() && other.is_valid()); | |
200 return render_process_id == other.render_process_id && | |
201 render_frame_id == other.render_frame_id; | |
202 } | |
203 | |
204 ResourcePrefetchPredictorConfig::ResourcePrefetchPredictorConfig() | |
205 : mode(0), | |
206 max_navigation_lifetime_seconds(60), | |
207 max_urls_to_track(500), | |
208 max_hosts_to_track(200), | |
209 min_url_visit_count(2), | |
210 max_resources_per_entry(50), | |
211 max_consecutive_misses(3), | |
212 min_resource_confidence_to_trigger_prefetch(0.8f), | |
213 min_resource_hits_to_trigger_prefetch(3), | |
214 max_prefetches_inflight_per_navigation(24), | |
215 max_prefetches_inflight_per_host_per_navigation(3) { | |
216 } | |
217 | |
218 ResourcePrefetchPredictorConfig::~ResourcePrefetchPredictorConfig() { | |
219 } | |
220 | |
221 bool ResourcePrefetchPredictorConfig::IsLearningEnabled() const { | |
222 return IsURLLearningEnabled() || IsHostLearningEnabled(); | |
223 } | |
224 | |
225 bool ResourcePrefetchPredictorConfig::IsPrefetchingEnabled() const { | |
226 return IsURLPrefetchingEnabled() || IsHostPrefetchingEnabled(); | |
227 } | |
228 | |
229 bool ResourcePrefetchPredictorConfig::IsURLLearningEnabled() const { | |
230 return (mode & URL_LEARNING) > 0; | |
231 } | |
232 | |
233 bool ResourcePrefetchPredictorConfig::IsHostLearningEnabled() const { | |
234 return (mode & HOST_LEARNING) > 0; | |
235 } | |
236 | |
237 bool ResourcePrefetchPredictorConfig::IsURLPrefetchingEnabled() const { | |
238 return (mode & URL_PREFETCHING) > 0; | |
239 } | |
240 | |
241 bool ResourcePrefetchPredictorConfig::IsHostPrefetchingEnabled() const { | |
242 return (mode & HOST_PRFETCHING) > 0; | |
243 } | |
244 | |
245 } // namespace predictors | |
OLD | NEW |