| // 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. |
| |
| #include "base/prefs/public/pref_change_registrar.h" |
| |
| #include "base/bind.h" |
| #include "base/logging.h" |
| #include "base/prefs/public/pref_service_base.h" |
| |
| PrefChangeRegistrar::PrefChangeRegistrar() : service_(NULL) {} |
| |
| PrefChangeRegistrar::~PrefChangeRegistrar() { |
| // If you see an invalid memory access in this destructor, this |
| // PrefChangeRegistrar might be subscribed to an OffTheRecordProfileImpl that |
| // has been destroyed. This should not happen any more but be warned. |
| // Feel free to contact battre@chromium.org in case this happens. |
| RemoveAll(); |
| } |
| |
| void PrefChangeRegistrar::Init(PrefServiceBase* service) { |
| DCHECK(IsEmpty() || service_ == service); |
| service_ = service; |
| } |
| |
| void PrefChangeRegistrar::Add(const char* path, |
| const base::Closure& obs) { |
| Add(path, base::Bind(&PrefChangeRegistrar::InvokeUnnamedCallback, obs)); |
| } |
| |
| void PrefChangeRegistrar::Add(const char* path, |
| const NamedChangeCallback& obs) { |
| if (!service_) { |
| NOTREACHED(); |
| return; |
| } |
| DCHECK(!IsObserved(path)) << "Already had this pref registered."; |
| |
| service_->AddPrefObserver(path, this); |
| observers_[path] = obs; |
| } |
| |
| void PrefChangeRegistrar::Remove(const char* path) { |
| DCHECK(IsObserved(path)); |
| |
| observers_.erase(path); |
| service_->RemovePrefObserver(path, this); |
| } |
| |
| void PrefChangeRegistrar::RemoveAll() { |
| for (ObserverMap::const_iterator it = observers_.begin(); |
| it != observers_.end(); ++it) { |
| service_->RemovePrefObserver(it->first.c_str(), this); |
| } |
| |
| observers_.clear(); |
| } |
| |
| bool PrefChangeRegistrar::IsEmpty() const { |
| return observers_.empty(); |
| } |
| |
| bool PrefChangeRegistrar::IsObserved(const std::string& pref) { |
| return observers_.find(pref) != observers_.end(); |
| } |
| |
| bool PrefChangeRegistrar::IsManaged() { |
| for (ObserverMap::const_iterator it = observers_.begin(); |
| it != observers_.end(); ++it) { |
| const PrefServiceBase::Preference* pref = |
| service_->FindPreference(it->first.c_str()); |
| if (pref && pref->IsManaged()) |
| return true; |
| } |
| return false; |
| } |
| |
| void PrefChangeRegistrar::OnPreferenceChanged(PrefServiceBase* service, |
| const std::string& pref) { |
| if (IsObserved(pref)) |
| observers_[pref].Run(pref); |
| } |
| |
| void PrefChangeRegistrar::InvokeUnnamedCallback(const base::Closure& callback, |
| const std::string& pref_name) { |
| callback.Run(); |
| } |
| |
| PrefServiceBase* PrefChangeRegistrar::prefs() { |
| return service_; |
| } |