Chromium Code Reviews| Index: base/prefs/json_pref_store.cc |
| diff --git a/base/prefs/json_pref_store.cc b/base/prefs/json_pref_store.cc |
| index e230407043aea5ebc29056618ece54571e274b9c..9337df6ac2b53d40816f1b46f147158b4963933c 100644 |
| --- a/base/prefs/json_pref_store.cc |
| +++ b/base/prefs/json_pref_store.cc |
| @@ -177,6 +177,10 @@ void JsonPrefStore::AddObserver(PrefStore::Observer* observer) { |
| void JsonPrefStore::RemoveObserver(PrefStore::Observer* observer) { |
| observers_.RemoveObserver(observer); |
| + ScopedVector<PrefStore::Observer>::iterator ownership = |
| + std::find(owned_observers_.begin(), owned_observers_.end(), observer); |
|
gab
2013/11/27 23:43:27
When would you want to remove an owned observer? I
|
| + if (ownership != owned_observers_.end()) |
| + owned_observers_.erase(ownership); |
| } |
| bool JsonPrefStore::HasObservers() const { |
| @@ -187,6 +191,11 @@ bool JsonPrefStore::IsInitializationComplete() const { |
| return initialized_; |
| } |
| +void JsonPrefStore::AddOwnedObserver(scoped_ptr<PrefStore::Observer> observer) { |
| + observers_.AddObserver(observer.get()); |
| + owned_observers_.push_back(observer.release()); |
| +} |
| + |
| bool JsonPrefStore::GetMutableValue(const std::string& key, |
| base::Value** result) { |
| return prefs_->Get(key, result); |
| @@ -321,6 +330,12 @@ void JsonPrefStore::OnFileRead(base::Value* value_owned, |
| JsonPrefStore::~JsonPrefStore() { |
| CommitPendingWrite(); |
| + for (ScopedVector<PrefStore::Observer>::iterator it = |
| + owned_observers_.begin(); |
| + it != owned_observers_.end(); |
| + ++it) { |
| + RemoveObserver(*it); |
|
gab
2013/11/27 23:43:27
This is operating on owned_observers_ while iterat
robertshield
2013/11/28 02:54:26
doesn't this call owned_observers_.erase() invalid
erikwright (departed)
2013/11/28 17:48:07
You're both right, it's a mistake that this affect
|
| + } |
| } |
| bool JsonPrefStore::SerializeData(std::string* output) { |