xref: /aosp_15_r20/external/cronet/components/prefs/pref_registry.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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 COMPONENTS_PREFS_PREF_REGISTRY_H_
6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_PREFS_PREF_REGISTRY_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <set>
11*6777b538SAndroid Build Coastguard Worker #include <unordered_map>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
14*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_value_map.h"
15*6777b538SAndroid Build Coastguard Worker #include "components/prefs/prefs_export.h"
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker namespace base {
18*6777b538SAndroid Build Coastguard Worker class Value;
19*6777b538SAndroid Build Coastguard Worker }
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker class DefaultPrefStore;
22*6777b538SAndroid Build Coastguard Worker class PrefStore;
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker // Preferences need to be registered with a type and default value
25*6777b538SAndroid Build Coastguard Worker // before they are used.
26*6777b538SAndroid Build Coastguard Worker //
27*6777b538SAndroid Build Coastguard Worker // The way you use a PrefRegistry is that you register all required
28*6777b538SAndroid Build Coastguard Worker // preferences on it (via one of its subclasses), then pass it as a
29*6777b538SAndroid Build Coastguard Worker // construction parameter to PrefService.
30*6777b538SAndroid Build Coastguard Worker //
31*6777b538SAndroid Build Coastguard Worker // Currently, registrations after constructing the PrefService will
32*6777b538SAndroid Build Coastguard Worker // also work, but this is being deprecated.
33*6777b538SAndroid Build Coastguard Worker class COMPONENTS_PREFS_EXPORT PrefRegistry
34*6777b538SAndroid Build Coastguard Worker     : public base::RefCounted<PrefRegistry> {
35*6777b538SAndroid Build Coastguard Worker  public:
36*6777b538SAndroid Build Coastguard Worker   // Registration flags that can be specified which impact how the pref will
37*6777b538SAndroid Build Coastguard Worker   // behave or be stored. This will be passed in a bitmask when the pref is
38*6777b538SAndroid Build Coastguard Worker   // registered. Subclasses of PrefRegistry can specify their own flags. Care
39*6777b538SAndroid Build Coastguard Worker   // must be taken to ensure none of these overlap with the flags below.
40*6777b538SAndroid Build Coastguard Worker   using PrefRegistrationFlags = uint32_t;
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker   // No flags are specified.
43*6777b538SAndroid Build Coastguard Worker   static constexpr PrefRegistrationFlags NO_REGISTRATION_FLAGS = 0;
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker   // The first 8 bits are reserved for subclasses of PrefRegistry to use.
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker   // This marks the pref as "lossy". There is no strict time guarantee on when
48*6777b538SAndroid Build Coastguard Worker   // a lossy pref will be persisted to permanent storage when it is modified.
49*6777b538SAndroid Build Coastguard Worker   static constexpr PrefRegistrationFlags LOSSY_PREF = 1 << 8;
50*6777b538SAndroid Build Coastguard Worker 
51*6777b538SAndroid Build Coastguard Worker   // Registering a pref as public allows other services to access it.
52*6777b538SAndroid Build Coastguard Worker   static constexpr PrefRegistrationFlags PUBLIC = 1 << 9;
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   typedef PrefValueMap::const_iterator const_iterator;
55*6777b538SAndroid Build Coastguard Worker   typedef std::unordered_map<std::string, uint32_t> PrefRegistrationFlagsMap;
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   PrefRegistry();
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker   PrefRegistry(const PrefRegistry&) = delete;
60*6777b538SAndroid Build Coastguard Worker   PrefRegistry& operator=(const PrefRegistry&) = delete;
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   // Retrieve the set of registration flags for the given preference. The return
63*6777b538SAndroid Build Coastguard Worker   // value is a bitmask of PrefRegistrationFlags.
64*6777b538SAndroid Build Coastguard Worker   uint32_t GetRegistrationFlags(const std::string& pref_name) const;
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker   // Gets the registered defaults.
67*6777b538SAndroid Build Coastguard Worker   scoped_refptr<PrefStore> defaults();
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker   // Allows iteration over defaults.
70*6777b538SAndroid Build Coastguard Worker   const_iterator begin() const;
71*6777b538SAndroid Build Coastguard Worker   const_iterator end() const;
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker   // Changes the default value for a preference.
74*6777b538SAndroid Build Coastguard Worker   //
75*6777b538SAndroid Build Coastguard Worker   // |pref_name| must be a previously registered preference.
76*6777b538SAndroid Build Coastguard Worker   void SetDefaultPrefValue(const std::string& pref_name, base::Value value);
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker   // Registers a pref owned by another service for use with the current service.
79*6777b538SAndroid Build Coastguard Worker   // The owning service must register that pref with the |PUBLIC| flag.
80*6777b538SAndroid Build Coastguard Worker   void RegisterForeignPref(const std::string& path);
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker   // Sets the default value and flags of a previously-registered foreign pref
83*6777b538SAndroid Build Coastguard Worker   // value.
84*6777b538SAndroid Build Coastguard Worker   void SetDefaultForeignPrefValue(const std::string& path,
85*6777b538SAndroid Build Coastguard Worker                                   base::Value default_value,
86*6777b538SAndroid Build Coastguard Worker                                   uint32_t flags);
87*6777b538SAndroid Build Coastguard Worker 
foreign_pref_keys()88*6777b538SAndroid Build Coastguard Worker   const std::set<std::string>& foreign_pref_keys() const {
89*6777b538SAndroid Build Coastguard Worker     return foreign_pref_keys_;
90*6777b538SAndroid Build Coastguard Worker   }
91*6777b538SAndroid Build Coastguard Worker 
92*6777b538SAndroid Build Coastguard Worker  protected:
93*6777b538SAndroid Build Coastguard Worker   friend class base::RefCounted<PrefRegistry>;
94*6777b538SAndroid Build Coastguard Worker   virtual ~PrefRegistry();
95*6777b538SAndroid Build Coastguard Worker 
96*6777b538SAndroid Build Coastguard Worker   // Used by subclasses to register a default value and registration flags for
97*6777b538SAndroid Build Coastguard Worker   // a preference. |flags| is a bitmask of |PrefRegistrationFlags|.
98*6777b538SAndroid Build Coastguard Worker   void RegisterPreference(const std::string& path,
99*6777b538SAndroid Build Coastguard Worker                           base::Value default_value,
100*6777b538SAndroid Build Coastguard Worker                           uint32_t flags);
101*6777b538SAndroid Build Coastguard Worker 
102*6777b538SAndroid Build Coastguard Worker   // Allows subclasses to hook into pref registration.
103*6777b538SAndroid Build Coastguard Worker   virtual void OnPrefRegistered(const std::string& path,
104*6777b538SAndroid Build Coastguard Worker                                 uint32_t flags);
105*6777b538SAndroid Build Coastguard Worker 
106*6777b538SAndroid Build Coastguard Worker   scoped_refptr<DefaultPrefStore> defaults_;
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker   // A map of pref name to a bitmask of PrefRegistrationFlags.
109*6777b538SAndroid Build Coastguard Worker   PrefRegistrationFlagsMap registration_flags_;
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker   std::set<std::string> foreign_pref_keys_;
112*6777b538SAndroid Build Coastguard Worker };
113*6777b538SAndroid Build Coastguard Worker 
114*6777b538SAndroid Build Coastguard Worker #endif  // COMPONENTS_PREFS_PREF_REGISTRY_H_
115