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

Side by Side Diff: content/browser/indexed_db/indexed_db_factory.cc

Issue 237143006: Make iterating over a corrupted IndexedDB fail. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 8 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) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 "content/browser/indexed_db/indexed_db_factory.h" 5 #include "content/browser/indexed_db/indexed_db_factory.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "base/time/time.h" 9 #include "base/time/time.h"
10 #include "content/browser/indexed_db/indexed_db_backing_store.h" 10 #include "content/browser/indexed_db/indexed_db_backing_store.h"
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 &data_loss_message, 184 &data_loss_message,
185 &disk_full); 185 &disk_full);
186 if (!backing_store) { 186 if (!backing_store) {
187 callbacks->OnError( 187 callbacks->OnError(
188 IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError, 188 IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError,
189 "Internal error opening backing store for " 189 "Internal error opening backing store for "
190 "indexedDB.webkitGetDatabaseNames.")); 190 "indexedDB.webkitGetDatabaseNames."));
191 return; 191 return;
192 } 192 }
193 193
194 callbacks->OnSuccess(backing_store->GetDatabaseNames()); 194 leveldb::Status s;
195 std::vector<base::string16> names = backing_store->GetDatabaseNames(s);
196 if (s.ok()) {
jsbell 2014/04/14 20:44:20 I'd reduce this to just an !s.ok() case for now, s
cmumford 2014/04/14 23:39:23 Done.
197 callbacks->OnSuccess(names);
198 } else {
199 // TODO(cmumford): Handle this error
200 DLOG(ERROR) << "Internal error getting database names";
201 callbacks->OnSuccess(names);
202 }
195 backing_store = NULL; 203 backing_store = NULL;
196 ReleaseBackingStore(origin_url, false /* immediate */); 204 ReleaseBackingStore(origin_url, false /* immediate */);
197 } 205 }
198 206
199 void IndexedDBFactory::DeleteDatabase( 207 void IndexedDBFactory::DeleteDatabase(
200 const base::string16& name, 208 const base::string16& name,
201 scoped_refptr<IndexedDBCallbacks> callbacks, 209 scoped_refptr<IndexedDBCallbacks> callbacks,
202 const GURL& origin_url, 210 const GURL& origin_url,
203 const base::FilePath& data_directory) { 211 const base::FilePath& data_directory) {
204 IDB_TRACE("IndexedDBFactory::DeleteDatabase"); 212 IDB_TRACE("IndexedDBFactory::DeleteDatabase");
(...skipping 18 matching lines...) Expand all
223 &disk_full); 231 &disk_full);
224 if (!backing_store) { 232 if (!backing_store) {
225 callbacks->OnError( 233 callbacks->OnError(
226 IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError, 234 IndexedDBDatabaseError(blink::WebIDBDatabaseExceptionUnknownError,
227 ASCIIToUTF16( 235 ASCIIToUTF16(
228 "Internal error opening backing store " 236 "Internal error opening backing store "
229 "for indexedDB.deleteDatabase."))); 237 "for indexedDB.deleteDatabase.")));
230 return; 238 return;
231 } 239 }
232 240
233 scoped_refptr<IndexedDBDatabase> database = 241 leveldb::Status s;
234 IndexedDBDatabase::Create(name, backing_store, this, unique_identifier); 242 scoped_refptr<IndexedDBDatabase> database = IndexedDBDatabase::Create(
243 name, backing_store, this, unique_identifier, s);
235 if (!database) { 244 if (!database) {
236 callbacks->OnError(IndexedDBDatabaseError( 245 IndexedDBDatabaseError error(
237 blink::WebIDBDatabaseExceptionUnknownError, 246 blink::WebIDBDatabaseExceptionUnknownError,
238 ASCIIToUTF16( 247 ASCIIToUTF16(
239 "Internal error creating database backend for " 248 "Internal error creating database backend for "
240 "indexedDB.deleteDatabase."))); 249 "indexedDB.deleteDatabase."));
250 callbacks->OnError(error);
251 if (s.IsCorruption()) {
252 backing_store = NULL; // Closes the LevelDB so that it can be deleted
jsbell 2014/04/14 20:44:20 Does it actually close, or just unblock closing?
cmumford 2014/04/14 23:39:23 If I'm reading that correctly that results in the
253 HandleBackingStoreCorruption(origin_url, error);
254 }
241 return; 255 return;
242 } 256 }
243 257
244 database_map_[unique_identifier] = database; 258 database_map_[unique_identifier] = database;
245 origin_dbs_.insert(std::make_pair(origin_url, database)); 259 origin_dbs_.insert(std::make_pair(origin_url, database));
246 database->DeleteDatabase(callbacks); 260 database->DeleteDatabase(callbacks);
247 RemoveDatabaseFromMaps(unique_identifier); 261 RemoveDatabaseFromMaps(unique_identifier);
248 database = NULL; 262 database = NULL;
249 backing_store = NULL; 263 backing_store = NULL;
250 ReleaseBackingStore(origin_url, false /* immediate */); 264 ReleaseBackingStore(origin_url, false /* immediate */);
(...skipping 21 matching lines...) Expand all
272 // Make a copy of origin_url as this is likely a reference to a member of a 286 // Make a copy of origin_url as this is likely a reference to a member of a
273 // backing store which this function will be deleting. 287 // backing store which this function will be deleting.
274 GURL saved_origin_url(origin_url); 288 GURL saved_origin_url(origin_url);
275 DCHECK(context_); 289 DCHECK(context_);
276 base::FilePath path_base = context_->data_path(); 290 base::FilePath path_base = context_->data_path();
277 IndexedDBBackingStore::RecordCorruptionInfo( 291 IndexedDBBackingStore::RecordCorruptionInfo(
278 path_base, saved_origin_url, base::UTF16ToUTF8(error.message())); 292 path_base, saved_origin_url, base::UTF16ToUTF8(error.message()));
279 HandleBackingStoreFailure(saved_origin_url); 293 HandleBackingStoreFailure(saved_origin_url);
280 // Note: DestroyBackingStore only deletes LevelDB files, leaving all others, 294 // Note: DestroyBackingStore only deletes LevelDB files, leaving all others,
281 // so our corruption info file will remain. 295 // so our corruption info file will remain.
282 if (!IndexedDBBackingStore::DestroyBackingStore(path_base, saved_origin_url) 296 leveldb::Status s =
283 .ok()) 297 IndexedDBBackingStore::DestroyBackingStore(path_base, saved_origin_url);
284 DLOG(ERROR) << "Unable to delete backing store"; 298 if (!s.ok())
299 DLOG(ERROR) << "Unable to delete backing store: " << s.ToString();
285 } 300 }
286 301
287 bool IndexedDBFactory::IsDatabaseOpen(const GURL& origin_url, 302 bool IndexedDBFactory::IsDatabaseOpen(const GURL& origin_url,
288 const base::string16& name) const { 303 const base::string16& name) const {
289 304
290 return !!database_map_.count(IndexedDBDatabase::Identifier(origin_url, name)); 305 return !!database_map_.count(IndexedDBDatabase::Identifier(origin_url, name));
291 } 306 }
292 307
293 bool IndexedDBFactory::IsBackingStoreOpen(const GURL& origin_url) const { 308 bool IndexedDBFactory::IsBackingStoreOpen(const GURL& origin_url) const {
294 return backing_store_map_.find(origin_url) != backing_store_map_.end(); 309 return backing_store_map_.find(origin_url) != backing_store_map_.end();
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 "backing store for indexedDB.open."))); 391 "backing store for indexedDB.open.")));
377 return; 392 return;
378 } 393 }
379 connection.callbacks->OnError(IndexedDBDatabaseError( 394 connection.callbacks->OnError(IndexedDBDatabaseError(
380 blink::WebIDBDatabaseExceptionUnknownError, 395 blink::WebIDBDatabaseExceptionUnknownError,
381 ASCIIToUTF16( 396 ASCIIToUTF16(
382 "Internal error opening backing store for indexedDB.open."))); 397 "Internal error opening backing store for indexedDB.open.")));
383 return; 398 return;
384 } 399 }
385 400
386 database = 401 leveldb::Status s;
387 IndexedDBDatabase::Create(name, backing_store, this, unique_identifier); 402 database = IndexedDBDatabase::Create(
403 name, backing_store, this, unique_identifier, s);
388 if (!database) { 404 if (!database) {
389 connection.callbacks->OnError(IndexedDBDatabaseError( 405 DLOG(ERROR) << "Unable to create the database";
390 blink::WebIDBDatabaseExceptionUnknownError, 406 IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError,
391 ASCIIToUTF16( 407 ASCIIToUTF16(
392 "Internal error creating database backend for indexedDB.open."))); 408 "Internal error creating "
409 "database backend for "
410 "indexedDB.open."));
411 connection.callbacks->OnError(error);
412 if (s.IsCorruption()) {
413 backing_store = NULL; // Closes the LevelDB so that it can be deleted
414 HandleBackingStoreCorruption(origin_url, error);
415 }
393 return; 416 return;
394 } 417 }
395 } else { 418 } else {
396 database = it->second; 419 database = it->second;
397 } 420 }
398 421
399 if (data_loss != blink::WebIDBDataLossNone) 422 if (data_loss != blink::WebIDBDataLossNone)
400 connection.callbacks->OnDataLoss(data_loss, data_loss_message); 423 connection.callbacks->OnDataLoss(data_loss, data_loss_message);
401 424
402 database->OpenConnection(connection); 425 database->OpenConnection(connection);
(...skipping 15 matching lines...) Expand all
418 441
419 std::pair<OriginDBMapIterator, OriginDBMapIterator> range = 442 std::pair<OriginDBMapIterator, OriginDBMapIterator> range =
420 GetOpenDatabasesForOrigin(origin_url); 443 GetOpenDatabasesForOrigin(origin_url);
421 for (OriginDBMapIterator it = range.first; it != range.second; ++it) 444 for (OriginDBMapIterator it = range.first; it != range.second; ++it)
422 count += it->second->ConnectionCount(); 445 count += it->second->ConnectionCount();
423 446
424 return count; 447 return count;
425 } 448 }
426 449
427 } // namespace content 450 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698