[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

jorlow at chromium.org jorlow at chromium.org
Wed Dec 22 12:50:01 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit c352e1c9761d3043ed5a63dbfa63bec0c53dd573
Author: jorlow at chromium.org <jorlow at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Aug 31 10:46:09 2010 +0000

    2010-08-24  Jeremy Orlow  <jorlow at chromium.org>
    
            Reviewed by Steve Block.
    
            Implement the rest of IDBCursors + make them persistent
            https://bugs.webkit.org/show_bug.cgi?id=44546
    
            * storage/indexeddb/keyrange-expected.txt:
            * storage/indexeddb/objectstore-cursor.html: Added.
            * storage/indexeddb/open-cursor-expected.txt:
            * storage/indexeddb/script-tests/keyrange.js:
            (checkLeftBoundKeyRange):
            ():
            * storage/indexeddb/script-tests/open-cursor.js:
            (emptyCursorSuccess):
    2010-08-24  Jeremy Orlow  <jorlow at chromium.org>
    
            Reviewed by Steve Block.
    
            Implement the rest of IDBCursors + make them persistent
            https://bugs.webkit.org/show_bug.cgi?id=44546
    
            Because the old (memory only) backend didn't support ranges, IDBCursors
            were never really finished.  This completes them on top of SQLite like
            the rest of IndexedDB.
    
            Test: storage/indexeddb/objectstore-cursor.html
    
            * storage/IDBCursor.cpp:
            (WebCore::IDBCursor::value):
            * storage/IDBCursorBackendImpl.cpp:
            (WebCore::IDBCursorBackendImpl::IDBCursorBackendImpl):
            (WebCore::IDBCursorBackendImpl::key):
            (WebCore::IDBCursorBackendImpl::value):
            (WebCore::IDBCursorBackendImpl::update):
            (WebCore::IDBCursorBackendImpl::continueFunction):
            (WebCore::IDBCursorBackendImpl::remove):
            (WebCore::IDBCursorBackendImpl::loadCurrentRow):
            * storage/IDBCursorBackendImpl.h:
            (WebCore::IDBCursorBackendImpl::create):
            * storage/IDBCursorBackendInterface.h:
            * storage/IDBKey.cpp:
            (WebCore::IDBKey::isEqual):
            * storage/IDBKey.h:
            * storage/IDBKeyRange.cpp:
            (WebCore::IDBKeyRange::leftBound):
            (WebCore::IDBKeyRange::rightBound):
            (WebCore::IDBKeyRange::bound):
            * storage/IDBObjectStoreBackendImpl.cpp:
            (WebCore::cursorWhereFragment):
            (WebCore::IDBObjectStoreBackendImpl::openCursor):
    2010-08-24  Jeremy Orlow  <jorlow at chromium.org>
    
            Reviewed by Steve Block.
    
            Implement the rest of IDBCursors + make them persistent
            https://bugs.webkit.org/show_bug.cgi?id=44546
    
            * src/IDBCursorBackendProxy.cpp:
            (WebCore::IDBCursorBackendProxy::value):
            * src/IDBCursorBackendProxy.h:
            * src/WebIDBCursorImpl.cpp:
            (WebKit::WebIDBCursorImpl::value):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@66473 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 48e039f..a9c9b31 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,19 @@
+2010-08-24  Jeremy Orlow  <jorlow at chromium.org>
+
+        Reviewed by Steve Block.
+
+        Implement the rest of IDBCursors + make them persistent
+        https://bugs.webkit.org/show_bug.cgi?id=44546
+
+        * storage/indexeddb/keyrange-expected.txt:
+        * storage/indexeddb/objectstore-cursor.html: Added.
+        * storage/indexeddb/open-cursor-expected.txt:
+        * storage/indexeddb/script-tests/keyrange.js:
+        (checkLeftBoundKeyRange):
+        ():
+        * storage/indexeddb/script-tests/open-cursor.js:
+        (emptyCursorSuccess):
+
 2010-08-31  Mihai Parparita  <mihaip at chromium.org>
 
         Reviewed by Adam Barth.
diff --git a/LayoutTests/storage/indexeddb/keyrange-expected.txt b/LayoutTests/storage/indexeddb/keyrange-expected.txt
index fc61b2f..a510a80 100644
--- a/LayoutTests/storage/indexeddb/keyrange-expected.txt
+++ b/LayoutTests/storage/indexeddb/keyrange-expected.txt
@@ -14,7 +14,7 @@ PASS keyRange.flags is keyRange.SINGLE
 IDBKeyRange.leftBound(10,true)
 PASS keyRange.left is 10
 PASS keyRange.right is null
-PASS keyRange.flags is keyRange.LEFT_OPEN
+PASS keyRange.flags is keyRange.LEFT_OPEN | keyRange.LEFT_BOUND
 IDBKeyRange.leftBound(11,false)
 PASS keyRange.left is 11
 PASS keyRange.right is null
@@ -26,7 +26,7 @@ PASS keyRange.flags is keyRange.LEFT_BOUND
 IDBKeyRange.leftBound('aa',true)
 PASS keyRange.left is 'aa'
 PASS keyRange.right is null
-PASS keyRange.flags is keyRange.LEFT_OPEN
+PASS keyRange.flags is keyRange.LEFT_OPEN | keyRange.LEFT_BOUND
 IDBKeyRange.leftBound('ab',false)
 PASS keyRange.left is 'ab'
 PASS keyRange.right is null
@@ -38,7 +38,7 @@ PASS keyRange.flags is keyRange.LEFT_BOUND
 IDBKeyRange.rightBound(20,true)
 PASS keyRange.right is 20
 PASS keyRange.left is null
-PASS keyRange.flags is keyRange.RIGHT_OPEN
+PASS keyRange.flags is keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND
 IDBKeyRange.rightBound(21,false)
 PASS keyRange.right is 21
 PASS keyRange.left is null
@@ -50,7 +50,7 @@ PASS keyRange.flags is keyRange.RIGHT_BOUND
 IDBKeyRange.rightBound('ba',true)
 PASS keyRange.right is 'ba'
 PASS keyRange.left is null
-PASS keyRange.flags is keyRange.RIGHT_OPEN
+PASS keyRange.flags is keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND
 IDBKeyRange.rightBound('bb',false)
 PASS keyRange.right is 'bb'
 PASS keyRange.left is null
@@ -73,17 +73,17 @@ IDBKeyRange.bound(32,42,false,true)
 PASS keyRange.left is 32
 PASS keyRange.right is 42
 PASS leftFlags is keyRange.LEFT_BOUND
-PASS rightFlags is keyRange.RIGHT_OPEN
+PASS rightFlags is keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND
 IDBKeyRange.bound(33,43,true,false)
 PASS keyRange.left is 33
 PASS keyRange.right is 43
-PASS leftFlags is keyRange.LEFT_OPEN
+PASS leftFlags is keyRange.LEFT_OPEN | keyRange.LEFT_BOUND
 PASS rightFlags is keyRange.RIGHT_BOUND
 IDBKeyRange.bound(34,44,true,true)
 PASS keyRange.left is 34
 PASS keyRange.right is 44
-PASS leftFlags is keyRange.LEFT_OPEN
-PASS rightFlags is keyRange.RIGHT_OPEN
+PASS leftFlags is keyRange.LEFT_OPEN | keyRange.LEFT_BOUND
+PASS rightFlags is keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND
 IDBKeyRange.bound('aaa','aba',false,false)
 PASS keyRange.left is 'aaa'
 PASS keyRange.right is 'aba'
@@ -103,17 +103,17 @@ IDBKeyRange.bound('aad','abd',false,true)
 PASS keyRange.left is 'aad'
 PASS keyRange.right is 'abd'
 PASS leftFlags is keyRange.LEFT_BOUND
-PASS rightFlags is keyRange.RIGHT_OPEN
+PASS rightFlags is keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND
 IDBKeyRange.bound('aae','abe',true,false)
 PASS keyRange.left is 'aae'
 PASS keyRange.right is 'abe'
-PASS leftFlags is keyRange.LEFT_OPEN
+PASS leftFlags is keyRange.LEFT_OPEN | keyRange.LEFT_BOUND
 PASS rightFlags is keyRange.RIGHT_BOUND
 IDBKeyRange.bound('aaf','abf',true,true)
 PASS keyRange.left is 'aaf'
 PASS keyRange.right is 'abf'
-PASS leftFlags is keyRange.LEFT_OPEN
-PASS rightFlags is keyRange.RIGHT_OPEN
+PASS leftFlags is keyRange.LEFT_OPEN | keyRange.LEFT_BOUND
+PASS rightFlags is keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/LayoutTests/storage/indexeddb/objectstore-cursor-expected.txt b/LayoutTests/storage/indexeddb/objectstore-cursor-expected.txt
new file mode 100644
index 0000000..ce5514a
--- /dev/null
+++ b/LayoutTests/storage/indexeddb/objectstore-cursor-expected.txt
@@ -0,0 +1,886 @@
+Test IndexedDB's objectStore.openCursor + the cursor it produces in depth.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+indexedDB.open('someDB', 'some description')
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'abort' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'abort' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+db = event.result
+db.createObjectStore('someObjectStore')
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'abort' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'abort' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+objectStore = event.result
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'abort' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+objectStore.add('', testData[nextToAdd])
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'abort' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'abort' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+objectStore.add('', testData[nextToAdd])
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'abort' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'abort' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+objectStore.add('', testData[nextToAdd])
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'abort' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'abort' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+objectStore.add('', testData[nextToAdd])
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'abort' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'abort' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+objectStore.add('', testData[nextToAdd])
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'abort' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'abort' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+objectStore.add('', testData[nextToAdd])
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'abort' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+Success event fired:
+PASS 'result' in event is true
+PASS 'code' in event is false
+PASS 'message' in event is false
+PASS 'source' in event is true
+PASS event.source != null is true
+PASS 'onsuccess' in event.target is true
+PASS 'onerror' in event.target is true
+PASS 'abort' in event.target is true
+PASS 'readyState' in event.target is true
+PASS event.target.readyState is event.target.DONE
+
+objectStore.add('', testData[nextToAdd])
+PASS 'onsuccess' in result is true
+PASS 'onerror' in result is true
+PASS 'abort' in result is true
+PASS 'readyState' in result is true
+An event should fire shortly...
+
+Scheduling tests...
+Running tests...
+
+Next test: lower open bound is 0; sorted ascending.
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 0; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: upper open bound is 0; sorted ascending.
+PASS event.result is null
+
+Next test: upper bound is 0; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: lower open bound is 0; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result is null
+
+Next test: lower bound is 0; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: upper open bound is 0; sorted descending.
+PASS event.result is null
+
+Next test: upper bound is 0; sorted descending.
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: lower open bound is 0; upper open bound is 6; sorted ascending.
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower open bound is 0; upper bound is 6; sorted ascending.
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 0; upper open bound is 6; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower bound is 0; upper bound is 6; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower open bound is 0; upper open bound is 6; sorted descending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result is null
+
+Next test: lower open bound is 0; upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result is null
+
+Next test: lower bound is 0; upper open bound is 6; sorted descending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: lower bound is 0; upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: lower open bound is 1; sorted ascending.
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 1; sorted ascending.
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: upper open bound is 1; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: upper bound is 1; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result is null
+
+Next test: lower open bound is 1; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result is null
+
+Next test: lower bound is 1; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result is null
+
+Next test: upper open bound is 1; sorted descending.
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: upper bound is 1; sorted descending.
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: lower open bound is 1; upper open bound is 6; sorted ascending.
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower open bound is 1; upper bound is 6; sorted ascending.
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 1; upper open bound is 6; sorted ascending.
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower bound is 1; upper bound is 6; sorted ascending.
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower open bound is 1; upper open bound is 6; sorted descending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result is null
+
+Next test: lower open bound is 1; upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result is null
+
+Next test: lower bound is 1; upper open bound is 6; sorted descending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result is null
+
+Next test: lower bound is 1; upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result is null
+
+Next test: lower open bound is 2; sorted ascending.
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 2; sorted ascending.
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: upper open bound is 2; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result is null
+
+Next test: upper bound is 2; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result is null
+
+Next test: lower open bound is 2; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result is null
+
+Next test: lower bound is 2; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result is null
+
+Next test: upper open bound is 2; sorted descending.
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: upper bound is 2; sorted descending.
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: lower open bound is 2; upper open bound is 6; sorted ascending.
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower open bound is 2; upper bound is 6; sorted ascending.
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 2; upper open bound is 6; sorted ascending.
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower bound is 2; upper bound is 6; sorted ascending.
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower open bound is 2; upper open bound is 6; sorted descending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result is null
+
+Next test: lower open bound is 2; upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result is null
+
+Next test: lower bound is 2; upper open bound is 6; sorted descending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result is null
+
+Next test: lower bound is 2; upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result is null
+
+Next test: lower open bound is 3; sorted ascending.
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 3; sorted ascending.
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: upper open bound is 3; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result is null
+
+Next test: upper bound is 3; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result is null
+
+Next test: lower open bound is 3; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result is null
+
+Next test: lower bound is 3; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result is null
+
+Next test: upper open bound is 3; sorted descending.
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: upper bound is 3; sorted descending.
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: lower open bound is 3; upper open bound is 6; sorted ascending.
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower open bound is 3; upper bound is 6; sorted ascending.
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 3; upper open bound is 6; sorted ascending.
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower bound is 3; upper bound is 6; sorted ascending.
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower open bound is 3; upper open bound is 6; sorted descending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result is null
+
+Next test: lower open bound is 3; upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result is null
+
+Next test: lower bound is 3; upper open bound is 6; sorted descending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result is null
+
+Next test: lower bound is 3; upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result is null
+
+Next test: lower open bound is 4; sorted ascending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 4; sorted ascending.
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: upper open bound is 4; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result is null
+
+Next test: upper bound is 4; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result is null
+
+Next test: lower open bound is 4; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower bound is 4; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result is null
+
+Next test: upper open bound is 4; sorted descending.
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: upper bound is 4; sorted descending.
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: lower open bound is 4; upper open bound is 6; sorted ascending.
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower open bound is 4; upper bound is 6; sorted ascending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 4; upper open bound is 6; sorted ascending.
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower bound is 4; upper bound is 6; sorted ascending.
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower open bound is 4; upper open bound is 6; sorted descending.
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower open bound is 4; upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower bound is 4; upper open bound is 6; sorted descending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result is null
+
+Next test: lower bound is 4; upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result is null
+
+Next test: lower open bound is 5; sorted ascending.
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 5; sorted ascending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: upper open bound is 5; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result is null
+
+Next test: upper bound is 5; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower open bound is 5; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 5; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: upper open bound is 5; sorted descending.
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: upper bound is 5; sorted descending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: lower open bound is 5; upper open bound is 6; sorted ascending.
+PASS event.result is null
+
+Next test: lower open bound is 5; upper bound is 6; sorted ascending.
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 5; upper open bound is 6; sorted ascending.
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower bound is 5; upper bound is 6; sorted ascending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower open bound is 5; upper open bound is 6; sorted descending.
+PASS event.result is null
+
+Next test: lower open bound is 5; upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower bound is 5; upper open bound is 6; sorted descending.
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower bound is 5; upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: lower open bound is 6; sorted ascending.
+PASS event.result is null
+
+Next test: lower bound is 6; sorted ascending.
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: upper open bound is 6; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result is null
+
+Next test: upper bound is 6; sorted ascending.
+PASS event.result.key is testData[0]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower open bound is 6; sorted descending.
+PASS event.result is null
+
+Next test: lower bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: upper open bound is 6; sorted descending.
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result.key is testData[5]
+PASS event.result.key is testData[4]
+PASS event.result.key is testData[3]
+PASS event.result.key is testData[2]
+PASS event.result.key is testData[1]
+PASS event.result.key is testData[0]
+PASS event.result is null
+
+Next test: lower open bound is 6; upper open bound is 6; sorted ascending.
+PASS event.result is null
+
+Next test: lower open bound is 6; upper bound is 6; sorted ascending.
+PASS event.result is null
+
+Next test: lower bound is 6; upper open bound is 6; sorted ascending.
+PASS event.result is null
+
+Next test: lower bound is 6; upper bound is 6; sorted ascending.
+PASS event.result.key is testData[6]
+PASS event.result is null
+
+Next test: lower open bound is 6; upper open bound is 6; sorted descending.
+PASS event.result is null
+
+Next test: lower open bound is 6; upper bound is 6; sorted descending.
+PASS event.result is null
+
+Next test: lower bound is 6; upper open bound is 6; sorted descending.
+PASS event.result is null
+
+Next test: lower bound is 6; upper bound is 6; sorted descending.
+PASS event.result.key is testData[6]
+PASS event.result is null
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/storage/indexeddb/objectstore-cursor.html b/LayoutTests/storage/indexeddb/objectstore-cursor.html
new file mode 100644
index 0000000..bc69b43
--- /dev/null
+++ b/LayoutTests/storage/indexeddb/objectstore-cursor.html
@@ -0,0 +1,209 @@
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+<script src="../../fast/js/resources/js-test-post-function.js"></script>
+<script src="resources/shared.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script> 
+
+description("Test IndexedDB's objectStore.openCursor + the cursor it produces in depth.");
+if (window.layoutTestController)
+    layoutTestController.waitUntilDone();
+ 
+// In order of how it should be sorted by IndexedDB.
+window.testData = [
+    null,
+    2,
+    3,
+    10,
+    // FIXME: Dates.
+    "A bigger string",
+    "The biggest",
+    "a low string"
+];
+ 
+function openDatabase()
+{
+    result = evalAndLog("indexedDB.open('someDB', 'some description')");
+    verifyResult(result);
+    result.onsuccess = openObjectStore;
+    result.onerror = unexpectedErrorCallback;
+}
+ 
+function openObjectStore()
+{
+    verifySuccessEvent(event);
+    window.db = evalAndLog("db = event.result");
+
+    deleteAllObjectStores(db);
+
+    result = evalAndLog("db.createObjectStore('someObjectStore')");
+    verifyResult(result);
+    result.onsuccess = startAddingData;
+    result.onerror = unexpectedErrorCallback;
+}
+ 
+function startAddingData()
+{
+    verifySuccessEvent(event);
+    window.objectStore = evalAndLog("objectStore = event.result");
+
+    window.nextToAdd = 0;
+    addData();
+}
+
+function addData()
+{
+    // We cheat when called for the first time; we're in the context of the objectStore success event.
+    verifySuccessEvent(event);
+
+    result = evalAndLog("objectStore.add('', testData[nextToAdd])");
+    verifyResult(result);
+    result.onsuccess = ++window.nextToAdd < testData.length ? addData : scheduleTests;
+}
+
+function scheduleTests()
+{
+    debug("Scheduling tests...");
+    window.scheduledTests = [];
+    for (var i = 0; i < testData.length; ++i) {
+        /* left bound, is open, right bound, is open, ascending */
+        scheduledTests.unshift([i, true, null, null, true]);
+        scheduledTests.unshift([i, false, null, null, true]);
+        scheduledTests.unshift([null, null, i, true, true]);
+        scheduledTests.unshift([null, null, i, false, true]);
+        scheduledTests.unshift([i, true, null, null, false]);
+        scheduledTests.unshift([i, false, null, null, false]);
+        scheduledTests.unshift([null, null, i, true, false]);
+        scheduledTests.unshift([null, null, i, false, false]);
+        for (var j = 6; j < testData.length; ++j) {
+            scheduledTests.unshift([i, true, j, true, true]);
+            scheduledTests.unshift([i, true, j, false, true]);
+            scheduledTests.unshift([i, false, j, true, true]);
+            scheduledTests.unshift([i, false, j, false, true]);
+            scheduledTests.unshift([i, true, j, true, false]);
+            scheduledTests.unshift([i, true, j, false, false]);
+            scheduledTests.unshift([i, false, j, true, false]);
+            scheduledTests.unshift([i, false, j, false, false]);
+        }
+    }
+ 
+    debug("Running tests...");
+    setTimeout(runNextTest, 0);
+}
+ 
+function runNextTest()
+{
+    if (!scheduledTests.length) {
+        done();
+        return;
+    }
+ 
+    var test = scheduledTests.pop();
+    window.lower = test[0];
+    window.lowerIsOpen = test[1];
+    window.upper = test[2];
+    window.upperIsOpen = test[3];
+    window.ascending = test[4];
+
+    str = "Next test: ";
+    if (lower !== null) {
+        str += "lower ";
+        if (lowerIsOpen)
+            str += "open ";
+        str += "bound is " + lower + "; ";
+    }
+    if (upper !== null) {
+        str += "upper ";
+        if (upperIsOpen)
+            str += "open ";
+        str += "bound is " + upper + "; ";
+    }
+    if (ascending)
+        str += "sorted ascending.";
+    else
+        str += "sorted descending.";
+
+    debug("");
+    debug(str);
+ 
+    if (ascending) {
+        if (lower !== null) {
+            if (!lowerIsOpen)
+                window.expectedIndex = lower;
+            else
+                window.expectedIndex = lower+1;
+        } else
+            window.expectedIndex = 0;
+    } else {
+        if (upper !== null) {
+            if (!upperIsOpen)
+                window.expectedIndex = upper;
+            else
+                window.expectedIndex = upper-1;
+        } else
+            window.expectedIndex = testData.length-1;
+    }
+    testWithinBounds();
+ 
+    var keyRange;
+    if (lower !== null && upper !== null)
+        keyRange = IDBKeyRange.bound(testData[lower], testData[upper], lowerIsOpen, upperIsOpen);
+    else if (lower !== null)
+        keyRange = IDBKeyRange.leftBound(testData[lower], lowerIsOpen);
+    else
+        keyRange = IDBKeyRange.rightBound(testData[upper], upperIsOpen);
+ 
+    // FIXME: Should be IDBCursor.NEXT : IDBCursor.PREV, but we can't do that yet.
+    var request = objectStore.openCursor(keyRange, ascending ? 0 : 2);
+    request.onsuccess = cursorIteration;
+    request.onerror = unexpectedErrorCallback;
+}
+
+function testWithinBounds()
+{
+    if (expectedIndex < 0 || testData.length <= expectedIndex)
+        window.expectedIndex = null;
+    if (lower !== null && expectedIndex < lower)
+        window.expectedIndex = null;
+    if (upper !== null && upper < expectedIndex)
+        window.expectedIndex = null;
+    if (lower !== null && lowerIsOpen && expectedIndex <= lower)
+        window.expectedIndex = null;
+    if (upper !== null && upperIsOpen && upper <= expectedIndex)
+        window.expectedIndex = null;
+}
+ 
+function cursorIteration()
+{
+    if (expectedIndex === null) {
+        shouldBeNull("event.result");
+        setTimeout(runNextTest, 0);
+        return;
+    }
+    if (event.result === null) {
+        testFailed("Event.result should not be null.")
+        setTimeout(runNextTest, 0);
+        return;
+    }
+ 
+    shouldBe("event.result.key", "testData[" + expectedIndex + "]");
+    window.expectedIndex = ascending ? expectedIndex+1 : expectedIndex-1;
+    testWithinBounds();
+
+    request = event.result.continue();
+    // FIXME: The spec says we should not return an IDBRequest and instead re-use the original request.
+    request.onsuccess = cursorIteration;
+    request.onerror = unexpectedErrorCallback;
+}
+ 
+openDatabase(); // The first step.
+var successfullyParsed = true;
+ 
+</script>
+</body>
+</html>
diff --git a/LayoutTests/storage/indexeddb/open-cursor-expected.txt b/LayoutTests/storage/indexeddb/open-cursor-expected.txt
index ac58785..e4ddc69 100644
--- a/LayoutTests/storage/indexeddb/open-cursor-expected.txt
+++ b/LayoutTests/storage/indexeddb/open-cursor-expected.txt
@@ -96,7 +96,6 @@ PASS 'abort' in event.target is true
 PASS 'readyState' in event.target is true
 PASS event.target.readyState is event.target.DONE
 
-PASS event.result is null
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/LayoutTests/storage/indexeddb/script-tests/keyrange.js b/LayoutTests/storage/indexeddb/script-tests/keyrange.js
index 26d283f..907d817 100644
--- a/LayoutTests/storage/indexeddb/script-tests/keyrange.js
+++ b/LayoutTests/storage/indexeddb/script-tests/keyrange.js
@@ -15,7 +15,7 @@ function checkLeftBoundKeyRange(value, open)
     keyRange = evalAndLog("IDBKeyRange.leftBound(" + value + "," + open + ")");
     shouldBe("keyRange.left", "" + value);
     shouldBeNull("keyRange.right");
-    shouldBe("keyRange.flags", open ? "keyRange.LEFT_OPEN" : "keyRange.LEFT_BOUND");
+    shouldBe("keyRange.flags", open ? "keyRange.LEFT_OPEN | keyRange.LEFT_BOUND" : "keyRange.LEFT_BOUND");
 }
 
 function checkRightBoundKeyRange(value, open)
@@ -23,7 +23,7 @@ function checkRightBoundKeyRange(value, open)
     keyRange = evalAndLog("IDBKeyRange.rightBound(" + value + "," + open + ")");
     shouldBe("keyRange.right", "" + value);
     shouldBeNull("keyRange.left");
-    shouldBe("keyRange.flags", open ? "keyRange.RIGHT_OPEN" : "keyRange.RIGHT_BOUND");
+    shouldBe("keyRange.flags", open ? "keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND" : "keyRange.RIGHT_BOUND");
 }
 
 function checkBoundKeyRange(left, right, openLeft, openRight)
@@ -32,9 +32,9 @@ function checkBoundKeyRange(left, right, openLeft, openRight)
     shouldBe("keyRange.left", "" + left);
     shouldBe("keyRange.right", "" + right);
     leftFlags = keyRange.flags & (keyRange.LEFT_OPEN | keyRange.LEFT_BOUND);
-    shouldBe("leftFlags", openLeft ? "keyRange.LEFT_OPEN" : "keyRange.LEFT_BOUND");
+    shouldBe("leftFlags", openLeft ? "keyRange.LEFT_OPEN | keyRange.LEFT_BOUND" : "keyRange.LEFT_BOUND");
     rightFlags = keyRange.flags & (keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND);
-    shouldBe("rightFlags", openRight ? "keyRange.RIGHT_OPEN" : "keyRange.RIGHT_BOUND");
+    shouldBe("rightFlags", openRight ? "keyRange.RIGHT_OPEN | keyRange.RIGHT_BOUND" : "keyRange.RIGHT_BOUND");
 }
 
 function test()
diff --git a/LayoutTests/storage/indexeddb/script-tests/open-cursor.js b/LayoutTests/storage/indexeddb/script-tests/open-cursor.js
index 2fbed5f..53ea96b 100644
--- a/LayoutTests/storage/indexeddb/script-tests/open-cursor.js
+++ b/LayoutTests/storage/indexeddb/script-tests/open-cursor.js
@@ -7,7 +7,6 @@ function emptyCursorSuccess()
     debug("Empty cursor opened successfully.")
     verifySuccessEvent(event);
     // FIXME: check that we can iterate the cursor.
-    shouldBe("event.result", "null");
     done();
 }
 
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index f1dc423..4e75f02 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,40 @@
+2010-08-24  Jeremy Orlow  <jorlow at chromium.org>
+
+        Reviewed by Steve Block.
+
+        Implement the rest of IDBCursors + make them persistent
+        https://bugs.webkit.org/show_bug.cgi?id=44546
+
+        Because the old (memory only) backend didn't support ranges, IDBCursors
+        were never really finished.  This completes them on top of SQLite like
+        the rest of IndexedDB.
+
+        Test: storage/indexeddb/objectstore-cursor.html
+
+        * storage/IDBCursor.cpp:
+        (WebCore::IDBCursor::value):
+        * storage/IDBCursorBackendImpl.cpp:
+        (WebCore::IDBCursorBackendImpl::IDBCursorBackendImpl):
+        (WebCore::IDBCursorBackendImpl::key):
+        (WebCore::IDBCursorBackendImpl::value):
+        (WebCore::IDBCursorBackendImpl::update):
+        (WebCore::IDBCursorBackendImpl::continueFunction):
+        (WebCore::IDBCursorBackendImpl::remove):
+        (WebCore::IDBCursorBackendImpl::loadCurrentRow):
+        * storage/IDBCursorBackendImpl.h:
+        (WebCore::IDBCursorBackendImpl::create):
+        * storage/IDBCursorBackendInterface.h:
+        * storage/IDBKey.cpp:
+        (WebCore::IDBKey::isEqual):
+        * storage/IDBKey.h:
+        * storage/IDBKeyRange.cpp:
+        (WebCore::IDBKeyRange::leftBound):
+        (WebCore::IDBKeyRange::rightBound):
+        (WebCore::IDBKeyRange::bound):
+        * storage/IDBObjectStoreBackendImpl.cpp:
+        (WebCore::cursorWhereFragment):
+        (WebCore::IDBObjectStoreBackendImpl::openCursor):
+
 2010-08-27  John Gregg  <johnnyg at google.com>
 
         Reviewed by David Levin.
diff --git a/WebCore/storage/IDBCursor.cpp b/WebCore/storage/IDBCursor.cpp
index de752f5..ae0d127 100644
--- a/WebCore/storage/IDBCursor.cpp
+++ b/WebCore/storage/IDBCursor.cpp
@@ -59,7 +59,7 @@ PassRefPtr<IDBKey> IDBCursor::key() const
 
 PassRefPtr<IDBAny> IDBCursor::value() const
 {
-    return m_backend->value();
+    return IDBAny::create(m_backend->value().get());
 }
 
 PassRefPtr<IDBRequest> IDBCursor::update(ScriptExecutionContext* context, PassRefPtr<SerializedScriptValue> value)
diff --git a/WebCore/storage/IDBCursorBackendImpl.cpp b/WebCore/storage/IDBCursorBackendImpl.cpp
index d3298b3..4cbac0e 100644
--- a/WebCore/storage/IDBCursorBackendImpl.cpp
+++ b/WebCore/storage/IDBCursorBackendImpl.cpp
@@ -28,23 +28,26 @@
 
 #if ENABLE(INDEXED_DATABASE)
 
-#include "IDBAny.h"
 #include "IDBCallbacks.h"
+#include "IDBDatabaseBackendImpl.h"
+#include "IDBDatabaseError.h"
+#include "IDBDatabaseException.h"
 #include "IDBKeyRange.h"
 #include "IDBObjectStoreBackendImpl.h"
 #include "IDBRequest.h"
 #include "SQLiteDatabase.h"
+#include "SQLiteStatement.h"
 #include "SerializedScriptValue.h"
 
 namespace WebCore {
 
-IDBCursorBackendImpl::IDBCursorBackendImpl(PassRefPtr<IDBObjectStoreBackendImpl> idbObjectStore, PassRefPtr<IDBKeyRange> keyRange, IDBCursor::Direction direction, PassRefPtr<IDBKey> key, PassRefPtr<SerializedScriptValue> value)
+IDBCursorBackendImpl::IDBCursorBackendImpl(PassRefPtr<IDBObjectStoreBackendImpl> idbObjectStore, PassRefPtr<IDBKeyRange> keyRange, IDBCursor::Direction direction, PassOwnPtr<SQLiteStatement> query)
     : m_idbObjectStore(idbObjectStore)
     , m_keyRange(keyRange)
     , m_direction(direction)
-    , m_key(key)
-    , m_value(IDBAny::create(value.get()))
+    , m_query(query)
 {
+    loadCurrentRow();
 }
 
 IDBCursorBackendImpl::~IDBCursorBackendImpl()
@@ -58,30 +61,106 @@ unsigned short IDBCursorBackendImpl::direction() const
 
 PassRefPtr<IDBKey> IDBCursorBackendImpl::key() const
 {
-    return m_key;
+    
+    return m_currentKey;
 }
 
-PassRefPtr<IDBAny> IDBCursorBackendImpl::value() const
+PassRefPtr<SerializedScriptValue> IDBCursorBackendImpl::value() const
 {
-    return m_value;
+    return m_currentValue;
 }
 
-void IDBCursorBackendImpl::update(PassRefPtr<SerializedScriptValue>, PassRefPtr<IDBCallbacks>)
+void IDBCursorBackendImpl::update(PassRefPtr<SerializedScriptValue> prpValue, PassRefPtr<IDBCallbacks> callbacks)
 {
-    // FIXME: Implement this method.
-    ASSERT_NOT_REACHED();
+    RefPtr<SerializedScriptValue> value = prpValue;
+
+    if (!m_query || m_currentId == InvalidId) {
+        // FIXME: Use the proper error code when it's specced.
+        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Operation not possible."));
+        return;
+    }
+
+    String sql = "UPDATE ObjectStoreData SET value = ? WHERE id = ?";
+    SQLiteStatement updateQuery(m_idbObjectStore->database()->sqliteDatabase(), sql);
+    
+    bool ok = updateQuery.prepare() == SQLResultOk;
+    ASSERT_UNUSED(ok, ok); // FIXME: Better error handling.
+    updateQuery.bindText(1, value->toWireString());
+    updateQuery.bindInt64(2, m_currentId);
+    ok = updateQuery.step() == SQLResultDone;
+    ASSERT_UNUSED(ok, ok); // FIXME: Better error handling.
+
+    m_currentValue = value.release();
+    callbacks->onSuccess();
+}
+
+void IDBCursorBackendImpl::continueFunction(PassRefPtr<IDBKey> prpKey, PassRefPtr<IDBCallbacks> callbacks)
+{
+    RefPtr<IDBKey> key = prpKey;
+    while (true) {
+        if (!m_query || m_query->step() != SQLResultRow) {
+            m_query = 0;
+            m_currentId = InvalidId;
+            m_currentKey = 0;
+            m_currentValue = 0;
+            callbacks->onSuccess();
+            return;
+        }
+
+        RefPtr<IDBKey> oldKey = m_currentKey;
+        loadCurrentRow();
+
+        // If a key was supplied, we must loop until we find that key (or hit the end).
+        if (key && !key->isEqual(m_currentKey.get()))
+            continue;
+
+        // If we don't have a uniqueness constraint, we can stop now.
+        if (m_direction == IDBCursor::NEXT || m_direction == IDBCursor::PREV)
+            break;
+        if (!m_currentKey->isEqual(oldKey.get()))
+            break;
+    }
+
+    callbacks->onSuccess(this);
 }
 
-void IDBCursorBackendImpl::continueFunction(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>)
+void IDBCursorBackendImpl::remove(PassRefPtr<IDBCallbacks> callbacks)
 {
-    // FIXME: Implement this method.
-    ASSERT_NOT_REACHED();
+    if (!m_query || m_currentId == InvalidId) {
+        // FIXME: Use the proper error code when it's specced.
+        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Operation not possible."));
+        return;
+    }
+
+    String sql = "DELETE FROM ObjectStoreData WHERE id = ?";
+    SQLiteStatement deleteQuery(m_idbObjectStore->database()->sqliteDatabase(), sql);
+    
+    bool ok = deleteQuery.prepare() == SQLResultOk;
+    ASSERT_UNUSED(ok, ok); // FIXME: Better error handling.
+    deleteQuery.bindInt64(1, m_currentId);
+    ok = deleteQuery.step() == SQLResultDone;
+    ASSERT_UNUSED(ok, ok); // FIXME: Better error handling.
+
+    m_currentId = InvalidId;
+    m_currentKey = 0;
+    m_currentValue = 0;
+    callbacks->onSuccess();
 }
 
-void IDBCursorBackendImpl::remove(PassRefPtr<IDBCallbacks>)
+void IDBCursorBackendImpl::loadCurrentRow()
 {
-    // FIXME: Implement this method.
-    ASSERT_NOT_REACHED();
+    // The column numbers depend on the query in IDBObjectStoreBackendImpl::openCursor.
+    m_currentId = m_query->getColumnInt64(0);
+    if (!m_query->isColumnNull(1))
+        m_currentKey = IDBKey::create(m_query->getColumnText(1));
+    else if (!m_query->isColumnNull(2)) {
+        ASSERT_NOT_REACHED(); // FIXME: Implement date.
+        m_currentKey = IDBKey::create();
+    } else if (!m_query->isColumnNull(3))
+        m_currentKey = IDBKey::create(m_query->getColumnInt(3));
+    else
+        m_currentKey = IDBKey::create();
+    m_currentValue = SerializedScriptValue::createFromWire(m_query->getColumnText(4));
 }
 
 } // namespace WebCore
diff --git a/WebCore/storage/IDBCursorBackendImpl.h b/WebCore/storage/IDBCursorBackendImpl.h
index 9ef62fe..3f7c4aa 100644
--- a/WebCore/storage/IDBCursorBackendImpl.h
+++ b/WebCore/storage/IDBCursorBackendImpl.h
@@ -31,37 +31,46 @@
 
 #include "IDBCursor.h"
 #include "IDBCursorBackendInterface.h"
+#include <wtf/OwnPtr.h>
+#include <wtf/PassOwnPtr.h>
 #include <wtf/RefPtr.h>
 
 namespace WebCore {
 
 class IDBKeyRange;
 class IDBObjectStoreBackendImpl;
+class SQLiteStatement;
 class SerializedScriptValue;
 
 class IDBCursorBackendImpl : public IDBCursorBackendInterface {
 public:
-    static PassRefPtr<IDBCursorBackendImpl> create(PassRefPtr<IDBObjectStoreBackendImpl> objectStore, PassRefPtr<IDBKeyRange> keyRange, IDBCursor::Direction direction, PassRefPtr<IDBKey> key, PassRefPtr<SerializedScriptValue> value)
+    static PassRefPtr<IDBCursorBackendImpl> create(PassRefPtr<IDBObjectStoreBackendImpl> objectStore, PassRefPtr<IDBKeyRange> keyRange, IDBCursor::Direction direction, PassOwnPtr<SQLiteStatement> query)
     {
-        return adoptRef(new IDBCursorBackendImpl(objectStore, keyRange, direction, key, value));
+        return adoptRef(new IDBCursorBackendImpl(objectStore, keyRange, direction, query));
     }
     virtual ~IDBCursorBackendImpl();
 
     virtual unsigned short direction() const;
     virtual PassRefPtr<IDBKey> key() const;
-    virtual PassRefPtr<IDBAny> value() const;
+    virtual PassRefPtr<SerializedScriptValue> value() const;
     virtual void update(PassRefPtr<SerializedScriptValue>, PassRefPtr<IDBCallbacks>);
     virtual void continueFunction(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>);
     virtual void remove(PassRefPtr<IDBCallbacks>);
 
 private:
-    IDBCursorBackendImpl(PassRefPtr<IDBObjectStoreBackendImpl>, PassRefPtr<IDBKeyRange>, IDBCursor::Direction, PassRefPtr<IDBKey>, PassRefPtr<SerializedScriptValue>);
+    IDBCursorBackendImpl(PassRefPtr<IDBObjectStoreBackendImpl>, PassRefPtr<IDBKeyRange>, IDBCursor::Direction, PassOwnPtr<SQLiteStatement> query);
+
+    void loadCurrentRow();
+
+    static const int64_t InvalidId = -1;
 
     RefPtr<IDBObjectStoreBackendImpl> m_idbObjectStore;
     RefPtr<IDBKeyRange> m_keyRange;
     IDBCursor::Direction m_direction;
-    RefPtr<IDBKey> m_key;
-    RefPtr<IDBAny> m_value;
+    OwnPtr<SQLiteStatement> m_query;
+    int64_t m_currentId;
+    RefPtr<IDBKey> m_currentKey;
+    RefPtr<SerializedScriptValue> m_currentValue;
 };
 
 } // namespace WebCore
diff --git a/WebCore/storage/IDBCursorBackendInterface.h b/WebCore/storage/IDBCursorBackendInterface.h
index 4b209c4..acea955 100644
--- a/WebCore/storage/IDBCursorBackendInterface.h
+++ b/WebCore/storage/IDBCursorBackendInterface.h
@@ -46,7 +46,7 @@ public:
 
     virtual unsigned short direction() const = 0;
     virtual PassRefPtr<IDBKey> key() const = 0;
-    virtual PassRefPtr<IDBAny> value() const = 0;
+    virtual PassRefPtr<SerializedScriptValue> value() const = 0;
 
     virtual void update(PassRefPtr<SerializedScriptValue>, PassRefPtr<IDBCallbacks>) = 0;
     virtual void continueFunction(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks>) = 0;
diff --git a/WebCore/storage/IDBKey.cpp b/WebCore/storage/IDBKey.cpp
index 8ec5dfd..50c4c46 100644
--- a/WebCore/storage/IDBKey.cpp
+++ b/WebCore/storage/IDBKey.cpp
@@ -53,6 +53,25 @@ IDBKey::~IDBKey()
 {
 }
 
+bool IDBKey::isEqual(IDBKey* other)
+{
+    if (!other || other->m_type != m_type)
+        return false;
+
+    switch (m_type) {
+    case StringType:
+        return other->m_string == m_string;
+    // FIXME: Implement dates.
+    case NumberType:
+        return other->m_number == m_number;
+    case NullType:
+        return true;
+    }
+
+    ASSERT_NOT_REACHED();
+    return false;
+}
+
 } // namespace WebCore
 
 #endif
diff --git a/WebCore/storage/IDBKey.h b/WebCore/storage/IDBKey.h
index a84ea6a..228b4a4 100644
--- a/WebCore/storage/IDBKey.h
+++ b/WebCore/storage/IDBKey.h
@@ -71,6 +71,8 @@ public:
         return m_number;
     }
 
+    bool isEqual(IDBKey* other);
+
 private:
     IDBKey();
     explicit IDBKey(int32_t);
diff --git a/WebCore/storage/IDBKeyRange.cpp b/WebCore/storage/IDBKeyRange.cpp
index dfcae19..4088b34 100644
--- a/WebCore/storage/IDBKeyRange.cpp
+++ b/WebCore/storage/IDBKeyRange.cpp
@@ -47,18 +47,27 @@ PassRefPtr<IDBKeyRange> IDBKeyRange::only(PassRefPtr<IDBKey> prpValue)
 
 PassRefPtr<IDBKeyRange> IDBKeyRange::leftBound(PassRefPtr<IDBKey> bound, bool open)
 {
-    return IDBKeyRange::create(bound, IDBKey::create(), open ? IDBKeyRange::LEFT_OPEN : IDBKeyRange::LEFT_BOUND);
+    unsigned short flags = IDBKeyRange::LEFT_BOUND;
+    if (open)
+        flags |= IDBKeyRange::LEFT_OPEN;
+    return IDBKeyRange::create(bound, IDBKey::create(), flags);
 }
 
 PassRefPtr<IDBKeyRange> IDBKeyRange::rightBound(PassRefPtr<IDBKey> bound, bool open)
 {
-    return IDBKeyRange::create(IDBKey::create(), bound, open ? IDBKeyRange::RIGHT_OPEN : IDBKeyRange::RIGHT_BOUND);
+    unsigned short flags = IDBKeyRange::RIGHT_BOUND;
+    if (open)
+        flags |= IDBKeyRange::RIGHT_OPEN;
+    return IDBKeyRange::create(IDBKey::create(), bound, flags);
 }
 
 PassRefPtr<IDBKeyRange> IDBKeyRange::bound(PassRefPtr<IDBKey> left, PassRefPtr<IDBKey> right, bool openLeft, bool openRight)
 {
-    unsigned short flags = openLeft ? IDBKeyRange::LEFT_OPEN : IDBKeyRange::LEFT_BOUND;
-    flags |= openRight ? IDBKeyRange::RIGHT_OPEN : IDBKeyRange::RIGHT_BOUND;
+    unsigned short flags = IDBKeyRange::LEFT_BOUND | IDBKeyRange::RIGHT_BOUND;
+    if (openLeft)
+        flags |= IDBKeyRange::LEFT_OPEN;
+    if (openRight)
+        flags |= IDBKeyRange::RIGHT_OPEN;
     return IDBKeyRange::create(left, right, flags);
 }
 
diff --git a/WebCore/storage/IDBObjectStoreBackendImpl.cpp b/WebCore/storage/IDBObjectStoreBackendImpl.cpp
index 1b9b76b..6c65bcb 100755
--- a/WebCore/storage/IDBObjectStoreBackendImpl.cpp
+++ b/WebCore/storage/IDBObjectStoreBackendImpl.cpp
@@ -265,23 +265,89 @@ void IDBObjectStoreBackendImpl::removeIndex(const String& name, PassRefPtr<IDBCa
     callbacks->onSuccess();
 }
 
-void IDBObjectStoreBackendImpl::openCursor(PassRefPtr<IDBKeyRange> range, unsigned short direction, PassRefPtr<IDBCallbacks> callbacks)
+static String leftCursorWhereFragment(IDBKey::Type type, String comparisonOperator)
 {
-    // FIXME: Fully implement.
+    switch (type) {
+    case IDBKey::StringType:
+        return "? " + comparisonOperator + " keyString  AND  ";
+    // FIXME: Implement date.
+    case IDBKey::NumberType:
+        return "(? " + comparisonOperator + " keyNumber  OR  NOT keyString IS NULL  OR  NOT keyDate IS NULL)  AND  ";
+    case IDBKey::NullType:
+        if (comparisonOperator == "<")
+            return "NOT(keyString IS NULL  AND  keyDate IS NULL  AND  keyNumber IS NULL)  AND  ";
+        return ""; // If it's =, the upper bound half will do the constraining. If it's <=, then that's a no-op.
+    }
+    ASSERT_NOT_REACHED();
+    return "";
+}
 
-    RefPtr<IDBKey> key = range->left();
-    SQLiteStatement query(sqliteDatabase(), "SELECT id, value FROM ObjectStoreData " + whereClause(key->type()));
-    bool ok = query.prepare() == SQLResultOk;
-    ASSERT_UNUSED(ok, ok); // FIXME: Better error handling?
+static String rightCursorWhereFragment(IDBKey::Type type, String comparisonOperator)
+{
+    switch (type) {
+    case IDBKey::StringType:
+        return "(keyString " + comparisonOperator + " ?  OR  keyString IS NULL)  AND  ";
+    // FIXME: Implement date.
+    case IDBKey::NumberType:
+        return "(keyNumber " + comparisonOperator + " ? OR keyNumber IS NULL)  AND  keyString IS NULL  AND  keyDate IS NULL  AND  ";
+    case IDBKey::NullType:
+        if (comparisonOperator == "<")
+            return "0 != 0  AND  ";
+        return "keyString IS NULL  AND  keyDate IS NULL  AND  keyNumber IS NULL  AND  ";
+    }
+    ASSERT_NOT_REACHED();
+    return "";
+}
 
-    bindWhereClause(query, m_id, key.get());
-    if (query.step() != SQLResultRow) {
+void IDBObjectStoreBackendImpl::openCursor(PassRefPtr<IDBKeyRange> range, unsigned short tmpDirection, PassRefPtr<IDBCallbacks> callbacks)
+{
+    String lowerEquality;
+    if (range->flags() & IDBKeyRange::LEFT_OPEN)
+        lowerEquality = "<";
+    else if (range->flags() & IDBKeyRange::LEFT_BOUND)
+        lowerEquality = "<=";
+    else
+        lowerEquality = "=";
+
+    String upperEquality;
+    if (range->flags() & IDBKeyRange::RIGHT_OPEN)
+        upperEquality = "<";
+    else if (range->flags() & IDBKeyRange::RIGHT_BOUND)
+        upperEquality = "<=";
+    else
+        upperEquality = "=";
+
+    // If you change the order of this select, you'll need to change it in IDBCursorBackendImpl.cpp as well.
+    String sql = "SELECT id, keyString, keyDate, keyNumber, value FROM ObjectStoreData WHERE ";
+    if (range->flags() & IDBKeyRange::LEFT_BOUND || range->flags() == IDBKeyRange::SINGLE)
+        sql += leftCursorWhereFragment(range->left()->type(), lowerEquality);
+    if (range->flags() & IDBKeyRange::RIGHT_BOUND || range->flags() == IDBKeyRange::SINGLE)
+        sql += rightCursorWhereFragment(range->right()->type(), upperEquality);
+    sql += "objectStoreId = ? ORDER BY ";
+
+    IDBCursor::Direction direction = static_cast<IDBCursor::Direction>(tmpDirection);
+    if (direction == IDBCursor::NEXT || direction == IDBCursor::NEXT_NO_DUPLICATE)
+        sql += "keyString, keyDate, keyNumber";
+    else
+        sql += "keyString DESC, keyDate DESC, keyNumber DESC";
+
+    OwnPtr<SQLiteStatement> query = adoptPtr(new SQLiteStatement(sqliteDatabase(), sql));
+    bool ok = query->prepare() == SQLResultOk;
+    ASSERT(ok); // FIXME: Better error handling?
+
+    int currentColumn = 1;
+    if (range->flags() & IDBKeyRange::LEFT_BOUND || range->flags() == IDBKeyRange::SINGLE)
+        currentColumn += bindKey(*query, currentColumn, range->left().get());
+    if (range->flags() & IDBKeyRange::RIGHT_BOUND || range->flags() == IDBKeyRange::SINGLE)
+        currentColumn += bindKey(*query, currentColumn, range->right().get());
+    query->bindInt64(currentColumn, m_id);
+
+    if (query->step() != SQLResultRow) {
         callbacks->onSuccess();
         return;
     }
 
-    RefPtr<SerializedScriptValue> value = SerializedScriptValue::createFromWire(query.getColumnText(1));
-    RefPtr<IDBCursorBackendInterface> cursor = IDBCursorBackendImpl::create(this, range, static_cast<IDBCursor::Direction>(direction), key.release(), value.release());
+    RefPtr<IDBCursorBackendInterface> cursor = IDBCursorBackendImpl::create(this, range, direction, query.release());
     callbacks->onSuccess(cursor.release());
 }
 
diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index 67fc9aa..1f5b2f7 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,16 @@
+2010-08-24  Jeremy Orlow  <jorlow at chromium.org>
+
+        Reviewed by Steve Block.
+
+        Implement the rest of IDBCursors + make them persistent
+        https://bugs.webkit.org/show_bug.cgi?id=44546
+
+        * src/IDBCursorBackendProxy.cpp:
+        (WebCore::IDBCursorBackendProxy::value):
+        * src/IDBCursorBackendProxy.h:
+        * src/WebIDBCursorImpl.cpp:
+        (WebKit::WebIDBCursorImpl::value):
+
 2010-08-27  John Gregg  <johnnyg at google.com>
 
         Reviewed by David Levin.
diff --git a/WebKit/chromium/src/IDBCursorBackendProxy.cpp b/WebKit/chromium/src/IDBCursorBackendProxy.cpp
index fff00b7..b4711eb 100644
--- a/WebKit/chromium/src/IDBCursorBackendProxy.cpp
+++ b/WebKit/chromium/src/IDBCursorBackendProxy.cpp
@@ -60,10 +60,9 @@ PassRefPtr<IDBKey> IDBCursorBackendProxy::key() const
     return m_idbCursor->key();
 }
 
-PassRefPtr<IDBAny> IDBCursorBackendProxy::value() const
+PassRefPtr<SerializedScriptValue> IDBCursorBackendProxy::value() const
 {
-    RefPtr<SerializedScriptValue> value = PassRefPtr<SerializedScriptValue>(m_idbCursor->value());
-    return IDBAny::create(value.get());
+    return m_idbCursor->value();
 }
 
 void IDBCursorBackendProxy::update(PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBCallbacks> callbacks)
diff --git a/WebKit/chromium/src/IDBCursorBackendProxy.h b/WebKit/chromium/src/IDBCursorBackendProxy.h
index d8b621a..8af27cf 100644
--- a/WebKit/chromium/src/IDBCursorBackendProxy.h
+++ b/WebKit/chromium/src/IDBCursorBackendProxy.h
@@ -44,7 +44,7 @@ public:
 
     virtual unsigned short direction() const;
     virtual PassRefPtr<IDBKey> key() const;
-    virtual PassRefPtr<IDBAny> value() const;
+    virtual PassRefPtr<SerializedScriptValue> value() const;
     virtual void update(PassRefPtr<SerializedScriptValue>, PassRefPtr<IDBCallbacks>);
     virtual void continueFunction(PassRefPtr<IDBKey>, PassRefPtr<IDBCallbacks>);
     virtual void remove(PassRefPtr<IDBCallbacks>);
diff --git a/WebKit/chromium/src/WebIDBCursorImpl.cpp b/WebKit/chromium/src/WebIDBCursorImpl.cpp
index 1ade687..b74d680 100644
--- a/WebKit/chromium/src/WebIDBCursorImpl.cpp
+++ b/WebKit/chromium/src/WebIDBCursorImpl.cpp
@@ -57,7 +57,7 @@ WebIDBKey WebIDBCursorImpl::key() const
 
 WebSerializedScriptValue WebIDBCursorImpl::value() const
 {
-    return m_idbCursorBackend->value()->serializedScriptValue();
+    return m_idbCursorBackend->value();
 }
 
 void WebIDBCursorImpl::update(const WebSerializedScriptValue& value, WebIDBCallbacks* callbacks)

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list