Index: third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp |
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp |
index 233de166d439ca55a86716d5adae8a0b1e49c79b..7c80f4cc645bc75ffc457d6978f6289ef672e18f 100644 |
--- a/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp |
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.cpp |
@@ -71,6 +71,49 @@ DEFINE_TRACE(IDBObjectStore) |
visitor->trace(m_createdIndexes); |
} |
+void IDBObjectStore::setName(const String& name, ExceptionState& exceptionState) |
+{ |
+ if (!RuntimeEnabledFeatures::indexedDBExperimentalEnabled()) |
+ return; |
+ |
+ IDB_TRACE("IDBObjectStore::setName"); |
+ if (!m_transaction->isVersionChange()) { |
+ exceptionState.throwDOMException(InvalidStateError, IDBDatabase::notVersionChangeTransactionErrorMessage); |
+ return; |
+ } |
+ if (isDeleted()) { |
+ exceptionState.throwDOMException(InvalidStateError, IDBDatabase::objectStoreDeletedErrorMessage); |
+ return; |
+ } |
+ if (m_transaction->isFinished() || m_transaction->isFinishing()) { |
+ exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionFinishedErrorMessage); |
+ return; |
+ } |
+ if (!m_transaction->isActive()) { |
+ exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionInactiveErrorMessage); |
+ return; |
+ } |
+ |
+ if (m_metadata.name == name) |
+ return; |
+ if (m_transaction->db()->containsObjectStore(name)) { |
+ exceptionState.throwDOMException(ConstraintError, IDBDatabase::objectStoreNameTakenErrorMessage); |
+ return; |
+ } |
+ if (!backendDB()) { |
+ exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databaseClosedErrorMessage); |
+ return; |
+ } |
+ |
+ backendDB()->renameObjectStore(m_transaction->id(), id(), name); |
+ m_transaction->objectStoreRenamed(m_metadata.name, name); |
+ m_metadata.name = name; |
+ |
+ // The name inside the database's version of the object store metadata is used by IDBDatabase.objectStoreNames(). |
+ // If the transaction is aborted, this name will be reverted when the metadata is overwritten with the previousMetadata in IDBTransaction. |
+ m_transaction->db()->objectStoreRenamed(id(), name); |
+} |
+ |
ScriptValue IDBObjectStore::keyPath(ScriptState* scriptState) const |
{ |
return ScriptValue::from(scriptState, m_metadata.keyPath); |
@@ -545,7 +588,7 @@ IDBIndex* IDBObjectStore::createIndex(ScriptState* scriptState, const String& na |
return nullptr; |
} |
if (containsIndex(name)) { |
- exceptionState.throwDOMException(ConstraintError, "An index with the specified name already exists."); |
+ exceptionState.throwDOMException(ConstraintError, IDBDatabase::indexNameTakenErrorMessage); |
return nullptr; |
} |
if (!keyPath.isValid()) { |
@@ -780,6 +823,24 @@ void IDBObjectStore::transactionFinished() |
m_createdIndexes.clear(); |
} |
+void IDBObjectStore::indexRenamed(int64_t indexId, const String& newName) |
+{ |
+ DCHECK(m_transaction->isVersionChange()); |
+ DCHECK(m_transaction->isActive()); |
+ |
+ IDBObjectStoreMetadata::IndexMap::iterator metadataIterator = m_metadata.indexes.find(indexId); |
+ DCHECK(metadataIterator != m_metadata.indexes.end()) << "Invalid indexId"; |
+ const String& oldName = metadataIterator->value.name; |
+ |
+ DCHECK(m_indexMap.contains(oldName)) << "The index had to be accessed in order to be renamed."; |
+ DCHECK(!m_indexMap.contains(newName)); |
+ IDBIndexMap::iterator it = m_indexMap.find(oldName); |
+ m_indexMap.set(newName, it->value); |
+ m_indexMap.remove(oldName); |
+ |
+ metadataIterator->value.name = newName; |
+} |
+ |
int64_t IDBObjectStore::findIndexId(const String& name) const |
{ |
for (const auto& it : m_metadata.indexes) { |