| 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 <memory> | 9 #include <memory> |
| 10 #include <string> | 10 #include <string> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "base/base_export.h" | 13 #include "base/base_export.h" |
| 14 #include "base/gtest_prod_util.h" | 14 #include "base/gtest_prod_util.h" |
| 15 #include "base/macros.h" | 15 #include "base/macros.h" |
| 16 #include "base/metrics/persistent_memory_allocator.h" |
| 16 #include "base/strings/string_piece.h" | 17 #include "base/strings/string_piece.h" |
| 17 #include "base/synchronization/lock.h" | 18 #include "base/synchronization/lock.h" |
| 18 | 19 |
| 19 namespace base { | 20 namespace base { |
| 20 | 21 |
| 21 class FieldTrial; | 22 class FieldTrial; |
| 22 | 23 |
| 23 // Specifies whether a given feature is enabled or disabled by default. | 24 // Specifies whether a given feature is enabled or disabled by default. |
| 24 enum FeatureState { | 25 enum FeatureState { |
| 25 FEATURE_DISABLED_BY_DEFAULT, | 26 FEATURE_DISABLED_BY_DEFAULT, |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 // it will be disabled. If a list entry has the format "FeatureName<TrialName" | 86 // it will be disabled. If a list entry has the format "FeatureName<TrialName" |
| 86 // then this initialization will also associate the feature state override | 87 // then this initialization will also associate the feature state override |
| 87 // with the named field trial, if it exists. If a feature name is prefixed | 88 // with the named field trial, if it exists. If a feature name is prefixed |
| 88 // with the '*' character, it will be created with OVERRIDE_USE_DEFAULT - | 89 // with the '*' character, it will be created with OVERRIDE_USE_DEFAULT - |
| 89 // which is useful for associating with a trial while using the default state. | 90 // which is useful for associating with a trial while using the default state. |
| 90 // Must only be invoked during the initialization phase (before | 91 // Must only be invoked during the initialization phase (before |
| 91 // FinalizeInitialization() has been called). | 92 // FinalizeInitialization() has been called). |
| 92 void InitializeFromCommandLine(const std::string& enable_features, | 93 void InitializeFromCommandLine(const std::string& enable_features, |
| 93 const std::string& disable_features); | 94 const std::string& disable_features); |
| 94 | 95 |
| 96 // Initializes feature overrides through the field trial allocator, which |
| 97 // we're using to store the feature names, their override state, and the name |
| 98 // of the associated field trial. |
| 99 void InitializeFromSharedMemory(SharedPersistentMemoryAllocator* allocator); |
| 100 |
| 95 // Specifies whether a feature override enables or disables the feature. | 101 // Specifies whether a feature override enables or disables the feature. |
| 96 enum OverrideState { | 102 enum OverrideState { |
| 97 OVERRIDE_USE_DEFAULT, | 103 OVERRIDE_USE_DEFAULT, |
| 98 OVERRIDE_DISABLE_FEATURE, | 104 OVERRIDE_DISABLE_FEATURE, |
| 99 OVERRIDE_ENABLE_FEATURE, | 105 OVERRIDE_ENABLE_FEATURE, |
| 100 }; | 106 }; |
| 101 | 107 |
| 102 // Returns true if the state of |feature_name| has been overridden via | 108 // Returns true if the state of |feature_name| has been overridden via |
| 103 // |InitializeFromCommandLine()|. | 109 // |InitializeFromCommandLine()|. |
| 104 bool IsFeatureOverriddenFromCommandLine(const std::string& feature_name, | 110 bool IsFeatureOverriddenFromCommandLine(const std::string& feature_name, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 117 // feature to |override_state|. Command-line overrides still take precedence | 123 // feature to |override_state|. Command-line overrides still take precedence |
| 118 // over field trials, so this will have no effect if the feature is being | 124 // over field trials, so this will have no effect if the feature is being |
| 119 // overridden from the command-line. The associated field trial will be | 125 // overridden from the command-line. The associated field trial will be |
| 120 // activated when the feature state for this feature is queried. This should | 126 // activated when the feature state for this feature is queried. This should |
| 121 // be called during registration, after InitializeFromCommandLine() has been | 127 // be called during registration, after InitializeFromCommandLine() has been |
| 122 // called but before the instance is registered via SetInstance(). | 128 // called but before the instance is registered via SetInstance(). |
| 123 void RegisterFieldTrialOverride(const std::string& feature_name, | 129 void RegisterFieldTrialOverride(const std::string& feature_name, |
| 124 OverrideState override_state, | 130 OverrideState override_state, |
| 125 FieldTrial* field_trial); | 131 FieldTrial* field_trial); |
| 126 | 132 |
| 133 // Loops through feature overrides and serializes them all into |allocator|. |
| 134 void AddFeaturesToAllocator(SharedPersistentMemoryAllocator* allocator); |
| 135 |
| 127 // Returns comma-separated lists of feature names (in the same format that is | 136 // Returns comma-separated lists of feature names (in the same format that is |
| 128 // accepted by InitializeFromCommandLine()) corresponding to features that | 137 // accepted by InitializeFromCommandLine()) corresponding to features that |
| 129 // have been overridden - either through command-line or via FieldTrials. For | 138 // have been overridden - either through command-line or via FieldTrials. For |
| 130 // those features that have an associated FieldTrial, the output entry will be | 139 // those features that have an associated FieldTrial, the output entry will be |
| 131 // of the format "FeatureName<TrialName", where "TrialName" is the name of the | 140 // of the format "FeatureName<TrialName", where "TrialName" is the name of the |
| 132 // FieldTrial. Features that have overrides with OVERRIDE_USE_DEFAULT will be | 141 // FieldTrial. Features that have overrides with OVERRIDE_USE_DEFAULT will be |
| 133 // added to |enable_overrides| with a '*' character prefix. Must be called | 142 // added to |enable_overrides| with a '*' character prefix. Must be called |
| 134 // only after the instance has been initialized and registered. | 143 // only after the instance has been initialized and registered. |
| 135 void GetFeatureOverrides(std::string* enable_overrides, | 144 void GetFeatureOverrides(std::string* enable_overrides, |
| 136 std::string* disable_overrides); | 145 std::string* disable_overrides); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 // base::test::ScopedFeatureList. | 182 // base::test::ScopedFeatureList. |
| 174 static std::unique_ptr<FeatureList> ClearInstanceForTesting(); | 183 static std::unique_ptr<FeatureList> ClearInstanceForTesting(); |
| 175 | 184 |
| 176 // Sets a given (initialized) |instance| to be the singleton feature list, | 185 // Sets a given (initialized) |instance| to be the singleton feature list, |
| 177 // for testing. Existing instance must be null. This is primarily intended | 186 // for testing. Existing instance must be null. This is primarily intended |
| 178 // to support base::test::ScopedFeatureList helper class. | 187 // to support base::test::ScopedFeatureList helper class. |
| 179 static void RestoreInstanceForTesting(std::unique_ptr<FeatureList> instance); | 188 static void RestoreInstanceForTesting(std::unique_ptr<FeatureList> instance); |
| 180 | 189 |
| 181 private: | 190 private: |
| 182 FRIEND_TEST_ALL_PREFIXES(FeatureListTest, CheckFeatureIdentity); | 191 FRIEND_TEST_ALL_PREFIXES(FeatureListTest, CheckFeatureIdentity); |
| 192 FRIEND_TEST_ALL_PREFIXES(FeatureListTest, |
| 193 StoreAndRetrieveFeaturesFromSharedMemory); |
| 183 | 194 |
| 184 struct OverrideEntry { | 195 struct OverrideEntry { |
| 185 // The overridden enable (on/off) state of the feature. | 196 // The overridden enable (on/off) state of the feature. |
| 186 const OverrideState overridden_state; | 197 const OverrideState overridden_state; |
| 187 | 198 |
| 188 // An optional associated field trial, which will be activated when the | 199 // An optional associated field trial, which will be activated when the |
| 189 // state of the feature is queried for the first time. Weak pointer to the | 200 // state of the feature is queried for the first time. Weak pointer to the |
| 190 // FieldTrial object that is owned by the FieldTrialList singleton. | 201 // FieldTrial object that is owned by the FieldTrialList singleton. |
| 191 base::FieldTrial* field_trial; | 202 base::FieldTrial* field_trial; |
| 192 | 203 |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 | 272 |
| 262 // Whether this object has been initialized from command line. | 273 // Whether this object has been initialized from command line. |
| 263 bool initialized_from_command_line_ = false; | 274 bool initialized_from_command_line_ = false; |
| 264 | 275 |
| 265 DISALLOW_COPY_AND_ASSIGN(FeatureList); | 276 DISALLOW_COPY_AND_ASSIGN(FeatureList); |
| 266 }; | 277 }; |
| 267 | 278 |
| 268 } // namespace base | 279 } // namespace base |
| 269 | 280 |
| 270 #endif // BASE_FEATURE_LIST_H_ | 281 #endif // BASE_FEATURE_LIST_H_ |
| OLD | NEW |