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

Unified Diff: components/flags_ui/flags_state.cc

Issue 2707013002: [chrome://flags] Let features override params in the same trial (Closed)
Patch Set: Comments #1 Created 3 years, 10 months 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 side-by-side diff with in-line comments
Download patch
Index: components/flags_ui/flags_state.cc
diff --git a/components/flags_ui/flags_state.cc b/components/flags_ui/flags_state.cc
index 7f039633e7a8a258dee0fc149f8e6838c52d76ef..f0c754a9fcf77e06d12bbe9f123108344a1112ce 100644
--- a/components/flags_ui/flags_state.cc
+++ b/components/flags_ui/flags_state.cc
@@ -192,25 +192,17 @@ base::Value* CreateOptionsData(const FeatureEntry& entry,
return result;
}
-// Registers variation parameters specified by |feature_variation| for the field
-// trial named |feature_trial_name|, unless a group for this trial has already
-// been created (e.g. via command-line switches that take precedence over
-// about:flags). In the trial, the function creates a new constant group called
-// |kTrialGroupAboutFlags|.
+// Registers variation parameters specified by |feature_variation_params| for
+// the field trial named |feature_trial_name|, unless a group for this trial has
+// already been created (e.g. via command-line switches that take precedence
+// over about:flags). In the trial, the function creates a new constant group
+// called |kTrialGroupAboutFlags|.
base::FieldTrial* RegisterFeatureVariationParameters(
const std::string& feature_trial_name,
- const FeatureEntry::FeatureVariation* feature_variation) {
- std::map<std::string, std::string> params;
- if (feature_variation) {
- // Copy the parameters for non-null variations.
- for (int i = 0; i < feature_variation->num_params; ++i) {
- params[feature_variation->params[i].param_name] =
- feature_variation->params[i].param_value;
- }
- }
-
+ const std::map<std::string, std::string>& feature_variation_params) {
bool success = variations::AssociateVariationParams(
- feature_trial_name, internal::kTrialGroupAboutFlags, params);
+ feature_trial_name, internal::kTrialGroupAboutFlags,
+ feature_variation_params);
if (!success)
return nullptr;
// Successful association also means that no group is created and selected
@@ -441,32 +433,62 @@ std::vector<std::string> FlagsState::RegisterAllFeatureVariationParameters(
std::set<std::string> enabled_entries;
GetSanitizedEnabledFlagsForCurrentPlatform(flags_storage, &enabled_entries);
std::vector<std::string> variation_ids;
+ std::map<std::string, std::set<std::string>> enabled_features_by_trial_name;
+ std::map<std::string, std::map<std::string, std::string>>
+ params_by_trial_name;
+ // First collect all the data for each trial.
for (size_t i = 0; i < num_feature_entries_; ++i) {
const FeatureEntry& e = feature_entries_[i];
if (e.type == FeatureEntry::FEATURE_WITH_VARIATIONS_VALUE) {
for (int j = 0; j < e.num_options; ++j) {
- const FeatureEntry::FeatureVariation* variation =
- e.VariationForOption(j);
if (e.StateForOption(j) == FeatureEntry::FeatureState::ENABLED &&
enabled_entries.count(e.NameForOption(j))) {
- // If the option is selected by the user & has variation, register it.
- base::FieldTrial* field_trial = RegisterFeatureVariationParameters(
- e.feature_trial_name, variation);
+ std::string trial_name = e.feature_trial_name;
+ // The user has chosen to enable the feature by this option.
+ enabled_features_by_trial_name[trial_name].insert(e.feature->name);
- if (!field_trial)
+ const FeatureEntry::FeatureVariation* variation =
+ e.VariationForOption(j);
+ if (!variation)
continue;
- feature_list->RegisterFieldTrialOverride(
- e.feature->name,
- base::FeatureList::OverrideState::OVERRIDE_ENABLE_FEATURE,
- field_trial);
- if (variation && variation->variation_id)
+ // The selected variation is non-default, collect its params & id.
+
+ for (int i = 0; i < variation->num_params; ++i) {
+ auto insert_result = params_by_trial_name[trial_name].insert(
+ std::make_pair(variation->params[i].param_name,
+ variation->params[i].param_value));
+ DCHECK(insert_result.second)
+ << "Multiple values for the same parameter '"
+ << variation->params[i].param_name
+ << "' are specified in chrome://flags!";
+ }
+ if (variation->variation_id)
variation_ids.push_back(variation->variation_id);
}
}
}
}
+
+ // Now create the trials and associate the features to them.
+ for (const auto& kv : enabled_features_by_trial_name) {
+ const std::string& trial_name = kv.first;
+ const std::set<std::string>& trial_features = kv.second;
+
+ base::FieldTrial* field_trial = RegisterFeatureVariationParameters(
+ trial_name, params_by_trial_name[trial_name]);
+ if (!field_trial)
+ continue;
+
+ for (const std::string& feature_name : trial_features) {
+ feature_list->RegisterFieldTrialOverride(
+ feature_name,
+ base::FeatureList::OverrideState::OVERRIDE_ENABLE_FEATURE,
+ field_trial);
+ }
+ }
+
return variation_ids;
}

Powered by Google App Engine
This is Rietveld 408576698