OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/predictors/autocomplete_action_predictor.h" | 12 #include "chrome/browser/predictors/autocomplete_action_predictor.h" |
13 #include "chrome/browser/prefs/pref_service.h" | 13 #include "chrome/browser/prefs/pref_service.h" |
14 #include "chrome/browser/prerender/prerender_manager.h" | 14 #include "chrome/browser/prerender/prerender_manager.h" |
15 #include "chrome/browser/profiles/profile.h" | 15 #include "chrome/browser/profiles/profile.h" |
16 #include "chrome/common/chrome_switches.h" | 16 #include "chrome/common/chrome_switches.h" |
17 #include "chrome/common/chrome_version_info.h" | 17 #include "chrome/common/chrome_version_info.h" |
18 | 18 |
| 19 using base::FieldTrial; |
| 20 using base::FieldTrialList; |
| 21 |
19 namespace prerender { | 22 namespace prerender { |
20 | 23 |
21 namespace { | 24 namespace { |
22 | 25 |
23 const char kOmniboxTrialName[] = "PrerenderFromOmnibox"; | 26 const char kOmniboxTrialName[] = "PrerenderFromOmnibox"; |
24 int g_omnibox_trial_default_group_number = kint32min; | 27 int g_omnibox_trial_default_group_number = kint32min; |
25 | 28 |
26 const char kSpeculativePrefetchingLearningTrialName[] = | 29 const char kSpeculativePrefetchingLearningTrialName[] = |
27 "SpeculativePrefetchingLearning"; | 30 "SpeculativePrefetchingLearning"; |
28 int g_speculative_prefetching_learning_default_group_number = kint32min; | 31 int g_speculative_prefetching_learning_default_group_number = kint32min; |
29 | 32 |
30 void SetupPrefetchFieldTrial() { | 33 void SetupPrefetchFieldTrial() { |
31 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); | 34 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); |
32 if (channel == chrome::VersionInfo::CHANNEL_STABLE || | 35 if (channel == chrome::VersionInfo::CHANNEL_STABLE || |
33 channel == chrome::VersionInfo::CHANNEL_BETA) { | 36 channel == chrome::VersionInfo::CHANNEL_BETA) { |
34 return; | 37 return; |
35 } | 38 } |
36 | 39 |
37 const base::FieldTrial::Probability divisor = 1000; | 40 const FieldTrial::Probability divisor = 1000; |
38 const base::FieldTrial::Probability prefetch_probability = 500; | 41 const FieldTrial::Probability prefetch_probability = 500; |
39 scoped_refptr<base::FieldTrial> trial( | 42 scoped_refptr<FieldTrial> trial( |
40 base::FieldTrialList::FactoryGetFieldTrial( | 43 FieldTrialList::FactoryGetFieldTrial( |
41 "Prefetch", divisor, "ContentPrefetchPrefetchOff", | 44 "Prefetch", divisor, "ContentPrefetchPrefetchOff", |
42 2013, 6, 30, NULL)); | 45 2013, 6, 30, NULL)); |
43 const int kPrefetchOnGroup = trial->AppendGroup("ContentPrefetchPrefetchOn", | 46 const int kPrefetchOnGroup = trial->AppendGroup("ContentPrefetchPrefetchOn", |
44 prefetch_probability); | 47 prefetch_probability); |
45 PrerenderManager::SetIsPrefetchEnabled(trial->group() == kPrefetchOnGroup); | 48 PrerenderManager::SetIsPrefetchEnabled(trial->group() == kPrefetchOnGroup); |
46 } | 49 } |
47 | 50 |
48 void SetupPrerenderFieldTrial() { | 51 void SetupPrerenderFieldTrial() { |
49 base::FieldTrial::Probability divisor = 1000; | 52 const FieldTrial::Probability divisor = 1000; |
50 | 53 |
51 base::FieldTrial::Probability exp1_probability = 166; | 54 FieldTrial::Probability prerender_on_probability; |
52 base::FieldTrial::Probability exp1_5min_ttl_probability = 83; | 55 FieldTrial::Probability control_probability; |
53 base::FieldTrial::Probability control1_probability = 166; | 56 FieldTrial::Probability experiment_multi_prerender_probability; |
54 base::FieldTrial::Probability no_use1_probability = 83; | 57 FieldTrial::Probability experiment_5min_ttl_probability; |
55 | 58 FieldTrial::Probability experiment_no_use_probability; |
56 base::FieldTrial::Probability exp2_probability = 167; | |
57 base::FieldTrial::Probability exp2_5min_ttl_probability = 84; | |
58 base::FieldTrial::Probability control2_probability = 167; | |
59 base::FieldTrial::Probability no_use2_probability = 84; | |
60 | 59 |
61 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); | 60 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); |
62 if (channel == chrome::VersionInfo::CHANNEL_STABLE || | 61 if (channel == chrome::VersionInfo::CHANNEL_STABLE || |
63 channel == chrome::VersionInfo::CHANNEL_BETA) { | 62 channel == chrome::VersionInfo::CHANNEL_BETA) { |
64 exp1_probability = 490; | 63 // Use very conservatives and stable settings in beta and stable. |
65 exp1_5min_ttl_probability = 5; | 64 const FieldTrial::Probability release_prerender_on_probability = 980; |
66 control1_probability = 5; | 65 const FieldTrial::Probability release_control_probability = 10; |
67 no_use1_probability = 0; | 66 const FieldTrial::Probability |
68 exp2_probability = 490; | 67 release_experiment_multi_prerender_probability = 0; |
69 exp2_5min_ttl_probability = 5; | 68 const FieldTrial::Probability release_experiment_5min_ttl_probability = 10; |
70 control2_probability = 5; | 69 const FieldTrial::Probability release_experiment_no_use_probability = 0; |
71 no_use2_probability = 0; | 70 COMPILE_ASSERT( |
| 71 release_prerender_on_probability + release_control_probability + |
| 72 release_experiment_multi_prerender_probability + |
| 73 release_experiment_5min_ttl_probability + |
| 74 release_experiment_no_use_probability == divisor, |
| 75 release_experiment_probabilities_must_equal_divisor); |
| 76 |
| 77 prerender_on_probability = release_prerender_on_probability; |
| 78 control_probability = release_experiment_5min_ttl_probability; |
| 79 experiment_multi_prerender_probability = |
| 80 release_experiment_multi_prerender_probability; |
| 81 experiment_5min_ttl_probability = release_control_probability; |
| 82 experiment_no_use_probability = release_experiment_no_use_probability; |
| 83 } else { |
| 84 // In testing channels, use more experiments and a larger control group to |
| 85 // improve quality of data. |
| 86 const FieldTrial::Probability dev_prerender_on_probability = 250; |
| 87 const FieldTrial::Probability dev_control_probability = 250; |
| 88 const FieldTrial::Probability |
| 89 dev_experiment_multi_prerender_probability = 250; |
| 90 const FieldTrial::Probability dev_experiment_5min_ttl_probability = 125; |
| 91 const FieldTrial::Probability dev_experiment_no_use_probability = 125; |
| 92 COMPILE_ASSERT(dev_prerender_on_probability + dev_control_probability + |
| 93 dev_experiment_multi_prerender_probability + |
| 94 dev_experiment_5min_ttl_probability + |
| 95 dev_experiment_no_use_probability == divisor, |
| 96 dev_experiment_probabilities_must_equal_divisor); |
| 97 |
| 98 prerender_on_probability = dev_prerender_on_probability; |
| 99 control_probability = dev_experiment_5min_ttl_probability; |
| 100 experiment_multi_prerender_probability = |
| 101 dev_experiment_multi_prerender_probability; |
| 102 experiment_5min_ttl_probability = dev_control_probability; |
| 103 experiment_no_use_probability = dev_experiment_no_use_probability; |
72 } | 104 } |
73 CHECK_EQ(divisor, exp1_probability + exp1_5min_ttl_probability + | |
74 control1_probability + no_use1_probability + exp2_probability + | |
75 exp2_5min_ttl_probability + control2_probability + | |
76 no_use2_probability); | |
77 int experiment_1_group = -1; | |
78 scoped_refptr<base::FieldTrial> trial( | |
79 base::FieldTrialList::FactoryGetFieldTrial( | |
80 "Prerender", divisor, "ContentPrefetchPrerender1", | |
81 2013, 6, 30, &experiment_1_group)); | |
82 | 105 |
83 const int experiment_15_min_TTL_group = | 106 int prerender_on_group = -1; |
84 trial->AppendGroup("ContentPrefetchPrerenderExp5minTTL1", | 107 scoped_refptr<FieldTrial> trial( |
85 exp1_5min_ttl_probability); | 108 FieldTrialList::FactoryGetFieldTrial( |
86 const int control_1_group = | 109 "Prerender", divisor, "PrerenderEnabled", |
87 trial->AppendGroup("ContentPrefetchPrerenderControl1", | 110 2013, 6, 30, &prerender_on_group)); |
88 control1_probability); | 111 const int control_group = |
89 const int no_use_1_group = | 112 trial->AppendGroup("PrerenderControl", |
90 trial->AppendGroup("ContentPrefetchPrerenderNoUse1", | 113 control_probability); |
91 no_use1_probability); | 114 const int experiment_multi_prerender_group = |
92 const int experiment_2_group = | 115 trial->AppendGroup("PrerenderMulti", |
93 trial->AppendGroup("ContentPrefetchPrerender2", | 116 experiment_multi_prerender_probability); |
94 exp2_probability); | 117 const int experiment_5_min_TTL_group = |
95 const int experiment_25_min_TTL_group = | 118 trial->AppendGroup("Prerender5minTTL", |
96 trial->AppendGroup("ContentPrefetchPrerenderExp5minTTL2", | 119 experiment_5min_ttl_probability); |
97 exp2_5min_ttl_probability); | 120 const int experiment_no_use_group = |
98 const int control_2_group = | 121 trial->AppendGroup("PrerenderNoUse", |
99 trial->AppendGroup("ContentPrefetchPrerenderControl2", | 122 experiment_no_use_probability); |
100 control2_probability); | 123 |
101 const int no_use_2_group = | |
102 trial->AppendGroup("ContentPrefetchPrerenderNoUse2", | |
103 no_use2_probability); | |
104 const int trial_group = trial->group(); | 124 const int trial_group = trial->group(); |
105 if (trial_group == experiment_1_group || | 125 if (trial_group == prerender_on_group) { |
106 trial_group == experiment_2_group) { | |
107 PrerenderManager::SetMode( | 126 PrerenderManager::SetMode( |
108 PrerenderManager::PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP); | 127 PrerenderManager::PRERENDER_MODE_EXPERIMENT_PRERENDER_GROUP); |
109 } else if (trial_group == experiment_15_min_TTL_group || | 128 } else if (trial_group == control_group) { |
110 trial_group == experiment_25_min_TTL_group) { | 129 PrerenderManager::SetMode( |
| 130 PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); |
| 131 } else if (trial_group == experiment_multi_prerender_group) { |
| 132 PrerenderManager::SetMode( |
| 133 PrerenderManager::PRERENDER_MODE_EXPERIMENT_MULTI_PRERENDER_GROUP); |
| 134 } else if (trial_group == experiment_5_min_TTL_group) { |
111 PrerenderManager::SetMode( | 135 PrerenderManager::SetMode( |
112 PrerenderManager::PRERENDER_MODE_EXPERIMENT_5MIN_TTL_GROUP); | 136 PrerenderManager::PRERENDER_MODE_EXPERIMENT_5MIN_TTL_GROUP); |
113 } else if (trial_group == control_1_group || | 137 } else if (trial_group == experiment_no_use_group) { |
114 trial_group == control_2_group) { | |
115 PrerenderManager::SetMode( | |
116 PrerenderManager::PRERENDER_MODE_EXPERIMENT_CONTROL_GROUP); | |
117 } else if (trial_group == no_use_1_group || | |
118 trial_group == no_use_2_group) { | |
119 PrerenderManager::SetMode( | 138 PrerenderManager::SetMode( |
120 PrerenderManager::PRERENDER_MODE_EXPERIMENT_NO_USE_GROUP); | 139 PrerenderManager::PRERENDER_MODE_EXPERIMENT_NO_USE_GROUP); |
121 } else { | 140 } else { |
122 NOTREACHED(); | 141 NOTREACHED(); |
123 } | 142 } |
124 } | 143 } |
125 | 144 |
126 } // end namespace | 145 } // end namespace |
127 | 146 |
128 void ConfigureOmniboxPrerender(); | 147 void ConfigureOmniboxPrerender(); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
185 UMA_HISTOGRAM_ENUMERATION("Prerender.Sessions", | 204 UMA_HISTOGRAM_ENUMERATION("Prerender.Sessions", |
186 PrerenderManager::GetMode(), | 205 PrerenderManager::GetMode(), |
187 PrerenderManager::PRERENDER_MODE_MAX); | 206 PrerenderManager::PRERENDER_MODE_MAX); |
188 | 207 |
189 ConfigureOmniboxPrerender(); | 208 ConfigureOmniboxPrerender(); |
190 ConfigureSpeculativePrefetching(); | 209 ConfigureSpeculativePrefetching(); |
191 } | 210 } |
192 | 211 |
193 void ConfigureOmniboxPrerender() { | 212 void ConfigureOmniboxPrerender() { |
194 // Field trial to see if we're enabled. | 213 // Field trial to see if we're enabled. |
195 const base::FieldTrial::Probability kDivisor = 100; | 214 const FieldTrial::Probability kDivisor = 100; |
196 | 215 |
197 base::FieldTrial::Probability kDisabledProbability = 10; | 216 FieldTrial::Probability kDisabledProbability = 10; |
198 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); | 217 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); |
199 if (channel == chrome::VersionInfo::CHANNEL_STABLE || | 218 if (channel == chrome::VersionInfo::CHANNEL_STABLE || |
200 channel == chrome::VersionInfo::CHANNEL_BETA) { | 219 channel == chrome::VersionInfo::CHANNEL_BETA) { |
201 kDisabledProbability = 1; | 220 kDisabledProbability = 1; |
202 } | 221 } |
203 scoped_refptr<base::FieldTrial> omnibox_prerender_trial( | 222 scoped_refptr<FieldTrial> omnibox_prerender_trial( |
204 base::FieldTrialList::FactoryGetFieldTrial( | 223 FieldTrialList::FactoryGetFieldTrial( |
205 kOmniboxTrialName, kDivisor, "OmniboxPrerenderEnabled", | 224 kOmniboxTrialName, kDivisor, "OmniboxPrerenderEnabled", |
206 2012, 12, 30, &g_omnibox_trial_default_group_number)); | 225 2012, 12, 30, &g_omnibox_trial_default_group_number)); |
207 omnibox_prerender_trial->AppendGroup("OmniboxPrerenderDisabled", | 226 omnibox_prerender_trial->AppendGroup("OmniboxPrerenderDisabled", |
208 kDisabledProbability); | 227 kDisabledProbability); |
209 } | 228 } |
210 | 229 |
211 bool IsOmniboxEnabled(Profile* profile) { | 230 bool IsOmniboxEnabled(Profile* profile) { |
212 if (!profile) | 231 if (!profile) |
213 return false; | 232 return false; |
214 | 233 |
215 if (!PrerenderManager::IsPrerenderingPossible()) | 234 if (!PrerenderManager::IsPrerenderingPossible()) |
216 return false; | 235 return false; |
217 | 236 |
218 // Override any field trial groups if the user has set a command line flag. | 237 // Override any field trial groups if the user has set a command line flag. |
219 if (CommandLine::ForCurrentProcess()->HasSwitch( | 238 if (CommandLine::ForCurrentProcess()->HasSwitch( |
220 switches::kPrerenderFromOmnibox)) { | 239 switches::kPrerenderFromOmnibox)) { |
221 const std::string switch_value = | 240 const std::string switch_value = |
222 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 241 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
223 switches::kPrerenderFromOmnibox); | 242 switches::kPrerenderFromOmnibox); |
224 | 243 |
225 if (switch_value == switches::kPrerenderFromOmniboxSwitchValueEnabled) | 244 if (switch_value == switches::kPrerenderFromOmniboxSwitchValueEnabled) |
226 return true; | 245 return true; |
227 | 246 |
228 if (switch_value == switches::kPrerenderFromOmniboxSwitchValueDisabled) | 247 if (switch_value == switches::kPrerenderFromOmniboxSwitchValueDisabled) |
229 return false; | 248 return false; |
230 | 249 |
231 DCHECK(switch_value == switches::kPrerenderFromOmniboxSwitchValueAuto); | 250 DCHECK(switch_value == switches::kPrerenderFromOmniboxSwitchValueAuto); |
232 } | 251 } |
233 | 252 |
234 const int group = base::FieldTrialList::FindValue(kOmniboxTrialName); | 253 const int group = FieldTrialList::FindValue(kOmniboxTrialName); |
235 return group == base::FieldTrial::kNotFinalized || | 254 return group == FieldTrial::kNotFinalized || |
236 group == g_omnibox_trial_default_group_number; | 255 group == g_omnibox_trial_default_group_number; |
237 } | 256 } |
238 | 257 |
239 void ConfigureSpeculativePrefetching() { | 258 void ConfigureSpeculativePrefetching() { |
240 // Field trial to see if we're enabled. | 259 // Field trial to see if we're enabled. |
241 const base::FieldTrial::Probability kDivisor = 100; | 260 const FieldTrial::Probability kDivisor = 100; |
242 | 261 |
243 base::FieldTrial::Probability kDisabledProbability = 99; | 262 FieldTrial::Probability kDisabledProbability = 99; |
244 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); | 263 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); |
245 if (channel == chrome::VersionInfo::CHANNEL_STABLE || | 264 if (channel == chrome::VersionInfo::CHANNEL_STABLE || |
246 channel == chrome::VersionInfo::CHANNEL_BETA) { | 265 channel == chrome::VersionInfo::CHANNEL_BETA) { |
247 kDisabledProbability = 100; | 266 kDisabledProbability = 100; |
248 } | 267 } |
249 scoped_refptr<base::FieldTrial> speculative_prefetching_learning_trial( | 268 scoped_refptr<FieldTrial> speculative_prefetching_learning_trial( |
250 base::FieldTrialList::FactoryGetFieldTrial( | 269 FieldTrialList::FactoryGetFieldTrial( |
251 kSpeculativePrefetchingLearningTrialName, | 270 kSpeculativePrefetchingLearningTrialName, |
252 kDivisor, | 271 kDivisor, |
253 "SpeculativePrefetchingLearningEnabled", | 272 "SpeculativePrefetchingLearningEnabled", |
254 2012, 12, 30, | 273 2012, 12, 30, |
255 &g_speculative_prefetching_learning_default_group_number)); | 274 &g_speculative_prefetching_learning_default_group_number)); |
256 speculative_prefetching_learning_trial->AppendGroup( | 275 speculative_prefetching_learning_trial->AppendGroup( |
257 "SpeculativePrefetchingDisabled", | 276 "SpeculativePrefetchingDisabled", |
258 kDisabledProbability); | 277 kDisabledProbability); |
259 } | 278 } |
260 | 279 |
261 bool IsSpeculativeResourcePrefetchingLearningEnabled(Profile* profile) { | 280 bool IsSpeculativeResourcePrefetchingLearningEnabled(Profile* profile) { |
262 if (!profile) | 281 if (!profile) |
263 return false; | 282 return false; |
264 | 283 |
265 // Override any field trial groups if the user has set a command line flag. | 284 // Override any field trial groups if the user has set a command line flag. |
266 if (CommandLine::ForCurrentProcess()->HasSwitch( | 285 if (CommandLine::ForCurrentProcess()->HasSwitch( |
267 switches::kSpeculativeResourcePrefetching)) { | 286 switches::kSpeculativeResourcePrefetching)) { |
268 const std::string switch_value = | 287 const std::string switch_value = |
269 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 288 CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
270 switches::kSpeculativeResourcePrefetching); | 289 switches::kSpeculativeResourcePrefetching); |
271 | 290 |
272 if (switch_value == switches::kSpeculativeResourcePrefetchingLearning) | 291 if (switch_value == switches::kSpeculativeResourcePrefetchingLearning) |
273 return true; | 292 return true; |
274 } | 293 } |
275 | 294 |
276 const int group = base::FieldTrialList::FindValue( | 295 const int group = FieldTrialList::FindValue( |
277 kSpeculativePrefetchingLearningTrialName); | 296 kSpeculativePrefetchingLearningTrialName); |
278 return group == g_speculative_prefetching_learning_default_group_number; | 297 return group == g_speculative_prefetching_learning_default_group_number; |
279 } | 298 } |
280 | 299 |
281 } // namespace prerender | 300 } // namespace prerender |
OLD | NEW |