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

Side by Side Diff: trunk/src/chrome/browser/prefs/tracked/segregated_pref_store.cc

Issue 273243002: Revert 269415 "Introduce a new framework for back-and-forth trac..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 6 years, 7 months 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/prefs/tracked/segregated_pref_store.h" 5 #include "chrome/browser/prefs/tracked/segregated_pref_store.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "base/values.h" 9 #include "base/values.h"
10 10
(...skipping 17 matching lines...) Expand all
28 void SegregatedPrefStore::AggregatingObserver::OnInitializationCompleted( 28 void SegregatedPrefStore::AggregatingObserver::OnInitializationCompleted(
29 bool succeeded) { 29 bool succeeded) {
30 if (succeeded) 30 if (succeeded)
31 ++successful_sub_initializations_; 31 ++successful_sub_initializations_;
32 else 32 else
33 ++failed_sub_initializations_; 33 ++failed_sub_initializations_;
34 34
35 DCHECK_LE(failed_sub_initializations_ + successful_sub_initializations_, 2); 35 DCHECK_LE(failed_sub_initializations_ + successful_sub_initializations_, 2);
36 36
37 if (failed_sub_initializations_ + successful_sub_initializations_ == 2) { 37 if (failed_sub_initializations_ + successful_sub_initializations_ == 2) {
38 if (!outer_->on_initialization_.is_null())
39 outer_->on_initialization_.Run();
40
38 if (successful_sub_initializations_ == 2 && outer_->read_error_delegate_) { 41 if (successful_sub_initializations_ == 2 && outer_->read_error_delegate_) {
39 PersistentPrefStore::PrefReadError read_error = outer_->GetReadError(); 42 PersistentPrefStore::PrefReadError read_error = outer_->GetReadError();
40 if (read_error != PersistentPrefStore::PREF_READ_ERROR_NONE) 43 if (read_error != PersistentPrefStore::PREF_READ_ERROR_NONE)
41 outer_->read_error_delegate_->OnError(read_error); 44 outer_->read_error_delegate_->OnError(read_error);
42 } 45 }
43 46
44 FOR_EACH_OBSERVER( 47 FOR_EACH_OBSERVER(
45 PrefStore::Observer, 48 PrefStore::Observer,
46 outer_->observers_, 49 outer_->observers_,
47 OnInitializationCompleted(successful_sub_initializations_ == 2)); 50 OnInitializationCompleted(successful_sub_initializations_ == 2));
48 } 51 }
49 } 52 }
50 53
51 SegregatedPrefStore::SegregatedPrefStore( 54 SegregatedPrefStore::SegregatedPrefStore(
52 const scoped_refptr<PersistentPrefStore>& default_pref_store, 55 const scoped_refptr<PersistentPrefStore>& default_pref_store,
53 const scoped_refptr<PersistentPrefStore>& selected_pref_store, 56 const scoped_refptr<PersistentPrefStore>& selected_pref_store,
54 const std::set<std::string>& selected_pref_names) 57 const std::set<std::string>& selected_pref_names,
58 const base::Closure& on_initialization)
55 : default_pref_store_(default_pref_store), 59 : default_pref_store_(default_pref_store),
56 selected_pref_store_(selected_pref_store), 60 selected_pref_store_(selected_pref_store),
57 selected_preference_names_(selected_pref_names), 61 selected_preference_names_(selected_pref_names),
62 on_initialization_(on_initialization),
58 aggregating_observer_(this) { 63 aggregating_observer_(this) {
64
59 default_pref_store_->AddObserver(&aggregating_observer_); 65 default_pref_store_->AddObserver(&aggregating_observer_);
60 selected_pref_store_->AddObserver(&aggregating_observer_); 66 selected_pref_store_->AddObserver(&aggregating_observer_);
61 } 67 }
62 68
63 void SegregatedPrefStore::AddObserver(Observer* observer) { 69 void SegregatedPrefStore::AddObserver(Observer* observer) {
64 observers_.AddObserver(observer); 70 observers_.AddObserver(observer);
65 } 71 }
66 72
67 void SegregatedPrefStore::RemoveObserver(Observer* observer) { 73 void SegregatedPrefStore::RemoveObserver(Observer* observer) {
68 observers_.RemoveObserver(observer); 74 observers_.RemoveObserver(observer);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 if (read_error == PersistentPrefStore::PREF_READ_ERROR_NONE) { 121 if (read_error == PersistentPrefStore::PREF_READ_ERROR_NONE) {
116 read_error = selected_pref_store_->GetReadError(); 122 read_error = selected_pref_store_->GetReadError();
117 // Ignore NO_FILE from selected_pref_store_. 123 // Ignore NO_FILE from selected_pref_store_.
118 if (read_error == PersistentPrefStore::PREF_READ_ERROR_NO_FILE) 124 if (read_error == PersistentPrefStore::PREF_READ_ERROR_NO_FILE)
119 read_error = PersistentPrefStore::PREF_READ_ERROR_NONE; 125 read_error = PersistentPrefStore::PREF_READ_ERROR_NONE;
120 } 126 }
121 return read_error; 127 return read_error;
122 } 128 }
123 129
124 PersistentPrefStore::PrefReadError SegregatedPrefStore::ReadPrefs() { 130 PersistentPrefStore::PrefReadError SegregatedPrefStore::ReadPrefs() {
125 // Note: Both of these stores own PrefFilters which makes ReadPrefs
126 // asynchronous. This is okay in this case as only the first call will be
127 // truly asynchronous, the second call will then unblock the migration in
128 // TrackedPreferencesMigrator and complete synchronously.
129 default_pref_store_->ReadPrefs(); 131 default_pref_store_->ReadPrefs();
130 PersistentPrefStore::PrefReadError selected_store_read_error = 132 selected_pref_store_->ReadPrefs();
131 selected_pref_store_->ReadPrefs();
132 DCHECK_NE(PersistentPrefStore::PREF_READ_ERROR_ASYNCHRONOUS_TASK_INCOMPLETE,
133 selected_store_read_error);
134 133
135 return GetReadError(); 134 return GetReadError();
136 } 135 }
137 136
138 void SegregatedPrefStore::ReadPrefsAsync(ReadErrorDelegate* error_delegate) { 137 void SegregatedPrefStore::ReadPrefsAsync(ReadErrorDelegate* error_delegate) {
139 read_error_delegate_.reset(error_delegate); 138 read_error_delegate_.reset(error_delegate);
140 default_pref_store_->ReadPrefsAsync(NULL); 139 default_pref_store_->ReadPrefsAsync(NULL);
141 selected_pref_store_->ReadPrefsAsync(NULL); 140 selected_pref_store_->ReadPrefsAsync(NULL);
142 } 141 }
143 142
144 void SegregatedPrefStore::CommitPendingWrite() { 143 void SegregatedPrefStore::CommitPendingWrite() {
145 default_pref_store_->CommitPendingWrite(); 144 default_pref_store_->CommitPendingWrite();
146 selected_pref_store_->CommitPendingWrite(); 145 selected_pref_store_->CommitPendingWrite();
147 } 146 }
148 147
149 SegregatedPrefStore::~SegregatedPrefStore() { 148 SegregatedPrefStore::~SegregatedPrefStore() {
150 default_pref_store_->RemoveObserver(&aggregating_observer_); 149 default_pref_store_->RemoveObserver(&aggregating_observer_);
151 selected_pref_store_->RemoveObserver(&aggregating_observer_); 150 selected_pref_store_->RemoveObserver(&aggregating_observer_);
152 } 151 }
153 152
154 PersistentPrefStore* SegregatedPrefStore::StoreForKey(const std::string& key) {
155 return ContainsKey(selected_preference_names_, key) ? selected_pref_store_
156 : default_pref_store_;
157 }
158
159 const PersistentPrefStore* SegregatedPrefStore::StoreForKey( 153 const PersistentPrefStore* SegregatedPrefStore::StoreForKey(
160 const std::string& key) const { 154 const std::string& key) const {
161 return ContainsKey(selected_preference_names_, key) ? selected_pref_store_ 155 if (ContainsKey(selected_preference_names_, key) ||
162 : default_pref_store_; 156 selected_pref_store_->GetValue(key, NULL)) {
157 return selected_pref_store_.get();
158 }
159 return default_pref_store_.get();
163 } 160 }
161
162 PersistentPrefStore* SegregatedPrefStore::StoreForKey(const std::string& key) {
163 if (ContainsKey(selected_preference_names_, key))
164 return selected_pref_store_.get();
165
166 // Check if this unselected value was previously selected. If so, migrate it
167 // back to the unselected store.
168 // It's hard to do this in a single pass at startup because PrefStore does not
169 // permit us to enumerate its contents.
170 const base::Value* value = NULL;
171 if (selected_pref_store_->GetValue(key, &value)) {
172 default_pref_store_->SetValue(key, value->DeepCopy());
173 // Commit |default_pref_store_| to guarantee that the migrated value is
174 // flushed to disk before the removal from |selected_pref_store_| is
175 // eventually flushed to disk.
176 default_pref_store_->CommitPendingWrite();
177
178 value = NULL;
179 selected_pref_store_->RemoveValue(key);
180 }
181
182 return default_pref_store_.get();
183 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698