xref: /aosp_15_r20/external/cronet/base/scoped_add_feature_flags.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_SCOPED_ADD_FEATURE_FLAGS_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_SCOPED_ADD_FEATURE_FLAGS_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <string>
9*6777b538SAndroid Build Coastguard Worker #include <vector>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/feature_list.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace base {
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker class CommandLine;
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker // Helper class to enable and disable features if they are not already set in
20*6777b538SAndroid Build Coastguard Worker // the command line. It reads the command line on construction, allows user to
21*6777b538SAndroid Build Coastguard Worker // enable and disable features during its lifetime, and writes the modified
22*6777b538SAndroid Build Coastguard Worker // --enable-features=... and --disable-features=... flags back to the command
23*6777b538SAndroid Build Coastguard Worker // line on destruction.
24*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT ScopedAddFeatureFlags {
25*6777b538SAndroid Build Coastguard Worker  public:
26*6777b538SAndroid Build Coastguard Worker   explicit ScopedAddFeatureFlags(CommandLine* command_line);
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker   ScopedAddFeatureFlags(const ScopedAddFeatureFlags&) = delete;
29*6777b538SAndroid Build Coastguard Worker   ScopedAddFeatureFlags& operator=(const ScopedAddFeatureFlags&) = delete;
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker   ~ScopedAddFeatureFlags();
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker   // Any existing (user set) enable/disable takes precedence.
34*6777b538SAndroid Build Coastguard Worker   void EnableIfNotSet(const Feature& feature);
35*6777b538SAndroid Build Coastguard Worker   void DisableIfNotSet(const Feature& feature);
36*6777b538SAndroid Build Coastguard Worker   void EnableIfNotSetWithParameter(const Feature& feature,
37*6777b538SAndroid Build Coastguard Worker                                    StringPiece name,
38*6777b538SAndroid Build Coastguard Worker                                    StringPiece value);
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker   // Check if the feature is enabled from command line or functions above
41*6777b538SAndroid Build Coastguard Worker   bool IsEnabled(const Feature& feature);
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker   // Check if the feature with the given parameter name and value is enabled
44*6777b538SAndroid Build Coastguard Worker   // from command line or functions above. An empty parameter name means that we
45*6777b538SAndroid Build Coastguard Worker   // are checking if the feature is enabled without any parameter.
46*6777b538SAndroid Build Coastguard Worker   bool IsEnabledWithParameter(const Feature& feature,
47*6777b538SAndroid Build Coastguard Worker                               StringPiece parameter_name,
48*6777b538SAndroid Build Coastguard Worker                               StringPiece parameter_value);
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker  private:
51*6777b538SAndroid Build Coastguard Worker   void AddFeatureIfNotSet(const Feature& feature,
52*6777b538SAndroid Build Coastguard Worker                           StringPiece suffix,
53*6777b538SAndroid Build Coastguard Worker                           bool enable);
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker   const raw_ptr<CommandLine> command_line_;
56*6777b538SAndroid Build Coastguard Worker   std::vector<std::string> enabled_features_;
57*6777b538SAndroid Build Coastguard Worker   std::vector<std::string> disabled_features_;
58*6777b538SAndroid Build Coastguard Worker };
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker }  // namespace base
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker #endif  // BASE_SCOPED_ADD_FEATURE_FLAGS_H_
63