OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/prerender/prerender_field_trial.h" | 5 #include "chrome/browser/prerender/prerender_field_trial.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
11 #include "chrome/browser/metrics/metrics_service.h" | 11 #include "chrome/browser/metrics/metrics_service.h" |
12 #include "chrome/browser/prefs/pref_service.h" | 12 #include "chrome/browser/prefs/pref_service.h" |
13 #include "chrome/browser/prerender/prerender_manager.h" | 13 #include "chrome/browser/prerender/prerender_manager.h" |
14 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
15 #include "chrome/common/chrome_switches.h" | 15 #include "chrome/common/chrome_switches.h" |
16 #include "chrome/common/chrome_version_info.h" | 16 #include "chrome/common/chrome_version_info.h" |
17 #include "content/browser/renderer_host/resource_dispatcher_host.h" | 17 #include "content/browser/renderer_host/resource_dispatcher_host.h" |
18 | 18 |
19 namespace prerender { | 19 namespace prerender { |
20 | 20 |
21 namespace { | 21 namespace { |
22 | 22 |
23 int omnibox_original_group_id = 0; | 23 int omnibox_original_group_id = 0; |
24 int omnibox_conservative_group_id = 0; | 24 int omnibox_conservative_group_id = 0; |
25 int omnibox_exact_group_id = 0; | 25 int omnibox_exact_group_id = 0; |
| 26 int omnibox_exact_full_group_id = 0; |
26 | 27 |
27 const char* kOmniboxHeuristicNames[] = { | 28 const char* kOmniboxHeuristicNames[] = { |
28 "Original", | 29 "Original", |
29 "Conservative", | 30 "Conservative", |
30 "Exact" | 31 "Exact", |
| 32 "Exact_Full" |
31 }; | 33 }; |
32 COMPILE_ASSERT(arraysize(kOmniboxHeuristicNames) == OMNIBOX_HEURISTIC_MAX, | 34 COMPILE_ASSERT(arraysize(kOmniboxHeuristicNames) == OMNIBOX_HEURISTIC_MAX, |
33 OmniboxHeuristic_name_count_mismatch); | 35 OmniboxHeuristic_name_count_mismatch); |
34 | 36 |
| 37 const char kPrerenderFromOmniboxTrialName[] = "PrerenderFromOmnibox"; |
| 38 const char kPrerenderFromOmniboxHeuristicTrialName[] = |
| 39 "PrerenderFromOmniboxHeuristic"; |
| 40 |
35 const char* NameFromOmniboxHeuristic(OmniboxHeuristic heuristic) { | 41 const char* NameFromOmniboxHeuristic(OmniboxHeuristic heuristic) { |
36 DCHECK_LT(static_cast<unsigned int>(heuristic), | 42 DCHECK_LT(static_cast<unsigned int>(heuristic), |
37 arraysize(kOmniboxHeuristicNames)); | 43 arraysize(kOmniboxHeuristicNames)); |
38 return kOmniboxHeuristicNames[heuristic]; | 44 return kOmniboxHeuristicNames[heuristic]; |
39 } | 45 } |
40 | 46 |
41 } // end namespace | 47 } // end namespace |
42 | 48 |
43 void ConfigurePrerenderFromOmnibox(); | 49 void ConfigurePrerenderFromOmnibox(); |
44 | 50 |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 | 166 |
161 ConfigurePrerenderFromOmnibox(); | 167 ConfigurePrerenderFromOmnibox(); |
162 } | 168 } |
163 | 169 |
164 void ConfigurePrerenderFromOmnibox() { | 170 void ConfigurePrerenderFromOmnibox() { |
165 // Field trial to see if we're enabled. | 171 // Field trial to see if we're enabled. |
166 const base::FieldTrial::Probability kDivisor = 100; | 172 const base::FieldTrial::Probability kDivisor = 100; |
167 | 173 |
168 const base::FieldTrial::Probability kEnabledProbability = 40; | 174 const base::FieldTrial::Probability kEnabledProbability = 40; |
169 scoped_refptr<base::FieldTrial> enabled_trial( | 175 scoped_refptr<base::FieldTrial> enabled_trial( |
170 new base::FieldTrial("PrerenderFromOmnibox", kDivisor, | 176 new base::FieldTrial(kPrerenderFromOmniboxTrialName, kDivisor, |
171 "OmniboxPrerenderDisabled", 2012, 8, 30)); | 177 "OmniboxPrerenderDisabled", 2012, 8, 30)); |
172 enabled_trial->AppendGroup("OmniboxPrerenderEnabled", kEnabledProbability); | 178 enabled_trial->AppendGroup("OmniboxPrerenderEnabled", kEnabledProbability); |
173 | 179 |
174 // Field trial to see which heuristic to use. | 180 // Field trial to see which heuristic to use. |
175 const base::FieldTrial::Probability kConservativeProbability = 33; | 181 const base::FieldTrial::Probability kConservativeProbability = 25; |
176 const base::FieldTrial::Probability kExactProbability = 33; | 182 const base::FieldTrial::Probability kExactProbability = 25; |
| 183 const base::FieldTrial::Probability kExactFullProbability = 25; |
177 scoped_refptr<base::FieldTrial> heuristic_trial( | 184 scoped_refptr<base::FieldTrial> heuristic_trial( |
178 new base::FieldTrial("PrerenderFromOmniboxHeuristic", kDivisor, | 185 new base::FieldTrial(kPrerenderFromOmniboxHeuristicTrialName, kDivisor, |
179 "OriginalAlgorithm", 2012, 8, 30)); | 186 "OriginalAlgorithm", 2012, 8, 30)); |
180 omnibox_original_group_id = base::FieldTrial::kDefaultGroupNumber; | 187 omnibox_original_group_id = base::FieldTrial::kDefaultGroupNumber; |
181 omnibox_conservative_group_id = | 188 omnibox_conservative_group_id = |
182 heuristic_trial->AppendGroup("ConservativeAlgorithm", | 189 heuristic_trial->AppendGroup("ConservativeAlgorithm", |
183 kConservativeProbability); | 190 kConservativeProbability); |
184 omnibox_exact_group_id = | 191 omnibox_exact_group_id = |
185 heuristic_trial->AppendGroup("ExactAlgorithm", kExactProbability); | 192 heuristic_trial->AppendGroup("ExactAlgorithm", kExactProbability); |
| 193 omnibox_exact_full_group_id = |
| 194 heuristic_trial->AppendGroup("ExactFullAlgorithm", kExactFullProbability); |
186 } | 195 } |
187 | 196 |
188 bool IsOmniboxEnabled(Profile* profile) { | 197 bool IsOmniboxEnabled(Profile* profile) { |
189 if (!profile || profile->IsOffTheRecord()) | 198 if (!profile || profile->IsOffTheRecord()) |
190 return false; | 199 return false; |
191 | 200 |
192 if (!PrerenderManager::IsPrerenderingPossible()) | 201 if (!PrerenderManager::IsPrerenderingPossible()) |
193 return false; | 202 return false; |
194 | 203 |
195 // Override any field trial groups if the user has set a command line flag. | 204 // Override any field trial groups if the user has set a command line flag. |
196 if (CommandLine::ForCurrentProcess()->HasSwitch( | 205 if (CommandLine::ForCurrentProcess()->HasSwitch( |
197 switches::kPrerenderFromOmnibox)) { | 206 switches::kPrerenderFromOmnibox)) { |
198 const std::string switch_value = | 207 const std::string switch_value = |
199 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 208 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
200 switches::kPrerenderFromOmnibox); | 209 switches::kPrerenderFromOmnibox); |
201 | 210 |
202 if (switch_value == switches::kPrerenderFromOmniboxSwitchValueEnabled) | 211 if (switch_value == switches::kPrerenderFromOmniboxSwitchValueEnabled) |
203 return true; | 212 return true; |
204 | 213 |
205 if (switch_value == switches::kPrerenderFromOmniboxSwitchValueDisabled) | 214 if (switch_value == switches::kPrerenderFromOmniboxSwitchValueDisabled) |
206 return false; | 215 return false; |
207 | 216 |
208 DCHECK(switch_value == switches::kPrerenderFromOmniboxSwitchValueAuto); | 217 DCHECK(switch_value == switches::kPrerenderFromOmniboxSwitchValueAuto); |
209 } | 218 } |
210 | 219 |
211 if (!MetricsServiceHelper::IsMetricsReportingEnabled()) | 220 if (!MetricsServiceHelper::IsMetricsReportingEnabled()) |
212 return false; | 221 return false; |
213 | 222 |
214 const int group = base::FieldTrialList::FindValue("PrerenderFromOmnibox"); | 223 const int group = |
| 224 base::FieldTrialList::FindValue(kPrerenderFromOmniboxTrialName); |
215 return group != base::FieldTrial::kNotFinalized && | 225 return group != base::FieldTrial::kNotFinalized && |
216 group != base::FieldTrial::kDefaultGroupNumber; | 226 group != base::FieldTrial::kDefaultGroupNumber; |
217 } | 227 } |
218 | 228 |
219 OmniboxHeuristic GetOmniboxHeuristicToUse() { | 229 OmniboxHeuristic GetOmniboxHeuristicToUse() { |
220 const int group = | 230 const int group = |
221 base::FieldTrialList::FindValue("PrerenderFromOmniboxHeuristic"); | 231 base::FieldTrialList::FindValue(kPrerenderFromOmniboxHeuristicTrialName); |
222 if (group == omnibox_original_group_id) | 232 if (group == omnibox_original_group_id) |
223 return OMNIBOX_HEURISTIC_ORIGINAL; | 233 return OMNIBOX_HEURISTIC_ORIGINAL; |
224 if (group == omnibox_conservative_group_id) | 234 if (group == omnibox_conservative_group_id) |
225 return OMNIBOX_HEURISTIC_CONSERVATIVE; | 235 return OMNIBOX_HEURISTIC_CONSERVATIVE; |
226 if (group == omnibox_exact_group_id) | 236 if (group == omnibox_exact_group_id) |
227 return OMNIBOX_HEURISTIC_EXACT; | 237 return OMNIBOX_HEURISTIC_EXACT; |
| 238 if (group == omnibox_exact_full_group_id) |
| 239 return OMNIBOX_HEURISTIC_EXACT_FULL; |
228 | 240 |
229 // If we don't have a group just return the original heuristic. | 241 // If we don't have a group just return the original heuristic. |
230 return OMNIBOX_HEURISTIC_ORIGINAL; | 242 return OMNIBOX_HEURISTIC_ORIGINAL; |
231 } | 243 } |
232 | 244 |
233 std::string GetOmniboxHistogramSuffix() { | 245 std::string GetOmniboxHistogramSuffix() { |
234 return NameFromOmniboxHeuristic(prerender::GetOmniboxHeuristicToUse()); | 246 return NameFromOmniboxHeuristic(prerender::GetOmniboxHeuristicToUse()); |
235 } | 247 } |
236 | 248 |
237 } // namespace prerender | 249 } // namespace prerender |
OLD | NEW |