<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[196025] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/196025">196025</a></dd>
<dt>Author</dt> <dd>beidson@apple.com</dd>
<dt>Date</dt> <dd>2016-02-02 12:51:46 -0800 (Tue, 02 Feb 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Modern IDB: storage/indexeddb/cursor-continue-validity.html fails.
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:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformmacwk1TestExpectations">trunk/LayoutTests/platform/mac-wk1/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorcontinuevalidityexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbcursorcontinuevalidityprivateexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbresourcescursorcontinuevalidityjs">trunk/LayoutTests/storage/indexeddb/resources/cursor-continue-validity.js</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverSQLiteIDBCursorcpp">trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverSQLiteIDBCursorh">trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (196024 => 196025)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-02-02 19:50:01 UTC (rev 196024)
+++ trunk/LayoutTests/ChangeLog        2016-02-02 20:51:46 UTC (rev 196025)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2016-02-02  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        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:
+
</ins><span class="cx"> 2016-02-01  Dave Hyatt  &lt;hyatt@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add a line grid pagination SPI to WebKit.
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacwk1TestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (196024 => 196025)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-wk1/TestExpectations        2016-02-02 19:50:01 UTC (rev 196024)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations        2016-02-02 20:51:46 UTC (rev 196025)
</span><span class="lines">@@ -256,9 +256,6 @@
</span><span class="cx"> # Completes successfully after ~40 seconds in a debug build with logging
</span><span class="cx"> imported/w3c/indexeddb/idbindex-multientry-big.htm [ Failure ]
</span><span class="cx"> 
</span><del>-# Cursor iterates one less time than expected
-storage/indexeddb/cursor-continue-validity.html [ Failure ]
-
</del><span class="cx"> # Integer part of the test iterates 0, 1, 2, Inf, -1, -2, -Inf - Should be in order from -Inf to Inf.
</span><span class="cx"> storage/indexeddb/cursor-primary-key-order.html [ Failure ]
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorcontinuevalidityexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-expected.txt (196024 => 196025)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-expected.txt        2016-02-02 19:50:01 UTC (rev 196024)
+++ trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-expected.txt        2016-02-02 20:51:46 UTC (rev 196025)
</span><span class="lines">@@ -783,151 +783,433 @@
</span><span class="cx"> indexObject.openCursor(null, 'next')
</span><span class="cx"> self.continueValue = 0
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 0
+Primary key is: 0
+Value.x is: 0
+Continue value: 1
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 1
+Primary key is: 1
+Value.x is: 1
+Continue value: 2
+New Index key for primary key 1 is 102
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 3
+Primary key is: 3
+Value.x is: 3
+Continue value: 4
+New Index key for primary key 3 is 104
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 4
+Primary key is: 4
+Value.x is: 4
+Continue value: 5
</ins><span class="cx"> cursor.continue()
</span><ins>+Expecting exception setting new Index key for primary key 4 to 105
</ins><span class="cx"> Expecting exception from cursor.update({ x: 100 + self.continueValue})
</span><span class="cx"> PASS Exception was thrown.
</span><span class="cx"> PASS code is DOMException.INVALID_STATE_ERR
</span><span class="cx"> Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 5
+Primary key is: 5
+Value.x is: 5
+Continue value: 6
+New Index key for primary key 5 is 106
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 6
+Primary key is: 6
+Value.x is: 6
+Continue value: 7
</ins><span class="cx"> cursor.continue()
</span><ins>+Expecting exception deleting primary key 6 which currently has Index key 6
</ins><span class="cx"> Expecting exception from cursor.delete()
</span><span class="cx"> PASS Exception was thrown.
</span><span class="cx"> PASS code is DOMException.INVALID_STATE_ERR
</span><span class="cx"> Exception message: Failed to execute 'delete' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 7
+Primary key is: 7
+Value.x is: 7
+Continue value: 8
+New Index key for primary key 7 is 108
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 9
+Primary key is: 9
+Value.x is: 9
+Continue value: 10
+New Index key for primary key 9 is 110
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 10
+Primary key is: 10
+Value.x is: 10
+Continue value: 11
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 11
+Primary key is: 11
+Value.x is: 11
+Continue value: 12
+New Index key for primary key 11 is 112
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 12
+Primary key is: 12
+Value.x is: 12
+Continue value: 13
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 13
+Primary key is: 13
+Value.x is: 13
+Continue value: 14
+New Index key for primary key 13 is 114
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 15
+Primary key is: 15
+Value.x is: 15
+Continue value: 16
+New Index key for primary key 15 is 116
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 16
+Primary key is: 16
+Value.x is: 16
+Continue value: 17
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 17
+Primary key is: 17
+Value.x is: 17
+Continue value: 18
+New Index key for primary key 17 is 118
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 18
+Primary key is: 18
+Value.x is: 18
+Continue value: 19
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 19
+Primary key is: 19
+Value.x is: 19
+Continue value: 20
+New Index key for primary key 19 is 120
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 21
+Primary key is: 21
+Value.x is: 21
+Continue value: 22
+New Index key for primary key 21 is 122
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 22
+Primary key is: 22
+Value.x is: 22
+Continue value: 23
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 23
+Primary key is: 23
+Value.x is: 23
+Continue value: 24
+New Index key for primary key 23 is 124
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 24
+Primary key is: 24
+Value.x is: 24
+Continue value: 25
</ins><span class="cx"> cursor.continue()
</span><ins>+Expecting exception setting new Index key for primary key 24 to 125
</ins><span class="cx"> Expecting exception from cursor.update({ x: 100 + self.continueValue})
</span><span class="cx"> PASS Exception was thrown.
</span><span class="cx"> PASS code is DOMException.INVALID_STATE_ERR
</span><span class="cx"> Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 102
+Primary key is: 1
+Value.x is: 102
+Continue value: 26
+New Index key for primary key 1 is 126
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 106
+Primary key is: 5
+Value.x is: 106
+Continue value: 28
+New Index key for primary key 5 is 128
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 108
+Primary key is: 7
+Value.x is: 108
+Continue value: 29
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 110
+Primary key is: 9
+Value.x is: 110
+Continue value: 30
+New Index key for primary key 9 is 130
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 112
+Primary key is: 11
+Value.x is: 112
+Continue value: 31
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 114
+Primary key is: 13
+Value.x is: 114
+Continue value: 32
+New Index key for primary key 13 is 132
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 118
+Primary key is: 17
+Value.x is: 118
+Continue value: 34
+New Index key for primary key 17 is 134
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 120
+Primary key is: 19
+Value.x is: 120
+Continue value: 35
</ins><span class="cx"> cursor.continue()
</span><ins>+Expecting exception setting new Index key for primary key 19 to 135
</ins><span class="cx"> Expecting exception from cursor.update({ x: 100 + self.continueValue})
</span><span class="cx"> PASS Exception was thrown.
</span><span class="cx"> PASS code is DOMException.INVALID_STATE_ERR
</span><span class="cx"> Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 122
+Primary key is: 21
+Value.x is: 122
+Continue value: 36
+New Index key for primary key 21 is 136
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 124
+Primary key is: 23
+Value.x is: 124
+Continue value: 37
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 126
+Primary key is: 1
+Value.x is: 126
+Continue value: 38
+New Index key for primary key 1 is 138
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 130
+Primary key is: 9
+Value.x is: 130
+Continue value: 40
+New Index key for primary key 9 is 140
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 132
+Primary key is: 13
+Value.x is: 132
+Continue value: 41
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 134
+Primary key is: 17
+Value.x is: 134
+Continue value: 42
+New Index key for primary key 17 is 142
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 136
+Primary key is: 21
+Value.x is: 136
+Continue value: 43
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 138
+Primary key is: 1
+Value.x is: 138
+Continue value: 44
+New Index key for primary key 1 is 144
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 142
+Primary key is: 17
+Value.x is: 142
+Continue value: 46
+New Index key for primary key 17 is 146
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 144
+Primary key is: 1
+Value.x is: 144
+Continue value: 47
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 146
+Primary key is: 17
+Value.x is: 146
+Continue value: 48
+New Index key for primary key 17 is 148
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 148
+Primary key is: 17
+Value.x is: 148
+Continue value: 49
</ins><span class="cx"> cursor.continue()
</span><ins>+Expecting exception deleting primary key 17 which currently has Index key 148
</ins><span class="cx"> Expecting exception from cursor.delete()
</span><span class="cx"> PASS Exception was thrown.
</span><span class="cx"> PASS code is DOMException.INVALID_STATE_ERR
</span></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorcontinuevalidityprivateexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-private-expected.txt (196024 => 196025)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-private-expected.txt        2016-02-02 19:50:01 UTC (rev 196024)
+++ trunk/LayoutTests/storage/indexeddb/cursor-continue-validity-private-expected.txt        2016-02-02 20:51:46 UTC (rev 196025)
</span><span class="lines">@@ -783,151 +783,433 @@
</span><span class="cx"> indexObject.openCursor(null, 'next')
</span><span class="cx"> self.continueValue = 0
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 0
+Primary key is: 0
+Value.x is: 0
+Continue value: 1
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 1
+Primary key is: 1
+Value.x is: 1
+Continue value: 2
+New Index key for primary key 1 is 102
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 3
+Primary key is: 3
+Value.x is: 3
+Continue value: 4
+New Index key for primary key 3 is 104
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 4
+Primary key is: 4
+Value.x is: 4
+Continue value: 5
</ins><span class="cx"> cursor.continue()
</span><ins>+Expecting exception setting new Index key for primary key 4 to 105
</ins><span class="cx"> Expecting exception from cursor.update({ x: 100 + self.continueValue})
</span><span class="cx"> PASS Exception was thrown.
</span><span class="cx"> PASS code is DOMException.INVALID_STATE_ERR
</span><span class="cx"> Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 5
+Primary key is: 5
+Value.x is: 5
+Continue value: 6
+New Index key for primary key 5 is 106
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 6
+Primary key is: 6
+Value.x is: 6
+Continue value: 7
</ins><span class="cx"> cursor.continue()
</span><ins>+Expecting exception deleting primary key 6 which currently has Index key 6
</ins><span class="cx"> Expecting exception from cursor.delete()
</span><span class="cx"> PASS Exception was thrown.
</span><span class="cx"> PASS code is DOMException.INVALID_STATE_ERR
</span><span class="cx"> Exception message: Failed to execute 'delete' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 7
+Primary key is: 7
+Value.x is: 7
+Continue value: 8
+New Index key for primary key 7 is 108
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 9
+Primary key is: 9
+Value.x is: 9
+Continue value: 10
+New Index key for primary key 9 is 110
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 10
+Primary key is: 10
+Value.x is: 10
+Continue value: 11
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 11
+Primary key is: 11
+Value.x is: 11
+Continue value: 12
+New Index key for primary key 11 is 112
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 12
+Primary key is: 12
+Value.x is: 12
+Continue value: 13
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 13
+Primary key is: 13
+Value.x is: 13
+Continue value: 14
+New Index key for primary key 13 is 114
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 15
+Primary key is: 15
+Value.x is: 15
+Continue value: 16
+New Index key for primary key 15 is 116
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 16
+Primary key is: 16
+Value.x is: 16
+Continue value: 17
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 17
+Primary key is: 17
+Value.x is: 17
+Continue value: 18
+New Index key for primary key 17 is 118
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 18
+Primary key is: 18
+Value.x is: 18
+Continue value: 19
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 19
+Primary key is: 19
+Value.x is: 19
+Continue value: 20
+New Index key for primary key 19 is 120
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 21
+Primary key is: 21
+Value.x is: 21
+Continue value: 22
+New Index key for primary key 21 is 122
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 22
+Primary key is: 22
+Value.x is: 22
+Continue value: 23
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 23
+Primary key is: 23
+Value.x is: 23
+Continue value: 24
+New Index key for primary key 23 is 124
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 24
+Primary key is: 24
+Value.x is: 24
+Continue value: 25
</ins><span class="cx"> cursor.continue()
</span><ins>+Expecting exception setting new Index key for primary key 24 to 125
</ins><span class="cx"> Expecting exception from cursor.update({ x: 100 + self.continueValue})
</span><span class="cx"> PASS Exception was thrown.
</span><span class="cx"> PASS code is DOMException.INVALID_STATE_ERR
</span><span class="cx"> Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 102
+Primary key is: 1
+Value.x is: 102
+Continue value: 26
+New Index key for primary key 1 is 126
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 106
+Primary key is: 5
+Value.x is: 106
+Continue value: 28
+New Index key for primary key 5 is 128
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 108
+Primary key is: 7
+Value.x is: 108
+Continue value: 29
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 110
+Primary key is: 9
+Value.x is: 110
+Continue value: 30
+New Index key for primary key 9 is 130
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 112
+Primary key is: 11
+Value.x is: 112
+Continue value: 31
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 114
+Primary key is: 13
+Value.x is: 114
+Continue value: 32
+New Index key for primary key 13 is 132
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 118
+Primary key is: 17
+Value.x is: 118
+Continue value: 34
+New Index key for primary key 17 is 134
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 120
+Primary key is: 19
+Value.x is: 120
+Continue value: 35
</ins><span class="cx"> cursor.continue()
</span><ins>+Expecting exception setting new Index key for primary key 19 to 135
</ins><span class="cx"> Expecting exception from cursor.update({ x: 100 + self.continueValue})
</span><span class="cx"> PASS Exception was thrown.
</span><span class="cx"> PASS code is DOMException.INVALID_STATE_ERR
</span><span class="cx"> Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 122
+Primary key is: 21
+Value.x is: 122
+Continue value: 36
+New Index key for primary key 21 is 136
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 124
+Primary key is: 23
+Value.x is: 124
+Continue value: 37
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 126
+Primary key is: 1
+Value.x is: 126
+Continue value: 38
+New Index key for primary key 1 is 138
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 130
+Primary key is: 9
+Value.x is: 130
+Continue value: 40
+New Index key for primary key 9 is 140
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 132
+Primary key is: 13
+Value.x is: 132
+Continue value: 41
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 134
+Primary key is: 17
+Value.x is: 134
+Continue value: 42
+New Index key for primary key 17 is 142
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 136
+Primary key is: 21
+Value.x is: 136
+Continue value: 43
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 138
+Primary key is: 1
+Value.x is: 138
+Continue value: 44
+New Index key for primary key 1 is 144
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+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
</ins><span class="cx"> cursor.delete()
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 142
+Primary key is: 17
+Value.x is: 142
+Continue value: 46
+New Index key for primary key 17 is 146
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 144
+Primary key is: 1
+Value.x is: 144
+Continue value: 47
</ins><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 146
+Primary key is: 17
+Value.x is: 146
+Continue value: 48
+New Index key for primary key 17 is 148
</ins><span class="cx"> cursor.update({ x: 100 + self.continueValue })
</span><span class="cx"> cursor.continue()
</span><span class="cx"> cursor = event.target.result
</span><ins>+
+Index key is: 148
+Primary key is: 17
+Value.x is: 148
+Continue value: 49
</ins><span class="cx"> cursor.continue()
</span><ins>+Expecting exception deleting primary key 17 which currently has Index key 148
</ins><span class="cx"> Expecting exception from cursor.delete()
</span><span class="cx"> PASS Exception was thrown.
</span><span class="cx"> PASS code is DOMException.INVALID_STATE_ERR
</span></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbresourcescursorcontinuevalidityjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/storage/indexeddb/resources/cursor-continue-validity.js (196024 => 196025)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/resources/cursor-continue-validity.js        2016-02-02 19:50:01 UTC (rev 196024)
+++ trunk/LayoutTests/storage/indexeddb/resources/cursor-continue-validity.js        2016-02-02 20:51:46 UTC (rev 196025)
</span><span class="lines">@@ -125,25 +125,35 @@
</span><span class="cx"> 
</span><span class="cx">     self.continueValue++;
</span><span class="cx">     if (cursor) {
</span><ins>+        debug(&quot;&quot;);
+        debug(&quot;Index key is: &quot; + cursor.key);
+        debug(&quot;Primary key is: &quot; + cursor.primaryKey);
+        debug(&quot;Value.x is: &quot; + cursor.value.x);
+        debug(&quot;Continue value: &quot; + self.continueValue);
+
</ins><span class="cx">         // we sprinkle these checks across the dataset, to sample
</span><span class="cx">         // behavior against pre-fetching. Make sure to use prime
</span><span class="cx">         // numbers for these checks to avoid overlap.
</span><span class="cx">         if (self.continueValue % 2 == 0) {
</span><span class="cx">             // it's ok to call update() and then continue..
</span><ins>+            debug(&quot;New Index key for primary key &quot; + cursor.primaryKey + &quot; is &quot; + (100 + self.continueValue));
</ins><span class="cx">             evalAndLog(&quot;cursor.update({ x: 100 + self.continueValue })&quot;);
</span><span class="cx">             evalAndLog(&quot;cursor.continue()&quot;);
</span><span class="cx">         } else if (self.continueValue % 3 == 0) {
</span><span class="cx">             // it's ok to call delete() and then continue
</span><ins>+            debug(&quot;Deleting primary key &quot; + cursor.primaryKey + &quot; which currently has Index key &quot; + cursor.key);
</ins><span class="cx">             evalAndLog(&quot;cursor.delete()&quot;);
</span><span class="cx">             evalAndLog(&quot;cursor.continue()&quot;);
</span><span class="cx">         } else if (self.continueValue % 5 == 0) {
</span><span class="cx">             // it's NOT ok to call continue and then update
</span><span class="cx">             evalAndLog(&quot;cursor.continue()&quot;);
</span><ins>+            debug(&quot;Expecting exception setting new Index key for primary key &quot; + cursor.primaryKey + &quot; to &quot; + (100 + self.continueValue));
</ins><span class="cx">             evalAndExpectException(&quot;cursor.update({ x: 100 + self.continueValue})&quot;,
</span><span class="cx">                                    &quot;DOMException.INVALID_STATE_ERR&quot;);
</span><span class="cx">         } else if (self.continueValue % 7 == 0) {
</span><span class="cx">             // it's NOT ok to call continue and then delete
</span><span class="cx">             evalAndLog(&quot;cursor.continue()&quot;);
</span><ins>+            debug(&quot;Expecting exception deleting primary key &quot; + cursor.primaryKey + &quot; which currently has Index key &quot; + cursor.key);
</ins><span class="cx">             evalAndExpectException(&quot;cursor.delete()&quot;,
</span><span class="cx">                                    &quot;DOMException.INVALID_STATE_ERR&quot;);
</span><span class="cx">         } else {
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (196024 => 196025)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-02-02 19:50:01 UTC (rev 196024)
+++ trunk/Source/WebCore/ChangeLog        2016-02-02 20:51:46 UTC (rev 196025)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2016-02-02  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        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:
+
</ins><span class="cx"> 2016-02-01  Dave Hyatt  &lt;hyatt@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add a line grid pagination SPI to WebKit.
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverSQLiteIDBCursorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp (196024 => 196025)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp        2016-02-02 19:50:01 UTC (rev 196024)
+++ trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp        2016-02-02 20:51:46 UTC (rev 196025)
</span><span class="lines">@@ -230,7 +230,6 @@
</span><span class="cx">             m_keyRange.lowerOpen = true;
</span><span class="cx">             m_keyRange.lowerKey = m_currentLowerKey;
</span><span class="cx">             m_statement = nullptr;
</span><del>-            m_currentRecordID = -1;
</del><span class="cx">         }
</span><span class="cx">     } else {
</span><span class="cx">         m_currentUpperKey = m_currentKey;
</span><span class="lines">@@ -238,7 +237,6 @@
</span><span class="cx">             m_keyRange.upperOpen = true;
</span><span class="cx">             m_keyRange.upperKey = m_currentUpperKey;
</span><span class="cx">             m_statement = nullptr;
</span><del>-            m_currentRecordID = -1;
</del><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -358,16 +356,6 @@
</span><span class="cx">         return AdvanceResult::Failure;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    int64_t recordID = m_statement-&gt;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;
-
</del><span class="cx">     Vector&lt;uint8_t&gt; keyData;
</span><span class="cx">     m_statement-&gt;getColumnBlobAsVector(1, keyData);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverSQLiteIDBCursorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.h (196024 => 196025)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.h        2016-02-02 19:50:01 UTC (rev 196024)
+++ trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.h        2016-02-02 20:51:46 UTC (rev 196025)
</span><span class="lines">@@ -100,7 +100,6 @@
</span><span class="cx">     IDBKeyData m_currentLowerKey;
</span><span class="cx">     IDBKeyData m_currentUpperKey;
</span><span class="cx"> 
</span><del>-    int64_t m_currentRecordID { -1 };
</del><span class="cx">     IDBKeyData m_currentKey;
</span><span class="cx">     IDBKeyData m_currentPrimaryKey;
</span><span class="cx">     Vector&lt;uint8_t&gt; m_currentValueBuffer;
</span></span></pre>
</div>
</div>

</body>
</html>