Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(299)

Unified Diff: chrome/browser/prefs/pref_notifier_impl.cc

Issue 11345008: Remove content::NotificationObserver dependency from most Prefs code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge to head for commit Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/prefs/pref_notifier_impl.h ('k') | chrome/browser/prefs/pref_notifier_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 a226685cc058faf37911b2eb5de50e6be1422b20..9bdf32221978b811a9608867921152df309f6b6a 100644
--- a/chrome/browser/prefs/pref_notifier_impl.cc
+++ b/chrome/browser/prefs/pref_notifier_impl.cc
@@ -7,9 +7,6 @@
#include "base/logging.h"
#include "base/stl_util.h"
#include "chrome/browser/prefs/pref_service.h"
-#include "chrome/common/chrome_notification_types.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_service.h"
PrefNotifierImpl::PrefNotifierImpl()
: pref_service_(NULL) {
@@ -25,45 +22,42 @@ 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) {
- NotificationObserverList::Iterator obs_iterator(*(it->second));
+ PrefObserverList::Iterator obs_iterator(*(it->second));
if (obs_iterator.GetNext()) {
LOG(WARNING) << "pref observer found at shutdown " << it->first;
}
}
+ // Same for initialization observers.
+ if (!init_observers_.empty())
+ LOG(WARNING) << "Init observer found at shutdown.";
+
STLDeleteContainerPairSecondPointers(pref_observers_.begin(),
pref_observers_.end());
pref_observers_.clear();
+ init_observers_.clear();
}
void PrefNotifierImpl::AddPrefObserver(const char* path,
- content::NotificationObserver* obs) {
+ PrefObserver* obs) {
// Get the pref observer list associated with the path.
- NotificationObserverList* observer_list = NULL;
+ PrefObserverList* observer_list = NULL;
const PrefObserverMap::iterator observer_iterator =
pref_observers_.find(path);
if (observer_iterator == pref_observers_.end()) {
- observer_list = new NotificationObserverList;
+ observer_list = new PrefObserverList;
pref_observers_[path] = observer_list;
} else {
observer_list = observer_iterator->second;
}
- // Verify that this observer doesn't already exist.
- NotificationObserverList::Iterator it(*observer_list);
- content::NotificationObserver* existing_obs;
- while ((existing_obs = it.GetNext()) != NULL) {
- DCHECK(existing_obs != obs) << path << " observer already registered";
- if (existing_obs == obs)
- return;
- }
-
- // Ok, safe to add the pref observer.
+ // Add the pref observer. ObserverList will DCHECK if it already is
+ // in the list.
observer_list->AddObserver(obs);
}
void PrefNotifierImpl::RemovePrefObserver(const char* path,
- content::NotificationObserver* obs) {
+ PrefObserver* obs) {
DCHECK(CalledOnValidThread());
const PrefObserverMap::iterator observer_iterator =
@@ -72,10 +66,14 @@ void PrefNotifierImpl::RemovePrefObserver(const char* path,
return;
}
- NotificationObserverList* observer_list = observer_iterator->second;
+ PrefObserverList* observer_list = observer_iterator->second;
observer_list->RemoveObserver(obs);
}
+void PrefNotifierImpl::AddInitObserver(base::Callback<void(bool)> obs) {
+ init_observers_.push_back(obs);
+}
+
void PrefNotifierImpl::OnPreferenceChanged(const std::string& path) {
FireObservers(path);
}
@@ -83,10 +81,17 @@ void PrefNotifierImpl::OnPreferenceChanged(const std::string& path) {
void PrefNotifierImpl::OnInitializationCompleted(bool succeeded) {
DCHECK(CalledOnValidThread());
- content::NotificationService::current()->Notify(
- chrome::NOTIFICATION_PREF_INITIALIZATION_COMPLETED,
- content::Source<PrefService>(pref_service_),
- content::Details<bool>(&succeeded));
+ // We must make a copy of init_observers_ and clear it before we run
+ // observers, or we can end up in this method re-entrantly before
+ // clearing the observers list.
+ PrefInitObserverList observers(init_observers_);
+ init_observers_.clear();
+
+ for (PrefInitObserverList::iterator it = observers.begin();
+ it != observers.end();
+ ++it) {
+ it->Run(succeeded);
+ }
}
void PrefNotifierImpl::FireObservers(const std::string& path) {
@@ -101,13 +106,9 @@ void PrefNotifierImpl::FireObservers(const std::string& path) {
if (observer_iterator == pref_observers_.end())
return;
- NotificationObserverList::Iterator it(*(observer_iterator->second));
- content::NotificationObserver* observer;
- while ((observer = it.GetNext()) != NULL) {
- observer->Observe(chrome::NOTIFICATION_PREF_CHANGED,
- content::Source<PrefService>(pref_service_),
- content::Details<const std::string>(&path));
- }
+ FOR_EACH_OBSERVER(PrefObserver,
+ *(observer_iterator->second),
+ OnPreferenceChanged(pref_service_, path));
}
void PrefNotifierImpl::SetPrefService(PrefService* pref_service) {
« no previous file with comments | « chrome/browser/prefs/pref_notifier_impl.h ('k') | chrome/browser/prefs/pref_notifier_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698