Chromium Code Reviews| Index: chrome/browser/prefs/pref_model_associator.cc |
| diff --git a/chrome/browser/prefs/pref_model_associator.cc b/chrome/browser/prefs/pref_model_associator.cc |
| index 42cd194e9cce8f3ae20c9cb004acfa917ea5fd98..5fb665d0a0f306dcb738a4f0a9f4ed6c79759338 100644 |
| --- a/chrome/browser/prefs/pref_model_associator.cc |
| +++ b/chrome/browser/prefs/pref_model_associator.cc |
| @@ -10,6 +10,7 @@ |
| #include "base/location.h" |
| #include "base/logging.h" |
| #include "base/prefs/pref_service.h" |
| +#include "base/stl_util.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/values.h" |
| #include "chrome/browser/chrome_notification_types.h" |
| @@ -61,6 +62,10 @@ PrefModelAssociator::PrefModelAssociator(syncer::ModelType type) |
| PrefModelAssociator::~PrefModelAssociator() { |
| DCHECK(CalledOnValidThread()); |
| pref_service_ = NULL; |
| + |
| + STLDeleteContainerPairSecondPointers(synced_pref_observers_.begin(), |
| + synced_pref_observers_.end()); |
| + synced_pref_observers_.clear(); |
| } |
| void PrefModelAssociator::InitPrefAndAssociate( |
| @@ -395,6 +400,8 @@ syncer::SyncError PrefModelAssociator::ProcessSyncChanges( |
| // policy controlled. |
| pref_service_->Set(pref_name, *value); |
| + NotifySyncedPrefObservers(name, true); |
|
battre
2013/08/05 17:17:26
nit: true /*from_sync*/
Ken Rockot(use gerrit already)
2013/08/06 20:18:32
Done.
|
| + |
| // Keep track of any newly synced preferences. |
| if (iter->change_type() == syncer::SyncChange::ACTION_ADD) { |
| synced_preferences_.insert(name); |
| @@ -422,6 +429,26 @@ bool PrefModelAssociator::IsPrefSynced(const std::string& name) const { |
| return synced_preferences_.find(name) != synced_preferences_.end(); |
| } |
| +void PrefModelAssociator::AddSyncedPrefObserver(const std::string& name, |
| + SyncedPrefObserver* observer) { |
| + SyncedPrefObserverList* observers = synced_pref_observers_[name]; |
| + if (observers == NULL) { |
| + observers = new SyncedPrefObserverList; |
| + synced_pref_observers_[name] = observers; |
| + } |
| + observers->AddObserver(observer); |
| +} |
| + |
| +void PrefModelAssociator::RemoveSyncedPrefObserver(const std::string& name, |
| + SyncedPrefObserver* observer) { |
| + SyncedPrefObserverMap::iterator observer_iter = |
| + synced_pref_observers_.find(name); |
| + if (observer_iter == synced_pref_observers_.end()) |
| + return; |
| + SyncedPrefObserverList* observers = observer_iter->second; |
| + observers->RemoveObserver(observer); |
| +} |
| + |
| std::set<std::string> PrefModelAssociator::registered_preferences() const { |
| return registered_preferences_; |
| } |
| @@ -463,6 +490,8 @@ void PrefModelAssociator::ProcessPrefChange(const std::string& name) { |
| base::AutoReset<bool> processing_changes(&processing_syncer_changes_, true); |
| + NotifySyncedPrefObservers(name, false); |
|
battre
2013/08/05 17:17:26
nit: true /*from_false*/
battre
2013/08/06 15:54:39
I think this is a bug: You notify the observers he
Ken Rockot(use gerrit already)
2013/08/06 16:27:46
The pref has its new value at this point. This met
Ken Rockot(use gerrit already)
2013/08/06 20:18:32
Done.
|
| + |
| if (synced_preferences_.count(name) == 0) { |
| // Not in synced_preferences_ means no synced data. InitPrefAndAssociate(..) |
| // will determine if we care about its data (e.g. if it has a default value |
| @@ -489,3 +518,14 @@ void PrefModelAssociator::SetPrefService(PrefServiceSyncable* pref_service) { |
| DCHECK(pref_service_ == NULL); |
| pref_service_ = pref_service; |
| } |
| + |
| +void PrefModelAssociator::NotifySyncedPrefObservers(const std::string& path, |
| + bool from_sync) { |
|
battre
2013/08/06 15:54:39
nit: align parameters.
Ken Rockot(use gerrit already)
2013/08/06 20:18:32
Done.
|
| + SyncedPrefObserverMap::iterator observer_iter = |
| + synced_pref_observers_.find(path); |
| + if (observer_iter == synced_pref_observers_.end()) |
| + return; |
| + SyncedPrefObserverList* observers = observer_iter->second; |
| + FOR_EACH_OBSERVER(SyncedPrefObserver, *observers, |
| + OnSyncedPrefChanged(path, from_sync)); |
| +} |