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