 Chromium Code Reviews
 Chromium Code Reviews Issue 2276593002:
  Support renaming of IndexedDB indexes and object stores.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 2276593002:
  Support renaming of IndexedDB indexes and object stores.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| Index: content/browser/indexed_db/indexed_db_database.cc | 
| diff --git a/content/browser/indexed_db/indexed_db_database.cc b/content/browser/indexed_db/indexed_db_database.cc | 
| index 8dcea537cb067ad66a50ba5d564e107d14bf8e9f..df24eaf03199fc49c31116372a3643f9c338864b 100644 | 
| --- a/content/browser/indexed_db/indexed_db_database.cc | 
| +++ b/content/browser/indexed_db/indexed_db_database.cc | 
| @@ -403,6 +403,13 @@ void IndexedDBDatabase::RemoveObjectStore(int64_t object_store_id) { | 
| metadata_.object_stores.erase(object_store_id); | 
| } | 
| +void IndexedDBDatabase::SetObjectStoreName( | 
| + int64_t object_store_id, const base::string16& name) { | 
| + DCHECK(metadata_.object_stores.find(object_store_id) != | 
| + metadata_.object_stores.end()); | 
| + metadata_.object_stores[object_store_id].name = name; | 
| +} | 
| + | 
| void IndexedDBDatabase::AddIndex(int64_t object_store_id, | 
| const IndexedDBIndexMetadata& index, | 
| int64_t new_max_index_id) { | 
| @@ -431,6 +438,18 @@ void IndexedDBDatabase::RemoveIndex(int64_t object_store_id, int64_t index_id) { | 
| metadata_.object_stores[object_store_id] = object_store; | 
| } | 
| +void IndexedDBDatabase::SetIndexName( | 
| + int64_t object_store_id, int64_t index_id, const base::string16& name) { | 
| + DCHECK(metadata_.object_stores.find(object_store_id) != | 
| + metadata_.object_stores.end()); | 
| + IndexedDBObjectStoreMetadata object_store = | 
| + metadata_.object_stores[object_store_id]; | 
| + | 
| + DCHECK(object_store.indexes.find(index_id) != object_store.indexes.end()); | 
| + object_store.indexes[index_id].name = name; | 
| + metadata_.object_stores[object_store_id] = object_store; | 
| +} | 
| + | 
| leveldb::Status IndexedDBDatabase::OpenInternal() { | 
| bool success = false; | 
| leveldb::Status s = backing_store_->GetIDBDatabaseMetaData( | 
| @@ -599,6 +618,48 @@ void IndexedDBDatabase::DeleteObjectStore(int64_t transaction_id, | 
| object_store_id)); | 
| } | 
| +void IndexedDBDatabase::RenameObjectStore(int64_t transaction_id, | 
| + int64_t object_store_id, | 
| + const base::string16& new_name) { | 
| + IDB_TRACE1("IndexedDBDatabase::RenameObjectStore", "txn.id", transaction_id); | 
| + IndexedDBTransaction* transaction = GetTransaction(transaction_id); | 
| + if (!transaction) | 
| + return; | 
| + DCHECK_EQ(transaction->mode(), blink::WebIDBTransactionModeVersionChange); | 
| + | 
| + if (!ValidateObjectStoreId(object_store_id)) | 
| + return; | 
| + | 
| + // Store creation is done synchronously, as it may be followed by | 
| 
jsbell
2016/09/07 17:16:13
Update comment, e.g. "Store metadata changes are m
 
pwnall
2016/09/07 22:43:52
Done.
 | 
| + // index creation (also sync) since preemptive OpenCursor/SetIndexKeys | 
| + // may follow. | 
| + const IndexedDBObjectStoreMetadata object_store_metadata = | 
| + metadata_.object_stores[object_store_id]; | 
| + | 
| + leveldb::Status s = | 
| + backing_store_->RenameObjectStore(transaction->BackingStoreTransaction(), | 
| + transaction->database()->id(), | 
| + object_store_metadata.id, new_name); | 
| + if (!s.ok()) { | 
| + IndexedDBDatabaseError error( | 
| + blink::WebIDBDatabaseExceptionUnknownError, | 
| + ASCIIToUTF16("Internal error renaming object store '") + | 
| + object_store_metadata.name + ASCIIToUTF16("' to '") + new_name + | 
| + ASCIIToUTF16("'.")); | 
| + transaction->Abort(error); | 
| + if (s.IsCorruption()) | 
| + factory_->HandleBackingStoreCorruption(backing_store_->origin(), error); | 
| + return; | 
| + } | 
| + | 
| + transaction->ScheduleAbortTask( | 
| + base::Bind(&IndexedDBDatabase::RenameObjectStoreAbortOperation, | 
| + this, | 
| + object_store_id, | 
| + object_store_metadata.name)); | 
| + SetObjectStoreName(object_store_id, new_name); | 
| +} | 
| + | 
| void IndexedDBDatabase::CreateIndex(int64_t transaction_id, | 
| int64_t object_store_id, | 
| int64_t index_id, | 
| @@ -722,6 +783,59 @@ void IndexedDBDatabase::DeleteIndexAbortOperation( | 
| AddIndex(object_store_id, index_metadata, IndexedDBIndexMetadata::kInvalidId); | 
| } | 
| +void IndexedDBDatabase::RenameIndex(int64_t transaction_id, | 
| + int64_t object_store_id, | 
| + int64_t index_id, | 
| + const base::string16& new_name) { | 
| + IDB_TRACE1("IndexedDBDatabase::RenameIndex", "txn.id", transaction_id); | 
| + IndexedDBTransaction* transaction = GetTransaction(transaction_id); | 
| + if (!transaction) | 
| + return; | 
| + DCHECK_EQ(transaction->mode(), blink::WebIDBTransactionModeVersionChange); | 
| + | 
| + if (!ValidateObjectStoreIdAndIndexId(object_store_id, index_id)) | 
| + return; | 
| + | 
| + // Index creation is done synchronously since preemptive | 
| 
jsbell
2016/09/07 17:16:13
Ditto
 
pwnall
2016/09/07 22:43:52
Done.
 | 
| + // OpenCursor/SetIndexKeys may follow. | 
| + | 
| + const IndexedDBIndexMetadata index_metadata = | 
| + metadata_.object_stores[object_store_id].indexes[index_id]; | 
| + | 
| + leveldb::Status s = | 
| + backing_store_->RenameIndex(transaction->BackingStoreTransaction(), | 
| + transaction->database()->id(), | 
| + object_store_id, | 
| + index_id, | 
| + new_name); | 
| + if (!s.ok()) { | 
| + base::string16 error_string = | 
| + ASCIIToUTF16("Internal error creating index '") + | 
| 
jsbell
2016/09/07 17:16:13
Update error message.
 
pwnall
2016/09/07 22:43:52
Done.
 | 
| + index_metadata.name + ASCIIToUTF16("'."); | 
| + transaction->Abort(IndexedDBDatabaseError( | 
| + blink::WebIDBDatabaseExceptionUnknownError, error_string)); | 
| + return; | 
| + } | 
| + | 
| + transaction->ScheduleAbortTask( | 
| + base::Bind(&IndexedDBDatabase::RenameIndexAbortOperation, | 
| + this, | 
| + object_store_id, | 
| + index_id, | 
| + index_metadata.name)); | 
| + SetIndexName(object_store_id, index_id, new_name); | 
| +} | 
| + | 
| +void IndexedDBDatabase::RenameIndexAbortOperation( | 
| + int64_t object_store_id, | 
| + int64_t index_id, | 
| + const base::string16 old_name, | 
| + IndexedDBTransaction* transaction) { | 
| + DCHECK(!transaction); | 
| + IDB_TRACE("IndexedDBDatabase::RenameIndexAbortOperation"); | 
| + SetIndexName(object_store_id, index_id, old_name); | 
| +} | 
| + | 
| void IndexedDBDatabase::Commit(int64_t transaction_id) { | 
| // The frontend suggests that we commit, but we may have previously initiated | 
| // an abort, and so have disposed of the transaction. on_abort has already | 
| @@ -2002,6 +2116,15 @@ void IndexedDBDatabase::DeleteObjectStoreAbortOperation( | 
| IndexedDBObjectStoreMetadata::kInvalidId); | 
| } | 
| +void IndexedDBDatabase::RenameObjectStoreAbortOperation( | 
| + int64_t object_store_id, | 
| + base::string16 old_name, | 
| + IndexedDBTransaction* transaction) { | 
| + DCHECK(!transaction); | 
| + IDB_TRACE("IndexedDBDatabase::RenameObjectStoreAbortOperation"); | 
| + SetObjectStoreName(object_store_id, old_name); | 
| +} | 
| + | 
| void IndexedDBDatabase::VersionChangeAbortOperation( | 
| int64_t previous_version, | 
| IndexedDBTransaction* transaction) { |