1// Copyright (c) 2010 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 "base/prefs/pref_change_registrar.h" 6 7#include "base/bind.h" 8#include "base/logging.h" 9#include "base/prefs/pref_service.h" 10 11PrefChangeRegistrar::PrefChangeRegistrar() : service_(NULL) {} 12 13PrefChangeRegistrar::~PrefChangeRegistrar() { 14 // If you see an invalid memory access in this destructor, this 15 // PrefChangeRegistrar might be subscribed to an OffTheRecordProfileImpl that 16 // has been destroyed. This should not happen any more but be warned. 17 // Feel free to contact battre@chromium.org in case this happens. 18 RemoveAll(); 19} 20 21void PrefChangeRegistrar::Init(PrefService* service) { 22 DCHECK(IsEmpty() || service_ == service); 23 service_ = service; 24} 25 26void PrefChangeRegistrar::Add(const char* path, 27 const base::Closure& obs) { 28 Add(path, base::Bind(&PrefChangeRegistrar::InvokeUnnamedCallback, obs)); 29} 30 31void PrefChangeRegistrar::Add(const char* path, 32 const NamedChangeCallback& obs) { 33 if (!service_) { 34 NOTREACHED(); 35 return; 36 } 37 DCHECK(!IsObserved(path)) << "Already had this pref registered."; 38 39 service_->AddPrefObserver(path, this); 40 observers_[path] = obs; 41} 42 43void PrefChangeRegistrar::Remove(const char* path) { 44 DCHECK(IsObserved(path)); 45 46 observers_.erase(path); 47 service_->RemovePrefObserver(path, this); 48} 49 50void PrefChangeRegistrar::RemoveAll() { 51 for (ObserverMap::const_iterator it = observers_.begin(); 52 it != observers_.end(); ++it) { 53 service_->RemovePrefObserver(it->first.c_str(), this); 54 } 55 56 observers_.clear(); 57} 58 59bool PrefChangeRegistrar::IsEmpty() const { 60 return observers_.empty(); 61} 62 63bool PrefChangeRegistrar::IsObserved(const std::string& pref) { 64 return observers_.find(pref) != observers_.end(); 65} 66 67bool PrefChangeRegistrar::IsManaged() { 68 for (ObserverMap::const_iterator it = observers_.begin(); 69 it != observers_.end(); ++it) { 70 const PrefService::Preference* pref = 71 service_->FindPreference(it->first.c_str()); 72 if (pref && pref->IsManaged()) 73 return true; 74 } 75 return false; 76} 77 78void PrefChangeRegistrar::OnPreferenceChanged(PrefService* service, 79 const std::string& pref) { 80 if (IsObserved(pref)) 81 observers_[pref].Run(pref); 82} 83 84void PrefChangeRegistrar::InvokeUnnamedCallback(const base::Closure& callback, 85 const std::string& pref_name) { 86 callback.Run(); 87} 88 89PrefService* PrefChangeRegistrar::prefs() { 90 return service_; 91} 92 93const PrefService* PrefChangeRegistrar::prefs() const { 94 return service_; 95} 96