Modern IDB: storage/indexeddb/cursor-continue-validity.html fails.
authorbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 2 Feb 2016 20:51:46 +0000 (20:51 +0000)
committerbeidson@apple.com <beidson@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 2 Feb 2016 20:51:46 +0000 (20:51 +0000)
https://bugs.webkit.org/show_bug.cgi?id=153791

Reviewed by Alex Christensen.

Source/WebCore:

No new tests (Existing test now unskipped).

There was a preexisting check in the SQLite cursor for remembering the current record and
refusing to refetch it.

This check was causing this bug, because we needed to refetch the current record.

Removing the check (and its associated flag) doesn't regress any other test, and fixes this one.

* Modules/indexeddb/server/SQLiteIDBCursor.cpp:
(WebCore::IDBServer::SQLiteIDBCursor::resetAndRebindStatement):
(WebCore::IDBServer::SQLiteIDBCursor::internalAdvanceOnce):
* Modules/indexeddb/server/SQLiteIDBCursor.h:

LayoutTests:

In addition to unskipping the test, I augmented it to print out more of what was going on.

The additional printed info is what helped me track down the bug, and will make it more
likely to catch any future regressions.

* platform/mac-wk1/TestExpectations:
* storage/indexeddb/cursor-continue-validity-expected.txt:
* storage/indexeddb/cursor-continue-validity-private-expected.txt:
* storage/indexeddb/resources/cursor-continue-validity.js:

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

LayoutTests/ChangeLog
LayoutTests/platform/mac-wk1/TestExpectations
LayoutTests/storage/indexeddb/cursor-continue-validity-expected.txt
LayoutTests/storage/indexeddb/cursor-continue-validity-private-expected.txt
LayoutTests/storage/indexeddb/resources/cursor-continue-validity.js
Source/WebCore/ChangeLog
Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp
Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.h

index e46b631..fc75eb7 100644 (file)
@@ -1,3 +1,20 @@
+2016-02-02  Brady Eidson  <beidson@apple.com>
+
+        Modern IDB: storage/indexeddb/cursor-continue-validity.html fails.
+        https://bugs.webkit.org/show_bug.cgi?id=153791
+
+        Reviewed by Alex Christensen.
+
+        In addition to unskipping the test, I augmented it to print out more of what was going on.
+        
+        The additional printed info is what helped me track down the bug, and will make it more
+        likely to catch any future regressions.
+        
+        * platform/mac-wk1/TestExpectations:
+        * storage/indexeddb/cursor-continue-validity-expected.txt:
+        * storage/indexeddb/cursor-continue-validity-private-expected.txt:
+        * storage/indexeddb/resources/cursor-continue-validity.js:
+
 2016-02-01  Dave Hyatt  <hyatt@apple.com>
 
         Add a line grid pagination SPI to WebKit.
index fbe7f94..9cf597b 100644 (file)
@@ -256,9 +256,6 @@ inspector/script-profiler/event-type-API.html
 # Completes successfully after ~40 seconds in a debug build with logging
 imported/w3c/indexeddb/idbindex-multientry-big.htm [ Failure ]
 
-# Cursor iterates one less time than expected
-storage/indexeddb/cursor-continue-validity.html [ Failure ]
-
 # Integer part of the test iterates 0, 1, 2, Inf, -1, -2, -Inf - Should be in order from -Inf to Inf.
 storage/indexeddb/cursor-primary-key-order.html [ Failure ]
 
index fdebe46..ef954f1 100644 (file)
@@ -783,151 +783,433 @@ Checking modification
 indexObject.openCursor(null, 'next')
 self.continueValue = 0
 cursor = event.target.result
+
+Index key is: 0
+Primary key is: 0
+Value.x is: 0
+Continue value: 1
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 1
+Primary key is: 1
+Value.x is: 1
+Continue value: 2
+New Index key for primary key 1 is 102
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 2
+Primary key is: 2
+Value.x is: 2
+Continue value: 3
+Deleting primary key 2 which currently has Index key 2
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 3
+Primary key is: 3
+Value.x is: 3
+Continue value: 4
+New Index key for primary key 3 is 104
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 4
+Primary key is: 4
+Value.x is: 4
+Continue value: 5
 cursor.continue()
+Expecting exception setting new Index key for primary key 4 to 105
 Expecting exception from cursor.update({ x: 100 + self.continueValue})
 PASS Exception was thrown.
 PASS code is DOMException.INVALID_STATE_ERR
 Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
 cursor = event.target.result
+
+Index key is: 5
+Primary key is: 5
+Value.x is: 5
+Continue value: 6
+New Index key for primary key 5 is 106
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 6
+Primary key is: 6
+Value.x is: 6
+Continue value: 7
 cursor.continue()
+Expecting exception deleting primary key 6 which currently has Index key 6
 Expecting exception from cursor.delete()
 PASS Exception was thrown.
 PASS code is DOMException.INVALID_STATE_ERR
 Exception message: Failed to execute 'delete' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
 cursor = event.target.result
+
+Index key is: 7
+Primary key is: 7
+Value.x is: 7
+Continue value: 8
+New Index key for primary key 7 is 108
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 8
+Primary key is: 8
+Value.x is: 8
+Continue value: 9
+Deleting primary key 8 which currently has Index key 8
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 9
+Primary key is: 9
+Value.x is: 9
+Continue value: 10
+New Index key for primary key 9 is 110
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 10
+Primary key is: 10
+Value.x is: 10
+Continue value: 11
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 11
+Primary key is: 11
+Value.x is: 11
+Continue value: 12
+New Index key for primary key 11 is 112
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 12
+Primary key is: 12
+Value.x is: 12
+Continue value: 13
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 13
+Primary key is: 13
+Value.x is: 13
+Continue value: 14
+New Index key for primary key 13 is 114
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 14
+Primary key is: 14
+Value.x is: 14
+Continue value: 15
+Deleting primary key 14 which currently has Index key 14
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 15
+Primary key is: 15
+Value.x is: 15
+Continue value: 16
+New Index key for primary key 15 is 116
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 16
+Primary key is: 16
+Value.x is: 16
+Continue value: 17
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 17
+Primary key is: 17
+Value.x is: 17
+Continue value: 18
+New Index key for primary key 17 is 118
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 18
+Primary key is: 18
+Value.x is: 18
+Continue value: 19
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 19
+Primary key is: 19
+Value.x is: 19
+Continue value: 20
+New Index key for primary key 19 is 120
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 20
+Primary key is: 20
+Value.x is: 20
+Continue value: 21
+Deleting primary key 20 which currently has Index key 20
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 21
+Primary key is: 21
+Value.x is: 21
+Continue value: 22
+New Index key for primary key 21 is 122
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 22
+Primary key is: 22
+Value.x is: 22
+Continue value: 23
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 23
+Primary key is: 23
+Value.x is: 23
+Continue value: 24
+New Index key for primary key 23 is 124
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 24
+Primary key is: 24
+Value.x is: 24
+Continue value: 25
 cursor.continue()
+Expecting exception setting new Index key for primary key 24 to 125
 Expecting exception from cursor.update({ x: 100 + self.continueValue})
 PASS Exception was thrown.
 PASS code is DOMException.INVALID_STATE_ERR
 Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
 cursor = event.target.result
+
+Index key is: 102
+Primary key is: 1
+Value.x is: 102
+Continue value: 26
+New Index key for primary key 1 is 126
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 104
+Primary key is: 3
+Value.x is: 104
+Continue value: 27
+Deleting primary key 3 which currently has Index key 104
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 106
+Primary key is: 5
+Value.x is: 106
+Continue value: 28
+New Index key for primary key 5 is 128
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 108
+Primary key is: 7
+Value.x is: 108
+Continue value: 29
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 110
+Primary key is: 9
+Value.x is: 110
+Continue value: 30
+New Index key for primary key 9 is 130
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 112
+Primary key is: 11
+Value.x is: 112
+Continue value: 31
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 114
+Primary key is: 13
+Value.x is: 114
+Continue value: 32
+New Index key for primary key 13 is 132
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 116
+Primary key is: 15
+Value.x is: 116
+Continue value: 33
+Deleting primary key 15 which currently has Index key 116
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 118
+Primary key is: 17
+Value.x is: 118
+Continue value: 34
+New Index key for primary key 17 is 134
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 120
+Primary key is: 19
+Value.x is: 120
+Continue value: 35
 cursor.continue()
+Expecting exception setting new Index key for primary key 19 to 135
 Expecting exception from cursor.update({ x: 100 + self.continueValue})
 PASS Exception was thrown.
 PASS code is DOMException.INVALID_STATE_ERR
 Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
 cursor = event.target.result
+
+Index key is: 122
+Primary key is: 21
+Value.x is: 122
+Continue value: 36
+New Index key for primary key 21 is 136
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 124
+Primary key is: 23
+Value.x is: 124
+Continue value: 37
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 126
+Primary key is: 1
+Value.x is: 126
+Continue value: 38
+New Index key for primary key 1 is 138
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 128
+Primary key is: 5
+Value.x is: 128
+Continue value: 39
+Deleting primary key 5 which currently has Index key 128
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 130
+Primary key is: 9
+Value.x is: 130
+Continue value: 40
+New Index key for primary key 9 is 140
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 132
+Primary key is: 13
+Value.x is: 132
+Continue value: 41
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 134
+Primary key is: 17
+Value.x is: 134
+Continue value: 42
+New Index key for primary key 17 is 142
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 136
+Primary key is: 21
+Value.x is: 136
+Continue value: 43
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 138
+Primary key is: 1
+Value.x is: 138
+Continue value: 44
+New Index key for primary key 1 is 144
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 140
+Primary key is: 9
+Value.x is: 140
+Continue value: 45
+Deleting primary key 9 which currently has Index key 140
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 142
+Primary key is: 17
+Value.x is: 142
+Continue value: 46
+New Index key for primary key 17 is 146
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 144
+Primary key is: 1
+Value.x is: 144
+Continue value: 47
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 146
+Primary key is: 17
+Value.x is: 146
+Continue value: 48
+New Index key for primary key 17 is 148
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 148
+Primary key is: 17
+Value.x is: 148
+Continue value: 49
 cursor.continue()
+Expecting exception deleting primary key 17 which currently has Index key 148
 Expecting exception from cursor.delete()
 PASS Exception was thrown.
 PASS code is DOMException.INVALID_STATE_ERR
index fdebe46..ef954f1 100644 (file)
@@ -783,151 +783,433 @@ Checking modification
 indexObject.openCursor(null, 'next')
 self.continueValue = 0
 cursor = event.target.result
+
+Index key is: 0
+Primary key is: 0
+Value.x is: 0
+Continue value: 1
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 1
+Primary key is: 1
+Value.x is: 1
+Continue value: 2
+New Index key for primary key 1 is 102
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 2
+Primary key is: 2
+Value.x is: 2
+Continue value: 3
+Deleting primary key 2 which currently has Index key 2
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 3
+Primary key is: 3
+Value.x is: 3
+Continue value: 4
+New Index key for primary key 3 is 104
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 4
+Primary key is: 4
+Value.x is: 4
+Continue value: 5
 cursor.continue()
+Expecting exception setting new Index key for primary key 4 to 105
 Expecting exception from cursor.update({ x: 100 + self.continueValue})
 PASS Exception was thrown.
 PASS code is DOMException.INVALID_STATE_ERR
 Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
 cursor = event.target.result
+
+Index key is: 5
+Primary key is: 5
+Value.x is: 5
+Continue value: 6
+New Index key for primary key 5 is 106
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 6
+Primary key is: 6
+Value.x is: 6
+Continue value: 7
 cursor.continue()
+Expecting exception deleting primary key 6 which currently has Index key 6
 Expecting exception from cursor.delete()
 PASS Exception was thrown.
 PASS code is DOMException.INVALID_STATE_ERR
 Exception message: Failed to execute 'delete' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
 cursor = event.target.result
+
+Index key is: 7
+Primary key is: 7
+Value.x is: 7
+Continue value: 8
+New Index key for primary key 7 is 108
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 8
+Primary key is: 8
+Value.x is: 8
+Continue value: 9
+Deleting primary key 8 which currently has Index key 8
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 9
+Primary key is: 9
+Value.x is: 9
+Continue value: 10
+New Index key for primary key 9 is 110
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 10
+Primary key is: 10
+Value.x is: 10
+Continue value: 11
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 11
+Primary key is: 11
+Value.x is: 11
+Continue value: 12
+New Index key for primary key 11 is 112
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 12
+Primary key is: 12
+Value.x is: 12
+Continue value: 13
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 13
+Primary key is: 13
+Value.x is: 13
+Continue value: 14
+New Index key for primary key 13 is 114
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 14
+Primary key is: 14
+Value.x is: 14
+Continue value: 15
+Deleting primary key 14 which currently has Index key 14
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 15
+Primary key is: 15
+Value.x is: 15
+Continue value: 16
+New Index key for primary key 15 is 116
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 16
+Primary key is: 16
+Value.x is: 16
+Continue value: 17
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 17
+Primary key is: 17
+Value.x is: 17
+Continue value: 18
+New Index key for primary key 17 is 118
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 18
+Primary key is: 18
+Value.x is: 18
+Continue value: 19
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 19
+Primary key is: 19
+Value.x is: 19
+Continue value: 20
+New Index key for primary key 19 is 120
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 20
+Primary key is: 20
+Value.x is: 20
+Continue value: 21
+Deleting primary key 20 which currently has Index key 20
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 21
+Primary key is: 21
+Value.x is: 21
+Continue value: 22
+New Index key for primary key 21 is 122
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 22
+Primary key is: 22
+Value.x is: 22
+Continue value: 23
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 23
+Primary key is: 23
+Value.x is: 23
+Continue value: 24
+New Index key for primary key 23 is 124
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 24
+Primary key is: 24
+Value.x is: 24
+Continue value: 25
 cursor.continue()
+Expecting exception setting new Index key for primary key 24 to 125
 Expecting exception from cursor.update({ x: 100 + self.continueValue})
 PASS Exception was thrown.
 PASS code is DOMException.INVALID_STATE_ERR
 Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
 cursor = event.target.result
+
+Index key is: 102
+Primary key is: 1
+Value.x is: 102
+Continue value: 26
+New Index key for primary key 1 is 126
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 104
+Primary key is: 3
+Value.x is: 104
+Continue value: 27
+Deleting primary key 3 which currently has Index key 104
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 106
+Primary key is: 5
+Value.x is: 106
+Continue value: 28
+New Index key for primary key 5 is 128
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 108
+Primary key is: 7
+Value.x is: 108
+Continue value: 29
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 110
+Primary key is: 9
+Value.x is: 110
+Continue value: 30
+New Index key for primary key 9 is 130
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 112
+Primary key is: 11
+Value.x is: 112
+Continue value: 31
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 114
+Primary key is: 13
+Value.x is: 114
+Continue value: 32
+New Index key for primary key 13 is 132
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 116
+Primary key is: 15
+Value.x is: 116
+Continue value: 33
+Deleting primary key 15 which currently has Index key 116
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 118
+Primary key is: 17
+Value.x is: 118
+Continue value: 34
+New Index key for primary key 17 is 134
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 120
+Primary key is: 19
+Value.x is: 120
+Continue value: 35
 cursor.continue()
+Expecting exception setting new Index key for primary key 19 to 135
 Expecting exception from cursor.update({ x: 100 + self.continueValue})
 PASS Exception was thrown.
 PASS code is DOMException.INVALID_STATE_ERR
 Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
 cursor = event.target.result
+
+Index key is: 122
+Primary key is: 21
+Value.x is: 122
+Continue value: 36
+New Index key for primary key 21 is 136
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 124
+Primary key is: 23
+Value.x is: 124
+Continue value: 37
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 126
+Primary key is: 1
+Value.x is: 126
+Continue value: 38
+New Index key for primary key 1 is 138
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 128
+Primary key is: 5
+Value.x is: 128
+Continue value: 39
+Deleting primary key 5 which currently has Index key 128
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 130
+Primary key is: 9
+Value.x is: 130
+Continue value: 40
+New Index key for primary key 9 is 140
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 132
+Primary key is: 13
+Value.x is: 132
+Continue value: 41
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 134
+Primary key is: 17
+Value.x is: 134
+Continue value: 42
+New Index key for primary key 17 is 142
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 136
+Primary key is: 21
+Value.x is: 136
+Continue value: 43
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 138
+Primary key is: 1
+Value.x is: 138
+Continue value: 44
+New Index key for primary key 1 is 144
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 140
+Primary key is: 9
+Value.x is: 140
+Continue value: 45
+Deleting primary key 9 which currently has Index key 140
 cursor.delete()
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 142
+Primary key is: 17
+Value.x is: 142
+Continue value: 46
+New Index key for primary key 17 is 146
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 144
+Primary key is: 1
+Value.x is: 144
+Continue value: 47
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 146
+Primary key is: 17
+Value.x is: 146
+Continue value: 48
+New Index key for primary key 17 is 148
 cursor.update({ x: 100 + self.continueValue })
 cursor.continue()
 cursor = event.target.result
+
+Index key is: 148
+Primary key is: 17
+Value.x is: 148
+Continue value: 49
 cursor.continue()
+Expecting exception deleting primary key 17 which currently has Index key 148
 Expecting exception from cursor.delete()
 PASS Exception was thrown.
 PASS code is DOMException.INVALID_STATE_ERR
index abb26be..7d392a5 100644 (file)
@@ -125,25 +125,35 @@ function modifyContinueOrderCallback()
 
     self.continueValue++;
     if (cursor) {
+        debug("");
+        debug("Index key is: " + cursor.key);
+        debug("Primary key is: " + cursor.primaryKey);
+        debug("Value.x is: " + cursor.value.x);
+        debug("Continue value: " + self.continueValue);
+
         // we sprinkle these checks across the dataset, to sample
         // behavior against pre-fetching. Make sure to use prime
         // numbers for these checks to avoid overlap.
         if (self.continueValue % 2 == 0) {
             // it's ok to call update() and then continue..
+            debug("New Index key for primary key " + cursor.primaryKey + " is " + (100 + self.continueValue));
             evalAndLog("cursor.update({ x: 100 + self.continueValue })");
             evalAndLog("cursor.continue()");
         } else if (self.continueValue % 3 == 0) {
             // it's ok to call delete() and then continue
+            debug("Deleting primary key " + cursor.primaryKey + " which currently has Index key " + cursor.key);
             evalAndLog("cursor.delete()");
             evalAndLog("cursor.continue()");
         } else if (self.continueValue % 5 == 0) {
             // it's NOT ok to call continue and then update
             evalAndLog("cursor.continue()");
+            debug("Expecting exception setting new Index key for primary key " + cursor.primaryKey + " to " + (100 + self.continueValue));
             evalAndExpectException("cursor.update({ x: 100 + self.continueValue})",
                                    "DOMException.INVALID_STATE_ERR");
         } else if (self.continueValue % 7 == 0) {
             // it's NOT ok to call continue and then delete
             evalAndLog("cursor.continue()");
+            debug("Expecting exception deleting primary key " + cursor.primaryKey + " which currently has Index key " + cursor.key);
             evalAndExpectException("cursor.delete()",
                                    "DOMException.INVALID_STATE_ERR");
         } else {
index 3fb3b96..5946845 100644 (file)
@@ -1,3 +1,24 @@
+2016-02-02  Brady Eidson  <beidson@apple.com>
+
+        Modern IDB: storage/indexeddb/cursor-continue-validity.html fails.
+        https://bugs.webkit.org/show_bug.cgi?id=153791
+
+        Reviewed by Alex Christensen.
+
+        No new tests (Existing test now unskipped).
+
+        There was a preexisting check in the SQLite cursor for remembering the current record and
+        refusing to refetch it.
+        
+        This check was causing this bug, because we needed to refetch the current record.
+        
+        Removing the check (and its associated flag) doesn't regress any other test, and fixes this one.
+
+        * Modules/indexeddb/server/SQLiteIDBCursor.cpp:
+        (WebCore::IDBServer::SQLiteIDBCursor::resetAndRebindStatement):
+        (WebCore::IDBServer::SQLiteIDBCursor::internalAdvanceOnce):
+        * Modules/indexeddb/server/SQLiteIDBCursor.h:
+
 2016-02-01  Dave Hyatt  <hyatt@apple.com>
 
         Add a line grid pagination SPI to WebKit.
index a9aa7d4..68236ab 100644 (file)
@@ -230,7 +230,6 @@ void SQLiteIDBCursor::resetAndRebindStatement()
             m_keyRange.lowerOpen = true;
             m_keyRange.lowerKey = m_currentLowerKey;
             m_statement = nullptr;
-            m_currentRecordID = -1;
         }
     } else {
         m_currentUpperKey = m_currentKey;
@@ -238,7 +237,6 @@ void SQLiteIDBCursor::resetAndRebindStatement()
             m_keyRange.upperOpen = true;
             m_keyRange.upperKey = m_currentUpperKey;
             m_statement = nullptr;
-            m_currentRecordID = -1;
         }
     }
 
@@ -358,16 +356,6 @@ SQLiteIDBCursor::AdvanceResult SQLiteIDBCursor::internalAdvanceOnce()
         return AdvanceResult::Failure;
     }
 
-    int64_t recordID = m_statement->getColumnInt64(0);
-
-    // If the recordID of the record just fetched is the same as the current record ID
-    // then this statement must have been re-prepared in response to an object store change.
-    // We don't want to re-use the current record so we'll move on to the next one.
-    if (recordID == m_currentRecordID)
-        return AdvanceResult::ShouldAdvanceAgain;
-
-    m_currentRecordID = recordID;
-
     Vector<uint8_t> keyData;
     m_statement->getColumnBlobAsVector(1, keyData);
 
index 1704cee..ddf0383 100644 (file)
@@ -100,7 +100,6 @@ private:
     IDBKeyData m_currentLowerKey;
     IDBKeyData m_currentUpperKey;
 
-    int64_t m_currentRecordID { -1 };
     IDBKeyData m_currentKey;
     IDBKeyData m_currentPrimaryKey;
     Vector<uint8_t> m_currentValueBuffer;