13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be
33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file.
43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_change_registrar.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/logging.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickPrefChangeRegistrar::PrefChangeRegistrar() : service_(NULL) {}
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickPrefChangeRegistrar::~PrefChangeRegistrar() {
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // If you see an invalid memory access in this destructor, this
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // PrefChangeRegistrar might be subscribed to an OffTheRecordProfileImpl that
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // has been destroyed. This should not happen any more but be warned.
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Feel free to contact battre@chromium.org in case this happens.
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  RemoveAll();
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid PrefChangeRegistrar::Init(PrefService* service) {
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  DCHECK(IsEmpty() || service_ == service);
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  service_ = service;
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid PrefChangeRegistrar::Add(const char* path, NotificationObserver* obs) {
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!service_) {
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    NOTREACHED();
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ObserverRegistration registration(path, obs);
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (observers_.find(registration) != observers_.end()) {
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    NOTREACHED();
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  observers_.insert(registration);
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  service_->AddPrefObserver(path, obs);
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid PrefChangeRegistrar::Remove(const char* path, NotificationObserver* obs) {
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!service_) {
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    NOTREACHED();
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ObserverRegistration registration(path, obs);
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::set<ObserverRegistration>::iterator it =
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick       observers_.find(registration);
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (it == observers_.end()) {
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    NOTREACHED();
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  service_->RemovePrefObserver(it->first.c_str(), it->second);
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  observers_.erase(it);
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid PrefChangeRegistrar::RemoveAll() {
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (service_) {
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    for (std::set<ObserverRegistration>::const_iterator it = observers_.begin();
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick         it != observers_.end(); ++it) {
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      service_->RemovePrefObserver(it->first.c_str(), it->second);
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    observers_.clear();
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool PrefChangeRegistrar::IsEmpty() const {
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return observers_.empty();
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
68