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

Side by Side Diff: chrome/browser/extensions/api/storage/storage_api.cc

Issue 175853002: Revert of Add a Restore() method to ValueStore and make StorageAPI use it (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 10 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/extensions/api/storage/storage_api.h" 5 #include "chrome/browser/extensions/api/storage/storage_api.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 } 66 }
67 67
68 void SettingsFunction::AsyncRunWithStorage(ValueStore* storage) { 68 void SettingsFunction::AsyncRunWithStorage(ValueStore* storage) {
69 bool success = RunWithStorage(storage); 69 bool success = RunWithStorage(storage);
70 BrowserThread::PostTask( 70 BrowserThread::PostTask(
71 BrowserThread::UI, 71 BrowserThread::UI,
72 FROM_HERE, 72 FROM_HERE,
73 base::Bind(&SettingsFunction::SendResponse, this, success)); 73 base::Bind(&SettingsFunction::SendResponse, this, success));
74 } 74 }
75 75
76 bool SettingsFunction::UseReadResult(ValueStore::ReadResult result, 76 bool SettingsFunction::UseReadResult(ValueStore::ReadResult read_result) {
77 ValueStore* storage) { 77 if (read_result->HasError()) {
78 if (result->HasError()) 78 error_ = read_result->error().message;
79 return HandleError(result->error(), storage); 79 return false;
80 }
80 81
81 base::DictionaryValue* dict = new base::DictionaryValue(); 82 base::DictionaryValue* result = new base::DictionaryValue();
82 dict->Swap(&result->settings()); 83 result->Swap(&read_result->settings());
83 SetResult(dict); 84 SetResult(result);
84 return true; 85 return true;
85 } 86 }
86 87
87 bool SettingsFunction::UseWriteResult(ValueStore::WriteResult result, 88 bool SettingsFunction::UseWriteResult(ValueStore::WriteResult result) {
88 ValueStore* storage) { 89 if (result->HasError()) {
89 if (result->HasError()) 90 error_ = result->error().message;
90 return HandleError(result->error(), storage); 91 return false;
92 }
91 93
92 if (!result->changes().empty()) { 94 if (!result->changes().empty()) {
93 observers_->Notify( 95 observers_->Notify(
94 &SettingsObserver::OnSettingsChanged, 96 &SettingsObserver::OnSettingsChanged,
95 extension_id(), 97 extension_id(),
96 settings_namespace_, 98 settings_namespace_,
97 ValueStoreChange::ToJson(result->changes())); 99 ValueStoreChange::ToJson(result->changes()));
98 } 100 }
99 101
100 return true; 102 return true;
101 } 103 }
102 104
103 bool SettingsFunction::HandleError(const ValueStore::Error& error,
104 ValueStore* storage) {
105 // If the method failed due to corruption, and we haven't tried to fix it, we
106 // can try to restore the storage and re-run it. Otherwise, the method has
107 // failed.
108 if (error.code == ValueStore::CORRUPTION && !tried_restoring_storage_) {
109 tried_restoring_storage_ = true;
110
111 // If the corruption is on a particular key, try to restore that key and
112 // re-run.
113 if (error.key.get() && storage->RestoreKey(*error.key))
114 return RunWithStorage(storage);
115
116 // If the full database is corrupted, try to restore the whole thing and
117 // re-run.
118 if (storage->Restore())
119 return RunWithStorage(storage);
120 }
121
122 error_ = error.message;
123 return false;
124 }
125
126 // Concrete settings functions 105 // Concrete settings functions
127 106
128 namespace { 107 namespace {
129 108
130 // Adds all StringValues from a ListValue to a vector of strings. 109 // Adds all StringValues from a ListValue to a vector of strings.
131 void AddAllStringValues(const base::ListValue& from, 110 void AddAllStringValues(const base::ListValue& from,
132 std::vector<std::string>* to) { 111 std::vector<std::string>* to) {
133 DCHECK(to->empty()); 112 DCHECK(to->empty());
134 std::string as_string; 113 std::string as_string;
135 for (base::ListValue::const_iterator it = from.begin(); 114 for (base::ListValue::const_iterator it = from.begin();
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 }; 154 };
176 155
177 } // namespace 156 } // namespace
178 157
179 bool StorageStorageAreaGetFunction::RunWithStorage(ValueStore* storage) { 158 bool StorageStorageAreaGetFunction::RunWithStorage(ValueStore* storage) {
180 base::Value* input = NULL; 159 base::Value* input = NULL;
181 EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &input)); 160 EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &input));
182 161
183 switch (input->GetType()) { 162 switch (input->GetType()) {
184 case base::Value::TYPE_NULL: 163 case base::Value::TYPE_NULL:
185 return UseReadResult(storage->Get(), storage); 164 return UseReadResult(storage->Get());
186 165
187 case base::Value::TYPE_STRING: { 166 case base::Value::TYPE_STRING: {
188 std::string as_string; 167 std::string as_string;
189 input->GetAsString(&as_string); 168 input->GetAsString(&as_string);
190 return UseReadResult(storage->Get(as_string), storage); 169 return UseReadResult(storage->Get(as_string));
191 } 170 }
192 171
193 case base::Value::TYPE_LIST: { 172 case base::Value::TYPE_LIST: {
194 std::vector<std::string> as_string_list; 173 std::vector<std::string> as_string_list;
195 AddAllStringValues(*static_cast<base::ListValue*>(input), 174 AddAllStringValues(*static_cast<base::ListValue*>(input),
196 &as_string_list); 175 &as_string_list);
197 return UseReadResult(storage->Get(as_string_list), storage); 176 return UseReadResult(storage->Get(as_string_list));
198 } 177 }
199 178
200 case base::Value::TYPE_DICTIONARY: { 179 case base::Value::TYPE_DICTIONARY: {
201 base::DictionaryValue* as_dict = 180 base::DictionaryValue* as_dict = static_cast<base::DictionaryValue*>(input );
202 static_cast<base::DictionaryValue*>(input);
203 ValueStore::ReadResult result = storage->Get(GetKeys(*as_dict)); 181 ValueStore::ReadResult result = storage->Get(GetKeys(*as_dict));
204 if (result->HasError()) { 182 if (result->HasError()) {
205 return UseReadResult(result.Pass(), storage); 183 return UseReadResult(result.Pass());
206 } 184 }
207 185
208 base::DictionaryValue* with_default_values = as_dict->DeepCopy(); 186 base::DictionaryValue* with_default_values = as_dict->DeepCopy();
209 with_default_values->MergeDictionary(&result->settings()); 187 with_default_values->MergeDictionary(&result->settings());
210 return UseReadResult( 188 return UseReadResult(
211 ValueStore::MakeReadResult(make_scoped_ptr(with_default_values)), 189 ValueStore::MakeReadResult(make_scoped_ptr(with_default_values)));
212 storage);
213 } 190 }
214 191
215 default: 192 default:
216 EXTENSION_FUNCTION_VALIDATE(false); 193 EXTENSION_FUNCTION_VALIDATE(false);
217 return false; 194 return false;
218 } 195 }
219 } 196 }
220 197
221 bool StorageStorageAreaGetBytesInUseFunction::RunWithStorage( 198 bool StorageStorageAreaGetBytesInUseFunction::RunWithStorage(
222 ValueStore* storage) { 199 ValueStore* storage) {
(...skipping 27 matching lines...) Expand all
250 return false; 227 return false;
251 } 228 }
252 229
253 SetResult(new base::FundamentalValue(static_cast<int>(bytes_in_use))); 230 SetResult(new base::FundamentalValue(static_cast<int>(bytes_in_use)));
254 return true; 231 return true;
255 } 232 }
256 233
257 bool StorageStorageAreaSetFunction::RunWithStorage(ValueStore* storage) { 234 bool StorageStorageAreaSetFunction::RunWithStorage(ValueStore* storage) {
258 base::DictionaryValue* input = NULL; 235 base::DictionaryValue* input = NULL;
259 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &input)); 236 EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &input));
260 return UseWriteResult(storage->Set(ValueStore::DEFAULTS, *input), storage); 237 return UseWriteResult(storage->Set(ValueStore::DEFAULTS, *input));
261 } 238 }
262 239
263 void StorageStorageAreaSetFunction::GetQuotaLimitHeuristics( 240 void StorageStorageAreaSetFunction::GetQuotaLimitHeuristics(
264 QuotaLimitHeuristics* heuristics) const { 241 QuotaLimitHeuristics* heuristics) const {
265 GetModificationQuotaLimitHeuristics(heuristics); 242 GetModificationQuotaLimitHeuristics(heuristics);
266 } 243 }
267 244
268 bool StorageStorageAreaRemoveFunction::RunWithStorage(ValueStore* storage) { 245 bool StorageStorageAreaRemoveFunction::RunWithStorage(ValueStore* storage) {
269 base::Value* input = NULL; 246 base::Value* input = NULL;
270 EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &input)); 247 EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &input));
271 248
272 switch (input->GetType()) { 249 switch (input->GetType()) {
273 case base::Value::TYPE_STRING: { 250 case base::Value::TYPE_STRING: {
274 std::string as_string; 251 std::string as_string;
275 input->GetAsString(&as_string); 252 input->GetAsString(&as_string);
276 return UseWriteResult(storage->Remove(as_string), storage); 253 return UseWriteResult(storage->Remove(as_string));
277 } 254 }
278 255
279 case base::Value::TYPE_LIST: { 256 case base::Value::TYPE_LIST: {
280 std::vector<std::string> as_string_list; 257 std::vector<std::string> as_string_list;
281 AddAllStringValues(*static_cast<base::ListValue*>(input), 258 AddAllStringValues(*static_cast<base::ListValue*>(input),
282 &as_string_list); 259 &as_string_list);
283 return UseWriteResult(storage->Remove(as_string_list), storage); 260 return UseWriteResult(storage->Remove(as_string_list));
284 } 261 }
285 262
286 default: 263 default:
287 EXTENSION_FUNCTION_VALIDATE(false); 264 EXTENSION_FUNCTION_VALIDATE(false);
288 return false; 265 return false;
289 }; 266 };
290 } 267 }
291 268
292 void StorageStorageAreaRemoveFunction::GetQuotaLimitHeuristics( 269 void StorageStorageAreaRemoveFunction::GetQuotaLimitHeuristics(
293 QuotaLimitHeuristics* heuristics) const { 270 QuotaLimitHeuristics* heuristics) const {
294 GetModificationQuotaLimitHeuristics(heuristics); 271 GetModificationQuotaLimitHeuristics(heuristics);
295 } 272 }
296 273
297 bool StorageStorageAreaClearFunction::RunWithStorage(ValueStore* storage) { 274 bool StorageStorageAreaClearFunction::RunWithStorage(ValueStore* storage) {
298 return UseWriteResult(storage->Clear(), storage); 275 return UseWriteResult(storage->Clear());
299 } 276 }
300 277
301 void StorageStorageAreaClearFunction::GetQuotaLimitHeuristics( 278 void StorageStorageAreaClearFunction::GetQuotaLimitHeuristics(
302 QuotaLimitHeuristics* heuristics) const { 279 QuotaLimitHeuristics* heuristics) const {
303 GetModificationQuotaLimitHeuristics(heuristics); 280 GetModificationQuotaLimitHeuristics(heuristics);
304 } 281 }
305 282
306 } // namespace extensions 283 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/storage/storage_api.h ('k') | chrome/browser/extensions/api/storage/storage_api_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698