OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "base/feature_list.h" | 5 #include "base/feature_list.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 } | 42 } |
43 | 43 |
44 bool FeatureList::IsFeatureOverriddenFromCommandLine( | 44 bool FeatureList::IsFeatureOverriddenFromCommandLine( |
45 const std::string& feature_name, | 45 const std::string& feature_name, |
46 OverrideState state) const { | 46 OverrideState state) const { |
47 auto it = overrides_.find(feature_name); | 47 auto it = overrides_.find(feature_name); |
48 return it != overrides_.end() && it->second.overridden_state == state && | 48 return it != overrides_.end() && it->second.overridden_state == state && |
49 !it->second.overridden_by_field_trial; | 49 !it->second.overridden_by_field_trial; |
50 } | 50 } |
51 | 51 |
52 void FeatureList::RegisterFieldTrialOverride(const std::string& feature_name, | |
53 OverrideState override_state, | |
54 FieldTrial* field_trial) { | |
55 DCHECK(field_trial); | |
56 DCHECK(!ContainsKey(overrides_, feature_name) || | |
57 !overrides_.find(feature_name)->second.field_trial) | |
58 << "Feature " << feature_name | |
59 << " has conflicting field trial overrides: " | |
60 << overrides_.find(feature_name)->second.field_trial->trial_name() | |
61 << " / " << field_trial->trial_name(); | |
62 | |
63 RegisterOverride(feature_name, override_state, field_trial); | |
64 } | |
65 | |
66 void FeatureList::AssociateReportingFieldTrial( | 52 void FeatureList::AssociateReportingFieldTrial( |
67 const std::string& feature_name, | 53 const std::string& feature_name, |
68 OverrideState for_overridden_state, | 54 OverrideState for_overridden_state, |
69 FieldTrial* field_trial) { | 55 FieldTrial* field_trial) { |
70 DCHECK( | 56 DCHECK( |
71 IsFeatureOverriddenFromCommandLine(feature_name, for_overridden_state)); | 57 IsFeatureOverriddenFromCommandLine(feature_name, for_overridden_state)); |
72 | 58 |
73 // Only one associated field trial is supported per feature. This is generally | 59 // Only one associated field trial is supported per feature. This is generally |
74 // enforced server-side. | 60 // enforced server-side. |
75 OverrideEntry* entry = &overrides_.find(feature_name)->second; | 61 OverrideEntry* entry = &overrides_.find(feature_name)->second; |
76 if (entry->field_trial) { | 62 if (entry->field_trial) { |
77 NOTREACHED() << "Feature " << feature_name | 63 NOTREACHED() << "Feature " << feature_name |
78 << " already has trial: " << entry->field_trial->trial_name() | 64 << " already has trial: " << entry->field_trial->trial_name() |
79 << ", associating trial: " << field_trial->trial_name(); | 65 << ", associating trial: " << field_trial->trial_name(); |
80 return; | 66 return; |
81 } | 67 } |
82 | 68 |
83 entry->field_trial = field_trial; | 69 entry->field_trial = field_trial; |
84 } | 70 } |
85 | 71 |
| 72 void FeatureList::RegisterFieldTrialOverride(const std::string& feature_name, |
| 73 OverrideState override_state, |
| 74 FieldTrial* field_trial) { |
| 75 DCHECK(field_trial); |
| 76 DCHECK(!ContainsKey(overrides_, feature_name) || |
| 77 !overrides_.find(feature_name)->second.field_trial) |
| 78 << "Feature " << feature_name |
| 79 << " has conflicting field trial overrides: " |
| 80 << overrides_.find(feature_name)->second.field_trial->trial_name() |
| 81 << " / " << field_trial->trial_name(); |
| 82 |
| 83 RegisterOverride(feature_name, override_state, field_trial); |
| 84 } |
| 85 |
| 86 void FeatureList::GetFeatureOverrides(std::string* enable_overrides, |
| 87 std::string* disable_overrides) { |
| 88 DCHECK(initialized_); |
| 89 |
| 90 enable_overrides->clear(); |
| 91 disable_overrides->clear(); |
| 92 |
| 93 for (const auto& entry : overrides_) { |
| 94 switch (entry.second.overridden_state) { |
| 95 case OVERRIDE_ENABLE_FEATURE: |
| 96 if (!enable_overrides->empty()) |
| 97 enable_overrides->push_back(','); |
| 98 enable_overrides->append(entry.first); |
| 99 break; |
| 100 case OVERRIDE_DISABLE_FEATURE: |
| 101 if (!disable_overrides->empty()) |
| 102 disable_overrides->push_back(','); |
| 103 disable_overrides->append(entry.first); |
| 104 break; |
| 105 } |
| 106 } |
| 107 } |
| 108 |
86 // static | 109 // static |
87 bool FeatureList::IsEnabled(const Feature& feature) { | 110 bool FeatureList::IsEnabled(const Feature& feature) { |
88 return GetInstance()->IsFeatureEnabled(feature); | 111 return GetInstance()->IsFeatureEnabled(feature); |
89 } | 112 } |
90 | 113 |
91 // static | 114 // static |
92 std::vector<std::string> FeatureList::SplitFeatureListString( | 115 std::vector<std::string> FeatureList::SplitFeatureListString( |
93 const std::string& input) { | 116 const std::string& input) { |
94 return SplitString(input, ",", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY); | 117 return SplitString(input, ",", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY); |
95 } | 118 } |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 return it->second == &feature; | 192 return it->second == &feature; |
170 } | 193 } |
171 | 194 |
172 FeatureList::OverrideEntry::OverrideEntry(OverrideState overridden_state, | 195 FeatureList::OverrideEntry::OverrideEntry(OverrideState overridden_state, |
173 FieldTrial* field_trial) | 196 FieldTrial* field_trial) |
174 : overridden_state(overridden_state), | 197 : overridden_state(overridden_state), |
175 field_trial(field_trial), | 198 field_trial(field_trial), |
176 overridden_by_field_trial(field_trial != nullptr) {} | 199 overridden_by_field_trial(field_trial != nullptr) {} |
177 | 200 |
178 } // namespace base | 201 } // namespace base |
OLD | NEW |