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

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

Issue 257003007: Introduce a new framework for back-and-forth tracked/protected preferences migration. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comment nit 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
41 if (successful_sub_initializations_ == 2 && outer_->read_error_delegate_) { 38 if (successful_sub_initializations_ == 2 && outer_->read_error_delegate_) {
42 PersistentPrefStore::PrefReadError read_error = outer_->GetReadError(); 39 PersistentPrefStore::PrefReadError read_error = outer_->GetReadError();
43 if (read_error != PersistentPrefStore::PREF_READ_ERROR_NONE) 40 if (read_error != PersistentPrefStore::PREF_READ_ERROR_NONE)
44 outer_->read_error_delegate_->OnError(read_error); 41 outer_->read_error_delegate_->OnError(read_error);
45 } 42 }
46 43
47 FOR_EACH_OBSERVER( 44 FOR_EACH_OBSERVER(
48 PrefStore::Observer, 45 PrefStore::Observer,
49 outer_->observers_, 46 outer_->observers_,
50 OnInitializationCompleted(successful_sub_initializations_ == 2)); 47 OnInitializationCompleted(successful_sub_initializations_ == 2));
51 } 48 }
52 } 49 }
53 50
54 SegregatedPrefStore::SegregatedPrefStore( 51 SegregatedPrefStore::SegregatedPrefStore(
55 const scoped_refptr<PersistentPrefStore>& default_pref_store, 52 const scoped_refptr<PersistentPrefStore>& default_pref_store,
56 const scoped_refptr<PersistentPrefStore>& selected_pref_store, 53 const scoped_refptr<PersistentPrefStore>& selected_pref_store,
57 const std::set<std::string>& selected_pref_names, 54 const std::set<std::string>& selected_pref_names)
58 const base::Closure& on_initialization)
59 : default_pref_store_(default_pref_store), 55 : default_pref_store_(default_pref_store),
60 selected_pref_store_(selected_pref_store), 56 selected_pref_store_(selected_pref_store),
61 selected_preference_names_(selected_pref_names), 57 selected_preference_names_(selected_pref_names),
62 on_initialization_(on_initialization),
63 aggregating_observer_(this) { 58 aggregating_observer_(this) {
64
65 default_pref_store_->AddObserver(&aggregating_observer_); 59 default_pref_store_->AddObserver(&aggregating_observer_);
66 selected_pref_store_->AddObserver(&aggregating_observer_); 60 selected_pref_store_->AddObserver(&aggregating_observer_);
67 } 61 }
68 62
69 void SegregatedPrefStore::AddObserver(Observer* observer) { 63 void SegregatedPrefStore::AddObserver(Observer* observer) {
70 observers_.AddObserver(observer); 64 observers_.AddObserver(observer);
71 } 65 }
72 66
73 void SegregatedPrefStore::RemoveObserver(Observer* observer) { 67 void SegregatedPrefStore::RemoveObserver(Observer* observer) {
74 observers_.RemoveObserver(observer); 68 observers_.RemoveObserver(observer);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 if (read_error == PersistentPrefStore::PREF_READ_ERROR_NONE) { 115 if (read_error == PersistentPrefStore::PREF_READ_ERROR_NONE) {
122 read_error = selected_pref_store_->GetReadError(); 116 read_error = selected_pref_store_->GetReadError();
123 // Ignore NO_FILE from selected_pref_store_. 117 // Ignore NO_FILE from selected_pref_store_.
124 if (read_error == PersistentPrefStore::PREF_READ_ERROR_NO_FILE) 118 if (read_error == PersistentPrefStore::PREF_READ_ERROR_NO_FILE)
125 read_error = PersistentPrefStore::PREF_READ_ERROR_NONE; 119 read_error = PersistentPrefStore::PREF_READ_ERROR_NONE;
126 } 120 }
127 return read_error; 121 return read_error;
128 } 122 }
129 123
130 PersistentPrefStore::PrefReadError SegregatedPrefStore::ReadPrefs() { 124 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.
131 default_pref_store_->ReadPrefs(); 129 default_pref_store_->ReadPrefs();
132 selected_pref_store_->ReadPrefs(); 130 PersistentPrefStore::PrefReadError selected_store_read_error =
131 selected_pref_store_->ReadPrefs();
132 DCHECK_NE(PersistentPrefStore::PREF_READ_ERROR_ASYNCHRONOUS_TASK_INCOMPLETE,
133 selected_store_read_error);
133 134
134 return GetReadError(); 135 return GetReadError();
135 } 136 }
136 137
137 void SegregatedPrefStore::ReadPrefsAsync(ReadErrorDelegate* error_delegate) { 138 void SegregatedPrefStore::ReadPrefsAsync(ReadErrorDelegate* error_delegate) {
138 read_error_delegate_.reset(error_delegate); 139 read_error_delegate_.reset(error_delegate);
139 default_pref_store_->ReadPrefsAsync(NULL); 140 default_pref_store_->ReadPrefsAsync(NULL);
140 selected_pref_store_->ReadPrefsAsync(NULL); 141 selected_pref_store_->ReadPrefsAsync(NULL);
141 } 142 }
142 143
143 void SegregatedPrefStore::CommitPendingWrite() { 144 void SegregatedPrefStore::CommitPendingWrite() {
144 default_pref_store_->CommitPendingWrite(); 145 default_pref_store_->CommitPendingWrite();
145 selected_pref_store_->CommitPendingWrite(); 146 selected_pref_store_->CommitPendingWrite();
146 } 147 }
147 148
148 SegregatedPrefStore::~SegregatedPrefStore() { 149 SegregatedPrefStore::~SegregatedPrefStore() {
149 default_pref_store_->RemoveObserver(&aggregating_observer_); 150 default_pref_store_->RemoveObserver(&aggregating_observer_);
150 selected_pref_store_->RemoveObserver(&aggregating_observer_); 151 selected_pref_store_->RemoveObserver(&aggregating_observer_);
151 } 152 }
152 153
154 PersistentPrefStore* SegregatedPrefStore::StoreForKey(const std::string& key) {
155 return ContainsKey(selected_preference_names_, key) ? selected_pref_store_
156 : default_pref_store_;
157 }
158
153 const PersistentPrefStore* SegregatedPrefStore::StoreForKey( 159 const PersistentPrefStore* SegregatedPrefStore::StoreForKey(
154 const std::string& key) const { 160 const std::string& key) const {
155 if (ContainsKey(selected_preference_names_, key) || 161 return ContainsKey(selected_preference_names_, key) ? selected_pref_store_
156 selected_pref_store_->GetValue(key, NULL)) { 162 : default_pref_store_;
157 return selected_pref_store_.get();
158 }
159 return default_pref_store_.get();
160 } 163 }
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
« no previous file with comments | « chrome/browser/prefs/tracked/segregated_pref_store.h ('k') | chrome/browser/prefs/tracked/segregated_pref_store_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698