Home | History | Annotate | Download | only in prefs
      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 
     11 PrefChangeRegistrar::PrefChangeRegistrar() : service_(NULL) {}
     12 
     13 PrefChangeRegistrar::~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 (at) chromium.org in case this happens.
     18   RemoveAll();
     19 }
     20 
     21 void PrefChangeRegistrar::Init(PrefService* service) {
     22   DCHECK(IsEmpty() || service_ == service);
     23   service_ = service;
     24 }
     25 
     26 void PrefChangeRegistrar::Add(const char* path,
     27                               const base::Closure& obs) {
     28   Add(path, base::Bind(&PrefChangeRegistrar::InvokeUnnamedCallback, obs));
     29 }
     30 
     31 void 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 
     43 void PrefChangeRegistrar::Remove(const char* path) {
     44   DCHECK(IsObserved(path));
     45 
     46   observers_.erase(path);
     47   service_->RemovePrefObserver(path, this);
     48 }
     49 
     50 void 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 
     59 bool PrefChangeRegistrar::IsEmpty() const {
     60   return observers_.empty();
     61 }
     62 
     63 bool PrefChangeRegistrar::IsObserved(const std::string& pref) {
     64   return observers_.find(pref) != observers_.end();
     65 }
     66 
     67 bool 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 
     78 void PrefChangeRegistrar::OnPreferenceChanged(PrefService* service,
     79                                               const std::string& pref) {
     80   if (IsObserved(pref))
     81     observers_[pref].Run(pref);
     82 }
     83 
     84 void PrefChangeRegistrar::InvokeUnnamedCallback(const base::Closure& callback,
     85                                                 const std::string& pref_name) {
     86   callback.Run();
     87 }
     88 
     89 PrefService* PrefChangeRegistrar::prefs() {
     90   return service_;
     91 }
     92 
     93 const PrefService* PrefChangeRegistrar::prefs() const {
     94   return service_;
     95 }
     96