| 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/autocomplete/autocomplete_field_trial.h" | 5 #include "chrome/browser/autocomplete/autocomplete_field_trial.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
| 10 #include "base/string_util.h" |
| 10 #include "base/stringprintf.h" | 11 #include "base/stringprintf.h" |
| 11 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 12 #include "chrome/common/metrics/metrics_util.h" | 13 #include "chrome/common/metrics/metrics_util.h" |
| 13 #include "chrome/common/metrics/variations/variation_ids.h" | 14 #include "chrome/common/metrics/variations/variation_ids.h" |
| 14 #include "chrome/common/metrics/variations/variations_util.h" | 15 #include "chrome/common/metrics/variations/variations_util.h" |
| 15 | 16 |
| 16 namespace { | 17 namespace { |
| 17 | 18 |
| 18 // Field trial names. | 19 // Field trial names. |
| 19 static const char kDisallowInlineHQPFieldTrialName[] = | 20 static const char kDisallowInlineHQPFieldTrialName[] = |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 // For the field trial that allows HistoryQuick provider to use the | 99 // For the field trial that allows HistoryQuick provider to use the |
| 99 // cursor position, put 25% ( = 25/100 ) of the users in the experiment group. | 100 // cursor position, put 25% ( = 25/100 ) of the users in the experiment group. |
| 100 const base::FieldTrial::Probability | 101 const base::FieldTrial::Probability |
| 101 kHQPUseCursorPositionFieldTrialDivisor = 100; | 102 kHQPUseCursorPositionFieldTrialDivisor = 100; |
| 102 const base::FieldTrial::Probability | 103 const base::FieldTrial::Probability |
| 103 kHQPUseCursorPositionFieldTrialExperimentFraction = 25; | 104 kHQPUseCursorPositionFieldTrialExperimentFraction = 25; |
| 104 | 105 |
| 105 | 106 |
| 106 // Field trial IDs. | 107 // Field trial IDs. |
| 107 // Though they are not literally "const", they are set only once, in | 108 // Though they are not literally "const", they are set only once, in |
| 108 // Activate() below. | 109 // ActivateStaticTrials() below. |
| 109 | 110 |
| 110 // Whether the static field trials have been initialized by | 111 // Whether the static field trials have been initialized by |
| 111 // ActivateStaticTrials method. | 112 // ActivateStaticTrials() method. |
| 112 bool static_field_trials_initialized = false; | 113 bool static_field_trials_initialized = false; |
| 113 | 114 |
| 114 // Field trial ID for the disallow-inline History Quick Provider | 115 // Field trial ID for the disallow-inline History Quick Provider |
| 115 // experiment group. | 116 // experiment group. |
| 116 int disallow_inline_hqp_experiment_group = 0; | 117 int disallow_inline_hqp_experiment_group = 0; |
| 117 | 118 |
| 118 // Field trial ID for the History Quick Provider new scoring experiment group. | 119 // Field trial ID for the History Quick Provider new scoring experiment group. |
| 119 int hqp_new_scoring_experiment_group = 0; | 120 int hqp_new_scoring_experiment_group = 0; |
| 120 | 121 |
| 121 // Field trial ID for the HistoryURL provider cull redirects experiment group. | 122 // Field trial ID for the HistoryURL provider cull redirects experiment group. |
| 122 int hup_dont_cull_redirects_experiment_group = 0; | 123 int hup_dont_cull_redirects_experiment_group = 0; |
| 123 | 124 |
| 124 // Field trial ID for the HistoryURL provider create shorter match | 125 // Field trial ID for the HistoryURL provider create shorter match |
| 125 // experiment group. | 126 // experiment group. |
| 126 int hup_dont_create_shorter_match_experiment_group = 0; | 127 int hup_dont_create_shorter_match_experiment_group = 0; |
| 127 | 128 |
| 128 // Field trial ID for the HistoryQuick provider replaces HistoryURL provider | 129 // Field trial ID for the HistoryQuick provider replaces HistoryURL provider |
| 129 // experiment group. | 130 // experiment group. |
| 130 int hqp_replace_hup_scoring_experiment_group = 0; | 131 int hqp_replace_hup_scoring_experiment_group = 0; |
| 131 | 132 |
| 132 // Field trial ID for the HistoryQuick provider only count matches at | 133 // Field trial ID for the HistoryQuick provider only count matches at |
| 133 // word boundaries experiment group. | 134 // word boundaries experiment group. |
| 134 int hqp_only_count_matches_at_word_boundaries_experiment_group = 0; | 135 int hqp_only_count_matches_at_word_boundaries_experiment_group = 0; |
| 135 | 136 |
| 136 // Field trial ID for the HistoryQuick provider use cursor position | 137 // Field trial ID for the HistoryQuick provider use cursor position |
| 137 // experiment group. | 138 // experiment group. |
| 138 int hqp_use_cursor_position_experiment_group = 0; | 139 int hqp_use_cursor_position_experiment_group = 0; |
| 139 | 140 |
| 141 // Concatenates the autocomplete dynamic field trial prefix with a field trial |
| 142 // ID to form a complete autocomplete field trial name. |
| 143 std::string DynamicFieldTrialName(int id) { |
| 144 return base::StringPrintf("%s%d", kAutocompleteDynamicFieldTrialPrefix, id); |
| 140 } | 145 } |
| 141 | 146 |
| 147 } // namespace |
| 148 |
| 142 | 149 |
| 143 void AutocompleteFieldTrial::ActivateStaticTrials() { | 150 void AutocompleteFieldTrial::ActivateStaticTrials() { |
| 144 DCHECK(!static_field_trials_initialized); | 151 DCHECK(!static_field_trials_initialized); |
| 145 | 152 |
| 146 // Create inline History Quick Provider field trial. | 153 // Create inline History Quick Provider field trial. |
| 147 // Make it expire on November 8, 2012. | 154 // Make it expire on November 8, 2012. |
| 148 scoped_refptr<base::FieldTrial> trial( | 155 scoped_refptr<base::FieldTrial> trial( |
| 149 base::FieldTrialList::FactoryGetFieldTrial( | 156 base::FieldTrialList::FactoryGetFieldTrial( |
| 150 kDisallowInlineHQPFieldTrialName, kDisallowInlineHQPFieldTrialDivisor, | 157 kDisallowInlineHQPFieldTrialName, kDisallowInlineHQPFieldTrialDivisor, |
| 151 "Standard", 2012, 11, 8, NULL)); | 158 "Standard", 2012, 11, 8, NULL)); |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 "Standard", 2013, 8, 23, NULL); | 261 "Standard", 2013, 8, 23, NULL); |
| 255 trial->UseOneTimeRandomization(); | 262 trial->UseOneTimeRandomization(); |
| 256 hqp_use_cursor_position_experiment_group = | 263 hqp_use_cursor_position_experiment_group = |
| 257 trial->AppendGroup("HQPUseCursorPosition", | 264 trial->AppendGroup("HQPUseCursorPosition", |
| 258 kHQPUseCursorPositionFieldTrialExperimentFraction); | 265 kHQPUseCursorPositionFieldTrialExperimentFraction); |
| 259 | 266 |
| 260 static_field_trials_initialized = true; | 267 static_field_trials_initialized = true; |
| 261 } | 268 } |
| 262 | 269 |
| 263 void AutocompleteFieldTrial::ActivateDynamicTrials() { | 270 void AutocompleteFieldTrial::ActivateDynamicTrials() { |
| 264 // Initialize all autocomplete dynamic field trials. | 271 // Initialize all autocomplete dynamic field trials. This method may be |
| 272 // called multiple times. |
| 273 for (int i = 0; i < kMaxAutocompleteDynamicFieldTrials; ++i) |
| 274 base::FieldTrialList::FindValue(DynamicFieldTrialName(i)); |
| 275 } |
| 276 |
| 277 int AutocompleteFieldTrial::GetDisabledProviderTypes() { |
| 278 // Make sure that Autocomplete dynamic field trials are activated. It's OK to |
| 279 // call this method multiple times. |
| 280 ActivateDynamicTrials(); |
| 281 |
| 282 // Look for group names in form of "DisabledProviders_<mask>" where "mask" |
| 283 // is a bitmap of disabled provider types (AutocompleteProvider::Type). |
| 284 int provider_types = 0; |
| 265 for (int i = 0; i < kMaxAutocompleteDynamicFieldTrials; ++i) { | 285 for (int i = 0; i < kMaxAutocompleteDynamicFieldTrials; ++i) { |
| 266 base::FieldTrialList::FindValue( | 286 std::string group_name = base::FieldTrialList::FindFullName( |
| 267 base::StringPrintf("%s%d", kAutocompleteDynamicFieldTrialPrefix, i)); | 287 DynamicFieldTrialName(i)); |
| 288 const char kDisabledProviders[] = "DisabledProviders_"; |
| 289 if (!StartsWithASCII(group_name, kDisabledProviders, true)) |
| 290 continue; |
| 291 int types = 0; |
| 292 if (!base::StringToInt(base::StringPiece( |
| 293 group_name.substr(strlen(kDisabledProviders))), &types)) { |
| 294 LOG(WARNING) << "Malformed DisabledProviders string: " << group_name; |
| 295 continue; |
| 296 } |
| 297 if (types == 0) |
| 298 LOG(WARNING) << "Expecting a non-zero bitmap; group = " << group_name; |
| 299 else |
| 300 provider_types |= types; |
| 268 } | 301 } |
| 302 return provider_types; |
| 269 } | 303 } |
| 270 | 304 |
| 271 bool AutocompleteFieldTrial::InDisallowInlineHQPFieldTrial() { | 305 bool AutocompleteFieldTrial::InDisallowInlineHQPFieldTrial() { |
| 272 return base::FieldTrialList::TrialExists(kDisallowInlineHQPFieldTrialName); | 306 return base::FieldTrialList::TrialExists(kDisallowInlineHQPFieldTrialName); |
| 273 } | 307 } |
| 274 | 308 |
| 275 bool AutocompleteFieldTrial::InDisallowInlineHQPFieldTrialExperimentGroup() { | 309 bool AutocompleteFieldTrial::InDisallowInlineHQPFieldTrialExperimentGroup() { |
| 276 if (!base::FieldTrialList::TrialExists(kDisallowInlineHQPFieldTrialName)) | 310 if (!base::FieldTrialList::TrialExists(kDisallowInlineHQPFieldTrialName)) |
| 277 return false; | 311 return false; |
| 278 | 312 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 bool AutocompleteFieldTrial:: | 406 bool AutocompleteFieldTrial:: |
| 373 InHQPUseCursorPositionFieldTrialExperimentGroup() { | 407 InHQPUseCursorPositionFieldTrialExperimentGroup() { |
| 374 if (!InHQPUseCursorPositionFieldTrial()) | 408 if (!InHQPUseCursorPositionFieldTrial()) |
| 375 return false; | 409 return false; |
| 376 | 410 |
| 377 // Return true if we're in the experiment group. | 411 // Return true if we're in the experiment group. |
| 378 const int group = base::FieldTrialList::FindValue( | 412 const int group = base::FieldTrialList::FindValue( |
| 379 kHQPUseCursorPositionFieldTrialName); | 413 kHQPUseCursorPositionFieldTrialName); |
| 380 return group == hqp_use_cursor_position_experiment_group; | 414 return group == hqp_use_cursor_position_experiment_group; |
| 381 } | 415 } |
| OLD | NEW |