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) { |