IndexedDB 2.0: Support IDBObjectStore openKeyCursor.
authorbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Oct 2016 21:42:57 +0000 (21:42 +0000)
committerbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Oct 2016 21:42:57 +0000 (21:42 +0000)
<rdar://problem/28806930> and https://bugs.webkit.org/show_bug.cgi?id=163954

Reviewed by Andy Estes.

LayoutTests/imported/w3c:

* web-platform-tests/IndexedDB/idbobjectstore_openKeyCursor-expected.txt:

Source/WebCore:

No new tests (Covered by changes to existing tests)

* Modules/indexeddb/IDBCursor.cpp:
(WebCore::IDBCursor::create):
* Modules/indexeddb/IDBCursor.h:

* Modules/indexeddb/IDBObjectStore.cpp:
(WebCore::IDBObjectStore::openCursor):
(WebCore::IDBObjectStore::openKeyCursor):
* Modules/indexeddb/IDBObjectStore.h:
* Modules/indexeddb/IDBObjectStore.idl:

* Modules/indexeddb/IDBTransaction.cpp:
(WebCore::IDBTransaction::requestOpenCursor):

* Modules/indexeddb/server/MemoryObjectStoreCursor.cpp:
(WebCore::IDBServer::MemoryObjectStoreCursor::currentData): Only grab the current value
  if the cursor is KeyAndValue.

* Modules/indexeddb/server/SQLiteIDBCursor.cpp:
(WebCore::IDBServer::SQLiteIDBCursor::SQLiteIDBCursor):
(WebCore::IDBServer::SQLiteIDBCursor::internalAdvanceOnce): Only save off the data for an
  object store cursor if it's both KeyAndValue.
* Modules/indexeddb/server/SQLiteIDBCursor.h:

* Modules/indexeddb/shared/IDBCursorInfo.cpp:
(WebCore::IDBCursorInfo::objectStoreCursor): Allow for a KeyOnly ObjectStoreCursor.
* Modules/indexeddb/shared/IDBCursorInfo.h:

LayoutTests:

* storage/indexeddb/modern/cursor-1-expected.txt:
* storage/indexeddb/modern/cursor-1-private-expected.txt:
* storage/indexeddb/modern/resources/cursor-1.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@207845 268f45cc-cd09-0410-ab3c-d52691b4dbfc

18 files changed:
LayoutTests/ChangeLog
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/IndexedDB/idbobjectstore_openKeyCursor-expected.txt
LayoutTests/storage/indexeddb/modern/cursor-1-expected.txt
LayoutTests/storage/indexeddb/modern/cursor-1-private-expected.txt
LayoutTests/storage/indexeddb/modern/resources/cursor-1.js
Source/WebCore/ChangeLog
Source/WebCore/Modules/indexeddb/IDBCursor.cpp
Source/WebCore/Modules/indexeddb/IDBCursor.h
Source/WebCore/Modules/indexeddb/IDBObjectStore.cpp
Source/WebCore/Modules/indexeddb/IDBObjectStore.h
Source/WebCore/Modules/indexeddb/IDBObjectStore.idl
Source/WebCore/Modules/indexeddb/IDBTransaction.cpp
Source/WebCore/Modules/indexeddb/server/MemoryObjectStoreCursor.cpp
Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp
Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.h
Source/WebCore/Modules/indexeddb/shared/IDBCursorInfo.cpp
Source/WebCore/Modules/indexeddb/shared/IDBCursorInfo.h

index 89c0eed..0144ebf 100644 (file)
@@ -1,3 +1,14 @@
+2016-10-25  Brady Eidson  <beidson@apple.com>
+
+        IndexedDB 2.0: Support IDBObjectStore openKeyCursor.
+        <rdar://problem/28806930> and https://bugs.webkit.org/show_bug.cgi?id=163954
+
+        Reviewed by Andy Estes.
+
+        * storage/indexeddb/modern/cursor-1-expected.txt:
+        * storage/indexeddb/modern/cursor-1-private-expected.txt:
+        * storage/indexeddb/modern/resources/cursor-1.js:
+
 2016-10-25  Michael Catanzaro  <mcatanzaro@igalia.com>
 
         Unreviewed GTK test gardening
index 916315d..993f767 100644 (file)
@@ -1,5 +1,14 @@
 2016-10-25  Brady Eidson  <beidson@apple.com>
 
+        IndexedDB 2.0: Support IDBObjectStore openKeyCursor.
+        <rdar://problem/28806930> and https://bugs.webkit.org/show_bug.cgi?id=163954
+
+        Reviewed by Andy Estes.
+
+        * web-platform-tests/IndexedDB/idbobjectstore_openKeyCursor-expected.txt:
+
+2016-10-25  Brady Eidson  <beidson@apple.com>
+
         IndexedDB 2.0: Support new IDBTransaction interfaces.
         <rdar://problem/28806928> and https://bugs.webkit.org/show_bug.cgi?id=163927
 
index 9cfe007..c0006fd 100644 (file)
@@ -1,7 +1,7 @@
 
-FAIL IDBObjectStore.openKeyCursor() - forward iteration store.openKeyCursor is not a function. (In 'store.openKeyCursor()', 'store.openKeyCursor' is undefined)
-FAIL IDBObjectStore.openKeyCursor() - reverse iteration store.openKeyCursor is not a function. (In 'store.openKeyCursor(null, "prev")', 'store.openKeyCursor' is undefined)
-FAIL IDBObjectStore.openKeyCursor() - forward iteration with range store.openKeyCursor is not a function. (In 'store.openKeyCursor(IDBKeyRange.bound(4, 6))', 'store.openKeyCursor' is undefined)
-FAIL IDBObjectStore.openKeyCursor() - reverse iteration with range store.openKeyCursor is not a function. (In 'store.openKeyCursor(IDBKeyRange.bound(4, 6), "prev")', 'store.openKeyCursor' is undefined)
-FAIL IDBObjectStore.openKeyCursor() - invalid inputs assert_throws: openKeyCursor should throw on invalid number key function "function () { store.openKeyCursor(NaN); }" threw object "TypeError: store.openKeyCursor is not a function. (In 'st..." that is not a DOMException DataError: property "code" is equal to undefined, expected 0
+PASS IDBObjectStore.openKeyCursor() - forward iteration 
+PASS IDBObjectStore.openKeyCursor() - reverse iteration 
+PASS IDBObjectStore.openKeyCursor() - forward iteration with range 
+PASS IDBObjectStore.openKeyCursor() - reverse iteration with range 
+PASS IDBObjectStore.openKeyCursor() - invalid inputs 
 
index 97b9cdb..2e570e8 100644 (file)
@@ -15,6 +15,12 @@ Cursor source is: [object IDBObjectStore] (TestObjectStore)
 Cursor key is: 0
 Cursor primary key is: 0
 Success opening cursor
+Cursor is: [object IDBCursor]
+Cursor direction is: next
+Cursor source is: [object IDBObjectStore] (TestObjectStore)
+Cursor key is: 0
+Cursor primary key is: 0
+Success opening cursor
 Cursor is: [object IDBCursorWithValue]
 Cursor direction is: next
 Cursor source is: [object IDBIndex] (TestIndex1)
@@ -33,6 +39,12 @@ Cursor source is: [object IDBObjectStore] (TestObjectStore)
 Cursor key is: 0
 Cursor primary key is: 0
 Success opening cursor
+Cursor is: [object IDBCursor]
+Cursor direction is: nextunique
+Cursor source is: [object IDBObjectStore] (TestObjectStore)
+Cursor key is: 0
+Cursor primary key is: 0
+Success opening cursor
 Cursor is: [object IDBCursorWithValue]
 Cursor direction is: nextunique
 Cursor source is: [object IDBIndex] (TestIndex1)
@@ -51,6 +63,12 @@ Cursor source is: [object IDBObjectStore] (TestObjectStore)
 Cursor key is: foo
 Cursor primary key is: foo
 Success opening cursor
+Cursor is: [object IDBCursor]
+Cursor direction is: prev
+Cursor source is: [object IDBObjectStore] (TestObjectStore)
+Cursor key is: foo
+Cursor primary key is: foo
+Success opening cursor
 Cursor is: [object IDBCursorWithValue]
 Cursor direction is: prev
 Cursor source is: [object IDBIndex] (TestIndex1)
@@ -69,6 +87,12 @@ Cursor source is: [object IDBObjectStore] (TestObjectStore)
 Cursor key is: foo
 Cursor primary key is: foo
 Success opening cursor
+Cursor is: [object IDBCursor]
+Cursor direction is: prevunique
+Cursor source is: [object IDBObjectStore] (TestObjectStore)
+Cursor key is: foo
+Cursor primary key is: foo
+Success opening cursor
 Cursor is: [object IDBCursorWithValue]
 Cursor direction is: prevunique
 Cursor source is: [object IDBIndex] (TestIndex1)
index 97b9cdb..2e570e8 100644 (file)
@@ -15,6 +15,12 @@ Cursor source is: [object IDBObjectStore] (TestObjectStore)
 Cursor key is: 0
 Cursor primary key is: 0
 Success opening cursor
+Cursor is: [object IDBCursor]
+Cursor direction is: next
+Cursor source is: [object IDBObjectStore] (TestObjectStore)
+Cursor key is: 0
+Cursor primary key is: 0
+Success opening cursor
 Cursor is: [object IDBCursorWithValue]
 Cursor direction is: next
 Cursor source is: [object IDBIndex] (TestIndex1)
@@ -33,6 +39,12 @@ Cursor source is: [object IDBObjectStore] (TestObjectStore)
 Cursor key is: 0
 Cursor primary key is: 0
 Success opening cursor
+Cursor is: [object IDBCursor]
+Cursor direction is: nextunique
+Cursor source is: [object IDBObjectStore] (TestObjectStore)
+Cursor key is: 0
+Cursor primary key is: 0
+Success opening cursor
 Cursor is: [object IDBCursorWithValue]
 Cursor direction is: nextunique
 Cursor source is: [object IDBIndex] (TestIndex1)
@@ -51,6 +63,12 @@ Cursor source is: [object IDBObjectStore] (TestObjectStore)
 Cursor key is: foo
 Cursor primary key is: foo
 Success opening cursor
+Cursor is: [object IDBCursor]
+Cursor direction is: prev
+Cursor source is: [object IDBObjectStore] (TestObjectStore)
+Cursor key is: foo
+Cursor primary key is: foo
+Success opening cursor
 Cursor is: [object IDBCursorWithValue]
 Cursor direction is: prev
 Cursor source is: [object IDBIndex] (TestIndex1)
@@ -69,6 +87,12 @@ Cursor source is: [object IDBObjectStore] (TestObjectStore)
 Cursor key is: foo
 Cursor primary key is: foo
 Success opening cursor
+Cursor is: [object IDBCursor]
+Cursor direction is: prevunique
+Cursor source is: [object IDBObjectStore] (TestObjectStore)
+Cursor key is: foo
+Cursor primary key is: foo
+Success opening cursor
 Cursor is: [object IDBCursorWithValue]
 Cursor direction is: prevunique
 Cursor source is: [object IDBIndex] (TestIndex1)
index 112a7c2..58ff8ba 100644 (file)
@@ -44,6 +44,8 @@ function testCursorDirection(direction)
     var range = IDBKeyRange.lowerBound(-Infinity);
     var request = objectStore.openCursor(range, direction);
     setupRequest(request);
+    request = objectStore.openKeyCursor(range, direction);
+    setupRequest(request);
     request = index.openCursor(range, direction);
     setupRequest(request);
     request = index.openKeyCursor(range, direction);
index 27199a5..d4f7942 100644 (file)
@@ -1,3 +1,39 @@
+2016-10-25  Brady Eidson  <beidson@apple.com>
+
+        IndexedDB 2.0: Support IDBObjectStore openKeyCursor.
+        <rdar://problem/28806930> and https://bugs.webkit.org/show_bug.cgi?id=163954
+
+        Reviewed by Andy Estes.
+
+        No new tests (Covered by changes to existing tests)
+
+        * Modules/indexeddb/IDBCursor.cpp:
+        (WebCore::IDBCursor::create):
+        * Modules/indexeddb/IDBCursor.h:
+
+        * Modules/indexeddb/IDBObjectStore.cpp:
+        (WebCore::IDBObjectStore::openCursor):
+        (WebCore::IDBObjectStore::openKeyCursor):
+        * Modules/indexeddb/IDBObjectStore.h:
+        * Modules/indexeddb/IDBObjectStore.idl:
+
+        * Modules/indexeddb/IDBTransaction.cpp:
+        (WebCore::IDBTransaction::requestOpenCursor):
+
+        * Modules/indexeddb/server/MemoryObjectStoreCursor.cpp:
+        (WebCore::IDBServer::MemoryObjectStoreCursor::currentData): Only grab the current value
+          if the cursor is KeyAndValue.
+
+        * Modules/indexeddb/server/SQLiteIDBCursor.cpp:
+        (WebCore::IDBServer::SQLiteIDBCursor::SQLiteIDBCursor):
+        (WebCore::IDBServer::SQLiteIDBCursor::internalAdvanceOnce): Only save off the data for an
+          object store cursor if it's both KeyAndValue.
+        * Modules/indexeddb/server/SQLiteIDBCursor.h:
+
+        * Modules/indexeddb/shared/IDBCursorInfo.cpp:
+        (WebCore::IDBCursorInfo::objectStoreCursor): Allow for a KeyOnly ObjectStoreCursor.
+        * Modules/indexeddb/shared/IDBCursorInfo.h:
+
 2016-10-25  Wenson Hsieh  <wenson_hsieh@apple.com>
 
         Support InputEvent.dataTransfer for the InputEvent spec
index 9e80594..5416909 100644 (file)
@@ -106,6 +106,11 @@ const AtomicString& IDBCursor::directionToString(IndexedDB::CursorDirection dire
     }
 }
 
+Ref<IDBCursor> IDBCursor::create(IDBTransaction& transaction, IDBObjectStore& objectStore, const IDBCursorInfo& info)
+{
+    return adoptRef(*new IDBCursor(transaction, objectStore, info));
+}
+
 Ref<IDBCursor> IDBCursor::create(IDBTransaction& transaction, IDBIndex& index, const IDBCursorInfo& info)
 {
     return adoptRef(*new IDBCursor(transaction, index, info));
index 94b0f79..2aa8882 100644 (file)
@@ -42,6 +42,7 @@ class IDBTransaction;
 
 class IDBCursor : public ScriptWrappable, public RefCounted<IDBCursor>, public ActiveDOMObject {
 public:
+    static Ref<IDBCursor> create(IDBTransaction&, IDBObjectStore&, const IDBCursorInfo&);
     static Ref<IDBCursor> create(IDBTransaction&, IDBIndex&, const IDBCursorInfo&);
 
     static const AtomicString& directionNext();
index 11c14f5..79ee3d7 100644 (file)
@@ -150,7 +150,7 @@ bool IDBObjectStore::autoIncrement() const
     return m_info.autoIncrement();
 }
 
-ExceptionOr<Ref<IDBRequest>> IDBObjectStore::openCursor(ExecState& execState, IDBKeyRange* range, const String& directionString)
+ExceptionOr<Ref<IDBRequest>> IDBObjectStore::openCursor(ExecState& execState, RefPtr<IDBKeyRange> range, const String& directionString)
 {
     LOG(IndexedDB, "IDBObjectStore::openCursor");
     ASSERT(currentThread() == m_transaction->database().originThreadID());
@@ -165,7 +165,7 @@ ExceptionOr<Ref<IDBRequest>> IDBObjectStore::openCursor(ExecState& execState, ID
     if (!direction)
         return Exception { TypeError };
 
-    auto info = IDBCursorInfo::objectStoreCursor(m_transaction.get(), m_info.identifier(), range, direction.value());
+    auto info = IDBCursorInfo::objectStoreCursor(m_transaction.get(), m_info.identifier(), range.get(), direction.value(), IndexedDB::CursorType::KeyAndValue);
     return m_transaction->requestOpenCursor(execState, *this, info);
 }
 
@@ -175,7 +175,35 @@ ExceptionOr<Ref<IDBRequest>> IDBObjectStore::openCursor(ExecState& execState, JS
     if (onlyResult.hasException())
         return Exception { IDBDatabaseException::DataError, ASCIILiteral("Failed to execute 'openCursor' on 'IDBObjectStore': The parameter is not a valid key.") };
 
-    return openCursor(execState, onlyResult.releaseReturnValue().ptr(), direction);
+    return openCursor(execState, onlyResult.releaseReturnValue(), direction);
+}
+
+ExceptionOr<Ref<IDBRequest>> IDBObjectStore::openKeyCursor(ExecState& execState, RefPtr<IDBKeyRange> range, const String& directionString)
+{
+    LOG(IndexedDB, "IDBObjectStore::openCursor");
+    ASSERT(currentThread() == m_transaction->database().originThreadID());
+
+    if (m_deleted)
+        return Exception { IDBDatabaseException::InvalidStateError, ASCIILiteral("Failed to execute 'openKeyCursor' on 'IDBObjectStore': The object store has been deleted.") };
+
+    if (!m_transaction->isActive())
+        return Exception { IDBDatabaseException::TransactionInactiveError, ASCIILiteral("Failed to execute 'openKeyCursor' on 'IDBObjectStore': The transaction is inactive or finished.") };
+
+    auto direction = IDBCursor::stringToDirection(directionString);
+    if (!direction)
+        return Exception { TypeError };
+
+    auto info = IDBCursorInfo::objectStoreCursor(m_transaction.get(), m_info.identifier(), range.get(), direction.value(), IndexedDB::CursorType::KeyOnly);
+    return m_transaction->requestOpenCursor(execState, *this, info);
+}
+
+ExceptionOr<Ref<IDBRequest>> IDBObjectStore::openKeyCursor(ExecState& execState, JSValue key, const String& direction)
+{
+    auto onlyResult = IDBKeyRange::only(execState, key);
+    if (onlyResult.hasException())
+        return Exception { IDBDatabaseException::DataError, ASCIILiteral("Failed to execute 'openKeyCursor' on 'IDBObjectStore': The parameter is not a valid key or key range.") };
+
+    return openKeyCursor(execState, onlyResult.releaseReturnValue(), direction);
 }
 
 ExceptionOr<Ref<IDBRequest>> IDBObjectStore::get(ExecState& execState, JSValue key)
index 2359cee..7b21ccc 100644 (file)
@@ -72,8 +72,10 @@ public:
         bool multiEntry;
     };
 
-    ExceptionOr<Ref<IDBRequest>> openCursor(JSC::ExecState&, IDBKeyRange*, const String& direction);
+    ExceptionOr<Ref<IDBRequest>> openCursor(JSC::ExecState&, RefPtr<IDBKeyRange>, const String& direction);
     ExceptionOr<Ref<IDBRequest>> openCursor(JSC::ExecState&, JSC::JSValue key, const String& direction);
+    ExceptionOr<Ref<IDBRequest>> openKeyCursor(JSC::ExecState&, RefPtr<IDBKeyRange>, const String& direction);
+    ExceptionOr<Ref<IDBRequest>> openKeyCursor(JSC::ExecState&, JSC::JSValue key, const String& direction);
     ExceptionOr<Ref<IDBRequest>> get(JSC::ExecState&, JSC::JSValue key);
     ExceptionOr<Ref<IDBRequest>> get(JSC::ExecState&, IDBKeyRange*);
     ExceptionOr<Ref<IDBRequest>> add(JSC::ExecState&, JSC::JSValue, JSC::JSValue key);
index 6cd147e..f0bd5bf 100644 (file)
@@ -45,6 +45,8 @@
     [CallWith=ScriptState, MayThrowException] IDBRequest clear();
     [CallWith=ScriptState, MayThrowException] IDBRequest openCursor(optional IDBKeyRange? range = null, optional DOMString direction = "next");
     [CallWith=ScriptState, MayThrowException] IDBRequest openCursor(any key, optional DOMString direction = "next");
+    [CallWith=ScriptState, MayThrowException] IDBRequest openKeyCursor(optional IDBKeyRange? range = null, optional DOMString direction = "next");
+    [CallWith=ScriptState, MayThrowException] IDBRequest openKeyCursor(any key, optional DOMString direction = "next");
     [CallWith=ScriptState, MayThrowException] IDBIndex createIndex(DOMString name, (DOMString or sequence<DOMString>) keyPath, optional IDBIndexParameters options);
     [MayThrowException] IDBIndex index(DOMString name);
     [MayThrowException] void deleteIndex(DOMString name);
index 413a684..1e64b34 100644 (file)
@@ -731,6 +731,9 @@ Ref<IDBRequest> IDBTransaction::requestOpenCursor(ExecState& execState, IDBObjec
     LOG(IndexedDB, "IDBTransaction::requestOpenCursor");
     ASSERT(currentThread() == m_database->originThreadID());
 
+    if (info.cursorType() == IndexedDB::CursorType::KeyOnly)
+        return doRequestOpenCursor(execState, IDBCursor::create(*this, objectStore, info));
+
     return doRequestOpenCursor(execState, IDBCursorWithValue::create(*this, objectStore, info));
 }
 
index 7288125..22696b2 100644 (file)
@@ -190,8 +190,12 @@ void MemoryObjectStoreCursor::currentData(IDBGetResult& data)
     }
 
     m_currentPositionKey = **m_iterator;
-    IDBValue value = { m_objectStore.valueForKeyRange(m_currentPositionKey), { }, { } };
-    data = { m_currentPositionKey, m_currentPositionKey, WTFMove(value) };
+    if (m_info.cursorType() == IndexedDB::CursorType::KeyOnly)
+        data = { m_currentPositionKey, m_currentPositionKey };
+    else {
+        IDBValue value = { m_objectStore.valueForKeyRange(m_currentPositionKey), { }, { } };
+        data = { m_currentPositionKey, m_currentPositionKey, WTFMove(value) };
+    }
 }
 
 void MemoryObjectStoreCursor::incrementForwardIterator(std::set<IDBKeyData>& set, const IDBKeyData& key, uint32_t count)
index 33212be..9ff897e 100644 (file)
@@ -74,6 +74,7 @@ SQLiteIDBCursor::SQLiteIDBCursor(SQLiteIDBTransaction& transaction, const IDBCur
     , m_objectStoreID(info.objectStoreIdentifier())
     , m_indexID(info.cursorSource() == IndexedDB::CursorSource::Index ? info.sourceIdentifier() : IDBIndexInfo::InvalidId)
     , m_cursorDirection(info.cursorDirection())
+    , m_cursorType(info.cursorType())
     , m_keyRange(info.range())
 {
     ASSERT(m_objectStoreID);
@@ -85,6 +86,7 @@ SQLiteIDBCursor::SQLiteIDBCursor(SQLiteIDBTransaction& transaction, const uint64
     , m_objectStoreID(objectStoreID)
     , m_indexID(indexID ? indexID : IDBIndexInfo::InvalidId)
     , m_cursorDirection(IndexedDB::CursorDirection::Next)
+    , m_cursorType(IndexedDB::CursorType::KeyAndValue)
     , m_keyRange(range)
     , m_backingStoreCursor(true)
 {
@@ -396,7 +398,8 @@ SQLiteIDBCursor::AdvanceResult SQLiteIDBCursor::internalAdvanceOnce()
             return AdvanceResult::Failure;
         }
 
-        m_currentValue = std::make_unique<IDBValue>(ThreadSafeDataBuffer::adoptVector(keyData), blobURLs, blobFilePaths);
+        if (m_cursorType == IndexedDB::CursorType::KeyAndValue)
+            m_currentValue = std::make_unique<IDBValue>(ThreadSafeDataBuffer::adoptVector(keyData), blobURLs, blobFilePaths);
     } else {
         if (!deserializeIDBKeyData(keyData.data(), keyData.size(), m_currentPrimaryKey)) {
             LOG_ERROR("Unable to deserialize value data from database while advancing index cursor");
index 70a952b..1d8b0ca 100644 (file)
@@ -96,6 +96,7 @@ private:
     int64_t m_objectStoreID;
     int64_t m_indexID { IDBIndexInfo::InvalidId };
     IndexedDB::CursorDirection m_cursorDirection { IndexedDB::CursorDirection::Next };
+    IndexedDB::CursorType m_cursorType;
     IDBKeyRangeData m_keyRange;
 
     IDBKeyData m_currentLowerKey;
index 3551d67..f18e0dc 100644 (file)
@@ -34,9 +34,9 @@
 
 namespace WebCore {
 
-IDBCursorInfo IDBCursorInfo::objectStoreCursor(IDBTransaction& transaction, uint64_t objectStoreIdentifier, const IDBKeyRangeData& range, IndexedDB::CursorDirection direction)
+IDBCursorInfo IDBCursorInfo::objectStoreCursor(IDBTransaction& transaction, uint64_t objectStoreIdentifier, const IDBKeyRangeData& range, IndexedDB::CursorDirection direction, IndexedDB::CursorType type)
 {
-    return { transaction, objectStoreIdentifier, range, direction, IndexedDB::CursorType::KeyAndValue };
+    return { transaction, objectStoreIdentifier, range, direction, type };
 }
 
 IDBCursorInfo IDBCursorInfo::indexCursor(IDBTransaction& transaction, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const IDBKeyRangeData& range, IndexedDB::CursorDirection direction, IndexedDB::CursorType type)
index 9fd98c2..4c693d0 100644 (file)
@@ -50,7 +50,7 @@ enum class CursorDuplicity {
 
 class IDBCursorInfo {
 public:
-    static IDBCursorInfo objectStoreCursor(IDBTransaction&, uint64_t objectStoreIdentifier, const IDBKeyRangeData&, IndexedDB::CursorDirection);
+    static IDBCursorInfo objectStoreCursor(IDBTransaction&, uint64_t objectStoreIdentifier, const IDBKeyRangeData&, IndexedDB::CursorDirection, IndexedDB::CursorType);
     static IDBCursorInfo indexCursor(IDBTransaction&, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const IDBKeyRangeData&, IndexedDB::CursorDirection, IndexedDB::CursorType);
 
     IDBResourceIdentifier identifier() const { return m_cursorIdentifier; }