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 #ifndef BASE_FEATURE_LIST_H_ | 5 #ifndef BASE_FEATURE_LIST_H_ |
6 #define BASE_FEATURE_LIST_H_ | 6 #define BASE_FEATURE_LIST_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/base_export.h" | 12 #include "base/base_export.h" |
13 #include "base/basictypes.h" | 13 #include "base/basictypes.h" |
14 #include "base/gtest_prod_util.h" | 14 #include "base/gtest_prod_util.h" |
15 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
| 16 #include "base/strings/string_piece.h" |
16 #include "base/synchronization/lock.h" | 17 #include "base/synchronization/lock.h" |
17 | 18 |
18 namespace base { | 19 namespace base { |
19 | 20 |
20 class FieldTrial; | 21 class FieldTrial; |
21 | 22 |
22 // Specifies whether a given feature is enabled or disabled by default. | 23 // Specifies whether a given feature is enabled or disabled by default. |
23 enum FeatureState { | 24 enum FeatureState { |
24 FEATURE_DISABLED_BY_DEFAULT, | 25 FEATURE_DISABLED_BY_DEFAULT, |
25 FEATURE_ENABLED_BY_DEFAULT, | 26 FEATURE_ENABLED_BY_DEFAULT, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 // intended use is to create an instance of this class and fully initialize it, | 75 // intended use is to create an instance of this class and fully initialize it, |
75 // before setting it as the singleton for a process, via SetInstance(). | 76 // before setting it as the singleton for a process, via SetInstance(). |
76 class BASE_EXPORT FeatureList { | 77 class BASE_EXPORT FeatureList { |
77 public: | 78 public: |
78 FeatureList(); | 79 FeatureList(); |
79 ~FeatureList(); | 80 ~FeatureList(); |
80 | 81 |
81 // Initializes feature overrides via command-line flags |enable_features| and | 82 // Initializes feature overrides via command-line flags |enable_features| and |
82 // |disable_features|, each of which is a comma-separated list of features to | 83 // |disable_features|, each of which is a comma-separated list of features to |
83 // enable or disable, respectively. If a feature appears on both lists, then | 84 // enable or disable, respectively. If a feature appears on both lists, then |
84 // it will be disabled. Must only be invoked during the initialization phase | 85 // it will be disabled. If a list entry has the format "FeatureName<TrialName" |
85 // (before FinalizeInitialization() has been called). | 86 // then this initialization will also associate the feature state override |
| 87 // with the named field trial, if it exists. Must only be invoked during the |
| 88 // initialization phase (before FinalizeInitialization() has been called). |
86 void InitializeFromCommandLine(const std::string& enable_features, | 89 void InitializeFromCommandLine(const std::string& enable_features, |
87 const std::string& disable_features); | 90 const std::string& disable_features); |
88 | 91 |
89 // Specifies whether a feature override enables or disables the feature. | 92 // Specifies whether a feature override enables or disables the feature. |
90 enum OverrideState { | 93 enum OverrideState { |
91 OVERRIDE_DISABLE_FEATURE, | 94 OVERRIDE_DISABLE_FEATURE, |
92 OVERRIDE_ENABLE_FEATURE, | 95 OVERRIDE_ENABLE_FEATURE, |
93 }; | 96 }; |
94 | 97 |
95 // Returns true if the state of |feature_name| has been overridden via | 98 // Returns true if the state of |feature_name| has been overridden via |
(...skipping 16 matching lines...) Expand all Loading... |
112 // overridden from the command-line. The associated field trial will be | 115 // overridden from the command-line. The associated field trial will be |
113 // activated when the feature state for this feature is queried. This should | 116 // activated when the feature state for this feature is queried. This should |
114 // be called during registration, after InitializeFromCommandLine() has been | 117 // be called during registration, after InitializeFromCommandLine() has been |
115 // called but before the instance is registered via SetInstance(). | 118 // called but before the instance is registered via SetInstance(). |
116 void RegisterFieldTrialOverride(const std::string& feature_name, | 119 void RegisterFieldTrialOverride(const std::string& feature_name, |
117 OverrideState override_state, | 120 OverrideState override_state, |
118 FieldTrial* field_trial); | 121 FieldTrial* field_trial); |
119 | 122 |
120 // Returns comma-separated lists of feature names (in the same format that is | 123 // Returns comma-separated lists of feature names (in the same format that is |
121 // accepted by InitializeFromCommandLine()) corresponding to features that | 124 // accepted by InitializeFromCommandLine()) corresponding to features that |
122 // have been overridden - either through command-line or via FieldTrials. | 125 // have been overridden - either through command-line or via FieldTrials. For |
123 // Must be called only after the instance has been initialized and registered. | 126 // those features that have an associated FieldTrial, the output entry will be |
| 127 // of the format "FeatureName<TrialName", where "TrialName" is the name of the |
| 128 // FieldTrial. Must be called only after the instance has been initialized and |
| 129 // registered. |
124 void GetFeatureOverrides(std::string* enable_overrides, | 130 void GetFeatureOverrides(std::string* enable_overrides, |
125 std::string* disable_overrides); | 131 std::string* disable_overrides); |
126 | 132 |
127 // Returns whether the given |feature| is enabled. Must only be called after | 133 // Returns whether the given |feature| is enabled. Must only be called after |
128 // the singleton instance has been registered via SetInstance(). Additionally, | 134 // the singleton instance has been registered via SetInstance(). Additionally, |
129 // a feature with a given name must only have a single corresponding Feature | 135 // a feature with a given name must only have a single corresponding Feature |
130 // struct, which is checked in builds with DCHECKs enabled. | 136 // struct, which is checked in builds with DCHECKs enabled. |
131 static bool IsEnabled(const Feature& feature); | 137 static bool IsEnabled(const Feature& feature); |
132 | 138 |
133 // Splits a comma-separated string containing feature names into a vector. | 139 // Splits a comma-separated string containing feature names into a vector. |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 // Finalizes the initialization state of the FeatureList, so that no further | 184 // Finalizes the initialization state of the FeatureList, so that no further |
179 // overrides can be registered. This is called by SetInstance() on the | 185 // overrides can be registered. This is called by SetInstance() on the |
180 // singleton feature list that is being registered. | 186 // singleton feature list that is being registered. |
181 void FinalizeInitialization(); | 187 void FinalizeInitialization(); |
182 | 188 |
183 // Returns whether the given |feature| is enabled. This is invoked by the | 189 // Returns whether the given |feature| is enabled. This is invoked by the |
184 // public FeatureList::IsEnabled() static function on the global singleton. | 190 // public FeatureList::IsEnabled() static function on the global singleton. |
185 // Requires the FeatureList to have already been fully initialized. | 191 // Requires the FeatureList to have already been fully initialized. |
186 bool IsFeatureEnabled(const Feature& feature); | 192 bool IsFeatureEnabled(const Feature& feature); |
187 | 193 |
| 194 // For each feature name in comma-separated list of strings |feature_list|, |
| 195 // registers an override with the specified |overridden_state|. Also, will |
| 196 // associate an optional named field trial if the entry is of the format |
| 197 // "FeatureName<TrialName". |
| 198 void RegisterOverridesFromCommandLine(const std::string& feature_list, |
| 199 OverrideState overridden_state); |
| 200 |
188 // Registers an override for feature |feature_name|. The override specifies | 201 // Registers an override for feature |feature_name|. The override specifies |
189 // whether the feature should be on or off (via |overridden_state|), which | 202 // whether the feature should be on or off (via |overridden_state|), which |
190 // will take precedence over the feature's default state. If |field_trial| is | 203 // will take precedence over the feature's default state. If |field_trial| is |
191 // not null, registers the specified field trial object to be associated with | 204 // not null, registers the specified field trial object to be associated with |
192 // the feature, which will activate the field trial when the feature state is | 205 // the feature, which will activate the field trial when the feature state is |
193 // queried. If an override is already registered for the given feature, it | 206 // queried. If an override is already registered for the given feature, it |
194 // will not be changed. | 207 // will not be changed. |
195 void RegisterOverride(const std::string& feature_name, | 208 void RegisterOverride(StringPiece feature_name, |
196 OverrideState overridden_state, | 209 OverrideState overridden_state, |
197 FieldTrial* field_trial); | 210 FieldTrial* field_trial); |
198 | 211 |
199 // Verifies that there's only a single definition of a Feature struct for a | 212 // Verifies that there's only a single definition of a Feature struct for a |
200 // given feature name. Keeps track of the first seen Feature struct for each | 213 // given feature name. Keeps track of the first seen Feature struct for each |
201 // feature. Returns false when called on a Feature struct with a different | 214 // feature. Returns false when called on a Feature struct with a different |
202 // address than the first one it saw for that feature name. Used only from | 215 // address than the first one it saw for that feature name. Used only from |
203 // DCHECKs and tests. | 216 // DCHECKs and tests. |
204 bool CheckFeatureIdentity(const Feature& feature); | 217 bool CheckFeatureIdentity(const Feature& feature); |
205 | 218 |
(...skipping 10 matching lines...) Expand all Loading... |
216 // Whether this object has been fully initialized. This gets set to true as a | 229 // Whether this object has been fully initialized. This gets set to true as a |
217 // result of FinalizeInitialization(). | 230 // result of FinalizeInitialization(). |
218 bool initialized_; | 231 bool initialized_; |
219 | 232 |
220 DISALLOW_COPY_AND_ASSIGN(FeatureList); | 233 DISALLOW_COPY_AND_ASSIGN(FeatureList); |
221 }; | 234 }; |
222 | 235 |
223 } // namespace base | 236 } // namespace base |
224 | 237 |
225 #endif // BASE_FEATURE_LIST_H_ | 238 #endif // BASE_FEATURE_LIST_H_ |
OLD | NEW |