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 "chrome/browser/prefs/pref_change_registrar.h"
      6 
      7 #include "base/logging.h"
      8 #include "chrome/browser/prefs/pref_service.h"
      9 
     10 PrefChangeRegistrar::PrefChangeRegistrar() : service_(NULL) {}
     11 
     12 PrefChangeRegistrar::~PrefChangeRegistrar() {
     13   // If you see an invalid memory access in this destructor, this
     14   // PrefChangeRegistrar might be subscribed to an OffTheRecordProfileImpl that
     15   // has been destroyed. This should not happen any more but be warned.
     16   // Feel free to contact battre (at) chromium.org in case this happens.
     17   RemoveAll();
     18 }
     19 
     20 void PrefChangeRegistrar::Init(PrefService* service) {
     21   DCHECK(IsEmpty() || service_ == service);
     22   service_ = service;
     23 }
     24 
     25 void PrefChangeRegistrar::Add(const char* path, NotificationObserver* obs) {
     26   if (!service_) {
     27     NOTREACHED();
     28     return;
     29   }
     30   ObserverRegistration registration(path, obs);
     31   if (observers_.find(registration) != observers_.end()) {
     32     NOTREACHED();
     33     return;
     34   }
     35   observers_.insert(registration);
     36   service_->AddPrefObserver(path, obs);
     37 }
     38 
     39 void PrefChangeRegistrar::Remove(const char* path, NotificationObserver* obs) {
     40   if (!service_) {
     41     NOTREACHED();
     42     return;
     43   }
     44   ObserverRegistration registration(path, obs);
     45   std::set<ObserverRegistration>::iterator it =
     46        observers_.find(registration);
     47   if (it == observers_.end()) {
     48     NOTREACHED();
     49     return;
     50   }
     51   service_->RemovePrefObserver(it->first.c_str(), it->second);
     52   observers_.erase(it);
     53 }
     54 
     55 void PrefChangeRegistrar::RemoveAll() {
     56   if (service_) {
     57     for (std::set<ObserverRegistration>::const_iterator it = observers_.begin();
     58          it != observers_.end(); ++it) {
     59       service_->RemovePrefObserver(it->first.c_str(), it->second);
     60     }
     61     observers_.clear();
     62   }
     63 }
     64 
     65 bool PrefChangeRegistrar::IsEmpty() const {
     66   return observers_.empty();
     67 }
     68