xref: /aosp_15_r20/external/cronet/components/prefs/pref_service.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 // This provides a way to access the application's current preferences.
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker // Chromium settings and storage represent user-selected preferences and
8*6777b538SAndroid Build Coastguard Worker // information and MUST not be extracted, overwritten or modified except
9*6777b538SAndroid Build Coastguard Worker // through Chromium defined APIs.
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #ifndef COMPONENTS_PREFS_PREF_SERVICE_H_
12*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_PREFS_PREF_SERVICE_H_
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker #include <memory>
17*6777b538SAndroid Build Coastguard Worker #include <set>
18*6777b538SAndroid Build Coastguard Worker #include <string>
19*6777b538SAndroid Build Coastguard Worker #include <unordered_map>
20*6777b538SAndroid Build Coastguard Worker #include <vector>
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
26*6777b538SAndroid Build Coastguard Worker #include "base/sequence_checker.h"
27*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
28*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
29*6777b538SAndroid Build Coastguard Worker #include "base/values.h"
30*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
31*6777b538SAndroid Build Coastguard Worker #include "build/chromeos_buildflags.h"
32*6777b538SAndroid Build Coastguard Worker #include "components/prefs/persistent_pref_store.h"
33*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_value_store.h"
34*6777b538SAndroid Build Coastguard Worker #include "components/prefs/prefs_export.h"
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
37*6777b538SAndroid Build Coastguard Worker #include "base/android/scoped_java_ref.h"
38*6777b538SAndroid Build Coastguard Worker #endif
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker class PrefNotifier;
41*6777b538SAndroid Build Coastguard Worker class PrefNotifierImpl;
42*6777b538SAndroid Build Coastguard Worker class PrefObserver;
43*6777b538SAndroid Build Coastguard Worker class PrefRegistry;
44*6777b538SAndroid Build Coastguard Worker class PrefStore;
45*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
46*6777b538SAndroid Build Coastguard Worker class PrefServiceAndroid;
47*6777b538SAndroid Build Coastguard Worker #endif
48*6777b538SAndroid Build Coastguard Worker 
49*6777b538SAndroid Build Coastguard Worker namespace base {
50*6777b538SAndroid Build Coastguard Worker class FilePath;
51*6777b538SAndroid Build Coastguard Worker }
52*6777b538SAndroid Build Coastguard Worker 
53*6777b538SAndroid Build Coastguard Worker namespace prefs {
54*6777b538SAndroid Build Coastguard Worker class ScopedDictionaryPrefUpdate;
55*6777b538SAndroid Build Coastguard Worker }
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker namespace subtle {
58*6777b538SAndroid Build Coastguard Worker class PrefMemberBase;
59*6777b538SAndroid Build Coastguard Worker class ScopedUserPrefUpdateBase;
60*6777b538SAndroid Build Coastguard Worker }
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker // Base class for PrefServices. You can use the base class to read and
63*6777b538SAndroid Build Coastguard Worker // interact with preferences, but not to register new preferences; for
64*6777b538SAndroid Build Coastguard Worker // that see e.g. PrefRegistrySimple.
65*6777b538SAndroid Build Coastguard Worker //
66*6777b538SAndroid Build Coastguard Worker // Settings and storage accessed through this class represent
67*6777b538SAndroid Build Coastguard Worker // user-selected preferences and information and MUST not be
68*6777b538SAndroid Build Coastguard Worker // extracted, overwritten or modified except through the defined APIs.
69*6777b538SAndroid Build Coastguard Worker class COMPONENTS_PREFS_EXPORT PrefService {
70*6777b538SAndroid Build Coastguard Worker  public:
71*6777b538SAndroid Build Coastguard Worker   enum PrefInitializationStatus {
72*6777b538SAndroid Build Coastguard Worker     INITIALIZATION_STATUS_WAITING,
73*6777b538SAndroid Build Coastguard Worker     INITIALIZATION_STATUS_SUCCESS,
74*6777b538SAndroid Build Coastguard Worker     INITIALIZATION_STATUS_CREATED_NEW_PREF_STORE,
75*6777b538SAndroid Build Coastguard Worker     INITIALIZATION_STATUS_ERROR
76*6777b538SAndroid Build Coastguard Worker   };
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker   enum IncludeDefaults {
79*6777b538SAndroid Build Coastguard Worker     INCLUDE_DEFAULTS,
80*6777b538SAndroid Build Coastguard Worker     EXCLUDE_DEFAULTS,
81*6777b538SAndroid Build Coastguard Worker   };
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   struct COMPONENTS_PREFS_EXPORT PreferenceValueAndStore {
84*6777b538SAndroid Build Coastguard Worker     std::string name;
85*6777b538SAndroid Build Coastguard Worker     base::Value value;
86*6777b538SAndroid Build Coastguard Worker     PrefValueStore::PrefStoreType store;
87*6777b538SAndroid Build Coastguard Worker   };
88*6777b538SAndroid Build Coastguard Worker 
89*6777b538SAndroid Build Coastguard Worker   // A helper class to store all the information associated with a preference.
90*6777b538SAndroid Build Coastguard Worker   class COMPONENTS_PREFS_EXPORT Preference {
91*6777b538SAndroid Build Coastguard Worker    public:
92*6777b538SAndroid Build Coastguard Worker     // The type of the preference is determined by the type with which it is
93*6777b538SAndroid Build Coastguard Worker     // registered. This type needs to be a boolean, integer, double, string,
94*6777b538SAndroid Build Coastguard Worker     // dictionary (a branch), or list.  You shouldn't need to construct this on
95*6777b538SAndroid Build Coastguard Worker     // your own; use the PrefService::Register*Pref methods instead.
96*6777b538SAndroid Build Coastguard Worker     Preference(const PrefService* service,
97*6777b538SAndroid Build Coastguard Worker                std::string name,
98*6777b538SAndroid Build Coastguard Worker                base::Value::Type type);
~Preference()99*6777b538SAndroid Build Coastguard Worker     ~Preference() {}
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker     // Returns the name of the Preference (i.e., the key, e.g.,
102*6777b538SAndroid Build Coastguard Worker     // browser.window_placement).
name()103*6777b538SAndroid Build Coastguard Worker     std::string name() const { return name_; }
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker     // Returns the registered type of the preference.
GetType()106*6777b538SAndroid Build Coastguard Worker     base::Value::Type GetType() const { return type_; }
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker     // Returns the value of the Preference, falling back to the registered
109*6777b538SAndroid Build Coastguard Worker     // default value if no other has been set.
110*6777b538SAndroid Build Coastguard Worker     const base::Value* GetValue() const;
111*6777b538SAndroid Build Coastguard Worker 
112*6777b538SAndroid Build Coastguard Worker     // Returns the value recommended by the admin, if any.
113*6777b538SAndroid Build Coastguard Worker     const base::Value* GetRecommendedValue() const;
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker     // Returns true if the Preference is managed, i.e. set by an admin policy.
116*6777b538SAndroid Build Coastguard Worker     // Since managed prefs have the highest priority, this also indicates
117*6777b538SAndroid Build Coastguard Worker     // whether the pref is actually being controlled by the policy setting.
118*6777b538SAndroid Build Coastguard Worker     bool IsManaged() const;
119*6777b538SAndroid Build Coastguard Worker 
120*6777b538SAndroid Build Coastguard Worker     // Returns true if the Preference is controlled by the custodian of the
121*6777b538SAndroid Build Coastguard Worker     // supervised user. Since a supervised user is not expected to have an admin
122*6777b538SAndroid Build Coastguard Worker     // policy, this is the controlling pref if set.
123*6777b538SAndroid Build Coastguard Worker     bool IsManagedByCustodian() const;
124*6777b538SAndroid Build Coastguard Worker 
125*6777b538SAndroid Build Coastguard Worker     // Returns true if the Preference's current value is one recommended by
126*6777b538SAndroid Build Coastguard Worker     // admin policy. Note that this will be false if any other higher-priority
127*6777b538SAndroid Build Coastguard Worker     // source overrides the value (e.g., the user has set a value).
128*6777b538SAndroid Build Coastguard Worker     bool IsRecommended() const;
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker     // Returns true if the Preference has a value set by an extension, even if
131*6777b538SAndroid Build Coastguard Worker     // that value is being overridden by a higher-priority source.
132*6777b538SAndroid Build Coastguard Worker     bool HasExtensionSetting() const;
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker     // Returns true if the Preference has a user setting, even if that value is
135*6777b538SAndroid Build Coastguard Worker     // being overridden by a higher-priority source.
136*6777b538SAndroid Build Coastguard Worker     bool HasUserSetting() const;
137*6777b538SAndroid Build Coastguard Worker 
138*6777b538SAndroid Build Coastguard Worker     // Returns true if the Preference value is currently being controlled by an
139*6777b538SAndroid Build Coastguard Worker     // extension, and not by any higher-priority source.
140*6777b538SAndroid Build Coastguard Worker     bool IsExtensionControlled() const;
141*6777b538SAndroid Build Coastguard Worker 
142*6777b538SAndroid Build Coastguard Worker     // Returns true if the Preference value is currently being controlled by a
143*6777b538SAndroid Build Coastguard Worker     // user setting, and not by any higher-priority source.
144*6777b538SAndroid Build Coastguard Worker     bool IsUserControlled() const;
145*6777b538SAndroid Build Coastguard Worker 
146*6777b538SAndroid Build Coastguard Worker     // Returns true if the Preference is currently using its default value,
147*6777b538SAndroid Build Coastguard Worker     // and has not been set by any higher-priority source (even with the same
148*6777b538SAndroid Build Coastguard Worker     // value).
149*6777b538SAndroid Build Coastguard Worker     bool IsDefaultValue() const;
150*6777b538SAndroid Build Coastguard Worker 
151*6777b538SAndroid Build Coastguard Worker     // Returns true if the user can change the Preference value, which is the
152*6777b538SAndroid Build Coastguard Worker     // case if no higher-priority source than the user store controls the
153*6777b538SAndroid Build Coastguard Worker     // Preference.
154*6777b538SAndroid Build Coastguard Worker     bool IsUserModifiable() const;
155*6777b538SAndroid Build Coastguard Worker 
156*6777b538SAndroid Build Coastguard Worker     // Returns true if an extension can change the Preference value, which is
157*6777b538SAndroid Build Coastguard Worker     // the case if no higher-priority source than the extension store controls
158*6777b538SAndroid Build Coastguard Worker     // the Preference.
159*6777b538SAndroid Build Coastguard Worker     bool IsExtensionModifiable() const;
160*6777b538SAndroid Build Coastguard Worker 
161*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS_ASH)
162*6777b538SAndroid Build Coastguard Worker     // Returns true if the Preference value is currently being controlled by a
163*6777b538SAndroid Build Coastguard Worker     // standalone browser (lacros) and not by any higher-priority source.
164*6777b538SAndroid Build Coastguard Worker     bool IsStandaloneBrowserControlled() const;
165*6777b538SAndroid Build Coastguard Worker 
166*6777b538SAndroid Build Coastguard Worker     // Returns true if a standalone browser (lacros) can change the Preference
167*6777b538SAndroid Build Coastguard Worker     // value, which is the case if no higher-priority source than the standalone
168*6777b538SAndroid Build Coastguard Worker     // browser store controls the Preference.
169*6777b538SAndroid Build Coastguard Worker     bool IsStandaloneBrowserModifiable() const;
170*6777b538SAndroid Build Coastguard Worker #endif
171*6777b538SAndroid Build Coastguard Worker 
172*6777b538SAndroid Build Coastguard Worker     // Return the registration flags for this pref as a bitmask of
173*6777b538SAndroid Build Coastguard Worker     // PrefRegistry::PrefRegistrationFlags.
registration_flags()174*6777b538SAndroid Build Coastguard Worker     uint32_t registration_flags() const { return registration_flags_; }
175*6777b538SAndroid Build Coastguard Worker 
176*6777b538SAndroid Build Coastguard Worker    private:
177*6777b538SAndroid Build Coastguard Worker     friend class PrefService;
178*6777b538SAndroid Build Coastguard Worker 
pref_value_store()179*6777b538SAndroid Build Coastguard Worker     PrefValueStore* pref_value_store() const {
180*6777b538SAndroid Build Coastguard Worker       return pref_service_->pref_value_store_.get();
181*6777b538SAndroid Build Coastguard Worker     }
182*6777b538SAndroid Build Coastguard Worker 
183*6777b538SAndroid Build Coastguard Worker     const std::string name_;
184*6777b538SAndroid Build Coastguard Worker 
185*6777b538SAndroid Build Coastguard Worker     const base::Value::Type type_;
186*6777b538SAndroid Build Coastguard Worker 
187*6777b538SAndroid Build Coastguard Worker     const uint32_t registration_flags_;
188*6777b538SAndroid Build Coastguard Worker 
189*6777b538SAndroid Build Coastguard Worker     // Reference to the PrefService in which this pref was created.
190*6777b538SAndroid Build Coastguard Worker     const raw_ptr<const PrefService> pref_service_;
191*6777b538SAndroid Build Coastguard Worker   };
192*6777b538SAndroid Build Coastguard Worker 
193*6777b538SAndroid Build Coastguard Worker   // You may wish to use PrefServiceFactory or one of its subclasses
194*6777b538SAndroid Build Coastguard Worker   // for simplified construction.
195*6777b538SAndroid Build Coastguard Worker   PrefService(std::unique_ptr<PrefNotifierImpl> pref_notifier,
196*6777b538SAndroid Build Coastguard Worker               std::unique_ptr<PrefValueStore> pref_value_store,
197*6777b538SAndroid Build Coastguard Worker               scoped_refptr<PersistentPrefStore> user_prefs,
198*6777b538SAndroid Build Coastguard Worker               scoped_refptr<PersistentPrefStore> standalone_browser_prefs,
199*6777b538SAndroid Build Coastguard Worker               scoped_refptr<PrefRegistry> pref_registry,
200*6777b538SAndroid Build Coastguard Worker               base::RepeatingCallback<void(PersistentPrefStore::PrefReadError)>
201*6777b538SAndroid Build Coastguard Worker                   read_error_callback,
202*6777b538SAndroid Build Coastguard Worker               bool async);
203*6777b538SAndroid Build Coastguard Worker 
204*6777b538SAndroid Build Coastguard Worker   PrefService(const PrefService&) = delete;
205*6777b538SAndroid Build Coastguard Worker   PrefService& operator=(const PrefService&) = delete;
206*6777b538SAndroid Build Coastguard Worker 
207*6777b538SAndroid Build Coastguard Worker   virtual ~PrefService();
208*6777b538SAndroid Build Coastguard Worker 
209*6777b538SAndroid Build Coastguard Worker   // Lands pending writes to disk. This should only be used if we need to save
210*6777b538SAndroid Build Coastguard Worker   // immediately (basically, during shutdown). |reply_callback| will be posted
211*6777b538SAndroid Build Coastguard Worker   // to the current sequence when changes have been written.
212*6777b538SAndroid Build Coastguard Worker   // |synchronous_done_callback| on the other hand will be invoked right away
213*6777b538SAndroid Build Coastguard Worker   // wherever the writes complete (could even be invoked synchronously if no
214*6777b538SAndroid Build Coastguard Worker   // writes need to occur); this is useful when the current thread cannot pump
215*6777b538SAndroid Build Coastguard Worker   // messages to observe the reply (e.g. nested loops banned on main thread
216*6777b538SAndroid Build Coastguard Worker   // during shutdown). |synchronous_done_callback| must be thread-safe.
217*6777b538SAndroid Build Coastguard Worker   void CommitPendingWrite(
218*6777b538SAndroid Build Coastguard Worker       base::OnceClosure reply_callback = base::OnceClosure(),
219*6777b538SAndroid Build Coastguard Worker       base::OnceClosure synchronous_done_callback = base::OnceClosure());
220*6777b538SAndroid Build Coastguard Worker 
221*6777b538SAndroid Build Coastguard Worker   // Schedules a write if there is any lossy data pending. Unlike
222*6777b538SAndroid Build Coastguard Worker   // CommitPendingWrite() this does not immediately sync to disk, instead it
223*6777b538SAndroid Build Coastguard Worker   // triggers an eventual write if there is lossy data pending and if there
224*6777b538SAndroid Build Coastguard Worker   // isn't one scheduled already.
225*6777b538SAndroid Build Coastguard Worker   void SchedulePendingLossyWrites();
226*6777b538SAndroid Build Coastguard Worker 
227*6777b538SAndroid Build Coastguard Worker   // Returns true if the preference for the given preference name is available
228*6777b538SAndroid Build Coastguard Worker   // and is managed.
229*6777b538SAndroid Build Coastguard Worker   bool IsManagedPreference(const std::string& pref_name) const;
230*6777b538SAndroid Build Coastguard Worker 
231*6777b538SAndroid Build Coastguard Worker   // Returns true if the preference for the given preference name is available
232*6777b538SAndroid Build Coastguard Worker   // and is controlled by the parent/guardian of the child Account.
233*6777b538SAndroid Build Coastguard Worker   bool IsPreferenceManagedByCustodian(const std::string& pref_name) const;
234*6777b538SAndroid Build Coastguard Worker 
235*6777b538SAndroid Build Coastguard Worker   // Returns |true| if a preference with the given name is available and its
236*6777b538SAndroid Build Coastguard Worker   // value can be changed by the user.
237*6777b538SAndroid Build Coastguard Worker   bool IsUserModifiablePreference(const std::string& pref_name) const;
238*6777b538SAndroid Build Coastguard Worker 
239*6777b538SAndroid Build Coastguard Worker   // Look up a preference.  Returns NULL if the preference is not
240*6777b538SAndroid Build Coastguard Worker   // registered.
241*6777b538SAndroid Build Coastguard Worker   const PrefService::Preference* FindPreference(const std::string& path) const;
242*6777b538SAndroid Build Coastguard Worker 
243*6777b538SAndroid Build Coastguard Worker   // If the path is valid and the value at the end of the path matches the type
244*6777b538SAndroid Build Coastguard Worker   // specified, it will return the specified value.  Otherwise, the default
245*6777b538SAndroid Build Coastguard Worker   // value (set when the pref was registered) will be returned.
246*6777b538SAndroid Build Coastguard Worker   bool GetBoolean(base::StringPiece path) const;
247*6777b538SAndroid Build Coastguard Worker   int GetInteger(base::StringPiece path) const;
248*6777b538SAndroid Build Coastguard Worker   double GetDouble(base::StringPiece path) const;
249*6777b538SAndroid Build Coastguard Worker   const std::string& GetString(base::StringPiece path) const;
250*6777b538SAndroid Build Coastguard Worker   base::FilePath GetFilePath(base::StringPiece path) const;
251*6777b538SAndroid Build Coastguard Worker 
252*6777b538SAndroid Build Coastguard Worker   // Returns the branch if it exists, or the registered default value otherwise.
253*6777b538SAndroid Build Coastguard Worker   // `path` must point to a registered preference (DCHECK).
254*6777b538SAndroid Build Coastguard Worker   const base::Value& GetValue(base::StringPiece path) const;
255*6777b538SAndroid Build Coastguard Worker 
256*6777b538SAndroid Build Coastguard Worker   // Returns the branch if it exists, or the registered default value otherwise.
257*6777b538SAndroid Build Coastguard Worker   // `path` must point to a registered preference whose value and registered
258*6777b538SAndroid Build Coastguard Worker   // default are of type `base::Value::Type::DICT (DCHECK).
259*6777b538SAndroid Build Coastguard Worker   const base::Value::Dict& GetDict(base::StringPiece path) const;
260*6777b538SAndroid Build Coastguard Worker 
261*6777b538SAndroid Build Coastguard Worker   // Returns the branch if it exists, or the registered default value otherwise.
262*6777b538SAndroid Build Coastguard Worker   // `path` must point to a registered preference whose value and registered
263*6777b538SAndroid Build Coastguard Worker   // default are of type `base::Value::Type::LIST (DCHECK).
264*6777b538SAndroid Build Coastguard Worker   const base::Value::List& GetList(base::StringPiece path) const;
265*6777b538SAndroid Build Coastguard Worker 
266*6777b538SAndroid Build Coastguard Worker   // Removes a user pref and restores the pref to its default value.
267*6777b538SAndroid Build Coastguard Worker   void ClearPref(const std::string& path);
268*6777b538SAndroid Build Coastguard Worker 
269*6777b538SAndroid Build Coastguard Worker   // Removes user prefs that start with |prefix|.
270*6777b538SAndroid Build Coastguard Worker   void ClearPrefsWithPrefixSilently(const std::string& prefix);
271*6777b538SAndroid Build Coastguard Worker 
272*6777b538SAndroid Build Coastguard Worker   // If the path is valid (i.e., registered), update the pref value in the user
273*6777b538SAndroid Build Coastguard Worker   // prefs.
274*6777b538SAndroid Build Coastguard Worker   //
275*6777b538SAndroid Build Coastguard Worker   // To set the value of dictionary or list values in the pref tree, use
276*6777b538SAndroid Build Coastguard Worker   // SetDict()/SetList(), but to modify the value of a dictionary or list use
277*6777b538SAndroid Build Coastguard Worker   // either ScopedDictPrefUpdate or ScopedListPrefUpdate from
278*6777b538SAndroid Build Coastguard Worker   // scoped_user_pref_update.h.
279*6777b538SAndroid Build Coastguard Worker   void Set(const std::string& path, const base::Value& value);
280*6777b538SAndroid Build Coastguard Worker   void SetBoolean(const std::string& path, bool value);
281*6777b538SAndroid Build Coastguard Worker   void SetInteger(const std::string& path, int value);
282*6777b538SAndroid Build Coastguard Worker   void SetDouble(const std::string& path, double value);
283*6777b538SAndroid Build Coastguard Worker   void SetString(const std::string& path, base::StringPiece value);
284*6777b538SAndroid Build Coastguard Worker   void SetDict(const std::string& path, base::Value::Dict dict);
285*6777b538SAndroid Build Coastguard Worker   void SetList(const std::string& path, base::Value::List list);
286*6777b538SAndroid Build Coastguard Worker   void SetFilePath(const std::string& path, const base::FilePath& value);
287*6777b538SAndroid Build Coastguard Worker 
288*6777b538SAndroid Build Coastguard Worker   // Int64 helper methods that actually store the given value as a string.
289*6777b538SAndroid Build Coastguard Worker   // Note that if obtaining the named value via GetDictionary or GetList, the
290*6777b538SAndroid Build Coastguard Worker   // Value type will be Type::STRING.
291*6777b538SAndroid Build Coastguard Worker   void SetInt64(const std::string& path, int64_t value);
292*6777b538SAndroid Build Coastguard Worker   int64_t GetInt64(const std::string& path) const;
293*6777b538SAndroid Build Coastguard Worker 
294*6777b538SAndroid Build Coastguard Worker   // As above, but for unsigned values.
295*6777b538SAndroid Build Coastguard Worker   void SetUint64(const std::string& path, uint64_t value);
296*6777b538SAndroid Build Coastguard Worker   uint64_t GetUint64(const std::string& path) const;
297*6777b538SAndroid Build Coastguard Worker 
298*6777b538SAndroid Build Coastguard Worker   // Time helper methods that actually store the given value as a string, which
299*6777b538SAndroid Build Coastguard Worker   // represents the number of microseconds elapsed (absolute for TimeDelta and
300*6777b538SAndroid Build Coastguard Worker   // relative to Windows epoch for Time variants). Note that if obtaining the
301*6777b538SAndroid Build Coastguard Worker   // named value via GetDictionary or GetList, the Value type will be
302*6777b538SAndroid Build Coastguard Worker   // Type::STRING.
303*6777b538SAndroid Build Coastguard Worker   void SetTime(const std::string& path, base::Time value);
304*6777b538SAndroid Build Coastguard Worker   base::Time GetTime(const std::string& path) const;
305*6777b538SAndroid Build Coastguard Worker   void SetTimeDelta(const std::string& path, base::TimeDelta value);
306*6777b538SAndroid Build Coastguard Worker   base::TimeDelta GetTimeDelta(const std::string& path) const;
307*6777b538SAndroid Build Coastguard Worker 
308*6777b538SAndroid Build Coastguard Worker   // Returns the value of the given preference, from the user pref store. If
309*6777b538SAndroid Build Coastguard Worker   // the preference is not set in the user pref store, returns NULL.
310*6777b538SAndroid Build Coastguard Worker   const base::Value* GetUserPrefValue(const std::string& path) const;
311*6777b538SAndroid Build Coastguard Worker 
312*6777b538SAndroid Build Coastguard Worker   // Changes the default value for a preference.
313*6777b538SAndroid Build Coastguard Worker   //
314*6777b538SAndroid Build Coastguard Worker   // Will cause a pref change notification to be fired if this causes
315*6777b538SAndroid Build Coastguard Worker   // the effective value to change.
316*6777b538SAndroid Build Coastguard Worker   void SetDefaultPrefValue(const std::string& path, base::Value value);
317*6777b538SAndroid Build Coastguard Worker 
318*6777b538SAndroid Build Coastguard Worker   // Returns the default value of the given preference. |path| must point to a
319*6777b538SAndroid Build Coastguard Worker   // registered preference. In that case, will never return nullptr, so callers
320*6777b538SAndroid Build Coastguard Worker   // do not need to check this.
321*6777b538SAndroid Build Coastguard Worker   const base::Value* GetDefaultPrefValue(const std::string& path) const;
322*6777b538SAndroid Build Coastguard Worker 
323*6777b538SAndroid Build Coastguard Worker   // Returns true if a value has been set for the specified path.
324*6777b538SAndroid Build Coastguard Worker   // NOTE: this is NOT the same as FindPreference. In particular
325*6777b538SAndroid Build Coastguard Worker   // FindPreference returns whether RegisterXXX has been invoked, where as
326*6777b538SAndroid Build Coastguard Worker   // this checks if a value exists for the path.
327*6777b538SAndroid Build Coastguard Worker   bool HasPrefPath(const std::string& path) const;
328*6777b538SAndroid Build Coastguard Worker 
329*6777b538SAndroid Build Coastguard Worker   // Issues a callback for every preference value. The preferences must not be
330*6777b538SAndroid Build Coastguard Worker   // mutated during iteration.
331*6777b538SAndroid Build Coastguard Worker   void IteratePreferenceValues(
332*6777b538SAndroid Build Coastguard Worker       base::RepeatingCallback<void(const std::string& key,
333*6777b538SAndroid Build Coastguard Worker                                    const base::Value& value)> callback) const;
334*6777b538SAndroid Build Coastguard Worker 
335*6777b538SAndroid Build Coastguard Worker   // Returns a dictionary with effective preference values. This is an expensive
336*6777b538SAndroid Build Coastguard Worker   // operation which does a deep copy. Use only if you really need the results
337*6777b538SAndroid Build Coastguard Worker   // in a base::Value (for example, for JSON serialization). Otherwise use
338*6777b538SAndroid Build Coastguard Worker   // IteratePreferenceValues above to avoid the copies.
339*6777b538SAndroid Build Coastguard Worker   //
340*6777b538SAndroid Build Coastguard Worker   // If INCLUDE_DEFAULTS is requested, preferences set to their default values
341*6777b538SAndroid Build Coastguard Worker   // will be included. Otherwise, these will be omitted from the returned
342*6777b538SAndroid Build Coastguard Worker   // dictionary.
343*6777b538SAndroid Build Coastguard Worker   base::Value::Dict GetPreferenceValues(IncludeDefaults include_defaults) const;
344*6777b538SAndroid Build Coastguard Worker 
345*6777b538SAndroid Build Coastguard Worker   // Returns a map of the preference values by their path including prefs that
346*6777b538SAndroid Build Coastguard Worker   // have their default value.
347*6777b538SAndroid Build Coastguard Worker   std::vector<PreferenceValueAndStore> GetPreferencesValueAndStore() const;
348*6777b538SAndroid Build Coastguard Worker 
349*6777b538SAndroid Build Coastguard Worker   bool ReadOnly() const;
350*6777b538SAndroid Build Coastguard Worker 
351*6777b538SAndroid Build Coastguard Worker   // Returns the initialization state, taking only user prefs into account.
352*6777b538SAndroid Build Coastguard Worker   PrefInitializationStatus GetInitializationStatus() const;
353*6777b538SAndroid Build Coastguard Worker 
354*6777b538SAndroid Build Coastguard Worker   // Returns the initialization state, taking all pref stores into account.
355*6777b538SAndroid Build Coastguard Worker   PrefInitializationStatus GetAllPrefStoresInitializationStatus() const;
356*6777b538SAndroid Build Coastguard Worker 
357*6777b538SAndroid Build Coastguard Worker   // Tell our PrefValueStore to update itself to |command_line_store|.
358*6777b538SAndroid Build Coastguard Worker   // Takes ownership of the store.
359*6777b538SAndroid Build Coastguard Worker   virtual void UpdateCommandLinePrefStore(PrefStore* command_line_store);
360*6777b538SAndroid Build Coastguard Worker 
361*6777b538SAndroid Build Coastguard Worker   // We run the callback once, when initialization completes. The bool
362*6777b538SAndroid Build Coastguard Worker   // parameter will be set to true for successful initialization,
363*6777b538SAndroid Build Coastguard Worker   // false for unsuccessful.
364*6777b538SAndroid Build Coastguard Worker   void AddPrefInitObserver(base::OnceCallback<void(bool)> callback);
365*6777b538SAndroid Build Coastguard Worker 
366*6777b538SAndroid Build Coastguard Worker   // Returns the PrefRegistry object for this service. You should not
367*6777b538SAndroid Build Coastguard Worker   // use this; the intent is for no registrations to take place after
368*6777b538SAndroid Build Coastguard Worker   // PrefService has been constructed.
369*6777b538SAndroid Build Coastguard Worker   //
370*6777b538SAndroid Build Coastguard Worker   // Instead of using this method, the recommended approach is to
371*6777b538SAndroid Build Coastguard Worker   // register all preferences for a class Xyz up front in a static
372*6777b538SAndroid Build Coastguard Worker   // Xyz::RegisterPrefs function, which gets invoked early in the
373*6777b538SAndroid Build Coastguard Worker   // application's start-up, before a PrefService is created.
374*6777b538SAndroid Build Coastguard Worker   //
375*6777b538SAndroid Build Coastguard Worker   // As an example, prefs registration in Chrome is triggered by the
376*6777b538SAndroid Build Coastguard Worker   // functions chrome::RegisterPrefs (for global preferences) and
377*6777b538SAndroid Build Coastguard Worker   // chrome::RegisterProfilePrefs (for user-specific preferences)
378*6777b538SAndroid Build Coastguard Worker   // implemented in chrome/browser/prefs/browser_prefs.cc.
379*6777b538SAndroid Build Coastguard Worker   PrefRegistry* DeprecatedGetPrefRegistry();
380*6777b538SAndroid Build Coastguard Worker 
381*6777b538SAndroid Build Coastguard Worker   // Invoked when the store is deleted from disk. Allows this PrefService
382*6777b538SAndroid Build Coastguard Worker   // to tangentially cleanup data it may have saved outside the store.
383*6777b538SAndroid Build Coastguard Worker   void OnStoreDeletionFromDisk();
384*6777b538SAndroid Build Coastguard Worker 
385*6777b538SAndroid Build Coastguard Worker   // A low level function for registering an observer for every single
386*6777b538SAndroid Build Coastguard Worker   // preference changed notification. The caller must ensure that the observer
387*6777b538SAndroid Build Coastguard Worker   // remains valid as long as it is registered. Pointer ownership is not
388*6777b538SAndroid Build Coastguard Worker   // transferred.
389*6777b538SAndroid Build Coastguard Worker   //
390*6777b538SAndroid Build Coastguard Worker   // Almost all calling code should use a PrefChangeRegistrar instead.
391*6777b538SAndroid Build Coastguard Worker   //
392*6777b538SAndroid Build Coastguard Worker   // AVOID ADDING THESE. These are low-level observer notifications that are
393*6777b538SAndroid Build Coastguard Worker   // called for every pref change. This can lead to inefficiency, and the lack
394*6777b538SAndroid Build Coastguard Worker   // of a "registrar" model makes it easy to forget to unregister. It is
395*6777b538SAndroid Build Coastguard Worker   // really designed for integrating other notification systems, not for normal
396*6777b538SAndroid Build Coastguard Worker   // observation.
397*6777b538SAndroid Build Coastguard Worker   void AddPrefObserverAllPrefs(PrefObserver* obs);
398*6777b538SAndroid Build Coastguard Worker   void RemovePrefObserverAllPrefs(PrefObserver* obs);
399*6777b538SAndroid Build Coastguard Worker 
400*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS_ASH)
401*6777b538SAndroid Build Coastguard Worker   // Write extension-controlled prefs from Lacros in ash.
402*6777b538SAndroid Build Coastguard Worker   void SetStandaloneBrowserPref(const std::string& path,
403*6777b538SAndroid Build Coastguard Worker                                 const base::Value& value);
404*6777b538SAndroid Build Coastguard Worker   // Clear extension-controlled prefs from Lacros in ash.
405*6777b538SAndroid Build Coastguard Worker   void RemoveStandaloneBrowserPref(const std::string& path);
406*6777b538SAndroid Build Coastguard Worker #endif
407*6777b538SAndroid Build Coastguard Worker 
408*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
409*6777b538SAndroid Build Coastguard Worker   base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
410*6777b538SAndroid Build Coastguard Worker #endif
411*6777b538SAndroid Build Coastguard Worker 
412*6777b538SAndroid Build Coastguard Worker   // Returns the WriteablePrefStore::PrefWriteFlags for `pref`.
413*6777b538SAndroid Build Coastguard Worker   static uint32_t GetWriteFlags(const PrefService::Preference* pref);
414*6777b538SAndroid Build Coastguard Worker 
415*6777b538SAndroid Build Coastguard Worker  protected:
416*6777b538SAndroid Build Coastguard Worker   // The PrefNotifier handles registering and notifying preference observers.
417*6777b538SAndroid Build Coastguard Worker   // It is created and owned by this PrefService. Subclasses may access it for
418*6777b538SAndroid Build Coastguard Worker   // unit testing.
419*6777b538SAndroid Build Coastguard Worker   const std::unique_ptr<PrefNotifierImpl> pref_notifier_;
420*6777b538SAndroid Build Coastguard Worker 
421*6777b538SAndroid Build Coastguard Worker   // The PrefValueStore provides prioritized preference values. It is owned by
422*6777b538SAndroid Build Coastguard Worker   // this PrefService. Subclasses may access it for unit testing.
423*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<PrefValueStore> pref_value_store_;
424*6777b538SAndroid Build Coastguard Worker 
425*6777b538SAndroid Build Coastguard Worker   // Pref Stores and profile that we passed to the PrefValueStore.
426*6777b538SAndroid Build Coastguard Worker   const scoped_refptr<PersistentPrefStore> user_pref_store_;
427*6777b538SAndroid Build Coastguard Worker   const scoped_refptr<PersistentPrefStore> standalone_browser_pref_store_;
428*6777b538SAndroid Build Coastguard Worker 
429*6777b538SAndroid Build Coastguard Worker   // Callback to call when a read error occurs. Always invoked on the sequence
430*6777b538SAndroid Build Coastguard Worker   // this PrefService was created own.
431*6777b538SAndroid Build Coastguard Worker   const base::RepeatingCallback<void(PersistentPrefStore::PrefReadError)>
432*6777b538SAndroid Build Coastguard Worker       read_error_callback_;
433*6777b538SAndroid Build Coastguard Worker 
434*6777b538SAndroid Build Coastguard Worker  private:
435*6777b538SAndroid Build Coastguard Worker   // Hash map expected to be fastest here since it minimises expensive
436*6777b538SAndroid Build Coastguard Worker   // string comparisons. Order is unimportant, and deletions are rare.
437*6777b538SAndroid Build Coastguard Worker   // Confirmed on Android where this speeded Chrome startup by roughly 50ms
438*6777b538SAndroid Build Coastguard Worker   // vs. std::map, and by roughly 180ms vs. std::set of Preference pointers.
439*6777b538SAndroid Build Coastguard Worker   typedef std::unordered_map<std::string, Preference> PreferenceMap;
440*6777b538SAndroid Build Coastguard Worker 
441*6777b538SAndroid Build Coastguard Worker   // Give access to ReportUserPrefChanged() and GetMutableUserPref().
442*6777b538SAndroid Build Coastguard Worker   friend class subtle::ScopedUserPrefUpdateBase;
443*6777b538SAndroid Build Coastguard Worker   friend class PrefServiceTest_WriteablePrefStoreFlags_Test;
444*6777b538SAndroid Build Coastguard Worker   friend class prefs::ScopedDictionaryPrefUpdate;
445*6777b538SAndroid Build Coastguard Worker 
446*6777b538SAndroid Build Coastguard Worker   // Registration of pref change observers must be done using the
447*6777b538SAndroid Build Coastguard Worker   // PrefChangeRegistrar, which is declared as a friend here to grant it
448*6777b538SAndroid Build Coastguard Worker   // access to the otherwise protected members Add/RemovePrefObserver.
449*6777b538SAndroid Build Coastguard Worker   // PrefMember registers for preferences changes notification directly to
450*6777b538SAndroid Build Coastguard Worker   // avoid the storage overhead of the registrar, so its base class must be
451*6777b538SAndroid Build Coastguard Worker   // declared as a friend, too.
452*6777b538SAndroid Build Coastguard Worker   friend class PrefChangeRegistrar;
453*6777b538SAndroid Build Coastguard Worker   friend class subtle::PrefMemberBase;
454*6777b538SAndroid Build Coastguard Worker 
455*6777b538SAndroid Build Coastguard Worker   // These are protected so they can only be accessed by the friend
456*6777b538SAndroid Build Coastguard Worker   // classes listed above.
457*6777b538SAndroid Build Coastguard Worker   //
458*6777b538SAndroid Build Coastguard Worker   // If the pref at the given path changes, we call the observer's
459*6777b538SAndroid Build Coastguard Worker   // OnPreferenceChanged method. Note that observers should not call
460*6777b538SAndroid Build Coastguard Worker   // these methods directly but rather use a PrefChangeRegistrar to
461*6777b538SAndroid Build Coastguard Worker   // make sure the observer gets cleaned up properly.
462*6777b538SAndroid Build Coastguard Worker   //
463*6777b538SAndroid Build Coastguard Worker   // Virtual for testing.
464*6777b538SAndroid Build Coastguard Worker   virtual void AddPrefObserver(const std::string& path, PrefObserver* obs);
465*6777b538SAndroid Build Coastguard Worker   virtual void RemovePrefObserver(const std::string& path, PrefObserver* obs);
466*6777b538SAndroid Build Coastguard Worker 
467*6777b538SAndroid Build Coastguard Worker   // A PrefStore::Observer which reports loading errors from
468*6777b538SAndroid Build Coastguard Worker   // PersistentPrefStores after they are loaded. Usually this is only user_prefs
469*6777b538SAndroid Build Coastguard Worker   // however in ash it additionally includes standalone_browser_prefs. Errors
470*6777b538SAndroid Build Coastguard Worker   // are only reported once even though multiple files may be loaded.
471*6777b538SAndroid Build Coastguard Worker   class PersistentPrefStoreLoadingObserver : public PrefStore::Observer {
472*6777b538SAndroid Build Coastguard Worker    public:
473*6777b538SAndroid Build Coastguard Worker     explicit PersistentPrefStoreLoadingObserver(PrefService* pref_service_);
474*6777b538SAndroid Build Coastguard Worker 
475*6777b538SAndroid Build Coastguard Worker     // PrefStore::Observer implementation
OnPrefValueChanged(const std::string & key)476*6777b538SAndroid Build Coastguard Worker     void OnPrefValueChanged(const std::string& key) override {}
477*6777b538SAndroid Build Coastguard Worker     void OnInitializationCompleted(bool succeeded) override;
478*6777b538SAndroid Build Coastguard Worker 
479*6777b538SAndroid Build Coastguard Worker    private:
480*6777b538SAndroid Build Coastguard Worker     raw_ptr<PrefService> pref_service_ = nullptr;
481*6777b538SAndroid Build Coastguard Worker   };
482*6777b538SAndroid Build Coastguard Worker 
483*6777b538SAndroid Build Coastguard Worker   // Sends notification of a changed preference. This needs to be called by
484*6777b538SAndroid Build Coastguard Worker   // a ScopedDictPrefUpdate or ScopedListPrefUpdate if a Value::Dict or
485*6777b538SAndroid Build Coastguard Worker   // Value::List is changed.
486*6777b538SAndroid Build Coastguard Worker   void ReportUserPrefChanged(const std::string& key);
487*6777b538SAndroid Build Coastguard Worker   void ReportUserPrefChanged(
488*6777b538SAndroid Build Coastguard Worker       const std::string& key,
489*6777b538SAndroid Build Coastguard Worker       std::set<std::vector<std::string>> path_components);
490*6777b538SAndroid Build Coastguard Worker 
491*6777b538SAndroid Build Coastguard Worker   // Sets the value for this pref path in the user pref store and informs the
492*6777b538SAndroid Build Coastguard Worker   // PrefNotifier of the change.
493*6777b538SAndroid Build Coastguard Worker   void SetUserPrefValue(const std::string& path, base::Value new_value);
494*6777b538SAndroid Build Coastguard Worker 
495*6777b538SAndroid Build Coastguard Worker   // Load preferences from storage, attempting to diagnose and handle errors.
496*6777b538SAndroid Build Coastguard Worker   // This should only be called from the constructor.
497*6777b538SAndroid Build Coastguard Worker   void InitFromStorage(bool async);
498*6777b538SAndroid Build Coastguard Worker 
499*6777b538SAndroid Build Coastguard Worker   // Verifies that prefs are fully loaded from disk, handling errors. This
500*6777b538SAndroid Build Coastguard Worker   // method may be called multiple times, but no more than once after all prefs
501*6777b538SAndroid Build Coastguard Worker   // are loaded.
502*6777b538SAndroid Build Coastguard Worker   void CheckPrefsLoaded();
503*6777b538SAndroid Build Coastguard Worker 
504*6777b538SAndroid Build Coastguard Worker   // Used to set the value of dictionary or list values in the user pref store.
505*6777b538SAndroid Build Coastguard Worker   // This will create a dictionary or list if one does not exist in the user
506*6777b538SAndroid Build Coastguard Worker   // pref store. This method returns NULL only if you're requesting an
507*6777b538SAndroid Build Coastguard Worker   // unregistered pref or a non-dict/non-list pref.
508*6777b538SAndroid Build Coastguard Worker   // |type| may only be Values::Type::DICT or Values::Type::LIST and
509*6777b538SAndroid Build Coastguard Worker   // |path| must point to a registered preference of type |type|.
510*6777b538SAndroid Build Coastguard Worker   // Ownership of the returned value remains at the user pref store.
511*6777b538SAndroid Build Coastguard Worker   base::Value* GetMutableUserPref(const std::string& path,
512*6777b538SAndroid Build Coastguard Worker                                   base::Value::Type type);
513*6777b538SAndroid Build Coastguard Worker 
514*6777b538SAndroid Build Coastguard Worker   // GetPreferenceValue is the equivalent of FindPreference(path)->GetValue(),
515*6777b538SAndroid Build Coastguard Worker   // it has been added for performance. It is faster because it does
516*6777b538SAndroid Build Coastguard Worker   // not need to find or create a Preference object to get the
517*6777b538SAndroid Build Coastguard Worker   // value (GetValue() calls back though the preference service to
518*6777b538SAndroid Build Coastguard Worker   // actually get the value.).
519*6777b538SAndroid Build Coastguard Worker   const base::Value* GetPreferenceValue(base::StringPiece path) const;
520*6777b538SAndroid Build Coastguard Worker 
521*6777b538SAndroid Build Coastguard Worker   const scoped_refptr<PrefRegistry> pref_registry_;
522*6777b538SAndroid Build Coastguard Worker 
523*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<PrefService::PersistentPrefStoreLoadingObserver>
524*6777b538SAndroid Build Coastguard Worker       pref_store_observer_;
525*6777b538SAndroid Build Coastguard Worker 
526*6777b538SAndroid Build Coastguard Worker   // Local cache of registered Preference objects. The pref_registry_
527*6777b538SAndroid Build Coastguard Worker   // is authoritative with respect to what the types and default values
528*6777b538SAndroid Build Coastguard Worker   // of registered preferences are.
529*6777b538SAndroid Build Coastguard Worker   mutable PreferenceMap prefs_map_;
530*6777b538SAndroid Build Coastguard Worker 
531*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
532*6777b538SAndroid Build Coastguard Worker   // Manage and fetch the java object that wraps this PrefService on
533*6777b538SAndroid Build Coastguard Worker   // android.
534*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<PrefServiceAndroid> pref_service_android_;
535*6777b538SAndroid Build Coastguard Worker #endif
536*6777b538SAndroid Build Coastguard Worker 
537*6777b538SAndroid Build Coastguard Worker   SEQUENCE_CHECKER(sequence_checker_);
538*6777b538SAndroid Build Coastguard Worker };
539*6777b538SAndroid Build Coastguard Worker 
540*6777b538SAndroid Build Coastguard Worker #endif  // COMPONENTS_PREFS_PREF_SERVICE_H_
541