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