<!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>[193657] 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/193657">193657</a></dd>
<dt>Author</dt> <dd>beidson@apple.com</dd>
<dt>Date</dt> <dd>2015-12-07 15:07:03 -0800 (Mon, 07 Dec 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Modern IDB: storage/indexeddb/cursor-continue-validity.html fails.
https://bugs.webkit.org/show_bug.cgi?id=151961

Reviewed by Alex Christensen.

Source/WebCore:

No new tests (At least one failing test now passes).

When an index cursor's iterator was invalidated, there were some cases where it did
not correctly find the next iterator to pick up where it left off.

* Modules/indexeddb/client/IDBCursorImpl.cpp:
(WebCore::IDBClient::IDBCursor::update):
(WebCore::IDBClient::IDBCursor::deleteFunction):

* Modules/indexeddb/server/IndexValueStore.cpp:
(WebCore::IDBServer::IndexValueStore::find):
(WebCore::IDBServer::IndexValueStore::loggingString):
* Modules/indexeddb/server/IndexValueStore.h:

LayoutTests:

* platform/mac-wk1/TestExpectations:
* storage/indexeddb/cursor-finished-expected.txt:</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="#trunkLayoutTestsstorageindexeddbcursorfinishedexpectedtxt">trunk/LayoutTests/storage/indexeddb/cursor-finished-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBCursorImplcpp">trunk/Source/WebCore/Modules/indexeddb/client/IDBCursorImpl.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverIndexValueStorecpp">trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverIndexValueStoreh">trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (193656 => 193657)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-12-07 23:01:13 UTC (rev 193656)
+++ trunk/LayoutTests/ChangeLog        2015-12-07 23:07:03 UTC (rev 193657)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2015-12-07  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        Modern IDB: storage/indexeddb/cursor-continue-validity.html fails.
+        https://bugs.webkit.org/show_bug.cgi?id=151961
+
+        Reviewed by Alex Christensen.
+
+        * platform/mac-wk1/TestExpectations:
+        * storage/indexeddb/cursor-finished-expected.txt:
+
</ins><span class="cx"> 2015-12-07  Xabier Rodriguez Calvar  &lt;calvaris@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Streams API] pipeTo tests are failing
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacwk1TestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (193656 => 193657)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-wk1/TestExpectations        2015-12-07 23:01:13 UTC (rev 193656)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations        2015-12-07 23:07:03 UTC (rev 193657)
</span><span class="lines">@@ -110,7 +110,6 @@
</span><span class="cx"> # IDB tests with text failures                                                             
</span><span class="cx"> storage/indexeddb/createIndex-after-failure.html [ Failure ]
</span><span class="cx"> storage/indexeddb/cursor-continue.html [ Failure ]
</span><del>-storage/indexeddb/cursor-continue-validity.html [ Failure ]
</del><span class="cx"> storage/indexeddb/cursor-continueprimarykey.html [ Failure ]
</span><span class="cx"> storage/indexeddb/cursor-leak.html [ Failure ]
</span><span class="cx"> storage/indexeddb/cursor-request-cycle.html [ Failure ]
</span></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbcursorfinishedexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/storage/indexeddb/cursor-finished-expected.txt (193656 => 193657)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/cursor-finished-expected.txt        2015-12-07 23:01:13 UTC (rev 193656)
+++ trunk/LayoutTests/storage/indexeddb/cursor-finished-expected.txt        2015-12-07 23:07:03 UTC (rev 193657)
</span><span class="lines">@@ -49,7 +49,7 @@
</span><span class="cx"> PASS Exception was thrown.
</span><span class="cx"> PASS code is DOMException.INVALID_STATE_ERR
</span><span class="cx"> PASS ename is 'InvalidStateError'
</span><del>-Exception message: An operation was called on an object on which it is not allowed or at a time when it is not allowed.
</del><ins>+Exception message: Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
</ins><span class="cx"> Expecting exception from savedCursor.advance(1)
</span><span class="cx"> PASS Exception was thrown.
</span><span class="cx"> PASS code is DOMException.INVALID_STATE_ERR
</span><span class="lines">@@ -69,7 +69,7 @@
</span><span class="cx"> PASS Exception was thrown.
</span><span class="cx"> PASS code is DOMException.INVALID_STATE_ERR
</span><span class="cx"> PASS ename is 'InvalidStateError'
</span><del>-Exception message: An operation was called on an object on which it is not allowed or at a time when it is not allowed.
</del><ins>+Exception message: Failed to execute 'delete' on 'IDBCursor': The cursor is being iterated or has iterated past its end.
</ins><span class="cx"> 
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (193656 => 193657)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-12-07 23:01:13 UTC (rev 193656)
+++ trunk/Source/WebCore/ChangeLog        2015-12-07 23:07:03 UTC (rev 193657)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2015-12-07  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        Modern IDB: storage/indexeddb/cursor-continue-validity.html fails.
+        https://bugs.webkit.org/show_bug.cgi?id=151961
+
+        Reviewed by Alex Christensen.
+
+        No new tests (At least one failing test now passes).
+
+        When an index cursor's iterator was invalidated, there were some cases where it did 
+        not correctly find the next iterator to pick up where it left off.
+
+        * Modules/indexeddb/client/IDBCursorImpl.cpp:
+        (WebCore::IDBClient::IDBCursor::update):
+        (WebCore::IDBClient::IDBCursor::deleteFunction):
+        
+        * Modules/indexeddb/server/IndexValueStore.cpp:
+        (WebCore::IDBServer::IndexValueStore::find):
+        (WebCore::IDBServer::IndexValueStore::loggingString):
+        * Modules/indexeddb/server/IndexValueStore.h:
+
</ins><span class="cx"> 2015-12-07  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Refactor TextPainter::paintText() into sub methods.
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBCursorImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBCursorImpl.cpp (193656 => 193657)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBCursorImpl.cpp        2015-12-07 23:01:13 UTC (rev 193656)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBCursorImpl.cpp        2015-12-07 23:07:03 UTC (rev 193657)
</span><span class="lines">@@ -133,6 +133,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (!m_gotValue) {
</span><span class="cx">         ec.code = IDBDatabaseException::InvalidStateError;
</span><ins>+        ec.message = ASCIILiteral(&quot;Failed to execute 'update' on 'IDBCursor': The cursor is being iterated or has iterated past its end.&quot;);
</ins><span class="cx">         return nullptr;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -306,6 +307,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (!m_gotValue) {
</span><span class="cx">         ec.code = IDBDatabaseException::InvalidStateError;
</span><ins>+        ec.message = ASCIILiteral(&quot;Failed to execute 'delete' on 'IDBCursor': The cursor is being iterated or has iterated past its end.&quot;);
</ins><span class="cx">         return nullptr;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverIndexValueStorecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.cpp (193656 => 193657)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.cpp        2015-12-07 23:01:13 UTC (rev 193656)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.cpp        2015-12-07 23:07:03 UTC (rev 193657)
</span><span class="lines">@@ -212,6 +212,15 @@
</span><span class="cx">     auto record = m_records.get(*iterator);
</span><span class="cx">     ASSERT(record);
</span><span class="cx"> 
</span><ins>+    // If the main record iterator is not equal to the key we were looking for,
+    // we know the primary key record should be the first.
+    if (*iterator != key) {
+        auto primaryIterator = record-&gt;begin();
+        ASSERT(primaryIterator.isValid());
+
+        return { *this, iterator, primaryIterator };
+    }
+
</ins><span class="cx">     auto primaryIterator = record-&gt;find(primaryKey);
</span><span class="cx">     if (primaryIterator.isValid())
</span><span class="cx">         return { *this, iterator, primaryIterator };
</span><span class="lines">@@ -374,6 +383,18 @@
</span><span class="cx">     return m_primaryKeyIterator.key();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#ifndef NDEBUG
+String IndexValueStore::loggingString() const
+{
+    String result;
+    for (auto&amp; key : m_orderedKeys) {
+        result.append(makeString(&quot;Key: &quot;, key.loggingString()));
+        result.append(makeString(&quot;  Entry has &quot;, String::number(m_records.get(key)-&gt;getCount()), &quot; entries&quot;));
+    }
+    return result;
+}
+#endif
+
</ins><span class="cx"> } // namespace IDBServer
</span><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverIndexValueStoreh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.h (193656 => 193657)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.h        2015-12-07 23:01:13 UTC (rev 193656)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.h        2015-12-07 23:07:03 UTC (rev 193657)
</span><span class="lines">@@ -98,6 +98,10 @@
</span><span class="cx">     Iterator find(const IDBKeyData&amp;, const IDBKeyData&amp; primaryKey);
</span><span class="cx">     Iterator reverseFind(const IDBKeyData&amp;, const IDBKeyData&amp; primaryKey, CursorDuplicity);
</span><span class="cx"> 
</span><ins>+#ifndef NDEBUG
+    String loggingString() const;
+#endif
+
</ins><span class="cx"> private:
</span><span class="cx">     std::set&lt;IDBKeyData&gt;::iterator lowestIteratorInRange(const IDBKeyRangeData&amp;) const;
</span><span class="cx">     std::set&lt;IDBKeyData&gt;::reverse_iterator highestReverseIteratorInRange(const IDBKeyRangeData&amp;) const;
</span></span></pre>
</div>
</div>

</body>
</html>