2011-02-28 Jeremy Orlow <jorlow@chromium.org>
authorjorlow@chromium.org <jorlow@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 2 Mar 2011 22:46:35 +0000 (22:46 +0000)
committerjorlow@chromium.org <jorlow@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 2 Mar 2011 22:46:35 +0000 (22:46 +0000)
        Reviewed by James Robinson.

        Split IDBCursor.value into IDBCursor.primaryKey and IDBCursor.value
        https://bugs.webkit.org/show_bug.cgi?id=55443

        * storage/indexeddb/cursor-delete-expected.txt:
        * storage/indexeddb/cursor-index-delete-expected.txt:
        * storage/indexeddb/cursor-update-expected.txt:
        * storage/indexeddb/cursor-update.html:
        * storage/indexeddb/duplicates-expected.txt:
        * storage/indexeddb/duplicates.html:
        * storage/indexeddb/index-basics-expected.txt:
        * storage/indexeddb/index-basics.html:
        * storage/indexeddb/index-cursor-expected.txt:
        * storage/indexeddb/index-cursor.html:
2011-02-28  Jeremy Orlow  <jorlow@chromium.org>

        Reviewed by James Robinson.

        Split IDBCursor.value into IDBCursor.primaryKey and IDBCursor.value
        https://bugs.webkit.org/show_bug.cgi?id=55443

        Implement http://www.w3.org/Bugs/Public/show_bug.cgi?id=11948

        The idea is to have an IDBCursor and an IDBCursorWithValue interface which
        inherits from the former.  index.openKeyCursor will return the former and
        index/objectStore.openCursor will return the latter.  We'll add a primaryKey
        attribute to IDBCursor.  It will always be the key of the associated object
        store entry.  For index.openCursor cursors, the key attribute will be the key
        of the index.  For objectStore.openCursors, it'll be the same as the
        primaryKey.  The value will be the value of the objectStore entry.

        * WebCore.gypi:
        * bindings/scripts/CodeGeneratorV8.pm:
        * bindings/v8/SerializedScriptValue.cpp:
        (WebCore::SerializedScriptValue::deserializeAndSetProperty):
        * bindings/v8/SerializedScriptValue.h:
        * bindings/v8/custom/V8IDBAnyCustom.cpp:
        (WebCore::toV8):
        * storage/IDBAny.cpp:
        (WebCore::IDBAny::idbCursorWithValue):
        (WebCore::IDBAny::set):
        * storage/IDBAny.h:
        * storage/IDBCursor.cpp:
        (WebCore::IDBCursor::create):
        (WebCore::IDBCursor::primaryKey):
        (WebCore::IDBCursor::value):
        * storage/IDBCursor.h:
        * storage/IDBCursor.idl:
        * storage/IDBCursorBackendImpl.cpp:
        (WebCore::IDBCursorBackendImpl::IDBCursorBackendImpl):
        (WebCore::IDBCursorBackendImpl::primaryKey):
        (WebCore::IDBCursorBackendImpl::value):
        (WebCore::IDBCursorBackendImpl::update):
        (WebCore::IDBCursorBackendImpl::currentRowExists):
        (WebCore::IDBCursorBackendImpl::continueFunctionInternal):
        (WebCore::IDBCursorBackendImpl::deleteFunction):
        (WebCore::IDBCursorBackendImpl::loadCurrentRow):
        * storage/IDBCursorBackendImpl.h:
        (WebCore::IDBCursorBackendImpl::create):
        * storage/IDBCursorBackendInterface.h:
        * storage/IDBCursorWithValue.cpp: Copied from Source/WebCore/storage/IDBCursor.idl.
        (WebCore::IDBCursorWithValue::create):
        (WebCore::IDBCursorWithValue::IDBCursorWithValue):
        (WebCore::IDBCursorWithValue::~IDBCursorWithValue):
        * storage/IDBCursorWithValue.h: Copied from Source/WebCore/storage/IDBCursorBackendInterface.h.
        * storage/IDBCursorWithValue.idl: Copied from Source/WebCore/storage/IDBCursor.idl.
        * storage/IDBIndex.cpp:
        (WebCore::IDBIndex::openCursor):
        (WebCore::IDBIndex::openKeyCursor):
        * storage/IDBIndexBackendImpl.cpp:
        (WebCore::IDBIndexBackendImpl::openCursorInternal):
        (WebCore::IDBIndexBackendImpl::openCursor):
        (WebCore::IDBIndexBackendImpl::openKeyCursor):
        * storage/IDBIndexBackendImpl.h:
        * storage/IDBObjectStore.cpp:
        (WebCore::IDBObjectStore::openCursor):
        * storage/IDBObjectStoreBackendImpl.cpp:
        (WebCore::IDBObjectStoreBackendImpl::openCursorInternal):
        * storage/IDBRequest.cpp:
        (WebCore::IDBRequest::IDBRequest):
        (WebCore::IDBRequest::setCursorType):
        (WebCore::IDBRequest::onSuccess):
        (WebCore::IDBRequest::dispatchEvent):
        * storage/IDBRequest.h:
2011-02-28  Jeremy Orlow  <jorlow@chromium.org>

        Reviewed by James Robinson.

        Split IDBCursor.value into IDBCursor.primaryKey and IDBCursor.value
        https://bugs.webkit.org/show_bug.cgi?id=55443

        * public/WebIDBCursor.h:
        (WebKit::WebIDBCursor::primaryKey):
        (WebKit::WebIDBCursor::value):
        * src/IDBCursorBackendProxy.cpp:
        (WebCore::IDBCursorBackendProxy::primaryKey):
        (WebCore::IDBCursorBackendProxy::value):
        * src/IDBCursorBackendProxy.h:
        * src/WebIDBCursorImpl.cpp:
        (WebKit::WebIDBCursorImpl::key):
        (WebKit::WebIDBCursorImpl::primaryKey):
        (WebKit::WebIDBCursorImpl::value):
        * src/WebIDBCursorImpl.h:

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

40 files changed:
LayoutTests/ChangeLog
LayoutTests/storage/indexeddb/cursor-delete-expected.txt
LayoutTests/storage/indexeddb/cursor-index-delete-expected.txt
LayoutTests/storage/indexeddb/cursor-update-expected.txt
LayoutTests/storage/indexeddb/cursor-update.html
LayoutTests/storage/indexeddb/duplicates-expected.txt
LayoutTests/storage/indexeddb/duplicates.html
LayoutTests/storage/indexeddb/index-basics-expected.txt
LayoutTests/storage/indexeddb/index-basics.html
LayoutTests/storage/indexeddb/index-cursor-expected.txt
LayoutTests/storage/indexeddb/index-cursor.html
Source/WebCore/ChangeLog
Source/WebCore/WebCore.gypi
Source/WebCore/bindings/v8/SerializedScriptValue.cpp
Source/WebCore/bindings/v8/SerializedScriptValue.h
Source/WebCore/bindings/v8/custom/V8IDBAnyCustom.cpp
Source/WebCore/storage/IDBAny.cpp
Source/WebCore/storage/IDBAny.h
Source/WebCore/storage/IDBCursor.cpp
Source/WebCore/storage/IDBCursor.h
Source/WebCore/storage/IDBCursor.idl
Source/WebCore/storage/IDBCursorBackendImpl.cpp
Source/WebCore/storage/IDBCursorBackendImpl.h
Source/WebCore/storage/IDBCursorBackendInterface.h
Source/WebCore/storage/IDBCursorWithValue.cpp [new file with mode: 0644]
Source/WebCore/storage/IDBCursorWithValue.h [new file with mode: 0644]
Source/WebCore/storage/IDBCursorWithValue.idl [new file with mode: 0644]
Source/WebCore/storage/IDBIndex.cpp
Source/WebCore/storage/IDBIndexBackendImpl.cpp
Source/WebCore/storage/IDBIndexBackendImpl.h
Source/WebCore/storage/IDBObjectStore.cpp
Source/WebCore/storage/IDBObjectStoreBackendImpl.cpp
Source/WebCore/storage/IDBRequest.cpp
Source/WebCore/storage/IDBRequest.h
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/public/WebIDBCursor.h
Source/WebKit/chromium/src/IDBCursorBackendProxy.cpp
Source/WebKit/chromium/src/IDBCursorBackendProxy.h
Source/WebKit/chromium/src/WebIDBCursorImpl.cpp
Source/WebKit/chromium/src/WebIDBCursorImpl.h

index 9c29492..d52d879 100644 (file)
@@ -1,3 +1,21 @@
+2011-02-28  Jeremy Orlow  <jorlow@chromium.org>
+
+        Reviewed by James Robinson.
+
+        Split IDBCursor.value into IDBCursor.primaryKey and IDBCursor.value
+        https://bugs.webkit.org/show_bug.cgi?id=55443
+
+        * storage/indexeddb/cursor-delete-expected.txt:
+        * storage/indexeddb/cursor-index-delete-expected.txt:
+        * storage/indexeddb/cursor-update-expected.txt:
+        * storage/indexeddb/cursor-update.html:
+        * storage/indexeddb/duplicates-expected.txt:
+        * storage/indexeddb/duplicates.html:
+        * storage/indexeddb/index-basics-expected.txt:
+        * storage/indexeddb/index-basics.html:
+        * storage/indexeddb/index-cursor-expected.txt:
+        * storage/indexeddb/index-cursor.html:
+
 2011-03-02  Martin Robinson  <mrobinson@igalia.com>
 
         Update GTK+ baselines after r80151.
index a6f9fc9..edda620 100644 (file)
@@ -38,7 +38,7 @@ objectStore = trans.objectStore('test')
 objectStore.add('myValue1', 'myKey1')
 openCursor2
 objectStore.openCursor(keyRange)
-PASS [object IDBCursor] is non-null.
+PASS [object IDBCursorWithValue] is non-null.
 event.target.result.delete()
 objectStore.get('myKey1')
 PASS event.target.result is undefined
index afd6c59..b7d16d3 100644 (file)
@@ -40,7 +40,7 @@ objectStore.add({x: 1}, 'myKey1')
 openCursor2
 index = event.target.source.index('testIndex')
 index.openCursor(keyRange)
-PASS [object IDBCursor] is non-null.
+PASS [object IDBCursorWithValue] is non-null.
 event.target.result.delete()
 index.get(1)
 event.preventDefault()
index 0d29d16..f273b52 100644 (file)
@@ -149,22 +149,22 @@ PASS counter is 5
 trans.objectStore('keyPathStore').index('numberIndex').openKeyCursor(keyRange)
 keyCursor()
 PASS event.target.result.key is counter + 100
-PASS event.target.result.value is counter
+PASS event.target.result.primaryKey is counter
 event.target.result.update({id: counter, number: counter + 200})
 PASS code is webkitIDBDatabaseException.NOT_ALLOWED_ERR
 keyCursor()
 PASS event.target.result.key is counter + 100
-PASS event.target.result.value is counter
+PASS event.target.result.primaryKey is counter
 event.target.result.update({id: counter, number: counter + 200})
 PASS code is webkitIDBDatabaseException.NOT_ALLOWED_ERR
 keyCursor()
 PASS event.target.result.key is counter + 100
-PASS event.target.result.value is counter
+PASS event.target.result.primaryKey is counter
 event.target.result.update({id: counter, number: counter + 200})
 PASS code is webkitIDBDatabaseException.NOT_ALLOWED_ERR
 keyCursor()
 PASS event.target.result.key is counter + 100
-PASS event.target.result.value is counter
+PASS event.target.result.primaryKey is counter
 event.target.result.update({id: counter, number: counter + 200})
 PASS code is webkitIDBDatabaseException.NOT_ALLOWED_ERR
 keyCursor()
index 379ee21..8d55416 100644 (file)
@@ -206,7 +206,7 @@ function keyCursor()
     }
 
     shouldBe("event.target.result.key", "counter + 100");
-    shouldBe("event.target.result.value", "counter");
+    shouldBe("event.target.result.primaryKey", "counter");
 
     try {
         debug("event.target.result.update({id: counter, number: counter + 200})");
index 9e47d0b..84cb3b4 100644 (file)
@@ -28,11 +28,11 @@ event.preventDefault()
 indexObject.openKeyCursor()
 PASS event.target.result === null is false
 PASS event.target.result.key is "value"
-PASS event.target.result.value is "key"
+PASS event.target.result.primaryKey is "key"
 event.target.result.continue()
 PASS event.target.result === null is false
 PASS event.target.result.key is "value2"
-PASS event.target.result.value is "key2"
+PASS event.target.result.primaryKey is "key2"
 event.target.result.continue()
 PASS event.target.result === null is true
 indexObject.openCursor()
@@ -72,11 +72,11 @@ event.preventDefault()
 indexObject.openKeyCursor()
 PASS event.target.result === null is false
 PASS event.target.result.key is "value"
-PASS event.target.result.value is "key"
+PASS event.target.result.primaryKey is "key"
 event.target.result.continue()
 PASS event.target.result === null is false
 PASS event.target.result.key is "value2"
-PASS event.target.result.value is "key2"
+PASS event.target.result.primaryKey is "key2"
 event.target.result.continue()
 PASS event.target.result === null is true
 indexObject.openCursor()
index fb6df5e..bf04a2f 100644 (file)
@@ -114,7 +114,7 @@ function cursor1Continue()
 {
     shouldBeFalse("event.target.result === null");
     shouldBeEqualToString("event.target.result.key", "value");
-    shouldBeEqualToString("event.target.result.value", "key");
+    shouldBeEqualToString("event.target.result.primaryKey", "key");
 
     // We re-use the last request object.
     evalAndLog("event.target.result.continue()");
@@ -125,7 +125,7 @@ function cursor1Continue2()
 {
     shouldBeFalse("event.target.result === null");
     shouldBeEqualToString("event.target.result.key", "value2");
-    shouldBeEqualToString("event.target.result.value", "key2");
+    shouldBeEqualToString("event.target.result.primaryKey", "key2");
 
     // We re-use the last request object.
     evalAndLog("event.target.result.continue()");
index d8bc94d..01f0de3 100644 (file)
@@ -49,11 +49,11 @@ PASS event.target.result is "key2"
 indexObject.openKeyCursor()
 PASS event.target.result === null is false
 PASS event.target.result.key is "value"
-PASS event.target.result.value is "key"
+PASS event.target.result.primaryKey is "key"
 event.target.result.continue()
 PASS event.target.result === null is false
 PASS event.target.result.key is "value2"
-PASS event.target.result.value is "key2"
+PASS event.target.result.primaryKey is "key2"
 event.target.result.continue()
 PASS event.target.result === null is true
 indexObject.openCursor()
index 5945e49..39d1de1 100644 (file)
@@ -152,7 +152,7 @@ function cursor1Continue()
 {
     shouldBeFalse("event.target.result === null");
     shouldBeEqualToString("event.target.result.key", "value");
-    shouldBeEqualToString("event.target.result.value", "key");
+    shouldBeEqualToString("event.target.result.primaryKey", "key");
 
     // We re-use the last request object.
     evalAndLog("event.target.result.continue()");
@@ -163,7 +163,7 @@ function cursor1Continue2()
 {
     shouldBeFalse("event.target.result === null");
     shouldBeEqualToString("event.target.result.key", "value2");
-    shouldBeEqualToString("event.target.result.value", "key2");
+    shouldBeEqualToString("event.target.result.primaryKey", "key2");
 
     // We re-use the last request object.
     evalAndLog("event.target.result.continue()");
index 5869a01..67f141d 100644 (file)
@@ -23,36 +23,36 @@ Scheduling tests...
 Running tests...
 
 Next test: lower open bound is 0; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 0; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
@@ -60,43 +60,43 @@ Next test: upper open bound is 0; sorted ascending.
 PASS event.target.result is null
 
 Next test: upper bound is 0; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
 PASS event.target.result is null
 
 Next test: lower open bound is 0; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower bound is 0; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
@@ -104,283 +104,283 @@ Next test: upper open bound is 0; sorted descending.
 PASS event.target.result is null
 
 Next test: upper bound is 0; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: lower open bound is 0; upper open bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower open bound is 0; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 0; upper open bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 0; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower open bound is 0; upper open bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower open bound is 0; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower bound is 0; upper open bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: lower bound is 0; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: lower open bound is 0; upper open bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower open bound is 0; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 0; upper open bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 0; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower open bound is 0; upper open bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower open bound is 0; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower bound is 0; upper open bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: lower bound is 0; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: lower open bound is 1; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 1; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
@@ -388,43 +388,43 @@ Next test: upper open bound is 1; sorted ascending.
 PASS event.target.result is null
 
 Next test: upper bound is 1; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
 PASS event.target.result is null
 
 Next test: lower open bound is 1; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower bound is 1; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
@@ -432,1081 +432,1081 @@ Next test: upper open bound is 1; sorted descending.
 PASS event.target.result is null
 
 Next test: upper bound is 1; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: lower open bound is 1; upper open bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower open bound is 1; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 1; upper open bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 1; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower open bound is 1; upper open bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower open bound is 1; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower bound is 1; upper open bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: lower bound is 1; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: lower open bound is 1; upper open bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower open bound is 1; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 1; upper open bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 1; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower open bound is 1; upper open bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower open bound is 1; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower bound is 1; upper open bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: lower bound is 1; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: lower open bound is 2; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 2; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: upper open bound is 2; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
 PASS event.target.result is null
 
 Next test: upper bound is 2; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
 PASS event.target.result is null
 
 Next test: lower open bound is 2; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower bound is 2; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: upper open bound is 2; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: upper bound is 2; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: lower open bound is 2; upper open bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower open bound is 2; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 2; upper open bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 2; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower open bound is 2; upper open bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower open bound is 2; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower bound is 2; upper open bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower bound is 2; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower open bound is 2; upper open bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower open bound is 2; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 2; upper open bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 2; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower open bound is 2; upper open bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower open bound is 2; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower bound is 2; upper open bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower bound is 2; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower open bound is 3; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 3; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: upper open bound is 3; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
 PASS event.target.result is null
 
 Next test: upper bound is 3; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
 PASS event.target.result is null
 
 Next test: lower open bound is 3; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower bound is 3; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: upper open bound is 3; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: upper bound is 3; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: lower open bound is 3; upper open bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower open bound is 3; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 3; upper open bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 3; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower open bound is 3; upper open bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower open bound is 3; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower bound is 3; upper open bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower bound is 3; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower open bound is 3; upper open bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower open bound is 3; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 3; upper open bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 3; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower open bound is 3; upper open bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower open bound is 3; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower bound is 3; upper open bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower bound is 3; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
 PASS event.target.result is null
 
 Next test: lower open bound is 4; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 4; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: upper open bound is 4; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
 PASS event.target.result is null
 
 Next test: upper bound is 4; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower open bound is 4; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 4; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: upper open bound is 4; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: upper bound is 4; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: lower open bound is 4; upper open bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower open bound is 4; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 4; upper open bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 4; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower open bound is 4; upper open bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower open bound is 4; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 4; upper open bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower bound is 4; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower open bound is 4; upper open bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower open bound is 4; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 4; upper open bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 4; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower open bound is 4; upper open bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower open bound is 4; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 4; upper open bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower bound is 4; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: lower open bound is 5; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 5; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: upper open bound is 5; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
 PASS event.target.result is null
 
 Next test: upper bound is 5; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower open bound is 5; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
 PASS event.target.result is null
 
 Next test: lower bound is 5; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: upper open bound is 5; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: upper bound is 5; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
@@ -1514,23 +1514,23 @@ Next test: lower open bound is 5; upper open bound is 6; sorted ascending.
 PASS event.target.result is null
 
 Next test: lower open bound is 5; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 5; upper open bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 5; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
@@ -1538,23 +1538,23 @@ Next test: lower open bound is 5; upper open bound is 6; sorted descending.
 PASS event.target.result is null
 
 Next test: lower open bound is 5; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
 PASS event.target.result is null
 
 Next test: lower bound is 5; upper open bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 5; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
@@ -1562,23 +1562,23 @@ Next test: lower open bound is 5; upper open bound is 7; sorted ascending.
 PASS event.target.result is null
 
 Next test: lower open bound is 5; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: lower bound is 5; upper open bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 5; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
@@ -1586,23 +1586,23 @@ Next test: lower open bound is 5; upper open bound is 7; sorted descending.
 PASS event.target.result is null
 
 Next test: lower open bound is 5; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
 PASS event.target.result is null
 
 Next test: lower bound is 5; upper open bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: lower bound is 5; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
@@ -1610,43 +1610,43 @@ Next test: lower open bound is 6; sorted ascending.
 PASS event.target.result is null
 
 Next test: lower bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: upper open bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
@@ -1654,43 +1654,43 @@ Next test: lower open bound is 6; sorted descending.
 PASS event.target.result is null
 
 Next test: lower bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
 PASS event.target.result is null
 
 Next test: upper open bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
@@ -1704,9 +1704,9 @@ Next test: lower bound is 6; upper open bound is 6; sorted ascending.
 PASS event.target.result is null
 
 Next test: lower bound is 6; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
@@ -1720,9 +1720,9 @@ Next test: lower bound is 6; upper open bound is 6; sorted descending.
 PASS event.target.result is null
 
 Next test: lower bound is 6; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
 PASS event.target.result is null
 
@@ -1736,9 +1736,9 @@ Next test: lower bound is 6; upper open bound is 7; sorted ascending.
 PASS event.target.result is null
 
 Next test: lower bound is 6; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
@@ -1752,9 +1752,9 @@ Next test: lower bound is 6; upper open bound is 7; sorted descending.
 PASS event.target.result is null
 
 Next test: lower bound is 6; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
 PASS event.target.result is null
 
@@ -1762,43 +1762,43 @@ Next test: lower open bound is 7; sorted ascending.
 PASS event.target.result is null
 
 Next test: lower bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: upper open bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
 PASS event.target.result is null
 
 Next test: upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
@@ -1806,43 +1806,43 @@ Next test: lower open bound is 7; sorted descending.
 PASS event.target.result is null
 
 Next test: lower bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
 PASS event.target.result is null
 
 Next test: upper open bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
 Next test: upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 
@@ -1856,9 +1856,9 @@ Next test: lower bound is 7; upper open bound is 6; sorted ascending.
 PASS event.target.result is null
 
 Next test: lower bound is 7; upper bound is 6; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
@@ -1872,9 +1872,9 @@ Next test: lower bound is 7; upper open bound is 6; sorted descending.
 PASS event.target.result is null
 
 Next test: lower bound is 7; upper bound is 6; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
 PASS event.target.result is null
 
@@ -1888,9 +1888,9 @@ Next test: lower bound is 7; upper open bound is 7; sorted ascending.
 PASS event.target.result is null
 
 Next test: lower bound is 7; upper bound is 7; sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
@@ -1904,47 +1904,47 @@ Next test: lower bound is 7; upper open bound is 7; sorted descending.
 PASS event.target.result is null
 
 Next test: lower bound is 7; upper bound is 7; sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
 PASS event.target.result is null
 
 Next test: null key path sorted ascending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
 PASS event.target.result is null
 
 Next test: null key path sorted descending.
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[7]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[6]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[5]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[4]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[3]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[2]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[1]
-PASS event.target.result.value is expectedIndex
+PASS event.target.result.primaryKey is expectedIndex
 PASS event.target.result.key is testData[0]
 PASS event.target.result is null
 PASS successfullyParsed is true
index 24c9125..77366a9 100644 (file)
@@ -208,7 +208,7 @@ function cursorIteration()
         return;
     }
  
-    shouldBe("event.target.result.value", "expectedIndex");
+    shouldBe("event.target.result.primaryKey", "expectedIndex");
     shouldBe("event.target.result.key", "testData[" + expectedIndex + "]");
     window.expectedIndex = ascending ? expectedIndex + 1 : expectedIndex - 1;
     testWithinBounds();
index d1c7d78..b4da872 100644 (file)
@@ -1,3 +1,74 @@
+2011-02-28  Jeremy Orlow  <jorlow@chromium.org>
+
+        Reviewed by James Robinson.
+
+        Split IDBCursor.value into IDBCursor.primaryKey and IDBCursor.value
+        https://bugs.webkit.org/show_bug.cgi?id=55443
+
+        Implement http://www.w3.org/Bugs/Public/show_bug.cgi?id=11948
+
+        The idea is to have an IDBCursor and an IDBCursorWithValue interface which
+        inherits from the former.  index.openKeyCursor will return the former and
+        index/objectStore.openCursor will return the latter.  We'll add a primaryKey
+        attribute to IDBCursor.  It will always be the key of the associated object
+        store entry.  For index.openCursor cursors, the key attribute will be the key
+        of the index.  For objectStore.openCursors, it'll be the same as the
+        primaryKey.  The value will be the value of the objectStore entry.
+
+        * WebCore.gypi:
+        * bindings/scripts/CodeGeneratorV8.pm:
+        * bindings/v8/SerializedScriptValue.cpp:
+        (WebCore::SerializedScriptValue::deserializeAndSetProperty):
+        * bindings/v8/SerializedScriptValue.h:
+        * bindings/v8/custom/V8IDBAnyCustom.cpp:
+        (WebCore::toV8):
+        * storage/IDBAny.cpp:
+        (WebCore::IDBAny::idbCursorWithValue):
+        (WebCore::IDBAny::set):
+        * storage/IDBAny.h:
+        * storage/IDBCursor.cpp:
+        (WebCore::IDBCursor::create):
+        (WebCore::IDBCursor::primaryKey):
+        (WebCore::IDBCursor::value):
+        * storage/IDBCursor.h:
+        * storage/IDBCursor.idl:
+        * storage/IDBCursorBackendImpl.cpp:
+        (WebCore::IDBCursorBackendImpl::IDBCursorBackendImpl):
+        (WebCore::IDBCursorBackendImpl::primaryKey):
+        (WebCore::IDBCursorBackendImpl::value):
+        (WebCore::IDBCursorBackendImpl::update):
+        (WebCore::IDBCursorBackendImpl::currentRowExists):
+        (WebCore::IDBCursorBackendImpl::continueFunctionInternal):
+        (WebCore::IDBCursorBackendImpl::deleteFunction):
+        (WebCore::IDBCursorBackendImpl::loadCurrentRow):
+        * storage/IDBCursorBackendImpl.h:
+        (WebCore::IDBCursorBackendImpl::create):
+        * storage/IDBCursorBackendInterface.h:
+        * storage/IDBCursorWithValue.cpp: Copied from Source/WebCore/storage/IDBCursor.idl.
+        (WebCore::IDBCursorWithValue::create):
+        (WebCore::IDBCursorWithValue::IDBCursorWithValue):
+        (WebCore::IDBCursorWithValue::~IDBCursorWithValue):
+        * storage/IDBCursorWithValue.h: Copied from Source/WebCore/storage/IDBCursorBackendInterface.h.
+        * storage/IDBCursorWithValue.idl: Copied from Source/WebCore/storage/IDBCursor.idl.
+        * storage/IDBIndex.cpp:
+        (WebCore::IDBIndex::openCursor):
+        (WebCore::IDBIndex::openKeyCursor):
+        * storage/IDBIndexBackendImpl.cpp:
+        (WebCore::IDBIndexBackendImpl::openCursorInternal):
+        (WebCore::IDBIndexBackendImpl::openCursor):
+        (WebCore::IDBIndexBackendImpl::openKeyCursor):
+        * storage/IDBIndexBackendImpl.h:
+        * storage/IDBObjectStore.cpp:
+        (WebCore::IDBObjectStore::openCursor):
+        * storage/IDBObjectStoreBackendImpl.cpp:
+        (WebCore::IDBObjectStoreBackendImpl::openCursorInternal):
+        * storage/IDBRequest.cpp:
+        (WebCore::IDBRequest::IDBRequest):
+        (WebCore::IDBRequest::setCursorType):
+        (WebCore::IDBRequest::onSuccess):
+        (WebCore::IDBRequest::dispatchEvent):
+        * storage/IDBRequest.h:
+
 2011-03-02  Aravind Akella  <aravind.akella@nokia.com>
 
          Reviewed by Csaba Osztrogon√°c.
index 3ea3e66..ca0bc5e 100644 (file)
             'storage/DatabaseSync.idl',
             'storage/IDBAny.idl',
             'storage/IDBCursor.idl',
+            'storage/IDBCursorWithValue.idl',
             'storage/IDBDatabaseError.idl',
             'storage/IDBDatabaseException.idl',
             'storage/IDBDatabase.idl',
             'storage/IDBCallbacks.h',
             'storage/IDBCursor.cpp',
             'storage/IDBCursor.h',
+            'storage/IDBCursorWithValue.cpp',
+            'storage/IDBCursorWithValue.h',
             'storage/IDBCursorBackendImpl.cpp',
             'storage/IDBCursorBackendImpl.h',
             'storage/IDBCursorBackendInterface.h',
index c67ef49..04ef2b1 100644 (file)
@@ -1146,6 +1146,12 @@ void SerializedScriptValue::deserializeAndSetProperty(v8::Handle<v8::Object> obj
     object->ForceSet(v8::String::NewSymbol(propertyName), deserialized, attribute);
 }
 
+void SerializedScriptValue::deserializeAndSetProperty(v8::Handle<v8::Object> object, const char* propertyName,
+                                                      v8::PropertyAttribute attribute, PassRefPtr<SerializedScriptValue> value)
+{
+    deserializeAndSetProperty(object, propertyName, attribute, value.get());
+}
+
 PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(v8::Handle<v8::Value> value, bool& didThrow)
 {
     return adoptRef(new SerializedScriptValue(value, didThrow));
index d0d8575..c0e9109 100644 (file)
@@ -39,8 +39,10 @@ namespace WebCore {
 
 class SerializedScriptValue : public ThreadSafeShared<SerializedScriptValue> {
 public:
-    static void deserializeAndSetProperty(v8::Handle<v8::Object> object, const char* propertyName,
+    static void deserializeAndSetProperty(v8::Handle<v8::Object>, const char* propertyName,
                                           v8::PropertyAttribute, SerializedScriptValue*);
+    static void deserializeAndSetProperty(v8::Handle<v8::Object>, const char* propertyName,
+                                          v8::PropertyAttribute, PassRefPtr<SerializedScriptValue>);
 
     // If a serialization error occurs (e.g., cyclic input value) this
     // function returns an empty representation, schedules a V8 exception to
index fd6f1a5..ccd6fb2 100644 (file)
@@ -33,6 +33,7 @@
 
 #include "SerializedScriptValue.h"
 #include "V8IDBCursor.h"
+#include "V8IDBCursorWithValue.h"
 #include "V8IDBDatabase.h"
 #include "V8IDBFactory.h"
 #include "V8IDBIndex.h"
@@ -54,6 +55,8 @@ v8::Handle<v8::Value> toV8(IDBAny* impl)
         return v8::Null();
     case IDBAny::IDBCursorType:
         return toV8(impl->idbCursor());
+    case IDBAny::IDBCursorWithValueType:
+        return toV8(impl->idbCursorWithValue());
     case IDBAny::IDBDatabaseType:
         return toV8(impl->idbDatabase());
     case IDBAny::IDBFactoryType:
index 3a049c0..1e076a9 100644 (file)
@@ -28,7 +28,7 @@
 
 #if ENABLE(INDEXED_DATABASE)
 
-#include "IDBCursor.h"
+#include "IDBCursorWithValue.h"
 #include "IDBDatabase.h"
 #include "IDBFactory.h"
 #include "IDBIndex.h"
@@ -64,6 +64,13 @@ PassRefPtr<IDBCursor> IDBAny::idbCursor()
     return m_idbCursor;
 }
 
+
+PassRefPtr<IDBCursorWithValue> IDBAny::idbCursorWithValue()
+{
+    ASSERT(m_type == IDBCursorWithValueType);
+    return m_idbCursorWithValue;
+}
+
 PassRefPtr<IDBDatabase> IDBAny::idbDatabase()
 {
     ASSERT(m_type == IDBDatabaseType);
@@ -112,6 +119,13 @@ void IDBAny::setNull()
     m_type = NullType;
 }
 
+void IDBAny::set(PassRefPtr<IDBCursorWithValue> value)
+{
+    ASSERT(m_type == UndefinedType);
+    m_type = IDBCursorWithValueType;
+    m_idbCursorWithValue = value;
+}
+
 void IDBAny::set(PassRefPtr<IDBCursor> value)
 {
     ASSERT(m_type == UndefinedType);
index 8e3f83e..e7e94f9 100644 (file)
@@ -35,6 +35,7 @@
 namespace WebCore {
 
 class IDBCursor;
+class IDBCursorWithValue;
 class IDBDatabase;
 class IDBFactory;
 class IDBIndex;
@@ -67,6 +68,7 @@ public:
         UndefinedType = 0,
         NullType,
         IDBCursorType,
+        IDBCursorWithValueType,
         IDBDatabaseType,
         IDBFactoryType,
         IDBIndexType,
@@ -79,6 +81,7 @@ public:
     Type type() const { return m_type; }
     // Use type() to figure out which one of these you're allowed to call.
     PassRefPtr<IDBCursor> idbCursor();
+    PassRefPtr<IDBCursorWithValue> idbCursorWithValue();
     PassRefPtr<IDBDatabase> idbDatabase();
     PassRefPtr<IDBFactory> idbFactory();
     PassRefPtr<IDBIndex> idbIndex();
@@ -90,6 +93,7 @@ public:
     // Set can only be called once.
     void setNull();
     void set(PassRefPtr<IDBCursor>);
+    void set(PassRefPtr<IDBCursorWithValue>);
     void set(PassRefPtr<IDBDatabase>);
     void set(PassRefPtr<IDBFactory>);
     void set(PassRefPtr<IDBIndex>);
@@ -105,6 +109,7 @@ private:
 
     // Only one of the following should ever be in use at any given time.
     RefPtr<IDBCursor> m_idbCursor;
+    RefPtr<IDBCursorWithValue> m_idbCursorWithValue;
     RefPtr<IDBDatabase> m_idbDatabase;
     RefPtr<IDBFactory> m_idbFactory;
     RefPtr<IDBIndex> m_idbIndex;
index fa1ca70..59a9709 100644 (file)
 
 namespace WebCore {
 
+PassRefPtr<IDBCursor> IDBCursor::create(PassRefPtr<IDBCursorBackendInterface> backend, IDBRequest* request, IDBTransaction* transaction)
+{
+    return adoptRef(new IDBCursor(backend, request, transaction));
+}
+
 IDBCursor::IDBCursor(PassRefPtr<IDBCursorBackendInterface> backend, IDBRequest* request, IDBTransaction* transaction)
     : m_backend(backend)
     , m_request(request)
@@ -63,7 +68,12 @@ PassRefPtr<IDBKey> IDBCursor::key() const
     return m_backend->key();
 }
 
-PassRefPtr<IDBAny> IDBCursor::value() const
+PassRefPtr<IDBKey> IDBCursor::primaryKey() const
+{
+    return m_backend->primaryKey();
+}
+
+PassRefPtr<SerializedScriptValue> IDBCursor::value() const
 {
     return m_backend->value();
 }
index 9f5ffad..2f803f4 100644 (file)
@@ -29,6 +29,7 @@
 #if ENABLE(INDEXED_DATABASE)
 
 #include "ExceptionCode.h"
+#include "IDBKey.h"
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
 #include <wtf/RefPtr.h>
@@ -38,7 +39,6 @@ namespace WebCore {
 class IDBAny;
 class IDBCallbacks;
 class IDBCursorBackendInterface;
-class IDBKey;
 class IDBRequest;
 class IDBTransaction;
 class ScriptExecutionContext;
@@ -52,11 +52,8 @@ public:
         PREV = 2,
         PREV_NO_DUPLICATE = 3,
     };
-    static PassRefPtr<IDBCursor> create(PassRefPtr<IDBCursorBackendInterface> backend, IDBRequest* request, IDBTransaction* transaction)
-    {
-        return adoptRef(new IDBCursor(backend, request, transaction));
-    }
-    ~IDBCursor();
+    static PassRefPtr<IDBCursor> create(PassRefPtr<IDBCursorBackendInterface>, IDBRequest*, IDBTransaction*);
+    virtual ~IDBCursor();
 
     // FIXME: Try to modify the code generator so this is unneeded.
     void continueFunction(ExceptionCode& ec) { continueFunction(0, ec); }
@@ -64,14 +61,16 @@ public:
     // Implement the IDL
     unsigned short direction() const;
     PassRefPtr<IDBKey> key() const;
-    PassRefPtr<IDBAny> value() const;
+    PassRefPtr<IDBKey> primaryKey() const;
+    PassRefPtr<SerializedScriptValue> value() const;
     PassRefPtr<IDBRequest> update(ScriptExecutionContext*, PassRefPtr<SerializedScriptValue>, ExceptionCode&);
     void continueFunction(PassRefPtr<IDBKey>, ExceptionCode&);
     PassRefPtr<IDBRequest> deleteFunction(ScriptExecutionContext*, ExceptionCode&);
 
-private:
+protected:
     explicit IDBCursor(PassRefPtr<IDBCursorBackendInterface>, IDBRequest*, IDBTransaction*);
 
+private:
     RefPtr<IDBCursorBackendInterface> m_backend;
     RefPtr<IDBRequest> m_request;
     RefPtr<IDBTransaction> m_transaction;
index 2e1459f..b5838ef 100644 (file)
@@ -35,7 +35,7 @@ module storage {
 
         readonly attribute unsigned short direction;
         readonly attribute IDBKey key;
-        readonly attribute IDBAny value;
+        readonly attribute IDBKey primaryKey;
 
         [CallWith=ScriptExecutionContext] IDBRequest update(in SerializedScriptValue value)
             raises (IDBDatabaseException);
index 4576f6d..842388b 100644 (file)
 
 namespace WebCore {
 
-IDBCursorBackendImpl::IDBCursorBackendImpl(IDBBackingStore* backingStore, PassRefPtr<IDBKeyRange> keyRange, IDBCursor::Direction direction, PassOwnPtr<SQLiteStatement> query, bool isSerializedScriptValueCursor, IDBTransactionBackendInterface* transaction, IDBObjectStoreBackendInterface* objectStore)
+IDBCursorBackendImpl::IDBCursorBackendImpl(IDBBackingStore* backingStore, PassRefPtr<IDBKeyRange> keyRange, IDBCursor::Direction direction, PassOwnPtr<SQLiteStatement> query, CursorType cursorType, IDBTransactionBackendInterface* transaction, IDBObjectStoreBackendInterface* objectStore)
     : m_backingStore(backingStore)
     , m_keyRange(keyRange)
     , m_direction(direction)
     , m_query(query)
-    , m_isSerializedScriptValueCursor(isSerializedScriptValueCursor)
+    , m_cursorType(cursorType)
     , m_transaction(transaction)
     , m_objectStore(objectStore)
 {
@@ -71,22 +71,25 @@ PassRefPtr<IDBKey> IDBCursorBackendImpl::key() const
     return m_currentKey;
 }
 
-PassRefPtr<IDBAny> IDBCursorBackendImpl::value() const
+PassRefPtr<IDBKey> IDBCursorBackendImpl::primaryKey() const
 {
-    if (m_isSerializedScriptValueCursor)
-        return IDBAny::create(m_currentSerializedScriptValue.get());
-    return IDBAny::create(m_currentIDBKeyValue.get());
+    return m_currentPrimaryKey;
+}
+
+PassRefPtr<SerializedScriptValue> IDBCursorBackendImpl::value() const
+{
+    ASSERT(m_cursorType != IndexKeyCursor);
+    return m_currentValue;
 }
 
 void IDBCursorBackendImpl::update(PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBCallbacks> callbacks, ExceptionCode& ec)
 {
-    if (!m_query || m_currentId == InvalidId || !m_isSerializedScriptValueCursor) {
+    if (!m_query || m_currentId == InvalidId || m_cursorType == IndexKeyCursor) {
         ec = IDBDatabaseException::NOT_ALLOWED_ERR;
         return;
     }
 
-    RefPtr<IDBKey> key = m_currentIDBKeyValue ? m_currentIDBKeyValue : m_currentKey;
-    m_objectStore->put(value, key.release(), IDBObjectStoreBackendInterface::CursorUpdate, callbacks, m_transaction.get(), ec);
+    m_objectStore->put(value, m_currentPrimaryKey, IDBObjectStoreBackendInterface::CursorUpdate, callbacks, m_transaction.get(), ec);
 }
 
 void IDBCursorBackendImpl::continueFunction(PassRefPtr<IDBKey> prpKey, PassRefPtr<IDBCallbacks> prpCallbacks, ExceptionCode& ec)
@@ -100,7 +103,7 @@ void IDBCursorBackendImpl::continueFunction(PassRefPtr<IDBKey> prpKey, PassRefPt
 
 bool IDBCursorBackendImpl::currentRowExists()
 {
-    String sql = m_currentIDBKeyValue ? "SELECT id FROM IndexData WHERE id = ?" : "SELECT id FROM ObjectStoreData WHERE id = ?";
+    String sql = m_cursorType == ObjectStoreCursor ? "SELECT id FROM ObjectStoreData WHERE id = ?" : "SELECT id FROM IndexData WHERE id = ?";
     SQLiteStatement statement(m_backingStore->db(), sql);
 
     bool ok = statement.prepare() == SQLResultOk;
@@ -121,8 +124,8 @@ void IDBCursorBackendImpl::continueFunctionInternal(ScriptExecutionContext*, Pas
             cursor->m_query = 0;
             cursor->m_currentId = InvalidId;
             cursor->m_currentKey = 0;
-            cursor->m_currentSerializedScriptValue = 0;
-            cursor->m_currentIDBKeyValue = 0;
+            cursor->m_currentPrimaryKey = 0;
+            cursor->m_currentValue = 0;
             callbacks->onSuccess(SerializedScriptValue::nullValue());
             return;
         }
@@ -150,26 +153,22 @@ void IDBCursorBackendImpl::continueFunctionInternal(ScriptExecutionContext*, Pas
 
 void IDBCursorBackendImpl::deleteFunction(PassRefPtr<IDBCallbacks> prpCallbacks, ExceptionCode& ec)
 {
-    if (!m_query || m_currentId == InvalidId || !m_isSerializedScriptValueCursor) {
+    if (!m_query || m_currentId == InvalidId || m_cursorType == IndexKeyCursor) {
         ec = IDBDatabaseException::NOT_ALLOWED_ERR;
         return;
     }
 
-    RefPtr<IDBKey> key = m_currentIDBKeyValue ? m_currentIDBKeyValue : m_currentKey;
-    m_objectStore->deleteFunction(key.release(), prpCallbacks, m_transaction.get(), ec);
+    m_objectStore->deleteFunction(m_currentPrimaryKey, prpCallbacks, m_transaction.get(), ec);
 }
 
 
 void IDBCursorBackendImpl::loadCurrentRow()
 {
-    // The column numbers depend on the query in IDBObjectStoreBackendImpl::openCursorInternal or
-    // IDBIndexBackendImpl::openCursorInternal.
+    // The column numbers depend on the query in IDBObjectStoreBackendImpl::openCursorInternal and/or IDBIndexBackendImpl::openCursorInternal.
     m_currentId = m_query->getColumnInt64(0);
     m_currentKey = IDBKey::fromQuery(*m_query, 1);
-    if (m_isSerializedScriptValueCursor)
-        m_currentSerializedScriptValue = SerializedScriptValue::createFromWire(m_query->getColumnBlobAsString(4));
-
-    m_currentIDBKeyValue = IDBKey::fromQuery(*m_query, 5);
+    m_currentValue = SerializedScriptValue::createFromWire(m_query->getColumnBlobAsString(4));
+    m_currentPrimaryKey = IDBKey::fromQuery(*m_query, 5);
 }
 
 SQLiteDatabase& IDBCursorBackendImpl::database() const
index db12f17..a46f7bf 100644 (file)
@@ -49,21 +49,22 @@ class SerializedScriptValue;
 
 class IDBCursorBackendImpl : public IDBCursorBackendInterface {
 public:
-    static PassRefPtr<IDBCursorBackendImpl> create(IDBBackingStore* backingStore, PassRefPtr<IDBKeyRange> keyRange, IDBCursor::Direction direction, PassOwnPtr<SQLiteStatement> query, bool isSerializedScriptValueCursor, IDBTransactionBackendInterface* transaction, IDBObjectStoreBackendInterface* objectStore)
+    static PassRefPtr<IDBCursorBackendImpl> create(IDBBackingStore* backingStore, PassRefPtr<IDBKeyRange> keyRange, IDBCursor::Direction direction, PassOwnPtr<SQLiteStatement> query, CursorType cursorType, IDBTransactionBackendInterface* transaction, IDBObjectStoreBackendInterface* objectStore)
     {
-        return adoptRef(new IDBCursorBackendImpl(backingStore, keyRange, direction, query, isSerializedScriptValueCursor, transaction, objectStore));
+        return adoptRef(new IDBCursorBackendImpl(backingStore, keyRange, direction, query, cursorType, transaction, objectStore));
     }
     virtual ~IDBCursorBackendImpl();
 
     virtual unsigned short direction() const;
     virtual PassRefPtr<IDBKey> key() const;
-    virtual PassRefPtr<IDBAny> value() const;
+    virtual PassRefPtr<IDBKey> primaryKey() const;
+    virtual PassRefPtr<SerializedScriptValue> value() const;
     virtual void update(PassRefPtr<SerializedScriptValue>, PassRefPtr<IDBCallbacks>, ExceptionCode&);
     virtual void continueFunction(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>, ExceptionCode&);
     virtual void deleteFunction(PassRefPtr<IDBCallbacks>, ExceptionCode&);
 
 private:
-    IDBCursorBackendImpl(IDBBackingStore*, PassRefPtr<IDBKeyRange>, IDBCursor::Direction, PassOwnPtr<SQLiteStatement> query, bool isSerializedScriptValueCursor, IDBTransactionBackendInterface*, IDBObjectStoreBackendInterface*);
+    IDBCursorBackendImpl(IDBBackingStore*, PassRefPtr<IDBKeyRange>, IDBCursor::Direction, PassOwnPtr<SQLiteStatement> query, CursorType, IDBTransactionBackendInterface*, IDBObjectStoreBackendInterface*);
 
     bool currentRowExists();
     void loadCurrentRow();
@@ -78,18 +79,12 @@ private:
     RefPtr<IDBKeyRange> m_keyRange;
     IDBCursor::Direction m_direction;
     OwnPtr<SQLiteStatement> m_query;
-    bool m_isSerializedScriptValueCursor;
+    CursorType m_cursorType;
     int64_t m_currentId;
 
-    // The key in the objectStore or index that this cursor iterates over.
     RefPtr<IDBKey> m_currentKey;
-
-    // m_isSerializedScriptValueCursor will only be available for object cursors.
-    RefPtr<SerializedScriptValue> m_currentSerializedScriptValue;
-
-    // FIXME: make the primary key available via script for all types of cursors.
-    // For cursors on indices, this is the key in the objectstore that corresponds to the current entry in the index.
-    RefPtr<IDBKey> m_currentIDBKeyValue;
+    RefPtr<IDBKey> m_currentPrimaryKey;
+    RefPtr<SerializedScriptValue> m_currentValue;
 
     RefPtr<IDBTransactionBackendInterface> m_transaction;
     RefPtr<IDBObjectStoreBackendInterface> m_objectStore;
index 0d132ca..6cdab42 100644 (file)
@@ -45,9 +45,17 @@ class IDBCursorBackendInterface : public ThreadSafeShared<IDBCursorBackendInterf
 public:
     virtual ~IDBCursorBackendInterface() {}
 
+    enum CursorType {
+        InvalidCursorType = 0,
+        IndexCursor,
+        IndexKeyCursor,
+        ObjectStoreCursor
+    };
+
     virtual unsigned short direction() const = 0;
     virtual PassRefPtr<IDBKey> key() const = 0;
-    virtual PassRefPtr<IDBAny> value() const = 0;
+    virtual PassRefPtr<IDBKey> primaryKey() const = 0;
+    virtual PassRefPtr<SerializedScriptValue> value() const = 0;
 
     virtual void update(PassRefPtr<SerializedScriptValue>, PassRefPtr<IDBCallbacks>, ExceptionCode&) = 0;
     virtual void continueFunction(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks>, ExceptionCode&) = 0;
diff --git a/Source/WebCore/storage/IDBCursorWithValue.cpp b/Source/WebCore/storage/IDBCursorWithValue.cpp
new file mode 100644 (file)
index 0000000..406c1b6
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "IDBCursorWithValue.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "IDBCursorBackendInterface.h"
+#include "IDBKey.h"
+
+namespace WebCore {
+
+PassRefPtr<IDBCursorWithValue> IDBCursorWithValue::create(PassRefPtr<IDBCursorBackendInterface> backend, IDBRequest* request, IDBTransaction* transaction)
+{
+    return adoptRef(new IDBCursorWithValue(backend, request, transaction));
+}
+
+IDBCursorWithValue::IDBCursorWithValue(PassRefPtr<IDBCursorBackendInterface> backend, IDBRequest* request, IDBTransaction* transaction)
+    : IDBCursor(backend, request, transaction)
+{
+}
+
+IDBCursorWithValue::~IDBCursorWithValue()
+{
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
diff --git a/Source/WebCore/storage/IDBCursorWithValue.h b/Source/WebCore/storage/IDBCursorWithValue.h
new file mode 100644 (file)
index 0000000..212306e
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef IDBCursorWithValue_h
+#define IDBCursorWithValue_h
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "IDBCursor.h"
+
+namespace WebCore {
+
+class IDBCursorWithValue : public IDBCursor {
+public:
+    static PassRefPtr<IDBCursorWithValue> create(PassRefPtr<IDBCursorBackendInterface>, IDBRequest*, IDBTransaction*);
+    virtual ~IDBCursorWithValue();
+
+    // The value attribute defined in the IDL is simply implemented in IDBCursor (but not exposed via
+    // its IDL). This is to make the implementation more simple while matching what the spec says.
+
+private:
+    explicit IDBCursorWithValue(PassRefPtr<IDBCursorBackendInterface>, IDBRequest*, IDBTransaction*);
+};
+
+} // namespace WebCore
+
+#endif
+
+#endif // IDBCursorWithValue_h
diff --git a/Source/WebCore/storage/IDBCursorWithValue.idl b/Source/WebCore/storage/IDBCursorWithValue.idl
new file mode 100644 (file)
index 0000000..811215a
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2010 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+module storage {
+
+    interface [
+        Conditional=INDEXED_DATABASE
+    ] IDBCursorWithValue : IDBCursor {
+        readonly attribute SerializedScriptValue value;
+    };
+}
index 63b800e..2976d48 100644 (file)
@@ -61,6 +61,7 @@ PassRefPtr<IDBRequest> IDBIndex::openCursor(ScriptExecutionContext* context, Pas
     }
 
     RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get());
+    request->setCursorType(IDBCursorBackendInterface::IndexCursor);
     m_backend->openCursor(keyRange, direction, request, m_transaction->backend(), ec);
     if (ec) {
         request->markEarlyDeath();
@@ -78,6 +79,7 @@ PassRefPtr<IDBRequest> IDBIndex::openKeyCursor(ScriptExecutionContext* context,
     }
 
     RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get());
+    request->setCursorType(IDBCursorBackendInterface::IndexKeyCursor);
     m_backend->openKeyCursor(keyRange, direction, request, m_transaction->backend(), ec);
     if (ec) {
         request->markEarlyDeath();
index bf3cab4..dd9d953 100644 (file)
@@ -66,7 +66,7 @@ IDBIndexBackendImpl::~IDBIndexBackendImpl()
 {
 }
 
-void IDBIndexBackendImpl::openCursorInternal(ScriptExecutionContext*, PassRefPtr<IDBIndexBackendImpl> index, PassRefPtr<IDBKeyRange> range, unsigned short untypedDirection, bool objectCursor, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBTransactionBackendInterface> transaction)
+void IDBIndexBackendImpl::openCursorInternal(ScriptExecutionContext*, PassRefPtr<IDBIndexBackendImpl> index, PassRefPtr<IDBKeyRange> range, unsigned short untypedDirection, IDBCursorBackendInterface::CursorType cursorType, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBTransactionBackendInterface> transaction)
 {
     // Several files depend on this order of selects.
     String sql = String("SELECT IndexData.id, IndexData.keyString, IndexData.keyDate, IndexData.keyNumber, ")
@@ -108,7 +108,7 @@ void IDBIndexBackendImpl::openCursorInternal(ScriptExecutionContext*, PassRefPtr
     RefPtr<IDBObjectStoreBackendInterface> objectStore = transaction->objectStore(index->m_storeName, ec);
     ASSERT(objectStore && !ec);
 
-    RefPtr<IDBCursorBackendInterface> cursor = IDBCursorBackendImpl::create(index->m_backingStore.get(), range, direction, query.release(), objectCursor, transaction.get(), objectStore.get());
+    RefPtr<IDBCursorBackendInterface> cursor = IDBCursorBackendImpl::create(index->m_backingStore.get(), range, direction, query.release(), cursorType, transaction.get(), objectStore.get());
     callbacks->onSuccess(cursor.release());
 }
 
@@ -118,7 +118,7 @@ void IDBIndexBackendImpl::openCursor(PassRefPtr<IDBKeyRange> prpKeyRange, unsign
     RefPtr<IDBKeyRange> keyRange = prpKeyRange;
     RefPtr<IDBCallbacks> callbacks = prpCallbacks;
     RefPtr<IDBTransactionBackendInterface> transaction = transactionPtr;
-    if (!transaction->scheduleTask(createCallbackTask(&openCursorInternal, index, keyRange, direction, true, callbacks, transaction)))
+    if (!transaction->scheduleTask(createCallbackTask(&openCursorInternal, index, keyRange, direction, IDBCursorBackendInterface::IndexCursor, callbacks, transaction)))
         ec = IDBDatabaseException::NOT_ALLOWED_ERR;
 }
 
@@ -128,7 +128,7 @@ void IDBIndexBackendImpl::openKeyCursor(PassRefPtr<IDBKeyRange> prpKeyRange, uns
     RefPtr<IDBKeyRange> keyRange = prpKeyRange;
     RefPtr<IDBCallbacks> callbacks = prpCallbacks;
     RefPtr<IDBTransactionBackendInterface> transaction = transactionPtr;
-    if (!transaction->scheduleTask(createCallbackTask(&openCursorInternal, index, keyRange, direction, false, callbacks, transaction)))
+    if (!transaction->scheduleTask(createCallbackTask(&openCursorInternal, index, keyRange, direction, IDBCursorBackendInterface::IndexKeyCursor, callbacks, transaction)))
         ec = IDBDatabaseException::NOT_ALLOWED_ERR;
 }
 
index 98f3623..2420a6d 100644 (file)
 #ifndef IDBIndexBackendImpl_h
 #define IDBIndexBackendImpl_h
 
-#include "IDBIndexBackendInterface.h"
-
 #if ENABLE(INDEXED_DATABASE)
 
+#include "IDBCursorBackendInterface.h"
+#include "IDBIndexBackendInterface.h"
+
 namespace WebCore {
 
 class IDBBackingStore;
@@ -77,7 +78,7 @@ private:
 
     SQLiteDatabase& sqliteDatabase() const;
 
-    static void openCursorInternal(ScriptExecutionContext*, PassRefPtr<IDBIndexBackendImpl>, PassRefPtr<IDBKeyRange>, unsigned short direction, bool objectCursor, PassRefPtr<IDBCallbacks>, PassRefPtr<IDBTransactionBackendInterface>);
+    static void openCursorInternal(ScriptExecutionContext*, PassRefPtr<IDBIndexBackendImpl>, PassRefPtr<IDBKeyRange>, unsigned short direction, IDBCursorBackendInterface::CursorType, PassRefPtr<IDBCallbacks>, PassRefPtr<IDBTransactionBackendInterface>);
     static void getInternal(ScriptExecutionContext*, PassRefPtr<IDBIndexBackendImpl>, PassRefPtr<IDBKey>, bool getObject, PassRefPtr<IDBCallbacks>);
 
     static const int64_t InvalidId = 0;
index 87d2a14..f0ec234 100644 (file)
@@ -157,6 +157,7 @@ PassRefPtr<IDBRequest> IDBObjectStore::openCursor(ScriptExecutionContext* contex
     }
 
     RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get());
+    request->setCursorType(IDBCursorBackendInterface::ObjectStoreCursor);
     m_objectStore->openCursor(range, direction, request, m_transaction->backend(), ec);
     if (ec) {
         request->markEarlyDeath();
index c637b1c..ec7007e 100644 (file)
@@ -488,7 +488,7 @@ void IDBObjectStoreBackendImpl::openCursorInternal(ScriptExecutionContext*, Pass
     bool upperBound = range && range->upper();
 
     // Several files depend on this order of selects.
-    String sql = "SELECT id, keyString, keyDate, keyNumber, value FROM ObjectStoreData WHERE ";
+    String sql = "SELECT id, keyString, keyDate, keyNumber, value, keyString, keyDate, keyNumber FROM ObjectStoreData WHERE ";
     if (lowerBound)
         sql += range->lower()->lowerCursorWhereFragment(range->lowerWhereClauseComparisonOperator());
     if (upperBound)
@@ -517,7 +517,7 @@ void IDBObjectStoreBackendImpl::openCursorInternal(ScriptExecutionContext*, Pass
         return;
     }
 
-    RefPtr<IDBCursorBackendInterface> cursor = IDBCursorBackendImpl::create(objectStore->m_backingStore.get(), range, direction, query.release(), true, transaction.get(), objectStore.get());
+    RefPtr<IDBCursorBackendInterface> cursor = IDBCursorBackendImpl::create(objectStore->m_backingStore.get(), range, direction, query.release(), IDBCursorBackendInterface::ObjectStoreCursor, transaction.get(), objectStore.get());
     callbacks->onSuccess(cursor.release());
 }
 
index 59e9377..653ea63 100644 (file)
@@ -36,7 +36,7 @@
 #include "EventListener.h"
 #include "EventNames.h"
 #include "EventQueue.h"
-#include "IDBCursor.h"
+#include "IDBCursorWithValue.h"
 #include "IDBDatabase.h"
 #include "IDBEventDispatcher.h"
 #include "IDBIndex.h"
@@ -58,6 +58,7 @@ IDBRequest::IDBRequest(ScriptExecutionContext* context, PassRefPtr<IDBAny> sourc
     , m_transaction(transaction)
     , m_readyState(LOADING)
     , m_finished(false)
+    , m_cursorType(IDBCursorBackendInterface::InvalidCursorType)
 {
     if (m_transaction) {
         m_transaction->registerRequest(this);
@@ -165,6 +166,12 @@ void IDBRequest::abort()
     onError(IDBDatabaseError::create(IDBDatabaseException::ABORT_ERR, "The transaction was aborted, so the request cannot be fulfilled."));
 }
 
+void IDBRequest::setCursorType(IDBCursorBackendInterface::CursorType cursorType)
+{
+    ASSERT(m_cursorType == IDBCursorBackendInterface::InvalidCursorType);
+    m_cursorType = cursorType;
+}
+
 void IDBRequest::onError(PassRefPtr<IDBDatabaseError> error)
 {
     ASSERT(!m_errorCode && m_errorMessage.isNull() && !m_result);
@@ -181,7 +188,11 @@ static PassRefPtr<Event> createSuccessEvent()
 void IDBRequest::onSuccess(PassRefPtr<IDBCursorBackendInterface> backend)
 {
     ASSERT(!m_errorCode && m_errorMessage.isNull() && !m_result);
-    m_result = IDBAny::create(IDBCursor::create(backend, this, m_transaction.get()));
+    ASSERT(m_cursorType != IDBCursorBackendInterface::InvalidCursorType);
+    if (m_cursorType == IDBCursorBackendInterface::IndexKeyCursor)
+        m_result = IDBAny::create(IDBCursor::create(backend, this, m_transaction.get()));
+    else
+        m_result = IDBAny::create(IDBCursorWithValue::create(backend, this, m_transaction.get()));
     enqueueEvent(createSuccessEvent());
 }
 
@@ -285,7 +296,7 @@ bool IDBRequest::dispatchEvent(PassRefPtr<Event> event)
     bool dontPreventDefault = IDBEventDispatcher::dispatch(event.get(), targets);
 
     // If the result was of type IDBCursor, then we'll fire again.
-    if (m_result && m_result->type() != IDBAny::IDBCursorType)
+    if (m_result && m_result->type() != IDBAny::IDBCursorType && m_result->type() != IDBAny::IDBCursorWithValueType)
         m_finished = true;
 
     if (m_transaction) {
index 0a76c0d..78579d0 100644 (file)
@@ -68,6 +68,7 @@ public:
 
     void markEarlyDeath();
     bool resetReadyState(IDBTransaction*);
+    void setCursorType(IDBCursorBackendInterface::CursorType);
     IDBAny* source();
     void abort();
 
@@ -116,6 +117,9 @@ private:
     bool m_finished; // Is it possible that we'll fire any more events? If not, we're finished.
     Vector<RefPtr<Event> > m_enqueuedEvents;
 
+    // Only used if the result type will be a cursor.
+    IDBCursorBackendInterface::CursorType m_cursorType;
+
     EventTargetData m_eventTargetData;
 };
 
index a526937..84089e4 100644 (file)
@@ -1,3 +1,23 @@
+2011-02-28  Jeremy Orlow  <jorlow@chromium.org>
+
+        Reviewed by James Robinson.
+
+        Split IDBCursor.value into IDBCursor.primaryKey and IDBCursor.value
+        https://bugs.webkit.org/show_bug.cgi?id=55443
+
+        * public/WebIDBCursor.h:
+        (WebKit::WebIDBCursor::primaryKey):
+        (WebKit::WebIDBCursor::value):
+        * src/IDBCursorBackendProxy.cpp:
+        (WebCore::IDBCursorBackendProxy::primaryKey):
+        (WebCore::IDBCursorBackendProxy::value):
+        * src/IDBCursorBackendProxy.h:
+        * src/WebIDBCursorImpl.cpp:
+        (WebKit::WebIDBCursorImpl::key):
+        (WebKit::WebIDBCursorImpl::primaryKey):
+        (WebKit::WebIDBCursorImpl::value):
+        * src/WebIDBCursorImpl.h:
+
 2011-03-02  Daniel Cheng  <dcheng@chromium.org>
 
         Reviewed by David Levin.
index 9e1ae62..35004e5 100644 (file)
@@ -55,8 +55,23 @@ public:
         WEBKIT_ASSERT_NOT_REACHED();
         return WebIDBKey::createInvalid();
     }
-    // One or the other will set, depending on what type of cursor this is.
-    virtual void value(WebSerializedScriptValue& serializedScriptValue, WebIDBKey& idbKey) const { WEBKIT_ASSERT_NOT_REACHED(); }
+    // FIXME: Remove the following 2 methods and uncomment third after roll.
+    virtual WebSerializedScriptValue value() const
+    {
+        WebSerializedScriptValue serializedScriptValue;
+        WebIDBKey key;
+        value(serializedScriptValue, key);
+        return serializedScriptValue;        
+    }
+    virtual void value(WebSerializedScriptValue& serializedScriptValue, WebIDBKey& key) const
+    {
+        serializedScriptValue = value();
+    }
+    // virtual WebSerializedScriptValue value() const
+    // {
+    //     WEBKIT_ASSERT_NOT_REACHED();
+    //     return WebSerializedScriptValue();
+    // }
 
     virtual void update(const WebSerializedScriptValue&, WebIDBCallbacks*, WebExceptionCode&) { WEBKIT_ASSERT_NOT_REACHED(); }
     virtual void continueFunction(const WebIDBKey&, WebIDBCallbacks*, WebExceptionCode&) { WEBKIT_ASSERT_NOT_REACHED(); }
index ec7bf63..b3b9ea7 100644 (file)
@@ -62,17 +62,14 @@ PassRefPtr<IDBKey> IDBCursorBackendProxy::key() const
     return m_idbCursor->key();
 }
 
-PassRefPtr<IDBAny> IDBCursorBackendProxy::value() const
+PassRefPtr<IDBKey> IDBCursorBackendProxy::primaryKey() const
 {
-    WebKit::WebSerializedScriptValue webScriptValue;
-    WebKit::WebIDBKey webKey;
-    m_idbCursor->value(webScriptValue, webKey);
-    if (!webScriptValue.isNull()) {
-        ASSERT(webKey.type() == WebKit::WebIDBKey::InvalidType);
-        return IDBAny::create<SerializedScriptValue>(webScriptValue);
-    }
-    ASSERT(webKey.type() != WebKit::WebIDBKey::InvalidType);
-    return IDBAny::create<IDBKey>(webKey);
+    return m_idbCursor->primaryKey();
+}
+
+PassRefPtr<SerializedScriptValue> IDBCursorBackendProxy::value() const
+{
+    return m_idbCursor->value();
 }
 
 void IDBCursorBackendProxy::update(PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBCallbacks> callbacks, ExceptionCode& ec)
index 650dded..0c2e1c7 100644 (file)
@@ -44,7 +44,8 @@ public:
 
     virtual unsigned short direction() const;
     virtual PassRefPtr<IDBKey> key() const;
-    virtual PassRefPtr<IDBAny> value() const;
+    virtual PassRefPtr<IDBKey> primaryKey() const;
+    virtual PassRefPtr<SerializedScriptValue> value() const;
     virtual void update(PassRefPtr<SerializedScriptValue>, PassRefPtr<IDBCallbacks>, ExceptionCode&);
     virtual void continueFunction(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>, ExceptionCode&);
     virtual void deleteFunction(PassRefPtr<IDBCallbacks>, ExceptionCode&);
index 5165574..86c4f57 100644 (file)
@@ -52,22 +52,17 @@ unsigned short WebIDBCursorImpl::direction() const
 
 WebIDBKey WebIDBCursorImpl::key() const
 {
-    return WebIDBKey(m_idbCursorBackend->key());
+    return m_idbCursorBackend->key();
 }
 
-void WebIDBCursorImpl::value(WebSerializedScriptValue& serializedScriptValue, WebIDBKey& idbKey) const
+WebIDBKey WebIDBCursorImpl::primaryKey() const
 {
-    // Verify we're starting off with blank slates.
-    ASSERT(serializedScriptValue.isNull());
-    ASSERT(idbKey.type() == WebIDBKey::InvalidType);
+    return m_idbCursorBackend->primaryKey();
+}
 
-    RefPtr<IDBAny> any = m_idbCursorBackend->value();
-    if (any->type() == IDBAny::SerializedScriptValueType)
-        serializedScriptValue.assign(any->serializedScriptValue());
-    else if (any->type() == IDBAny::IDBKeyType)
-        idbKey.assign(any->idbKey());
-    else
-        ASSERT_NOT_REACHED();
+WebSerializedScriptValue WebIDBCursorImpl::value() const
+{
+    return m_idbCursorBackend->value();
 }
 
 void WebIDBCursorImpl::update(const WebSerializedScriptValue& value, WebIDBCallbacks* callbacks, WebExceptionCode& ec)
index 7f8ebd7..de17a99 100644 (file)
@@ -44,7 +44,8 @@ public:
 
     virtual unsigned short direction() const;
     virtual WebIDBKey key() const;
-    virtual void value(WebSerializedScriptValue&, WebIDBKey&) const;
+    virtual WebIDBKey primaryKey() const;
+    virtual WebSerializedScriptValue value() const;
     virtual void update(const WebSerializedScriptValue&, WebIDBCallbacks*, WebExceptionCode&);
     virtual void continueFunction(const WebIDBKey&, WebIDBCallbacks*, WebExceptionCode&);
     virtual void deleteFunction(WebIDBCallbacks*, WebExceptionCode&);