| // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef BASE_PREFS_PUBLIC_PREF_CHANGE_REGISTRAR_H_ |
| #define BASE_PREFS_PUBLIC_PREF_CHANGE_REGISTRAR_H_ |
| |
| #include <map> |
| #include <string> |
| |
| #include "base/basictypes.h" |
| #include "base/callback.h" |
| #include "base/prefs/base_prefs_export.h" |
| #include "base/prefs/pref_observer.h" |
| |
| class PrefServiceBase; |
| |
| // Automatically manages the registration of one or more pref change observers |
| // with a PrefStore. Functions much like NotificationRegistrar, but specifically |
| // manages observers of preference changes. When the Registrar is destroyed, |
| // all registered observers are automatically unregistered with the PrefStore. |
| class BASE_PREFS_EXPORT PrefChangeRegistrar : public PrefObserver { |
| public: |
| // You can register this type of callback if you need to know the |
| // path of the preference that is changing. |
| typedef base::Callback<void(const std::string&)> NamedChangeCallback; |
| |
| PrefChangeRegistrar(); |
| virtual ~PrefChangeRegistrar(); |
| |
| // Must be called before adding or removing observers. Can be called more |
| // than once as long as the value of |service| doesn't change. |
| void Init(PrefServiceBase* service); |
| |
| // Adds a pref observer for the specified pref |path| and |obs| observer |
| // object. All registered observers will be automatically unregistered |
| // when the registrar's destructor is called. |
| // |
| // The second version binds a callback that will receive the path of |
| // the preference that is changing as its parameter. |
| // |
| // Only one observer may be registered per path. |
| void Add(const char* path, const base::Closure& obs); |
| void Add(const char* path, const NamedChangeCallback& obs); |
| |
| // Removes the pref observer registered for |path|. |
| void Remove(const char* path); |
| |
| // Removes all observers that have been previously added with a call to Add. |
| void RemoveAll(); |
| |
| // Returns true if no pref observers are registered. |
| bool IsEmpty() const; |
| |
| // Check whether |pref| is in the set of preferences being observed. |
| bool IsObserved(const std::string& pref); |
| |
| // Check whether any of the observed preferences has the managed bit set. |
| bool IsManaged(); |
| |
| // Return the PrefServiceBase for this registrar. |
| PrefServiceBase* prefs(); |
| |
| private: |
| // PrefObserver: |
| virtual void OnPreferenceChanged(PrefServiceBase* service, |
| const std::string& pref_name) override; |
| |
| static void InvokeUnnamedCallback(const base::Closure& callback, |
| const std::string& pref_name); |
| |
| typedef std::map<std::string, NamedChangeCallback> ObserverMap; |
| |
| ObserverMap observers_; |
| PrefServiceBase* service_; |
| |
| DISALLOW_COPY_AND_ASSIGN(PrefChangeRegistrar); |
| }; |
| |
| #endif // BASE_PREFS_PUBLIC_PREF_CHANGE_REGISTRAR_H_ |