1*6777b538SAndroid Build Coastguard Worker // Copyright 2010 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_CHANGE_REGISTRAR_H_ 6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_PREFS_PREF_CHANGE_REGISTRAR_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <map> 9*6777b538SAndroid Build Coastguard Worker #include <string> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 13*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_observer.h" 14*6777b538SAndroid Build Coastguard Worker #include "components/prefs/prefs_export.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker class PrefService; 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker // Automatically manages the registration of one or more pref change observers 19*6777b538SAndroid Build Coastguard Worker // with a PrefStore. Functions much like NotificationRegistrar, but specifically 20*6777b538SAndroid Build Coastguard Worker // manages observers of preference changes. When the Registrar is destroyed, 21*6777b538SAndroid Build Coastguard Worker // all registered observers are automatically unregistered with the PrefStore. 22*6777b538SAndroid Build Coastguard Worker class COMPONENTS_PREFS_EXPORT PrefChangeRegistrar final : public PrefObserver { 23*6777b538SAndroid Build Coastguard Worker public: 24*6777b538SAndroid Build Coastguard Worker // You can register this type of callback if you need to know the 25*6777b538SAndroid Build Coastguard Worker // path of the preference that is changing. 26*6777b538SAndroid Build Coastguard Worker using NamedChangeCallback = base::RepeatingCallback<void(const std::string&)>; 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker PrefChangeRegistrar(); 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker PrefChangeRegistrar(const PrefChangeRegistrar&) = delete; 31*6777b538SAndroid Build Coastguard Worker PrefChangeRegistrar& operator=(const PrefChangeRegistrar&) = delete; 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker ~PrefChangeRegistrar(); 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker // Must be called before adding or removing observers. Can be called more 36*6777b538SAndroid Build Coastguard Worker // than once as long as the value of |service| doesn't change. 37*6777b538SAndroid Build Coastguard Worker void Init(PrefService* service); 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker // Removes all observers and clears the reference to `PrefService`. 40*6777b538SAndroid Build Coastguard Worker // `Init` must be called before adding or removing any observers. 41*6777b538SAndroid Build Coastguard Worker void Reset(); 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker // Adds a pref observer for the specified pref |path| and |obs| observer 44*6777b538SAndroid Build Coastguard Worker // object. All registered observers will be automatically unregistered 45*6777b538SAndroid Build Coastguard Worker // when the registrar's destructor is called. 46*6777b538SAndroid Build Coastguard Worker // 47*6777b538SAndroid Build Coastguard Worker // The second version binds a callback that will receive the path of 48*6777b538SAndroid Build Coastguard Worker // the preference that is changing as its parameter. 49*6777b538SAndroid Build Coastguard Worker // 50*6777b538SAndroid Build Coastguard Worker // Only one observer may be registered per path. 51*6777b538SAndroid Build Coastguard Worker void Add(const std::string& path, const base::RepeatingClosure& obs); 52*6777b538SAndroid Build Coastguard Worker void Add(const std::string& path, const NamedChangeCallback& obs); 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker // Removes the pref observer registered for |path|. 55*6777b538SAndroid Build Coastguard Worker void Remove(const std::string& path); 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker // Removes all observers that have been previously added with a call to Add. 58*6777b538SAndroid Build Coastguard Worker void RemoveAll(); 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker // Returns true if no pref observers are registered. 61*6777b538SAndroid Build Coastguard Worker bool IsEmpty() const; 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker // Check whether |pref| is in the set of preferences being observed. 64*6777b538SAndroid Build Coastguard Worker bool IsObserved(const std::string& pref); 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker // Return the PrefService for this registrar. 67*6777b538SAndroid Build Coastguard Worker PrefService* prefs(); 68*6777b538SAndroid Build Coastguard Worker const PrefService* prefs() const; 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker private: 71*6777b538SAndroid Build Coastguard Worker // PrefObserver: 72*6777b538SAndroid Build Coastguard Worker void OnPreferenceChanged(PrefService* service, 73*6777b538SAndroid Build Coastguard Worker const std::string& pref_name) override; 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker static void InvokeUnnamedCallback(const base::RepeatingClosure& callback, 76*6777b538SAndroid Build Coastguard Worker const std::string& pref_name); 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker using ObserverMap = std::map<std::string, NamedChangeCallback>; 79*6777b538SAndroid Build Coastguard Worker 80*6777b538SAndroid Build Coastguard Worker ObserverMap observers_; 81*6777b538SAndroid Build Coastguard Worker raw_ptr<PrefService, AcrossTasksDanglingUntriaged> service_; 82*6777b538SAndroid Build Coastguard Worker }; 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker #endif // COMPONENTS_PREFS_PREF_CHANGE_REGISTRAR_H_ 85