Index: third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp |
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp b/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp |
index c31e35bd04e63e622bb7b35ef5a9f304b161af38..1471524e04a65c32ed7007ca027d4bd3b0f4d11d 100644 |
--- a/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp |
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBDatabase.cpp |
@@ -109,29 +109,14 @@ int64_t IDBDatabase::nextTransactionId() |
return atomicIncrement(¤tTransactionId); |
} |
-void IDBDatabase::indexCreated(int64_t objectStoreId, const IDBIndexMetadata& metadata) |
+void IDBDatabase::setMetadata(const IDBDatabaseMetadata& metadata) |
{ |
- IDBDatabaseMetadata::ObjectStoreMap::iterator it = m_metadata.objectStores.find(objectStoreId); |
- ASSERT_WITH_SECURITY_IMPLICATION(it != m_metadata.objectStores.end()); |
- it->value.indexes.set(metadata.id, metadata); |
-} |
- |
-void IDBDatabase::indexDeleted(int64_t objectStoreId, int64_t indexId) |
-{ |
- IDBDatabaseMetadata::ObjectStoreMap::iterator it = m_metadata.objectStores.find(objectStoreId); |
- ASSERT_WITH_SECURITY_IMPLICATION(it != m_metadata.objectStores.end()); |
- it->value.indexes.remove(indexId); |
+ m_metadata = metadata; |
} |
-void IDBDatabase::indexRenamed(int64_t objectStoreId, int64_t indexId, const String& newName) |
+void IDBDatabase::setOwnMetadata(const IDBDatabaseOwnMetadata& metadata) |
{ |
- IDBDatabaseMetadata::ObjectStoreMap::iterator storeIterator = m_metadata.objectStores.find(objectStoreId); |
- SECURITY_DCHECK(storeIterator != m_metadata.objectStores.end()); |
- |
- IDBObjectStoreMetadata& storeMetadata = storeIterator->value; |
- IDBObjectStoreMetadata::IndexMap::iterator indexIterator = storeMetadata.indexes.find(indexId); |
- DCHECK(indexIterator != storeMetadata.indexes.end()); |
- indexIterator->value.name = newName; |
+ m_metadata.own = metadata; |
} |
void IDBDatabase::transactionCreated(IDBTransaction* transaction) |
@@ -178,7 +163,7 @@ DOMStringList* IDBDatabase::objectStoreNames() const |
{ |
DOMStringList* objectStoreNames = DOMStringList::create(DOMStringList::IndexedDB); |
for (const auto& it : m_metadata.objectStores) |
- objectStoreNames->append(it.value.name); |
+ objectStoreNames->append(it.value->own.name); |
objectStoreNames->sort(); |
return objectStoreNames; |
} |
@@ -187,7 +172,7 @@ const String& IDBDatabase::getObjectStoreName(int64_t objectStoreId) const |
{ |
const auto& it = m_metadata.objectStores.find(objectStoreId); |
DCHECK(it != m_metadata.objectStores.end()); |
- return it->value.name; |
+ return it->value->own.name; |
} |
IDBObjectStore* IDBDatabase::createObjectStore(const String& name, const IDBKeyPath& keyPath, bool autoIncrement, ExceptionState& exceptionState) |
@@ -228,15 +213,17 @@ IDBObjectStore* IDBDatabase::createObjectStore(const String& name, const IDBKeyP |
return nullptr; |
} |
- int64_t objectStoreId = m_metadata.maxObjectStoreId + 1; |
+ int64_t objectStoreId = m_metadata.own.maxObjectStoreId + 1; |
+ DCHECK(objectStoreId != IDBObjectStoreMetadata::InvalidId); |
m_backend->createObjectStore(m_versionChangeTransaction->id(), objectStoreId, name, keyPath, autoIncrement); |
- IDBObjectStoreMetadata metadata(name, objectStoreId, keyPath, autoIncrement, WebIDBDatabase::minimumIndexId); |
- IDBObjectStore* objectStore = IDBObjectStore::create(metadata, m_versionChangeTransaction.get()); |
- m_metadata.objectStores.set(metadata.id, metadata); |
- ++m_metadata.maxObjectStoreId; |
- |
+ RefPtr<IDBObjectStoreMetadata> storeMetadata = adoptRef(new IDBObjectStoreMetadata( |
+ name, objectStoreId, keyPath, autoIncrement, WebIDBDatabase::minimumIndexId)); |
+ IDBObjectStore* objectStore = IDBObjectStore::create(storeMetadata, m_versionChangeTransaction.get()); |
m_versionChangeTransaction->objectStoreCreated(name, objectStore); |
+ m_metadata.objectStores.set(objectStoreId, std::move(storeMetadata)); |
+ ++m_metadata.own.maxObjectStoreId; |
+ |
return objectStore; |
} |
@@ -269,7 +256,7 @@ void IDBDatabase::deleteObjectStore(const String& name, ExceptionState& exceptio |
} |
m_backend->deleteObjectStore(m_versionChangeTransaction->id(), objectStoreId); |
- m_versionChangeTransaction->objectStoreDeleted(name); |
+ m_versionChangeTransaction->objectStoreDeleted(objectStoreId, name); |
m_metadata.objectStores.remove(objectStoreId); |
} |
@@ -307,7 +294,6 @@ IDBTransaction* IDBDatabase::transaction(ScriptState* scriptState, const StringO |
return nullptr; |
} |
- |
if (scope.isEmpty()) { |
exceptionState.throwDOMException(InvalidAccessError, "The storeNames parameter was empty."); |
return nullptr; |
@@ -332,7 +318,7 @@ IDBTransaction* IDBDatabase::transaction(ScriptState* scriptState, const StringO |
int64_t transactionId = nextTransactionId(); |
m_backend->createTransaction(transactionId, WebIDBDatabaseCallbacksImpl::create(m_databaseCallbacks).release(), objectStoreIds, mode); |
- return IDBTransaction::create(scriptState, transactionId, scope, mode, this); |
+ return IDBTransaction::createNonVersionChange(scriptState, transactionId, scope, mode, this); |
} |
void IDBDatabase::forceClose() |
@@ -427,7 +413,7 @@ DispatchEventResult IDBDatabase::dispatchEventInternal(Event* event) |
int64_t IDBDatabase::findObjectStoreId(const String& name) const |
{ |
for (const auto& it : m_metadata.objectStores) { |
- if (it.value.name == name) { |
+ if (it.value->own.name == name) { |
ASSERT(it.key != IDBObjectStoreMetadata::InvalidId); |
return it.key; |
} |
@@ -435,11 +421,35 @@ int64_t IDBDatabase::findObjectStoreId(const String& name) const |
return IDBObjectStoreMetadata::InvalidId; |
} |
-void IDBDatabase::objectStoreRenamed(int64_t storeId, const String& newName) |
+void IDBDatabase::renameObjectStore(int64_t objectStoreId, const String& newName) |
+{ |
+ DCHECK(m_versionChangeTransaction) << "Object store renamed on database without a versionchange transaction"; |
+ DCHECK(m_versionChangeTransaction->isActive()) << "Object store renamed when versionchange transaction is not active"; |
+ DCHECK(m_backend) << "Object store renamed after database connection closed"; |
+ DCHECK(m_metadata.objectStores.contains(objectStoreId)); |
+ |
+ m_backend->renameObjectStore(m_versionChangeTransaction->id(), objectStoreId, newName); |
+ |
+ IDBDatabaseMetadata::ObjectStoreMap::iterator it = m_metadata.objectStores.find(objectStoreId); |
+ IDBObjectStoreMetadata* objectStoreMetadata = it->value.get(); |
+ m_versionChangeTransaction->objectStoreRenamed(objectStoreMetadata->own.name, newName); |
+ objectStoreMetadata->own.name = newName; |
+} |
+ |
+void IDBDatabase::revertObjectStoreCreation(int64_t objectStoreId) |
+{ |
+ DCHECK(m_versionChangeTransaction) << "Object store metadata reverted on database without a versionchange transaction"; |
+ DCHECK(!m_versionChangeTransaction->isActive()) << "Object store metadata reverted when versionchange transaction is still active"; |
+ DCHECK(m_metadata.objectStores.contains(objectStoreId)); |
+ m_metadata.objectStores.remove(objectStoreId); |
+} |
+ |
+void IDBDatabase::revertObjectStoreMetadata(RefPtr<IDBObjectStoreMetadata> oldMetadata) |
{ |
- DCHECK(m_metadata.objectStores.contains(storeId)); |
- IDBDatabaseMetadata::ObjectStoreMap::iterator it = m_metadata.objectStores.find(storeId); |
- it->value.name = newName; |
+ DCHECK(m_versionChangeTransaction) << "Object store metadata reverted on database without a versionchange transaction"; |
+ DCHECK(!m_versionChangeTransaction->isActive()) << "Object store metadata reverted when versionchange transaction is still active"; |
+ DCHECK(oldMetadata.get()); |
+ m_metadata.objectStores.set(oldMetadata->own.id, std::move(oldMetadata)); |
} |
bool IDBDatabase::hasPendingActivity() const |