1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/prefs/synced_pref_change_registrar.h" 6 7#include "base/bind.h" 8 9namespace { 10 11void InvokeUnnamedCallback( 12 const SyncedPrefChangeRegistrar::ChangeCallback& callback, 13 const std::string& path, 14 bool from_sync) { 15 callback.Run(from_sync); 16} 17 18} // namespace 19 20SyncedPrefChangeRegistrar::SyncedPrefChangeRegistrar( 21 PrefServiceSyncable* pref_service) { 22 pref_service_ = pref_service; 23} 24 25SyncedPrefChangeRegistrar::~SyncedPrefChangeRegistrar() { 26 RemoveAll(); 27} 28 29void SyncedPrefChangeRegistrar::Add(const char *path, 30 const ChangeCallback& callback) { 31 Add(path, base::Bind(InvokeUnnamedCallback, callback)); 32} 33 34void SyncedPrefChangeRegistrar::Add(const char *path, 35 const NamedChangeCallback& callback) { 36 DCHECK(!IsObserved(path)); 37 observers_[path] = callback; 38 pref_service_->AddSyncedPrefObserver(path, this); 39} 40 41void SyncedPrefChangeRegistrar::Remove(const char *path) { 42 observers_.erase(path); 43 pref_service_->RemoveSyncedPrefObserver(path, this); 44} 45 46void SyncedPrefChangeRegistrar::RemoveAll() { 47 for (ObserverMap::iterator iter = observers_.begin(); 48 iter != observers_.end(); ++iter) { 49 pref_service_->RemoveSyncedPrefObserver(iter->first, this); 50 } 51 observers_.clear(); 52} 53 54bool SyncedPrefChangeRegistrar::IsObserved(const char* path) const { 55 return observers_.find(path) != observers_.end(); 56} 57 58void SyncedPrefChangeRegistrar::OnSyncedPrefChanged(const std::string& path, 59 bool from_sync) { 60 if (pref_service_->IsManagedPreference(path.c_str())) 61 return; 62 ObserverMap::const_iterator iter = observers_.find(path); 63 if (iter == observers_.end()) 64 return; 65 iter->second.Run(path, from_sync); 66} 67