1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// found in the LICENSE file. 4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#ifndef CHROME_BROWSER_PREFS_SYNCED_PREF_CHANGE_REGISTRAR_H_ 6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#define CHROME_BROWSER_PREFS_SYNCED_PREF_CHANGE_REGISTRAR_H_ 7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <map> 9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <string> 10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/callback.h" 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/prefs/pref_service_syncable.h" 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/prefs/synced_pref_observer.h" 14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Manages the registration of one or more SyncedPrefObservers on a 16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// PrefServiceSyncable. This is modeled after base::PrefChangeRegistrar, and 17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// it should be used whenever it's necessary to determine whether a pref change 18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// has come from sync or from some other mechanism (managed, UI, external, etc.) 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass SyncedPrefChangeRegistrar : public SyncedPrefObserver { 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public: 21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Registered callbacks may optionally take a path argument. 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The boolean argument indicates whether (true) or not (false) 23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // the change was a result of syncing. 24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch typedef base::Callback<void(bool)> ChangeCallback; 25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch typedef base::Callback<void(const std::string&, bool)> NamedChangeCallback; 26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch explicit SyncedPrefChangeRegistrar(PrefServiceSyncable* pref_service); 28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual ~SyncedPrefChangeRegistrar(); 29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Register an observer callback for sync change events on the pref at 31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // |path|. Only one callback may be registered per pref. 32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void Add(const char* path, const ChangeCallback& callback); 33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void Add(const char* path, const NamedChangeCallback& callback); 34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Remove the registered observer for |path|. 36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void Remove(const char* path); 37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Remove all registered observers. 39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void RemoveAll(); 40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Indicates whether or not an observer is already registered for |path|. 42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool IsObserved(const char* path) const; 43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch private: 45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // SyncedPrefObserver implementation 46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void OnSyncedPrefChanged(const std::string& path, bool from_sync) 47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch OVERRIDE; 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch typedef std::map<std::string, NamedChangeCallback> ObserverMap; 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PrefServiceSyncable* pref_service_; 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ObserverMap observers_; 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DISALLOW_COPY_AND_ASSIGN(SyncedPrefChangeRegistrar); 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}; 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif // CHROME_BROWSER_PREFS_SYNCED_PREF_CHANGE_REGISTRAR_H_ 58