xref: /aosp_15_r20/external/cronet/components/prefs/pref_notifier_impl.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 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_NOTIFIER_IMPL_H_
6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_PREFS_PREF_NOTIFIER_IMPL_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <list>
9*6777b538SAndroid Build Coastguard Worker #include <memory>
10*6777b538SAndroid Build Coastguard Worker #include <string>
11*6777b538SAndroid Build Coastguard Worker #include <unordered_map>
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/observer_list.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/sequence_checker.h"
18*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_notifier.h"
19*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_observer.h"
20*6777b538SAndroid Build Coastguard Worker #include "components/prefs/prefs_export.h"
21*6777b538SAndroid Build Coastguard Worker 
22*6777b538SAndroid Build Coastguard Worker class PrefService;
23*6777b538SAndroid Build Coastguard Worker 
24*6777b538SAndroid Build Coastguard Worker // The PrefNotifier implementation used by the PrefService.
25*6777b538SAndroid Build Coastguard Worker class COMPONENTS_PREFS_EXPORT PrefNotifierImpl : public PrefNotifier {
26*6777b538SAndroid Build Coastguard Worker  public:
27*6777b538SAndroid Build Coastguard Worker   PrefNotifierImpl();
28*6777b538SAndroid Build Coastguard Worker   explicit PrefNotifierImpl(PrefService* pref_service);
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker   PrefNotifierImpl(const PrefNotifierImpl&) = delete;
31*6777b538SAndroid Build Coastguard Worker   PrefNotifierImpl& operator=(const PrefNotifierImpl&) = delete;
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker   ~PrefNotifierImpl() override;
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker   // If the pref at the given path changes, we call the observer's
36*6777b538SAndroid Build Coastguard Worker   // OnPreferenceChanged method.
37*6777b538SAndroid Build Coastguard Worker   void AddPrefObserver(const std::string& path, PrefObserver* observer);
38*6777b538SAndroid Build Coastguard Worker   void RemovePrefObserver(const std::string& path, PrefObserver* observer);
39*6777b538SAndroid Build Coastguard Worker 
40*6777b538SAndroid Build Coastguard Worker   // These observers are called for any pref changes.
41*6777b538SAndroid Build Coastguard Worker   //
42*6777b538SAndroid Build Coastguard Worker   // AVOID ADDING THESE. See the long comment in the identically-named
43*6777b538SAndroid Build Coastguard Worker   // functions on PrefService for background.
44*6777b538SAndroid Build Coastguard Worker   void AddPrefObserverAllPrefs(PrefObserver* observer);
45*6777b538SAndroid Build Coastguard Worker   void RemovePrefObserverAllPrefs(PrefObserver* observer);
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker   // We run the callback once, when initialization completes. The bool
48*6777b538SAndroid Build Coastguard Worker   // parameter will be set to true for successful initialization,
49*6777b538SAndroid Build Coastguard Worker   // false for unsuccessful.
50*6777b538SAndroid Build Coastguard Worker   void AddInitObserver(base::OnceCallback<void(bool)> observer);
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker   void SetPrefService(PrefService* pref_service);
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   // PrefNotifier overrides.
55*6777b538SAndroid Build Coastguard Worker   void OnPreferenceChanged(const std::string& pref_name) override;
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker  protected:
58*6777b538SAndroid Build Coastguard Worker   // PrefNotifier overrides.
59*6777b538SAndroid Build Coastguard Worker   void OnInitializationCompleted(bool succeeded) override;
60*6777b538SAndroid Build Coastguard Worker 
61*6777b538SAndroid Build Coastguard Worker   // A map from pref names to a list of observers. Observers get fired in the
62*6777b538SAndroid Build Coastguard Worker   // order they are added. These should only be accessed externally for unit
63*6777b538SAndroid Build Coastguard Worker   // testing.
64*6777b538SAndroid Build Coastguard Worker   typedef base::ObserverList<PrefObserver>::Unchecked PrefObserverList;
65*6777b538SAndroid Build Coastguard Worker   typedef std::unordered_map<std::string, std::unique_ptr<PrefObserverList>>
66*6777b538SAndroid Build Coastguard Worker       PrefObserverMap;
67*6777b538SAndroid Build Coastguard Worker 
68*6777b538SAndroid Build Coastguard Worker   typedef std::list<base::OnceCallback<void(bool)>> PrefInitObserverList;
69*6777b538SAndroid Build Coastguard Worker 
pref_observers()70*6777b538SAndroid Build Coastguard Worker   const PrefObserverMap* pref_observers() const { return &pref_observers_; }
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker  private:
73*6777b538SAndroid Build Coastguard Worker   // For the given pref_name, fire any observer of the pref. Virtual so it can
74*6777b538SAndroid Build Coastguard Worker   // be mocked for unit testing.
75*6777b538SAndroid Build Coastguard Worker   virtual void FireObservers(const std::string& path);
76*6777b538SAndroid Build Coastguard Worker 
77*6777b538SAndroid Build Coastguard Worker   // Weak reference; the notifier is owned by the PrefService.
78*6777b538SAndroid Build Coastguard Worker   raw_ptr<PrefService> pref_service_;
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker   PrefObserverMap pref_observers_;
81*6777b538SAndroid Build Coastguard Worker   PrefInitObserverList init_observers_;
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   // Observers for changes to any preference.
84*6777b538SAndroid Build Coastguard Worker   PrefObserverList all_prefs_pref_observers_;
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker   SEQUENCE_CHECKER(sequence_checker_);
87*6777b538SAndroid Build Coastguard Worker };
88*6777b538SAndroid Build Coastguard Worker 
89*6777b538SAndroid Build Coastguard Worker #endif  // COMPONENTS_PREFS_PREF_NOTIFIER_IMPL_H_
90