Index: third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.h |
diff --git a/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.h b/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.h |
index 9349f10380237c95024c5baf0788d9d093d8318c..3d4baf184326b0f3b3981e46276debf2ab262ff0 100644 |
--- a/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.h |
+++ b/third_party/WebKit/Source/modules/indexeddb/IDBObjectStore.h |
@@ -39,7 +39,6 @@ |
#include "public/platform/modules/indexeddb/WebIDBCursor.h" |
#include "public/platform/modules/indexeddb/WebIDBDatabase.h" |
#include "public/platform/modules/indexeddb/WebIDBTypes.h" |
-#include "wtf/PassRefPtr.h" |
#include "wtf/RefPtr.h" |
#include "wtf/text/WTFString.h" |
@@ -52,21 +51,23 @@ class ExceptionState; |
class IDBObjectStore final : public GarbageCollectedFinalized<IDBObjectStore>, public ScriptWrappable { |
DEFINE_WRAPPERTYPEINFO(); |
public: |
- static IDBObjectStore* create(const IDBObjectStoreMetadata& metadata, IDBTransaction* transaction) |
+ static IDBObjectStore* create(RefPtr<IDBObjectStoreMetadata> metadata, IDBTransaction* transaction) |
{ |
- return new IDBObjectStore(metadata, transaction); |
+ return new IDBObjectStore(std::move(metadata), transaction); |
} |
~IDBObjectStore() { } |
DECLARE_TRACE(); |
+ const IDBObjectStoreMetadata& metadata() const { return *m_metadata; } |
+ |
// Implement the IDBObjectStore IDL |
- int64_t id() const { return m_metadata.id; } |
- const String& name() const { return m_metadata.name; } |
+ int64_t id() const { return metadata().own.id; } |
+ const String& name() const { return metadata().own.name; } |
void setName(const String& name, ExceptionState&); |
ScriptValue keyPath(ScriptState*) const; |
DOMStringList* indexNames() const; |
IDBTransaction* transaction() const { return m_transaction.get(); } |
- bool autoIncrement() const { return m_metadata.autoIncrement; } |
+ bool autoIncrement() const { return metadata().own.autoIncrement; } |
IDBRequest* openCursor(ScriptState*, const ScriptValue& range, const String& direction, ExceptionState&); |
IDBRequest* openKeyCursor(ScriptState*, const ScriptValue& range, const String& direction, ExceptionState&); |
@@ -96,43 +97,55 @@ public: |
// Used internally and by InspectorIndexedDBAgent: |
IDBRequest* openCursor(ScriptState*, IDBKeyRange*, WebIDBCursorDirection, WebIDBTaskType = WebIDBTaskTypeNormal); |
- void markDeleted() { m_deleted = true; } |
+ void markDeleted(); |
bool isDeleted() const { return m_deleted; } |
- void abort(); |
void transactionFinished(); |
- const IDBObjectStoreMetadata& metadata() const { return m_metadata; } |
- void setMetadata(const IDBObjectStoreMetadata& metadata) { m_metadata = metadata; } |
- |
- typedef HeapVector<Member<IDBKey>> IndexKeys; |
+ // Sets the object store's metadata to a previous version. |
+ // |
+ // The reverting process includes reverting the metadata for the IDBIndex |
+ // instances that are still tracked by the store. It does not revert the |
+ // IDBIndex metadata for indexes that were deleted in this transaction. |
+ // |
+ // Used when a versionchange transaction is aborted. |
+ void revertMetadata(RefPtr<IDBObjectStoreMetadata> previousMetadata); |
+ // This relies on the changes made by revertMetadata(). |
+ void revertDeletedIndexMetadata(IDBIndex& deletedIndex); |
// Used by IDBIndex::setName: |
bool containsIndex(const String& name) const |
{ |
return findIndexId(name) != IDBIndexMetadata::InvalidId; |
} |
- void indexRenamed(int64_t indexId, const String& newName); |
+ void renameIndex(int64_t indexId, const String& newName); |
WebIDBDatabase* backendDB() const; |
private: |
- IDBObjectStore(const IDBObjectStoreMetadata&, IDBTransaction*); |
+ IDBObjectStore(RefPtr<IDBObjectStoreMetadata>, IDBTransaction*); |
IDBIndex* createIndex(ScriptState*, const String& name, const IDBKeyPath&, const IDBIndexParameters&, ExceptionState&); |
IDBRequest* put(ScriptState*, WebIDBPutMode, IDBAny* source, const ScriptValue&, const ScriptValue& key, ExceptionState&); |
int64_t findIndexId(const String& name) const; |
- IDBObjectStoreMetadata m_metadata; |
+ // The IDBObjectStoreMetadata is shared with the object store map in the |
+ // database's metadata. |
+ RefPtr<IDBObjectStoreMetadata> m_metadata; |
Member<IDBTransaction> m_transaction; |
bool m_deleted = false; |
- typedef HeapHashMap<String, Member<IDBIndex>> IDBIndexMap; |
- IDBIndexMap m_indexMap; |
- |
- // Used to mark indexes created in an aborted upgrade transaction as |
- // deleted. |
- HeapHashSet<Member<IDBIndex>> m_createdIndexes; |
+ // Caches the IDBIndex instances returned by the index() method. |
+ // |
+ // The spec requires that an object store's index() returns the same |
+ // IDBIndex instance for a specific index, so this cache is necessary |
+ // for correctness. |
+ // |
+ // The cache may be in an inconsistent state after a transaction is aborted. |
+ // index() throws for inactive transactions, which makes the cache not |
+ // observable, so reverting the cache would be a waste of resources. |
+ using IndexMap = HeapHashMap<String, Member<IDBIndex>>; |
+ IndexMap m_indexMap; |
}; |
} // namespace blink |