Index: chrome/browser/prefs/pref_notifier_impl.cc |
diff --git a/chrome/browser/prefs/pref_notifier_impl.cc b/chrome/browser/prefs/pref_notifier_impl.cc |
index 9bdf32221978b811a9608867921152df309f6b6a..5df6237a99210d7544a6cc840a7077479232e727 100644 |
--- a/chrome/browser/prefs/pref_notifier_impl.cc |
+++ b/chrome/browser/prefs/pref_notifier_impl.cc |
@@ -4,6 +4,7 @@ |
#include "chrome/browser/prefs/pref_notifier_impl.h" |
+#include "base/bind.h" |
#include "base/logging.h" |
#include "base/stl_util.h" |
#include "chrome/browser/prefs/pref_service.h" |
@@ -22,8 +23,7 @@ PrefNotifierImpl::~PrefNotifierImpl() { |
// Verify that there are no pref observers when we shut down. |
for (PrefObserverMap::iterator it = pref_observers_.begin(); |
it != pref_observers_.end(); ++it) { |
- PrefObserverList::Iterator obs_iterator(*(it->second)); |
- if (obs_iterator.GetNext()) { |
+ if (!it->second->empty()) { |
LOG(WARNING) << "pref observer found at shutdown " << it->first; |
} |
} |
@@ -39,7 +39,7 @@ PrefNotifierImpl::~PrefNotifierImpl() { |
} |
void PrefNotifierImpl::AddPrefObserver(const char* path, |
- PrefObserver* obs) { |
+ const base::Closure& obs) { |
// Get the pref observer list associated with the path. |
PrefObserverList* observer_list = NULL; |
const PrefObserverMap::iterator observer_iterator = |
@@ -51,13 +51,25 @@ void PrefNotifierImpl::AddPrefObserver(const char* path, |
observer_list = observer_iterator->second; |
} |
- // Add the pref observer. ObserverList will DCHECK if it already is |
- // in the list. |
- observer_list->AddObserver(obs); |
+ // Add the pref observer. |
+ // TODO(joi): DO NOT COMMIT must DCHECK if already in list |
+ observer_list->push_back(obs); |
} |
+class SameObserverPredicate { |
+ public: |
+ SameObserverPredicate(const base::Closure& observer) : obs_(observer) {} |
+ |
+ bool operator ()(const base::Closure& other) { |
+ return obs_.Equals(other); |
+ } |
+ |
+ private: |
+ const base::Closure& obs_; |
+}; |
+ |
void PrefNotifierImpl::RemovePrefObserver(const char* path, |
- PrefObserver* obs) { |
+ const base::Closure& obs) { |
DCHECK(CalledOnValidThread()); |
const PrefObserverMap::iterator observer_iterator = |
@@ -67,7 +79,10 @@ void PrefNotifierImpl::RemovePrefObserver(const char* path, |
} |
PrefObserverList* observer_list = observer_iterator->second; |
- observer_list->RemoveObserver(obs); |
+ // TODO(joi): DO NOT COMMIT, DCHECK if not found. |
+ observer_list->erase( |
+ std::find_if(observer_list->begin(), observer_list->end(), |
+ SameObserverPredicate(obs))); |
} |
void PrefNotifierImpl::AddInitObserver(base::Callback<void(bool)> obs) { |
@@ -106,9 +121,11 @@ void PrefNotifierImpl::FireObservers(const std::string& path) { |
if (observer_iterator == pref_observers_.end()) |
return; |
- FOR_EACH_OBSERVER(PrefObserver, |
- *(observer_iterator->second), |
- OnPreferenceChanged(pref_service_, path)); |
+ for (PrefObserverList::iterator it = observer_iterator->second->begin(); |
+ it != observer_iterator->second->end(); |
+ ++it) { |
+ it->Run(); |
+ } |
} |
void PrefNotifierImpl::SetPrefService(PrefService* pref_service) { |