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

Side by Side Diff: chrome/browser/instant/instant_field_trial.cc

Issue 8588003: Add a new field trial for Instant. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « chrome/browser/instant/instant_field_trial.h ('k') | chrome/common/chrome_switches.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/instant/instant_field_trial.h" 5 #include "chrome/browser/instant/instant_field_trial.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/metrics/field_trial.h" 8 #include "base/metrics/field_trial.h"
9 #include "chrome/browser/metrics/metrics_service.h" 9 #include "chrome/browser/metrics/metrics_service.h"
10 #include "chrome/browser/prefs/pref_service.h" 10 #include "chrome/browser/prefs/pref_service.h"
11 #include "chrome/browser/profiles/profile.h" 11 #include "chrome/browser/profiles/profile.h"
12 #include "chrome/common/chrome_switches.h" 12 #include "chrome/common/chrome_switches.h"
13 #include "chrome/common/pref_names.h" 13 #include "chrome/common/pref_names.h"
14 14
15 namespace { 15 namespace {
16 16
17 // Field trial IDs of the control and experiment groups. Though they are not 17 // Field trial IDs of the control and experiment groups. Though they are not
18 // literally "const", they are set only once, in Activate() below. See the .h 18 // literally "const", they are set only once, in Activate() below. See the .h
19 // file for what these groups represent. 19 // file for what these groups represent.
20 int g_instant_experiment_a = 0; 20 int g_instant_experiment_a = 0;
21 int g_instant_experiment_b = 0; 21 int g_instant_experiment_b = 0;
22
22 int g_hidden_experiment_a = 0; 23 int g_hidden_experiment_a = 0;
23 int g_hidden_experiment_b = 0; 24 int g_hidden_experiment_b = 0;
25
24 int g_silent_experiment_a = 0; 26 int g_silent_experiment_a = 0;
25 int g_silent_experiment_b = 0; 27 int g_silent_experiment_b = 0;
26 28
29 int g_suggest_experiment_a = 0;
30 int g_suggest_experiment_b = 0;
31
27 int g_uma_control_a = 0; 32 int g_uma_control_a = 0;
28 int g_uma_control_b = 0; 33 int g_uma_control_b = 0;
34
29 int g_all_control_a = 0; 35 int g_all_control_a = 0;
30 int g_all_control_b = 0; 36 int g_all_control_b = 0;
31 37
32 } 38 }
33 39
34 // static 40 // static
35 void InstantFieldTrial::Activate() { 41 void InstantFieldTrial::Activate() {
36 scoped_refptr<base::FieldTrial> trial( 42 scoped_refptr<base::FieldTrial> trial(
37 new base::FieldTrial("Instant", 1000, "Inactive", 2012, 7, 1)); 43 new base::FieldTrial("Instant", 1000, "Inactive", 2012, 7, 1));
38 44
39 // Try to give the user a consistent experience, if possible. 45 // Try to give the user a consistent experience, if possible.
40 if (base::FieldTrialList::IsOneTimeRandomizationEnabled()) 46 if (base::FieldTrialList::IsOneTimeRandomizationEnabled())
41 trial->UseOneTimeRandomization(); 47 trial->UseOneTimeRandomization();
42 48
43 // Each group is of total size 10% (5% each for the _a and _b variants). 49 // Each group is of total size 10% (5% each for the _a and _b variants).
44 g_instant_experiment_a = trial->AppendGroup("InstantExperimentA", 50); 50 g_instant_experiment_a = trial->AppendGroup("InstantExperimentA", 50);
45 g_instant_experiment_b = trial->AppendGroup("InstantExperimentB", 50); 51 g_instant_experiment_b = trial->AppendGroup("InstantExperimentB", 50);
52
46 g_hidden_experiment_a = trial->AppendGroup("HiddenExperimentA", 50); 53 g_hidden_experiment_a = trial->AppendGroup("HiddenExperimentA", 50);
47 g_hidden_experiment_b = trial->AppendGroup("HiddenExperimentB", 50); 54 g_hidden_experiment_b = trial->AppendGroup("HiddenExperimentB", 50);
55
48 g_silent_experiment_a = trial->AppendGroup("SilentExperimentA", 50); 56 g_silent_experiment_a = trial->AppendGroup("SilentExperimentA", 50);
49 g_silent_experiment_b = trial->AppendGroup("SilentExperimentB", 50); 57 g_silent_experiment_b = trial->AppendGroup("SilentExperimentB", 50);
50 58
59 g_suggest_experiment_a = trial->AppendGroup("SuggestExperimentA", 50);
60 g_suggest_experiment_b = trial->AppendGroup("SuggestExperimentB", 50);
61
51 g_uma_control_a = trial->AppendGroup("UmaControlA", 50); 62 g_uma_control_a = trial->AppendGroup("UmaControlA", 50);
52 g_uma_control_b = trial->AppendGroup("UmaControlB", 50); 63 g_uma_control_b = trial->AppendGroup("UmaControlB", 50);
64
53 g_all_control_a = trial->AppendGroup("AllControlA", 50); 65 g_all_control_a = trial->AppendGroup("AllControlA", 50);
54 g_all_control_b = trial->AppendGroup("AllControlB", 50); 66 g_all_control_b = trial->AppendGroup("AllControlB", 50);
55 } 67 }
56 68
57 // static 69 // static
58 InstantFieldTrial::Group InstantFieldTrial::GetGroup(Profile* profile) { 70 InstantFieldTrial::Group InstantFieldTrial::GetGroup(Profile* profile) {
59 CommandLine* command_line = CommandLine::ForCurrentProcess(); 71 CommandLine* command_line = CommandLine::ForCurrentProcess();
60 if (command_line->HasSwitch(switches::kInstantFieldTrial)) { 72 if (command_line->HasSwitch(switches::kInstantFieldTrial)) {
61 std::string switch_value = 73 std::string switch_value =
62 command_line->GetSwitchValueASCII(switches::kInstantFieldTrial); 74 command_line->GetSwitchValueASCII(switches::kInstantFieldTrial);
63 if (switch_value == switches::kInstantFieldTrialInstant) 75 if (switch_value == switches::kInstantFieldTrialInstant)
64 return INSTANT_EXPERIMENT_A; 76 return INSTANT_EXPERIMENT_A;
65 else if (switch_value == switches::kInstantFieldTrialHidden) 77 else if (switch_value == switches::kInstantFieldTrialHidden)
66 return HIDDEN_EXPERIMENT_A; 78 return HIDDEN_EXPERIMENT_A;
67 else if (switch_value == switches::kInstantFieldTrialSilent) 79 else if (switch_value == switches::kInstantFieldTrialSilent)
68 return SILENT_EXPERIMENT_A; 80 return SILENT_EXPERIMENT_A;
81 else if (switch_value == switches::kInstantFieldTrialSuggest)
82 return SUGGEST_EXPERIMENT_A;
69 else 83 else
70 return INACTIVE; 84 return INACTIVE;
71 } 85 }
72 86
73 const int group = base::FieldTrialList::FindValue("Instant"); 87 const int group = base::FieldTrialList::FindValue("Instant");
74 if (group == base::FieldTrial::kNotFinalized || 88 if (group == base::FieldTrial::kNotFinalized ||
75 group == base::FieldTrial::kDefaultGroupNumber) { 89 group == base::FieldTrial::kDefaultGroupNumber) {
76 return INACTIVE; 90 return INACTIVE;
77 } 91 }
78 92
79 const PrefService* prefs = profile ? profile->GetPrefs() : NULL; 93 const PrefService* prefs = profile ? profile->GetPrefs() : NULL;
80 if (!prefs || 94 if (!prefs ||
81 prefs->GetBoolean(prefs::kInstantEnabledOnce) || 95 prefs->GetBoolean(prefs::kInstantEnabledOnce) ||
82 prefs->IsManagedPreference(prefs::kInstantEnabled)) { 96 prefs->IsManagedPreference(prefs::kInstantEnabled)) {
83 return INACTIVE; 97 return INACTIVE;
84 } 98 }
85 99
86 // First, deal with the groups that don't require UMA opt-in. 100 // First, deal with the groups that don't require UMA opt-in.
87 if (group == g_silent_experiment_a) 101 if (group == g_silent_experiment_a)
88 return SILENT_EXPERIMENT_A; 102 return SILENT_EXPERIMENT_A;
89 if (group == g_silent_experiment_b) 103 if (group == g_silent_experiment_b)
90 return SILENT_EXPERIMENT_B; 104 return SILENT_EXPERIMENT_B;
105
91 if (group == g_all_control_a) 106 if (group == g_all_control_a)
92 return ALL_CONTROL_A; 107 return ALL_CONTROL_A;
93 if (group == g_all_control_b) 108 if (group == g_all_control_b)
94 return ALL_CONTROL_B; 109 return ALL_CONTROL_B;
95 110
96 // All other groups require UMA and suggest, else bounce back to INACTIVE. 111 // All other groups require UMA and suggest, else bounce back to INACTIVE.
97 if (profile->IsOffTheRecord() || 112 if (profile->IsOffTheRecord() ||
98 !MetricsServiceHelper::IsMetricsReportingEnabled() || 113 !MetricsServiceHelper::IsMetricsReportingEnabled() ||
99 !prefs->GetBoolean(prefs::kSearchSuggestEnabled)) { 114 !prefs->GetBoolean(prefs::kSearchSuggestEnabled)) {
100 return INACTIVE; 115 return INACTIVE;
101 } 116 }
102 117
103 if (group == g_instant_experiment_a) 118 if (group == g_instant_experiment_a)
104 return INSTANT_EXPERIMENT_A; 119 return INSTANT_EXPERIMENT_A;
105 if (group == g_instant_experiment_b) 120 if (group == g_instant_experiment_b)
106 return INSTANT_EXPERIMENT_B; 121 return INSTANT_EXPERIMENT_B;
122
107 if (group == g_hidden_experiment_a) 123 if (group == g_hidden_experiment_a)
108 return HIDDEN_EXPERIMENT_A; 124 return HIDDEN_EXPERIMENT_A;
109 if (group == g_hidden_experiment_b) 125 if (group == g_hidden_experiment_b)
110 return HIDDEN_EXPERIMENT_B; 126 return HIDDEN_EXPERIMENT_B;
127
128 if (group == g_suggest_experiment_a)
129 return SUGGEST_EXPERIMENT_A;
130 if (group == g_suggest_experiment_b)
131 return SUGGEST_EXPERIMENT_B;
132
111 if (group == g_uma_control_a) 133 if (group == g_uma_control_a)
112 return UMA_CONTROL_A; 134 return UMA_CONTROL_A;
113 if (group == g_uma_control_b) 135 if (group == g_uma_control_b)
114 return UMA_CONTROL_B; 136 return UMA_CONTROL_B;
115 137
116 NOTREACHED(); 138 NOTREACHED();
117 return INACTIVE; 139 return INACTIVE;
118 } 140 }
119 141
120 // static 142 // static
121 bool InstantFieldTrial::IsInstantExperiment(Profile* profile) { 143 bool InstantFieldTrial::IsInstantExperiment(Profile* profile) {
122 Group group = GetGroup(profile); 144 Group group = GetGroup(profile);
123 return group == INSTANT_EXPERIMENT_A || group == INSTANT_EXPERIMENT_B || 145 return group == INSTANT_EXPERIMENT_A || group == INSTANT_EXPERIMENT_B ||
124 group == HIDDEN_EXPERIMENT_A || group == HIDDEN_EXPERIMENT_B || 146 group == HIDDEN_EXPERIMENT_A || group == HIDDEN_EXPERIMENT_B ||
125 group == SILENT_EXPERIMENT_A || group == SILENT_EXPERIMENT_B; 147 group == SILENT_EXPERIMENT_A || group == SILENT_EXPERIMENT_B ||
148 group == SUGGEST_EXPERIMENT_A || group == SUGGEST_EXPERIMENT_B;
126 } 149 }
127 150
128 // static 151 // static
129 bool InstantFieldTrial::IsHiddenExperiment(Profile* profile) { 152 bool InstantFieldTrial::IsHiddenExperiment(Profile* profile) {
130 Group group = GetGroup(profile); 153 Group group = GetGroup(profile);
131 return group == HIDDEN_EXPERIMENT_A || group == HIDDEN_EXPERIMENT_B || 154 return group == HIDDEN_EXPERIMENT_A || group == HIDDEN_EXPERIMENT_B ||
132 group == SILENT_EXPERIMENT_A || group == SILENT_EXPERIMENT_B; 155 group == SILENT_EXPERIMENT_A || group == SILENT_EXPERIMENT_B ||
156 group == SUGGEST_EXPERIMENT_A || group == SUGGEST_EXPERIMENT_B;
133 } 157 }
134 158
135 // static 159 // static
136 bool InstantFieldTrial::IsSilentExperiment(Profile* profile) { 160 bool InstantFieldTrial::IsSilentExperiment(Profile* profile) {
137 Group group = GetGroup(profile); 161 Group group = GetGroup(profile);
138 return group == SILENT_EXPERIMENT_A || group == SILENT_EXPERIMENT_B; 162 return group == SILENT_EXPERIMENT_A || group == SILENT_EXPERIMENT_B;
139 } 163 }
140 164
141 // static 165 // static
142 std::string InstantFieldTrial::GetGroupName(Profile* profile) { 166 std::string InstantFieldTrial::GetGroupName(Profile* profile) {
143 switch (GetGroup(profile)) { 167 switch (GetGroup(profile)) {
144 case INACTIVE: return std::string(); 168 case INACTIVE: return std::string();
145 169
146 case INSTANT_EXPERIMENT_A: return "_InstantExperimentA"; 170 case INSTANT_EXPERIMENT_A: return "_InstantExperimentA";
147 case INSTANT_EXPERIMENT_B: return "_InstantExperimentB"; 171 case INSTANT_EXPERIMENT_B: return "_InstantExperimentB";
172
148 case HIDDEN_EXPERIMENT_A: return "_HiddenExperimentA"; 173 case HIDDEN_EXPERIMENT_A: return "_HiddenExperimentA";
149 case HIDDEN_EXPERIMENT_B: return "_HiddenExperimentB"; 174 case HIDDEN_EXPERIMENT_B: return "_HiddenExperimentB";
175
150 case SILENT_EXPERIMENT_A: return "_SilentExperimentA"; 176 case SILENT_EXPERIMENT_A: return "_SilentExperimentA";
151 case SILENT_EXPERIMENT_B: return "_SilentExperimentB"; 177 case SILENT_EXPERIMENT_B: return "_SilentExperimentB";
152 178
179 case SUGGEST_EXPERIMENT_A: return "_SuggestExperimentA";
180 case SUGGEST_EXPERIMENT_B: return "_SuggestExperimentB";
181
153 case UMA_CONTROL_A: return "_UmaControlA"; 182 case UMA_CONTROL_A: return "_UmaControlA";
154 case UMA_CONTROL_B: return "_UmaControlB"; 183 case UMA_CONTROL_B: return "_UmaControlB";
184
155 case ALL_CONTROL_A: return "_AllControlA"; 185 case ALL_CONTROL_A: return "_AllControlA";
156 case ALL_CONTROL_B: return "_AllControlB"; 186 case ALL_CONTROL_B: return "_AllControlB";
157 } 187 }
158 188
159 NOTREACHED(); 189 NOTREACHED();
160 return std::string(); 190 return std::string();
161 } 191 }
162 192
163 // static 193 // static
164 std::string InstantFieldTrial::GetGroupAsUrlParam(Profile* profile) { 194 std::string InstantFieldTrial::GetGroupAsUrlParam(Profile* profile) {
165 switch (GetGroup(profile)) { 195 switch (GetGroup(profile)) {
166 case INACTIVE: return std::string(); 196 case INACTIVE: return std::string();
167 197
168 case INSTANT_EXPERIMENT_A: return "ix=iea&"; 198 case INSTANT_EXPERIMENT_A: return "ix=iea&";
169 case INSTANT_EXPERIMENT_B: return "ix=ieb&"; 199 case INSTANT_EXPERIMENT_B: return "ix=ieb&";
200
170 case HIDDEN_EXPERIMENT_A: return "ix=hea&"; 201 case HIDDEN_EXPERIMENT_A: return "ix=hea&";
171 case HIDDEN_EXPERIMENT_B: return "ix=heb&"; 202 case HIDDEN_EXPERIMENT_B: return "ix=heb&";
203
172 case SILENT_EXPERIMENT_A: return "ix=sea&"; 204 case SILENT_EXPERIMENT_A: return "ix=sea&";
173 case SILENT_EXPERIMENT_B: return "ix=seb&"; 205 case SILENT_EXPERIMENT_B: return "ix=seb&";
174 206
207 case SUGGEST_EXPERIMENT_A: return "ix=tea&";
208 case SUGGEST_EXPERIMENT_B: return "ix=teb&";
209
175 case UMA_CONTROL_A: return "ix=uca&"; 210 case UMA_CONTROL_A: return "ix=uca&";
176 case UMA_CONTROL_B: return "ix=ucb&"; 211 case UMA_CONTROL_B: return "ix=ucb&";
212
177 case ALL_CONTROL_A: return "ix=aca&"; 213 case ALL_CONTROL_A: return "ix=aca&";
178 case ALL_CONTROL_B: return "ix=acb&"; 214 case ALL_CONTROL_B: return "ix=acb&";
179 } 215 }
180 216
181 NOTREACHED(); 217 NOTREACHED();
182 return std::string(); 218 return std::string();
183 } 219 }
220
221 // static
222 bool InstantFieldTrial::ShouldSetSuggestedText(Profile* profile) {
223 Group group = GetGroup(profile);
224 return !(group == HIDDEN_EXPERIMENT_A || group == HIDDEN_EXPERIMENT_B ||
225 group == SILENT_EXPERIMENT_A || group == SILENT_EXPERIMENT_B);
226 }
OLDNEW
« no previous file with comments | « chrome/browser/instant/instant_field_trial.h ('k') | chrome/common/chrome_switches.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698