| Index: components/variations/variations_seed_processor.cc
|
| ===================================================================
|
| --- components/variations/variations_seed_processor.cc (revision 233704)
|
| +++ components/variations/variations_seed_processor.cc (working copy)
|
| @@ -12,6 +12,7 @@
|
| #include "base/metrics/field_trial.h"
|
| #include "base/stl_util.h"
|
| #include "base/version.h"
|
| +#include "components/variations/processed_study.h"
|
| #include "components/variations/variations_associated_data.h"
|
|
|
| namespace chrome_variations {
|
| @@ -69,6 +70,21 @@
|
| const base::Time& reference_date,
|
| const base::Version& version,
|
| Study_Channel channel) {
|
| + std::vector<ProcessedStudy> filtered_studies;
|
| + FilterAndValidateStudies(seed, locale, reference_date, version, channel,
|
| + &filtered_studies);
|
| +
|
| + for (size_t i = 0; i < filtered_studies.size(); ++i)
|
| + CreateTrialFromStudy(filtered_studies[i]);
|
| +}
|
| +
|
| +void VariationsSeedProcessor::FilterAndValidateStudies(
|
| + const VariationsSeed& seed,
|
| + const std::string& locale,
|
| + const base::Time& reference_date,
|
| + const base::Version& version,
|
| + Study_Channel channel,
|
| + std::vector<ProcessedStudy>* filtered_studies) {
|
| DCHECK(version.IsValid());
|
|
|
| // Add expired studies (in a disabled state) only after all the non-expired
|
| @@ -85,18 +101,29 @@
|
|
|
| if (IsStudyExpired(study, reference_date)) {
|
| expired_studies.push_back(&study);
|
| - } else {
|
| - CreateTrialFromStudy(study, false);
|
| + } else if (!ContainsKey(created_studies, study.name())) {
|
| + ValidateAndAddStudy(study, false, filtered_studies);
|
| created_studies.insert(study.name());
|
| }
|
| }
|
|
|
| for (size_t i = 0; i < expired_studies.size(); ++i) {
|
| if (!ContainsKey(created_studies, expired_studies[i]->name()))
|
| - CreateTrialFromStudy(*expired_studies[i], true);
|
| + ValidateAndAddStudy(*expired_studies[i], true, filtered_studies);
|
| }
|
| }
|
|
|
| +void VariationsSeedProcessor::ValidateAndAddStudy(
|
| + const Study& study,
|
| + bool is_expired,
|
| + std::vector<ProcessedStudy>* filtered_studies) {
|
| + base::FieldTrial::Probability total_probability = 0;
|
| + if (!ValidateStudyAndComputeTotalProbability(study, &total_probability))
|
| + return;
|
| + filtered_studies->push_back(ProcessedStudy(&study, total_probability,
|
| + is_expired));
|
| +}
|
| +
|
| bool VariationsSeedProcessor::CheckStudyChannel(const Study_Filter& filter,
|
| Study_Channel channel) {
|
| // An empty channel list matches all channels.
|
| @@ -166,11 +193,9 @@
|
| return true;
|
| }
|
|
|
| -void VariationsSeedProcessor::CreateTrialFromStudy(const Study& study,
|
| - bool is_expired) {
|
| - base::FieldTrial::Probability total_probability = 0;
|
| - if (!ValidateStudyAndComputeTotalProbability(study, &total_probability))
|
| - return;
|
| +void VariationsSeedProcessor::CreateTrialFromStudy(
|
| + const ProcessedStudy& processed_study) {
|
| + const Study& study = *processed_study.study;
|
|
|
| // Check if any experiments need to be forced due to a command line
|
| // flag. Force the first experiment with an existing flag.
|
| @@ -202,7 +227,8 @@
|
| // the expiration check using |reference_date| is done explicitly below.
|
| scoped_refptr<base::FieldTrial> trial(
|
| base::FieldTrialList::FactoryGetFieldTrialWithRandomizationSeed(
|
| - study.name(), total_probability, study.default_experiment_name(),
|
| + study.name(), processed_study.total_probability,
|
| + study.default_experiment_name(),
|
| base::FieldTrialList::kNoExpirationYear, 1, 1, randomization_type,
|
| randomization_seed, NULL));
|
|
|
| @@ -237,7 +263,7 @@
|
| }
|
|
|
| trial->SetForced();
|
| - if (is_expired)
|
| + if (processed_study.is_expired)
|
| trial->Disable();
|
| else if (study.activation_type() == Study_ActivationType_ACTIVATION_AUTO)
|
| trial->group();
|
|
|