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