Chromium Code Reviews| Index: content/browser/indexed_db/indexed_db_factory.cc |
| diff --git a/content/browser/indexed_db/indexed_db_factory.cc b/content/browser/indexed_db/indexed_db_factory.cc |
| index e3a415a683a0cac066880140ba2b43eabb75aa3b..562be571d6c863ee643f70c7b7a6df42ae1a801f 100644 |
| --- a/content/browser/indexed_db/indexed_db_factory.cc |
| +++ b/content/browser/indexed_db/indexed_db_factory.cc |
| @@ -191,7 +191,15 @@ void IndexedDBFactory::GetDatabaseNames( |
| return; |
| } |
| - callbacks->OnSuccess(backing_store->GetDatabaseNames()); |
| + leveldb::Status s; |
| + std::vector<base::string16> names = backing_store->GetDatabaseNames(s); |
| + 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.
|
| + callbacks->OnSuccess(names); |
| + } else { |
| + // TODO(cmumford): Handle this error |
| + DLOG(ERROR) << "Internal error getting database names"; |
| + callbacks->OnSuccess(names); |
| + } |
| backing_store = NULL; |
| ReleaseBackingStore(origin_url, false /* immediate */); |
| } |
| @@ -230,14 +238,20 @@ void IndexedDBFactory::DeleteDatabase( |
| return; |
| } |
| - scoped_refptr<IndexedDBDatabase> database = |
| - IndexedDBDatabase::Create(name, backing_store, this, unique_identifier); |
| + leveldb::Status s; |
| + scoped_refptr<IndexedDBDatabase> database = IndexedDBDatabase::Create( |
| + name, backing_store, this, unique_identifier, s); |
| if (!database) { |
| - callbacks->OnError(IndexedDBDatabaseError( |
| + IndexedDBDatabaseError error( |
| blink::WebIDBDatabaseExceptionUnknownError, |
| ASCIIToUTF16( |
| "Internal error creating database backend for " |
| - "indexedDB.deleteDatabase."))); |
| + "indexedDB.deleteDatabase.")); |
| + callbacks->OnError(error); |
| + if (s.IsCorruption()) { |
| + 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
|
| + HandleBackingStoreCorruption(origin_url, error); |
| + } |
| return; |
| } |
| @@ -279,9 +293,10 @@ void IndexedDBFactory::HandleBackingStoreCorruption( |
| HandleBackingStoreFailure(saved_origin_url); |
| // Note: DestroyBackingStore only deletes LevelDB files, leaving all others, |
| // so our corruption info file will remain. |
| - if (!IndexedDBBackingStore::DestroyBackingStore(path_base, saved_origin_url) |
| - .ok()) |
| - DLOG(ERROR) << "Unable to delete backing store"; |
| + leveldb::Status s = |
| + IndexedDBBackingStore::DestroyBackingStore(path_base, saved_origin_url); |
| + if (!s.ok()) |
| + DLOG(ERROR) << "Unable to delete backing store: " << s.ToString(); |
| } |
| bool IndexedDBFactory::IsDatabaseOpen(const GURL& origin_url, |
| @@ -383,13 +398,21 @@ void IndexedDBFactory::Open(const base::string16& name, |
| return; |
| } |
| - database = |
| - IndexedDBDatabase::Create(name, backing_store, this, unique_identifier); |
| + leveldb::Status s; |
| + database = IndexedDBDatabase::Create( |
| + name, backing_store, this, unique_identifier, s); |
| if (!database) { |
| - connection.callbacks->OnError(IndexedDBDatabaseError( |
| - blink::WebIDBDatabaseExceptionUnknownError, |
| - ASCIIToUTF16( |
| - "Internal error creating database backend for indexedDB.open."))); |
| + DLOG(ERROR) << "Unable to create the database"; |
| + IndexedDBDatabaseError error(blink::WebIDBDatabaseExceptionUnknownError, |
| + ASCIIToUTF16( |
| + "Internal error creating " |
| + "database backend for " |
| + "indexedDB.open.")); |
| + connection.callbacks->OnError(error); |
| + if (s.IsCorruption()) { |
| + backing_store = NULL; // Closes the LevelDB so that it can be deleted |
| + HandleBackingStoreCorruption(origin_url, error); |
| + } |
| return; |
| } |
| } else { |