| Index: components/variations/variations_seed_processor.cc
|
| diff --git a/components/variations/variations_seed_processor.cc b/components/variations/variations_seed_processor.cc
|
| index e468e4e2d808cddef99f84c3c6414a3a1205eeb0..87912e8630ee663a5592665e23a640cb0f3da82f 100644
|
| --- a/components/variations/variations_seed_processor.cc
|
| +++ b/components/variations/variations_seed_processor.cc
|
| @@ -4,10 +4,12 @@
|
|
|
| #include "components/variations/variations_seed_processor.h"
|
|
|
| +#include <map>
|
| #include <vector>
|
|
|
| #include "base/command_line.h"
|
| #include "base/metrics/field_trial.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| #include "components/variations/processed_study.h"
|
| #include "components/variations/study_filtering.h"
|
| #include "components/variations/variations_associated_data.h"
|
| @@ -58,6 +60,17 @@ void RegisterVariationIds(const Study_Experiment& experiment,
|
| }
|
| }
|
|
|
| +// Executes |callback| on every override defined by |experiment|.
|
| +void ApplyUIStringOverrides(
|
| + const Study_Experiment& experiment,
|
| + const VariationsSeedProcessor::UIStringOverrideCallback& callback) {
|
| + for (int i = 0; i < experiment.override_ui_string_size(); ++i) {
|
| + const Study_Experiment_OverrideUIString& override =
|
| + experiment.override_ui_string(i);
|
| + callback.Run(override.name_hash(), base::UTF8ToUTF16(override.value()));
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|
| VariationsSeedProcessor::VariationsSeedProcessor() {
|
| @@ -73,17 +86,19 @@ void VariationsSeedProcessor::CreateTrialsFromSeed(
|
| const base::Version& version,
|
| Study_Channel channel,
|
| Study_FormFactor form_factor,
|
| - const std::string& hardware_class) {
|
| + const std::string& hardware_class,
|
| + const UIStringOverrideCallback& override_callback) {
|
| std::vector<ProcessedStudy> filtered_studies;
|
| FilterAndValidateStudies(seed, locale, reference_date, version, channel,
|
| form_factor, hardware_class, &filtered_studies);
|
|
|
| for (size_t i = 0; i < filtered_studies.size(); ++i)
|
| - CreateTrialFromStudy(filtered_studies[i]);
|
| + CreateTrialFromStudy(filtered_studies[i], override_callback);
|
| }
|
|
|
| void VariationsSeedProcessor::CreateTrialFromStudy(
|
| - const ProcessedStudy& processed_study) {
|
| + const ProcessedStudy& processed_study,
|
| + const UIStringOverrideCallback& override_callback) {
|
| const Study& study = *processed_study.study();
|
|
|
| // Check if any experiments need to be forced due to a command line
|
| @@ -98,8 +113,11 @@ void VariationsSeedProcessor::CreateTrialFromStudy(
|
| experiment.name()));
|
| RegisterExperimentParams(study, experiment);
|
| RegisterVariationIds(experiment, study.name());
|
| - if (study.activation_type() == Study_ActivationType_ACTIVATION_AUTO)
|
| + if (study.activation_type() == Study_ActivationType_ACTIVATION_AUTO) {
|
| trial->group();
|
| + // UI Strings can only be overridden from ACTIVATION_AUTO experiments.
|
| + ApplyUIStringOverrides(experiment, override_callback);
|
| + }
|
|
|
| DVLOG(1) << "Trial " << study.name() << " forced by flag: "
|
| << experiment.forcing_flag();
|
| @@ -127,6 +145,7 @@ void VariationsSeedProcessor::CreateTrialFromStudy(
|
| base::FieldTrialList::kNoExpirationYear, 1, 1, randomization_type,
|
| randomization_seed, NULL));
|
|
|
| + bool has_overrides = false;
|
| for (int i = 0; i < study.experiment_size(); ++i) {
|
| const Study_Experiment& experiment = study.experiment(i);
|
| RegisterExperimentParams(study, experiment);
|
| @@ -140,13 +159,31 @@ void VariationsSeedProcessor::CreateTrialFromStudy(
|
| trial->AppendGroup(experiment.name(), experiment.probability_weight());
|
|
|
| RegisterVariationIds(experiment, study.name());
|
| +
|
| + has_overrides = has_overrides || experiment.override_ui_string_size() > 0;
|
| }
|
|
|
| trial->SetForced();
|
| - if (processed_study.is_expired())
|
| + if (processed_study.is_expired()) {
|
| trial->Disable();
|
| - else if (study.activation_type() == Study_ActivationType_ACTIVATION_AUTO)
|
| - trial->group();
|
| + } else if (study.activation_type() == Study_ActivationType_ACTIVATION_AUTO) {
|
| + const std::string& group_name = trial->group_name();
|
| +
|
| + // Don't try to apply overrides if none of the experiments in this study had
|
| + // any.
|
| + if (!has_overrides)
|
| + return;
|
| +
|
| + // UI Strings can only be overridden from ACTIVATION_AUTO experiments.
|
| + int experiment_index = processed_study.GetExperimentIndexByName(group_name);
|
| +
|
| + // The field trial was defined from |study|, so the active experiment's name
|
| + // must be in the |study|.
|
| + DCHECK_NE(-1, experiment_index);
|
| +
|
| + ApplyUIStringOverrides(study.experiment(experiment_index),
|
| + override_callback);
|
| + }
|
| }
|
|
|
| } // namespace chrome_variations
|
|
|