<!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>[208261] 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/208261">208261</a></dd>
<dt>Author</dt> <dd>beidson@apple.com</dd>
<dt>Date</dt> <dd>2016-11-01 16:51:54 -0700 (Tue, 01 Nov 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>IndexedDB 2.0: Support IDBIndex getAll/getAllKeys.
&lt;rdar://problem/28806933&gt; and https://bugs.webkit.org/show_bug.cgi?id=164294

Reviewed by Alex Christensen.

LayoutTests/imported/w3c:

* web-platform-tests/IndexedDB/idbindex_getAll-expected.txt:
* web-platform-tests/IndexedDB/idbindex_getAllKeys-expected.txt:

Source/WebCore:

Tests: storage/indexeddb/modern/idbindex-getall-1-private.html
       storage/indexeddb/modern/idbindex-getall-1.html
       storage/indexeddb/modern/idbindex-getallkeys-1-private.html
       storage/indexeddb/modern/idbindex-getallkeys-1.html
       Existing imported W3C tests.

* Modules/indexeddb/IDBIndex.cpp:
(WebCore::IDBIndex::getAll):
(WebCore::IDBIndex::getAllKeys):
* Modules/indexeddb/IDBIndex.h:
* Modules/indexeddb/IDBIndex.idl:

* Modules/indexeddb/IDBRequest.cpp:
(WebCore::IDBRequest::create):
(WebCore::IDBRequest::createIndexGet):
(WebCore::IDBRequest::createCount): Deleted.
(WebCore::IDBRequest::createGet): Deleted.
* Modules/indexeddb/IDBRequest.h:

* Modules/indexeddb/IDBTransaction.cpp:
(WebCore::IDBTransaction::requestGetAllIndexRecords):
(WebCore::IDBTransaction::requestIndexRecord):
(WebCore::IDBTransaction::requestCount):
* Modules/indexeddb/IDBTransaction.h:

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

* Modules/indexeddb/server/MemoryIDBBackingStore.cpp:
(WebCore::IDBServer::MemoryIDBBackingStore::getAllRecords):

* Modules/indexeddb/server/MemoryIndex.cpp:
(WebCore::IDBServer::MemoryIndex::getAllRecords):
* Modules/indexeddb/server/MemoryIndex.h:

* Modules/indexeddb/server/SQLiteIDBBackingStore.cpp:
(WebCore::IDBServer::SQLiteIDBBackingStore::getAllRecords):
(WebCore::IDBServer::queryForGetAllObjectStoreRecords):
(WebCore::IDBServer::SQLiteIDBBackingStore::getAllObjectStoreRecords):
(WebCore::IDBServer::SQLiteIDBBackingStore::getAllIndexRecords):
(WebCore::IDBServer::queryForGetAllRecords): Deleted.
* Modules/indexeddb/server/SQLiteIDBBackingStore.h:

LayoutTests:

* resources/js-test.js:
(areObjectsEqual):

* storage/indexeddb/modern/idbindex-getall-1-expected.txt: Added.
* storage/indexeddb/modern/idbindex-getall-1-private-expected.txt: Added.
* storage/indexeddb/modern/idbindex-getall-1-private.html: Added.
* storage/indexeddb/modern/idbindex-getall-1.html: Added.
* storage/indexeddb/modern/idbindex-getallkeys-1-expected.txt: Added.
* storage/indexeddb/modern/idbindex-getallkeys-1-private-expected.txt: Added.
* storage/indexeddb/modern/idbindex-getallkeys-1-private.html: Added.
* storage/indexeddb/modern/idbindex-getallkeys-1.html: Added.
* storage/indexeddb/modern/resources/idbindex-getall-1.js: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsimportedw3cChangeLog">trunk/LayoutTests/imported/w3c/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsIndexedDBidbindex_getAllexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/IndexedDB/idbindex_getAll-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsIndexedDBidbindex_getAllKeysexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/IndexedDB/idbindex_getAllKeys-expected.txt</a></li>
<li><a href="#trunkLayoutTestsresourcesjstestjs">trunk/LayoutTests/resources/js-test.js</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBIndexcpp">trunk/Source/WebCore/Modules/indexeddb/IDBIndex.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBIndexh">trunk/Source/WebCore/Modules/indexeddb/IDBIndex.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBIndexidl">trunk/Source/WebCore/Modules/indexeddb/IDBIndex.idl</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBRequestcpp">trunk/Source/WebCore/Modules/indexeddb/IDBRequest.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBRequesth">trunk/Source/WebCore/Modules/indexeddb/IDBRequest.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBTransactioncpp">trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBTransactionh">trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h</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>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverMemoryIDBBackingStorecpp">trunk/Source/WebCore/Modules/indexeddb/server/MemoryIDBBackingStore.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverMemoryIndexcpp">trunk/Source/WebCore/Modules/indexeddb/server/MemoryIndex.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverMemoryIndexh">trunk/Source/WebCore/Modules/indexeddb/server/MemoryIndex.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverSQLiteIDBBackingStorecpp">trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverSQLiteIDBBackingStoreh">trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernidbindexgetall1expectedtxt">trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernidbindexgetall1privateexpectedtxt">trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernidbindexgetall1privatehtml">trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernidbindexgetall1html">trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernidbindexgetallkeys1expectedtxt">trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernidbindexgetallkeys1privateexpectedtxt">trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1-private-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernidbindexgetallkeys1privatehtml">trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1-private.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernidbindexgetallkeys1html">trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1.html</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernresourcesidbindexgetall1js">trunk/LayoutTests/storage/indexeddb/modern/resources/idbindex-getall-1.js</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernresourcesidbindexgetallkeys1js">trunk/LayoutTests/storage/indexeddb/modern/resources/idbindex-getallkeys-1.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/LayoutTests/ChangeLog        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2016-11-01  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        IndexedDB 2.0: Support IDBIndex getAll/getAllKeys.
+        &lt;rdar://problem/28806933&gt; and https://bugs.webkit.org/show_bug.cgi?id=164294
+
+        Reviewed by Alex Christensen.
+
+        * resources/js-test.js:
+        (areObjectsEqual):
+
+        * storage/indexeddb/modern/idbindex-getall-1-expected.txt: Added.
+        * storage/indexeddb/modern/idbindex-getall-1-private-expected.txt: Added.
+        * storage/indexeddb/modern/idbindex-getall-1-private.html: Added.
+        * storage/indexeddb/modern/idbindex-getall-1.html: Added.
+        * storage/indexeddb/modern/idbindex-getallkeys-1-expected.txt: Added.
+        * storage/indexeddb/modern/idbindex-getallkeys-1-private-expected.txt: Added.
+        * storage/indexeddb/modern/idbindex-getallkeys-1-private.html: Added.
+        * storage/indexeddb/modern/idbindex-getallkeys-1.html: Added.
+        * storage/indexeddb/modern/resources/idbindex-getall-1.js: Added.
+
</ins><span class="cx"> 2016-11-01  Antoine Quint  &lt;graouts@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Modern Media Controls] Media Controller: Airplay support
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/ChangeLog (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/ChangeLog        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/LayoutTests/imported/w3c/ChangeLog        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-11-01  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        IndexedDB 2.0: Support IDBIndex getAll/getAllKeys.
+        &lt;rdar://problem/28806933&gt; and https://bugs.webkit.org/show_bug.cgi?id=164294
+
+        Reviewed by Alex Christensen.
+
+        * web-platform-tests/IndexedDB/idbindex_getAll-expected.txt:
+        * web-platform-tests/IndexedDB/idbindex_getAllKeys-expected.txt:
+
</ins><span class="cx"> 2016-11-01  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Rebase test after r208239
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsIndexedDBidbindex_getAllexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/IndexedDB/idbindex_getAll-expected.txt (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/IndexedDB/idbindex_getAll-expected.txt        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/IndexedDB/idbindex_getAll-expected.txt        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -1,15 +1,15 @@
</span><span class="cx"> 
</span><del>-FAIL Single item get index.getAll is not a function. (In 'index.getAll(range, maxCount)', 'index.getAll' is undefined)
-FAIL Empty object store index.getAll is not a function. (In 'index.getAll(range, maxCount)', 'index.getAll' is undefined)
-FAIL Get all keys index.getAll is not a function. (In 'index.getAll(range, maxCount)', 'index.getAll' is undefined)
-FAIL maxCount=10 index.getAll is not a function. (In 'index.getAll(range, maxCount)', 'index.getAll' is undefined)
-FAIL Get bound range index.getAll is not a function. (In 'index.getAll(range, maxCount)', 'index.getAll' is undefined)
-FAIL Get bound range with maxCount index.getAll is not a function. (In 'index.getAll(range, maxCount)', 'index.getAll' is undefined)
-FAIL Get upper excluded index.getAll is not a function. (In 'index.getAll(range, maxCount)', 'index.getAll' is undefined)
-FAIL Get lower excluded index.getAll is not a function. (In 'index.getAll(range, maxCount)', 'index.getAll' is undefined)
-FAIL Get bound range (generated) with maxCount index.getAll is not a function. (In 'index.getAll(range, maxCount)', 'index.getAll' is undefined)
-FAIL Non existent key index.getAll is not a function. (In 'index.getAll(range, maxCount)', 'index.getAll' is undefined)
-FAIL maxCount=0 index.getAll is not a function. (In 'index.getAll(range, maxCount)', 'index.getAll' is undefined)
-FAIL Retrieve multiEntry key index.getAll is not a function. (In 'index.getAll(range, maxCount)', 'index.getAll' is undefined)
-FAIL Retrieve one key multiple values index.getAll is not a function. (In 'index.getAll(range, maxCount)', 'index.getAll' is undefined)
</del><ins>+PASS Single item get 
+PASS Empty object store 
+PASS Get all keys 
+PASS maxCount=10 
+PASS Get bound range 
+PASS Get bound range with maxCount 
+PASS Get upper excluded 
+PASS Get lower excluded 
+PASS Get bound range (generated) with maxCount 
+PASS Non existent key 
+PASS maxCount=0 
+PASS Retrieve multiEntry key 
+PASS Retrieve one key multiple values 
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsIndexedDBidbindex_getAllKeysexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/IndexedDB/idbindex_getAllKeys-expected.txt (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/IndexedDB/idbindex_getAllKeys-expected.txt        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/IndexedDB/idbindex_getAllKeys-expected.txt        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -1,15 +1,15 @@
</span><span class="cx"> 
</span><del>-FAIL Single item get index.getAllKeys is not a function. (In 'index.getAllKeys(range, maxCount)', 'index.getAllKeys' is undefined)
-FAIL Empty object store index.getAllKeys is not a function. (In 'index.getAllKeys(range, maxCount)', 'index.getAllKeys' is undefined)
-FAIL Get all keys index.getAllKeys is not a function. (In 'index.getAllKeys(range, maxCount)', 'index.getAllKeys' is undefined)
-FAIL Get all generated keys index.getAllKeys is not a function. (In 'index.getAllKeys(range, maxCount)', 'index.getAllKeys' is undefined)
-FAIL maxCount=10 index.getAllKeys is not a function. (In 'index.getAllKeys(range, maxCount)', 'index.getAllKeys' is undefined)
-FAIL Get bound range index.getAllKeys is not a function. (In 'index.getAllKeys(range, maxCount)', 'index.getAllKeys' is undefined)
-FAIL Get bound range with maxCount index.getAllKeys is not a function. (In 'index.getAllKeys(range, maxCount)', 'index.getAllKeys' is undefined)
-FAIL Get upper excluded index.getAllKeys is not a function. (In 'index.getAllKeys(range, maxCount)', 'index.getAllKeys' is undefined)
-FAIL Get lower excluded index.getAllKeys is not a function. (In 'index.getAllKeys(range, maxCount)', 'index.getAllKeys' is undefined)
-FAIL Get bound range (generated) with maxCount index.getAllKeys is not a function. (In 'index.getAllKeys(range, maxCount)', 'index.getAllKeys' is undefined)
-FAIL Non existent key index.getAllKeys is not a function. (In 'index.getAllKeys(range, maxCount)', 'index.getAllKeys' is undefined)
-FAIL maxCount=0 index.getAllKeys is not a function. (In 'index.getAllKeys(range, maxCount)', 'index.getAllKeys' is undefined)
-FAIL Retrieve multiEntry keys index.getAllKeys is not a function. (In 'index.getAllKeys(range, maxCount)', 'index.getAllKeys' is undefined)
</del><ins>+PASS Single item get 
+PASS Empty object store 
+PASS Get all keys 
+PASS Get all generated keys 
+PASS maxCount=10 
+PASS Get bound range 
+PASS Get bound range with maxCount 
+PASS Get upper excluded 
+PASS Get lower excluded 
+PASS Get bound range (generated) with maxCount 
+PASS Non existent key 
+PASS maxCount=0 
+PASS Retrieve multiEntry keys 
</ins><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsresourcesjstestjs"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/resources/js-test.js (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/resources/js-test.js        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/LayoutTests/resources/js-test.js        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -711,6 +711,34 @@
</span><span class="cx">         testRunner.notifyDone();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+function areObjectsEqual(a, b) {
+        for (var property in a) {
+                if (!b.hasOwnProperty(property))
+                        return false;
+
+                switch (typeof (a[property])) {
+                case 'function':
+                        if (typeof b[property] == 'undefined' || a[property].toString() != b[property].toString())
+                                return false;
+                        break;
+                case 'object':
+                        if (!areObjectsEqual(a, b))
+                                return false;
+                        break;
+                default:
+                        if (a[property] != b[property])
+                                return false;
+                }
+        }

+        for (var property in b) {
+                if (!a.hasOwnProperty(property))
+                        return false;
+        }
+        
+        return true;
+};
+
</ins><span class="cx"> function startWorker(testScriptURL)
</span><span class="cx"> {
</span><span class="cx">     self.jsTestIsAsync = true;
</span></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernidbindexgetall1expectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1-expected.txt (0 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1-expected.txt        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+Test IDBIndex.getAll()
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+PASS: Good index count
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+PASS: Correct value
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+PASS: Correct value
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+PASS: Correct value
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+PASS: Correct value
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+PASS: Correct value
+PASS: Correct value
+PASS: Correct value
+PASS: Correct value
+PASS: Correct value
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+PASS: Correct value
+PASS: Correct value
+PASS: Correct value
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernidbindexgetall1privateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1-private-expected.txt (0 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1-private-expected.txt        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+Test IDBIndex.getAll()
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+PASS: Good index count
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+PASS: Correct value
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+PASS: Correct value
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+PASS: Correct value
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+PASS: Correct value
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+PASS: Correct value
+PASS: Correct value
+PASS: Correct value
+PASS: Correct value
+PASS: Correct value
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+PASS: Correct value
+PASS: Correct value
+PASS: Correct value
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct value
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernidbindexgetall1privatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1-private.html (0 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1-private.html        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script&gt;
+enablePrivateBrowsing = true;
+&lt;/script&gt;
+&lt;script src=&quot;../../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+
+&lt;script src=&quot;resources/idbindex-getall-1.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernidbindexgetall1html"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1.html (0 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/idbindex-getall-1.html        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+
+&lt;script src=&quot;resources/idbindex-getall-1.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernidbindexgetallkeys1expectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1-expected.txt (0 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1-expected.txt        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+Test IDBIndex.getAll()
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+PASS: Good index count
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+PASS: Correct key
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+PASS: Correct key
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+PASS: Correct key
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+PASS: Correct key
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+PASS: Correct key
+PASS: Correct key
+PASS: Correct key
+PASS: Correct key
+PASS: Correct key
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+PASS: Correct key
+PASS: Correct key
+PASS: Correct key
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernidbindexgetallkeys1privateexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1-private-expected.txt (0 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1-private-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1-private-expected.txt        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+Test IDBIndex.getAll()
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+PASS: Good index count
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+PASS: Correct key
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+PASS: Correct key
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+PASS: Correct key
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+PASS: Correct key
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+PASS: Correct key
+PASS: Correct key
+PASS: Correct key
+PASS: Correct key
+PASS: Correct key
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+PASS: Correct key
+PASS: Correct key
+PASS: Correct key
+PASS: Got an array object
+PASS: Correct length
+PASS: Correct key
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernidbindexgetallkeys1privatehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1-private.html (0 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1-private.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1-private.html        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script&gt;
+enablePrivateBrowsing = true;
+&lt;/script&gt;
+&lt;script src=&quot;../../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+
+&lt;script src=&quot;resources/idbindex-getallkeys-1.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernidbindexgetallkeys1html"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1.html (0 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/idbindex-getallkeys-1.html        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -0,0 +1,10 @@
</span><ins>+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../../resources/js-test.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../resources/shared.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+
+&lt;script src=&quot;resources/idbindex-getallkeys-1.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernresourcesidbindexgetall1js"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/resources/idbindex-getall-1.js (0 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/resources/idbindex-getall-1.js                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/resources/idbindex-getall-1.js        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -0,0 +1,196 @@
</span><ins>+// Adapted from a Mozilla test placed in the public domain.
+// Taken from git repository https://github.com/mozilla/gecko-dev.git and the path ./dom/indexedDB/test/unit/test_index_getAll.js
+
+description(&quot;Test IDBIndex.getAll()&quot;);
+
+function continueWithEvent(event)
+{
+    testGenerator.next(event);
+}
+
+function log(msg)
+{
+        document.body.innerHTML += msg + &quot;&lt;br&gt;&quot;;
+}
+
+function is(a, b, pass)
+{
+    if (areObjectsEqual(a, b))
+        log(&quot;PASS: &quot; + pass);
+    else
+        log(&quot;FAIL: &quot; + a + &quot; should be &quot; + b + &quot; but is not.&quot;);
+}
+
+function* testSteps()
+{
+    const name = window.location.pathname;
+    const objectStoreName = &quot;People&quot;;
+
+    let objectStoreData = [
+        { key: &quot;237-23-7732&quot;, value: { name: &quot;Bob&quot;, height: 60, weight: 120 } },
+        { key: &quot;237-23-7733&quot;, value: { name: &quot;Ann&quot;, height: 52, weight: 110 } },
+        { key: &quot;237-23-7734&quot;, value: { name: &quot;Ron&quot;, height: 73, weight: 180 } },
+        { key: &quot;237-23-7735&quot;, value: { name: &quot;Sue&quot;, height: 58, weight: 130 } },
+        { key: &quot;237-23-7736&quot;, value: { name: &quot;Joe&quot;, height: 65, weight: 150 } },
+        { key: &quot;237-23-7737&quot;, value: { name: &quot;Pat&quot;, height: 65 } }
+    ];
+
+    let indexData = [
+        { name: &quot;name&quot;, keyPath: &quot;name&quot;, options: { unique: true } },
+        { name: &quot;height&quot;, keyPath: &quot;height&quot;, options: { unique: false } },
+        { name: &quot;weight&quot;, keyPath: &quot;weight&quot;, options: { unique: false } }
+    ];
+
+    let objectStoreDataNameSort = [
+        { key: &quot;237-23-7733&quot;, value: { name: &quot;Ann&quot;, height: 52, weight: 110 } },
+        { key: &quot;237-23-7732&quot;, value: { name: &quot;Bob&quot;, height: 60, weight: 120 } },
+        { key: &quot;237-23-7736&quot;, value: { name: &quot;Joe&quot;, height: 65, weight: 150 } },
+        { key: &quot;237-23-7737&quot;, value: { name: &quot;Pat&quot;, height: 65 } },
+        { key: &quot;237-23-7734&quot;, value: { name: &quot;Ron&quot;, height: 73, weight: 180 } },
+        { key: &quot;237-23-7735&quot;, value: { name: &quot;Sue&quot;, height: 58, weight: 130 } }
+    ];
+
+    let objectStoreDataWeightSort = [
+        { key: &quot;237-23-7733&quot;, value: { name: &quot;Ann&quot;, height: 52, weight: 110 } },
+        { key: &quot;237-23-7732&quot;, value: { name: &quot;Bob&quot;, height: 60, weight: 120 } },
+        { key: &quot;237-23-7735&quot;, value: { name: &quot;Sue&quot;, height: 58, weight: 130 } },
+        { key: &quot;237-23-7736&quot;, value: { name: &quot;Joe&quot;, height: 65, weight: 150 } },
+        { key: &quot;237-23-7734&quot;, value: { name: &quot;Ron&quot;, height: 73, weight: 180 } }
+    ];
+
+    let objectStoreDataHeightSort = [
+        { key: &quot;237-23-7733&quot;, value: { name: &quot;Ann&quot;, height: 52, weight: 110 } },
+        { key: &quot;237-23-7735&quot;, value: { name: &quot;Sue&quot;, height: 58, weight: 130 } },
+        { key: &quot;237-23-7732&quot;, value: { name: &quot;Bob&quot;, height: 60, weight: 120 } },
+        { key: &quot;237-23-7736&quot;, value: { name: &quot;Joe&quot;, height: 65, weight: 150 } },
+        { key: &quot;237-23-7737&quot;, value: { name: &quot;Pat&quot;, height: 65 } },
+        { key: &quot;237-23-7734&quot;, value: { name: &quot;Ron&quot;, height: 73, weight: 180 } }
+    ];
+        
+    let request = indexedDB.deleteDatabase(name);
+        request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    request = indexedDB.open(name, 1);
+    request.onerror = finishJSTest;
+    request.onupgradeneeded = continueWithEvent;
+    event = yield;
+
+    let db = event.target.result;
+        event.target.transaction.oncomplete = continueWithEvent;
+    let objectStore = db.createObjectStore(objectStoreName);
+
+    // First, add all our data to the object store.
+    let addedData = 0;
+    for (let i in objectStoreData) {
+        request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+        request.onerror = finishJSTest;
+        request.onsuccess = function(event) {
+            if (++addedData == objectStoreData.length) {
+                testGenerator.next(event);
+            }
+        }
+    }
+    yield;
+
+    // Now create the indexes.
+    for (let i in indexData) {
+        objectStore.createIndex(indexData[i].name, indexData[i].keyPath, indexData[i].options);
+    }
+
+    is(objectStore.indexNames.length, indexData.length, &quot;Good index count&quot;);
+    yield; // Completion of version change transaction
+
+    objectStore = db.transaction(objectStoreName).objectStore(objectStoreName);
+    request = objectStore.index(&quot;height&quot;).getAll(65);
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+        
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, 2, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[parseInt(i) + 3].value, &quot;Correct value&quot;);
+    }
+
+    request = objectStore.index(&quot;height&quot;).getAll(65, 0);
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, 2, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[parseInt(i) + 3].value, &quot;Correct value&quot;);
+    }
+
+    request = objectStore.index(&quot;height&quot;).getAll(65, null);
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, 2, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[parseInt(i) + 3].value, &quot;Correct value&quot;);
+    }
+
+    request = objectStore.index(&quot;height&quot;).getAll(65, undefined);
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, 2, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[parseInt(i) + 3].value, &quot;Correct value&quot;);
+    }
+
+    request = objectStore.index(&quot;height&quot;).getAll();
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, objectStoreDataHeightSort.length, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[i].value, &quot;Correct value&quot;);
+    }
+
+    request = objectStore.index(&quot;height&quot;).getAll(null, 4);
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, 4, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[i].value, &quot;Correct value&quot;);
+    }
+
+    request = objectStore.index(&quot;height&quot;).getAll(65, 1);
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, 1, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[parseInt(i) + 3].value, &quot;Correct value&quot;);
+    }
+
+    finishJSTest();
+    yield;
+}
+
+var testGenerator = testSteps();
+testGenerator.next();
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernresourcesidbindexgetallkeys1js"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/resources/idbindex-getallkeys-1.js (0 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/resources/idbindex-getallkeys-1.js                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/resources/idbindex-getallkeys-1.js        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -0,0 +1,196 @@
</span><ins>+// Adapted from a Mozilla test placed in the public domain.
+// Taken from git repository https://github.com/mozilla/gecko-dev.git and the path ./dom/indexedDB/test/unit/test_index_getAllKeys.js
+
+description(&quot;Test IDBIndex.getAll()&quot;);
+
+function continueWithEvent(event)
+{
+    testGenerator.next(event);
+}
+
+function log(msg)
+{
+        document.body.innerHTML += msg + &quot;&lt;br&gt;&quot;;
+}
+
+function is(a, b, pass)
+{
+    if (a === b)
+        log(&quot;PASS: &quot; + pass);
+    else
+        log(&quot;FAIL: &quot; + a + &quot; should be &quot; + b + &quot; but is not.&quot;);
+}
+
+function* testSteps()
+{
+    const name = window.location.pathname;
+    const objectStoreName = &quot;People&quot;;
+
+    let objectStoreData = [
+        { key: &quot;237-23-7732&quot;, value: { name: &quot;Bob&quot;, height: 60, weight: 120 } },
+        { key: &quot;237-23-7733&quot;, value: { name: &quot;Ann&quot;, height: 52, weight: 110 } },
+        { key: &quot;237-23-7734&quot;, value: { name: &quot;Ron&quot;, height: 73, weight: 180 } },
+        { key: &quot;237-23-7735&quot;, value: { name: &quot;Sue&quot;, height: 58, weight: 130 } },
+        { key: &quot;237-23-7736&quot;, value: { name: &quot;Joe&quot;, height: 65, weight: 150 } },
+        { key: &quot;237-23-7737&quot;, value: { name: &quot;Pat&quot;, height: 65 } }
+    ];
+
+    let indexData = [
+        { name: &quot;name&quot;, keyPath: &quot;name&quot;, options: { unique: true } },
+        { name: &quot;height&quot;, keyPath: &quot;height&quot;, options: { unique: false } },
+        { name: &quot;weight&quot;, keyPath: &quot;weight&quot;, options: { unique: false } }
+    ];
+
+    let objectStoreDataNameSort = [
+        { key: &quot;237-23-7733&quot;, value: { name: &quot;Ann&quot;, height: 52, weight: 110 } },
+        { key: &quot;237-23-7732&quot;, value: { name: &quot;Bob&quot;, height: 60, weight: 120 } },
+        { key: &quot;237-23-7736&quot;, value: { name: &quot;Joe&quot;, height: 65, weight: 150 } },
+        { key: &quot;237-23-7737&quot;, value: { name: &quot;Pat&quot;, height: 65 } },
+        { key: &quot;237-23-7734&quot;, value: { name: &quot;Ron&quot;, height: 73, weight: 180 } },
+        { key: &quot;237-23-7735&quot;, value: { name: &quot;Sue&quot;, height: 58, weight: 130 } }
+    ];
+
+    let objectStoreDataWeightSort = [
+        { key: &quot;237-23-7733&quot;, value: { name: &quot;Ann&quot;, height: 52, weight: 110 } },
+        { key: &quot;237-23-7732&quot;, value: { name: &quot;Bob&quot;, height: 60, weight: 120 } },
+        { key: &quot;237-23-7735&quot;, value: { name: &quot;Sue&quot;, height: 58, weight: 130 } },
+        { key: &quot;237-23-7736&quot;, value: { name: &quot;Joe&quot;, height: 65, weight: 150 } },
+        { key: &quot;237-23-7734&quot;, value: { name: &quot;Ron&quot;, height: 73, weight: 180 } }
+    ];
+
+    let objectStoreDataHeightSort = [
+        { key: &quot;237-23-7733&quot;, value: { name: &quot;Ann&quot;, height: 52, weight: 110 } },
+        { key: &quot;237-23-7735&quot;, value: { name: &quot;Sue&quot;, height: 58, weight: 130 } },
+        { key: &quot;237-23-7732&quot;, value: { name: &quot;Bob&quot;, height: 60, weight: 120 } },
+        { key: &quot;237-23-7736&quot;, value: { name: &quot;Joe&quot;, height: 65, weight: 150 } },
+        { key: &quot;237-23-7737&quot;, value: { name: &quot;Pat&quot;, height: 65 } },
+        { key: &quot;237-23-7734&quot;, value: { name: &quot;Ron&quot;, height: 73, weight: 180 } }
+    ];
+        
+    let request = indexedDB.deleteDatabase(name);
+        request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    request = indexedDB.open(name, 1);
+    request.onerror = finishJSTest;
+    request.onupgradeneeded = continueWithEvent;
+    event = yield;
+
+    let db = event.target.result;
+        event.target.transaction.oncomplete = continueWithEvent;
+    let objectStore = db.createObjectStore(objectStoreName);
+
+    // First, add all our data to the object store.
+    let addedData = 0;
+    for (let i in objectStoreData) {
+        request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);
+        request.onerror = finishJSTest;
+        request.onsuccess = function(event) {
+            if (++addedData == objectStoreData.length) {
+                testGenerator.next(event);
+            }
+        }
+    }
+    yield;
+
+    // Now create the indexes.
+    for (let i in indexData) {
+        objectStore.createIndex(indexData[i].name, indexData[i].keyPath, indexData[i].options);
+    }
+
+    is(objectStore.indexNames.length, indexData.length, &quot;Good index count&quot;);
+    yield; // Completion of version change transaction
+
+    objectStore = db.transaction(objectStoreName).objectStore(objectStoreName);
+    request = objectStore.index(&quot;height&quot;).getAllKeys(65);
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+        
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, 2, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[parseInt(i) + 3].key, &quot;Correct key&quot;);
+    }
+
+    request = objectStore.index(&quot;height&quot;).getAllKeys(65, 0);
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, 2, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[parseInt(i) + 3].key, &quot;Correct key&quot;);
+    }
+
+    request = objectStore.index(&quot;height&quot;).getAllKeys(65, null);
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, 2, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[parseInt(i) + 3].key, &quot;Correct key&quot;);
+    }
+
+    request = objectStore.index(&quot;height&quot;).getAllKeys(65, undefined);
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, 2, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[parseInt(i) + 3].key, &quot;Correct key&quot;);
+    }
+
+    request = objectStore.index(&quot;height&quot;).getAllKeys();
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, objectStoreDataHeightSort.length, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[i].key, &quot;Correct key&quot;);
+    }
+
+    request = objectStore.index(&quot;height&quot;).getAllKeys(null, 4);
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, 4, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[i].key, &quot;Correct key&quot;);
+    }
+
+    request = objectStore.index(&quot;height&quot;).getAllKeys(65, 1);
+    request.onerror = finishJSTest;
+    request.onsuccess = continueWithEvent;
+    event = yield;
+
+    is(event.target.result instanceof Array, true, &quot;Got an array object&quot;);
+    is(event.target.result.length, 1, &quot;Correct length&quot;);
+
+    for (let i in event.target.result) {
+        is(event.target.result[i], objectStoreDataHeightSort[parseInt(i) + 3].key, &quot;Correct key&quot;);
+    }
+
+    finishJSTest();
+    yield;
+}
+
+var testGenerator = testSteps();
+testGenerator.next();
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/ChangeLog        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -1,3 +1,54 @@
</span><ins>+2016-11-01  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        IndexedDB 2.0: Support IDBIndex getAll/getAllKeys.
+        &lt;rdar://problem/28806933&gt; and https://bugs.webkit.org/show_bug.cgi?id=164294
+
+        Reviewed by Alex Christensen.
+
+        Tests: storage/indexeddb/modern/idbindex-getall-1-private.html
+               storage/indexeddb/modern/idbindex-getall-1.html
+               storage/indexeddb/modern/idbindex-getallkeys-1-private.html
+               storage/indexeddb/modern/idbindex-getallkeys-1.html
+               Existing imported W3C tests.
+
+        * Modules/indexeddb/IDBIndex.cpp:
+        (WebCore::IDBIndex::getAll):
+        (WebCore::IDBIndex::getAllKeys):
+        * Modules/indexeddb/IDBIndex.h:
+        * Modules/indexeddb/IDBIndex.idl:
+
+        * Modules/indexeddb/IDBRequest.cpp:
+        (WebCore::IDBRequest::create):
+        (WebCore::IDBRequest::createIndexGet):
+        (WebCore::IDBRequest::createCount): Deleted.
+        (WebCore::IDBRequest::createGet): Deleted.
+        * Modules/indexeddb/IDBRequest.h:
+
+        * Modules/indexeddb/IDBTransaction.cpp:
+        (WebCore::IDBTransaction::requestGetAllIndexRecords):
+        (WebCore::IDBTransaction::requestIndexRecord):
+        (WebCore::IDBTransaction::requestCount):
+        * Modules/indexeddb/IDBTransaction.h:
+
+        * Modules/indexeddb/server/IndexValueStore.cpp:
+        (WebCore::IDBServer::IndexValueStore::allValuesForKey):
+        * Modules/indexeddb/server/IndexValueStore.h:
+
+        * Modules/indexeddb/server/MemoryIDBBackingStore.cpp:
+        (WebCore::IDBServer::MemoryIDBBackingStore::getAllRecords):
+
+        * Modules/indexeddb/server/MemoryIndex.cpp:
+        (WebCore::IDBServer::MemoryIndex::getAllRecords):
+        * Modules/indexeddb/server/MemoryIndex.h:
+
+        * Modules/indexeddb/server/SQLiteIDBBackingStore.cpp:
+        (WebCore::IDBServer::SQLiteIDBBackingStore::getAllRecords):
+        (WebCore::IDBServer::queryForGetAllObjectStoreRecords):
+        (WebCore::IDBServer::SQLiteIDBBackingStore::getAllObjectStoreRecords):
+        (WebCore::IDBServer::SQLiteIDBBackingStore::getAllIndexRecords):
+        (WebCore::IDBServer::queryForGetAllRecords): Deleted.
+        * Modules/indexeddb/server/SQLiteIDBBackingStore.h:
+
</ins><span class="cx"> 2016-11-01  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove CUSTOM_ELEMENTS build flag
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBIndexcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBIndex.cpp (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBIndex.cpp        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBIndex.cpp        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -308,6 +308,52 @@
</span><span class="cx">     return transaction.requestGetKey(execState, *this, range);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+ExceptionOr&lt;Ref&lt;IDBRequest&gt;&gt; IDBIndex::getAll(ExecState&amp; execState, RefPtr&lt;IDBKeyRange&gt; range, Optional&lt;uint32_t&gt; count)
+{
+    LOG(IndexedDB, &quot;IDBIndex::getAll&quot;);
+    ASSERT(currentThread() == m_objectStore.transaction().database().originThreadID());
+
+    if (m_deleted || m_objectStore.isDeleted())
+        return Exception { IDBDatabaseException::InvalidStateError, ASCIILiteral(&quot;Failed to execute 'getAll' on 'IDBIndex': The index or its object store has been deleted.&quot;) };
+
+    if (!m_objectStore.transaction().isActive())
+        return Exception { IDBDatabaseException::TransactionInactiveError, ASCIILiteral(&quot;Failed to execute 'getAll' on 'IDBIndex': The transaction is inactive or finished.&quot;) };
+
+    return m_objectStore.transaction().requestGetAllIndexRecords(execState, *this, range.get(), IndexedDB::GetAllType::Values, count);
+}
+
+ExceptionOr&lt;Ref&lt;IDBRequest&gt;&gt; IDBIndex::getAll(ExecState&amp; execState, JSValue key, Optional&lt;uint32_t&gt; count)
+{
+    auto onlyResult = IDBKeyRange::only(execState, key);
+    if (onlyResult.hasException())
+        return Exception { IDBDatabaseException::DataError, ASCIILiteral(&quot;Failed to execute 'getAll' on 'IDBIndex': The parameter is not a valid key.&quot;) };
+
+    return getAll(execState, onlyResult.releaseReturnValue(), count);
+}
+
+ExceptionOr&lt;Ref&lt;IDBRequest&gt;&gt; IDBIndex::getAllKeys(ExecState&amp; execState, RefPtr&lt;IDBKeyRange&gt; range, Optional&lt;uint32_t&gt; count)
+{
+    LOG(IndexedDB, &quot;IDBIndex::getAllKeys&quot;);
+    ASSERT(currentThread() == m_objectStore.transaction().database().originThreadID());
+
+    if (m_deleted || m_objectStore.isDeleted())
+        return Exception { IDBDatabaseException::InvalidStateError, ASCIILiteral(&quot;Failed to execute 'getAllKeys' on 'IDBIndex': The index or its object store has been deleted.&quot;) };
+
+    if (!m_objectStore.transaction().isActive())
+        return Exception { IDBDatabaseException::TransactionInactiveError, ASCIILiteral(&quot;Failed to execute 'getAllKeys' on 'IDBIndex': The transaction is inactive or finished.&quot;) };
+
+    return m_objectStore.transaction().requestGetAllIndexRecords(execState, *this, range.get(), IndexedDB::GetAllType::Keys, count);
+}
+
+ExceptionOr&lt;Ref&lt;IDBRequest&gt;&gt; IDBIndex::getAllKeys(ExecState&amp; execState, JSValue key, Optional&lt;uint32_t&gt; count)
+{
+    auto onlyResult = IDBKeyRange::only(execState, key);
+    if (onlyResult.hasException())
+        return Exception { IDBDatabaseException::DataError, ASCIILiteral(&quot;Failed to execute 'getAllKeys' on 'IDBIndex': The parameter is not a valid key.&quot;) };
+
+    return getAllKeys(execState, onlyResult.releaseReturnValue(), count);
+}
+
</ins><span class="cx"> void IDBIndex::markAsDeleted()
</span><span class="cx"> {
</span><span class="cx">     ASSERT(currentThread() == m_objectStore.transaction().database().originThreadID());
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBIndexh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBIndex.h (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBIndex.h        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBIndex.h        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -70,6 +70,11 @@
</span><span class="cx">     ExceptionOr&lt;Ref&lt;IDBRequest&gt;&gt; getKey(JSC::ExecState&amp;, IDBKeyRange*);
</span><span class="cx">     ExceptionOr&lt;Ref&lt;IDBRequest&gt;&gt; getKey(JSC::ExecState&amp;, JSC::JSValue key);
</span><span class="cx"> 
</span><ins>+    ExceptionOr&lt;Ref&lt;IDBRequest&gt;&gt; getAll(JSC::ExecState&amp;, RefPtr&lt;IDBKeyRange&gt;, Optional&lt;uint32_t&gt; count);
+    ExceptionOr&lt;Ref&lt;IDBRequest&gt;&gt; getAll(JSC::ExecState&amp;, JSC::JSValue key, Optional&lt;uint32_t&gt; count);
+    ExceptionOr&lt;Ref&lt;IDBRequest&gt;&gt; getAllKeys(JSC::ExecState&amp;, RefPtr&lt;IDBKeyRange&gt;, Optional&lt;uint32_t&gt; count);
+    ExceptionOr&lt;Ref&lt;IDBRequest&gt;&gt; getAllKeys(JSC::ExecState&amp;, JSC::JSValue key, Optional&lt;uint32_t&gt; count);
+
</ins><span class="cx">     const IDBIndexInfo&amp; info() const { return m_info; }
</span><span class="cx"> 
</span><span class="cx">     void markAsDeleted();
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBIndexidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBIndex.idl (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBIndex.idl        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBIndex.idl        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -46,6 +46,10 @@
</span><span class="cx">     [CallWith=ScriptState, MayThrowException] IDBRequest get(any key);
</span><span class="cx">     [CallWith=ScriptState, MayThrowException] IDBRequest getKey(IDBKeyRange? key);
</span><span class="cx">     [CallWith=ScriptState, MayThrowException] IDBRequest getKey(any key);
</span><ins>+    [CallWith=ScriptState, MayThrowException] IDBRequest getAll(optional IDBKeyRange? range = null, [EnforceRange] optional unsigned long count);
+    [CallWith=ScriptState, MayThrowException] IDBRequest getAll(any key,  [EnforceRange] optional unsigned long count);
+    [CallWith=ScriptState, MayThrowException] IDBRequest getAllKeys(optional IDBKeyRange? range = null, [EnforceRange] optional unsigned long count);
+    [CallWith=ScriptState, MayThrowException] IDBRequest getAllKeys(any key,  [EnforceRange] optional unsigned long count);
</ins><span class="cx">     [CallWith=ScriptState, MayThrowException] IDBRequest count(optional IDBKeyRange? range = null);
</span><span class="cx">     [CallWith=ScriptState, MayThrowException] IDBRequest count(any key);
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBRequestcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBRequest.cpp (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBRequest.cpp        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBRequest.cpp        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -63,12 +63,12 @@
</span><span class="cx">     return adoptRef(*new IDBRequest(context, cursor, transaction));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Ref&lt;IDBRequest&gt; IDBRequest::createCount(ScriptExecutionContext&amp; context, IDBIndex&amp; index, IDBTransaction&amp; transaction)
</del><ins>+Ref&lt;IDBRequest&gt; IDBRequest::create(ScriptExecutionContext&amp; context, IDBIndex&amp; index, IDBTransaction&amp; transaction)
</ins><span class="cx"> {
</span><span class="cx">     return adoptRef(*new IDBRequest(context, index, transaction));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Ref&lt;IDBRequest&gt; IDBRequest::createGet(ScriptExecutionContext&amp; context, IDBIndex&amp; index, IndexedDB::IndexRecordType requestedRecordType, IDBTransaction&amp; transaction)
</del><ins>+Ref&lt;IDBRequest&gt; IDBRequest::createIndexGet(ScriptExecutionContext&amp; context, IDBIndex&amp; index, IndexedDB::IndexRecordType requestedRecordType, IDBTransaction&amp; transaction)
</ins><span class="cx"> {
</span><span class="cx">     return adoptRef(*new IDBRequest(context, index, requestedRecordType, transaction));
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBRequesth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBRequest.h (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBRequest.h        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBRequest.h        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -57,8 +57,8 @@
</span><span class="cx"> public:
</span><span class="cx">     static Ref&lt;IDBRequest&gt; create(ScriptExecutionContext&amp;, IDBObjectStore&amp;, IDBTransaction&amp;);
</span><span class="cx">     static Ref&lt;IDBRequest&gt; create(ScriptExecutionContext&amp;, IDBCursor&amp;, IDBTransaction&amp;);
</span><del>-    static Ref&lt;IDBRequest&gt; createCount(ScriptExecutionContext&amp;, IDBIndex&amp;, IDBTransaction&amp;);
-    static Ref&lt;IDBRequest&gt; createGet(ScriptExecutionContext&amp;, IDBIndex&amp;, IndexedDB::IndexRecordType, IDBTransaction&amp;);
</del><ins>+    static Ref&lt;IDBRequest&gt; create(ScriptExecutionContext&amp;, IDBIndex&amp;, IDBTransaction&amp;);
+    static Ref&lt;IDBRequest&gt; createIndexGet(ScriptExecutionContext&amp;, IDBIndex&amp;, IndexedDB::IndexRecordType, IDBTransaction&amp;);
</ins><span class="cx"> 
</span><span class="cx">     const IDBResourceIdentifier&amp; resourceIdentifier() const { return m_resourceIdentifier; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBTransactioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -747,6 +747,24 @@
</span><span class="cx">     return request;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Ref&lt;IDBRequest&gt; IDBTransaction::requestGetAllIndexRecords(JSC::ExecState&amp; state, IDBIndex&amp; index, const IDBKeyRangeData&amp; keyRangeData, IndexedDB::GetAllType getAllType, Optional&lt;uint32_t&gt; count)
+{
+    LOG(IndexedDB, &quot;IDBTransaction::requestGetAllIndexRecords&quot;);
+    ASSERT(isActive());
+    ASSERT(currentThread() == m_database-&gt;originThreadID());
+
+    ASSERT_UNUSED(state, scriptExecutionContext() == scriptExecutionContextFromExecState(&amp;state));
+
+    auto request = IDBRequest::create(*scriptExecutionContext(), index, *this);
+    addRequest(request.get());
+
+    IDBGetAllRecordsData getAllRecordsData { keyRangeData, getAllType, count, index.objectStore().info().identifier(), index.info().identifier() };
+
+    scheduleOperation(IDBClient::createTransactionOperation(*this, request.get(), &amp;IDBTransaction::didGetAllRecordsOnServer, &amp;IDBTransaction::getAllRecordsOnServer, getAllRecordsData));
+
+    return request;
+}
+
</ins><span class="cx"> void IDBTransaction::getAllRecordsOnServer(IDBClient::TransactionOperation&amp; operation, const IDBGetAllRecordsData&amp; getAllRecordsData)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBTransaction::getAllRecordsOnServer&quot;);
</span><span class="lines">@@ -822,7 +840,7 @@
</span><span class="cx"> 
</span><span class="cx">     ASSERT_UNUSED(state, scriptExecutionContext() == scriptExecutionContextFromExecState(&amp;state));
</span><span class="cx"> 
</span><del>-    auto request = IDBRequest::createGet(*scriptExecutionContext(), index, type, *this);
</del><ins>+    auto request = IDBRequest::createIndexGet(*scriptExecutionContext(), index, type, *this);
</ins><span class="cx">     addRequest(request.get());
</span><span class="cx"> 
</span><span class="cx">     IDBGetRecordData getRecordData = { range };
</span><span class="lines">@@ -894,7 +912,7 @@
</span><span class="cx"> 
</span><span class="cx">     ASSERT_UNUSED(state, scriptExecutionContext() == scriptExecutionContextFromExecState(&amp;state));
</span><span class="cx"> 
</span><del>-    auto request = IDBRequest::createCount(*scriptExecutionContext(), index, *this);
</del><ins>+    auto request = IDBRequest::create(*scriptExecutionContext(), index, *this);
</ins><span class="cx">     addRequest(request.get());
</span><span class="cx"> 
</span><span class="cx">     scheduleOperation(IDBClient::createTransactionOperation(*this, request.get(), &amp;IDBTransaction::didGetCountOnServer, &amp;IDBTransaction::getCountOnServer, range));
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBTransactionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -115,6 +115,7 @@
</span><span class="cx">     Ref&lt;IDBRequest&gt; requestPutOrAdd(JSC::ExecState&amp;, IDBObjectStore&amp;, IDBKey*, SerializedScriptValue&amp;, IndexedDB::ObjectStoreOverwriteMode);
</span><span class="cx">     Ref&lt;IDBRequest&gt; requestGetRecord(JSC::ExecState&amp;, IDBObjectStore&amp;, const IDBGetRecordData&amp;);
</span><span class="cx">     Ref&lt;IDBRequest&gt; requestGetAllObjectStoreRecords(JSC::ExecState&amp;, IDBObjectStore&amp;, const IDBKeyRangeData&amp;, IndexedDB::GetAllType, Optional&lt;uint32_t&gt; count);
</span><ins>+    Ref&lt;IDBRequest&gt; requestGetAllIndexRecords(JSC::ExecState&amp;, IDBIndex&amp;, const IDBKeyRangeData&amp;, IndexedDB::GetAllType, Optional&lt;uint32_t&gt; count);
</ins><span class="cx">     Ref&lt;IDBRequest&gt; requestDeleteRecord(JSC::ExecState&amp;, IDBObjectStore&amp;, const IDBKeyRangeData&amp;);
</span><span class="cx">     Ref&lt;IDBRequest&gt; requestClearObjectStore(JSC::ExecState&amp;, IDBObjectStore&amp;);
</span><span class="cx">     Ref&lt;IDBRequest&gt; requestCount(JSC::ExecState&amp;, IDBObjectStore&amp;, const IDBKeyRangeData&amp;);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverIndexValueStorecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.cpp (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.cpp        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.cpp        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -51,6 +51,19 @@
</span><span class="cx">     return entry-&gt;getLowest();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Vector&lt;IDBKeyData&gt; IndexValueStore::allValuesForKey(const IDBKeyData&amp; key, uint32_t limit) const
+{
+    const auto&amp; entry = m_records.get(key);
+    if (!entry)
+        return { };
+
+    Vector&lt;IDBKeyData&gt; results;
+    for (auto iterator = entry-&gt;begin(); results.size() &lt; limit &amp;&amp; iterator.isValid(); ++iterator)
+        results.append(iterator.key());
+
+    return results;
+}
+
</ins><span class="cx"> uint64_t IndexValueStore::countForKey(const IDBKeyData&amp; key) const
</span><span class="cx"> {
</span><span class="cx">     const auto&amp; entry = m_records.get(key);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverIndexValueStoreh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.h (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.h        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IndexValueStore.h        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -51,6 +51,7 @@
</span><span class="cx">     IndexValueStore(bool unique);
</span><span class="cx"> 
</span><span class="cx">     const IDBKeyData* lowestValueForKey(const IDBKeyData&amp;) const;
</span><ins>+    Vector&lt;IDBKeyData&gt; allValuesForKey(const IDBKeyData&amp;, uint32_t limit) const;
</ins><span class="cx">     uint64_t countForKey(const IDBKeyData&amp;) const;
</span><span class="cx">     IDBKeyData lowestKeyWithRecordInRange(const IDBKeyRangeData&amp;) const;
</span><span class="cx">     bool contains(const IDBKeyData&amp;) const;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverMemoryIDBBackingStorecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/MemoryIDBBackingStore.cpp (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/MemoryIDBBackingStore.cpp        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/server/MemoryIDBBackingStore.cpp        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -375,11 +375,19 @@
</span><span class="cx">     if (!m_transactions.contains(transactionIdentifier))
</span><span class="cx">         return { IDBDatabaseException::UnknownError, ASCIILiteral(&quot;No backing store transaction found to get all records&quot;) };
</span><span class="cx"> 
</span><del>-    MemoryObjectStore* objectStore = m_objectStoresByIdentifier.get(getAllRecordsData.objectStoreIdentifier);
</del><ins>+    auto* objectStore = m_objectStoresByIdentifier.get(getAllRecordsData.objectStoreIdentifier);
</ins><span class="cx">     if (!objectStore)
</span><span class="cx">         return { IDBDatabaseException::UnknownError, ASCIILiteral(&quot;No backing store object store found&quot;) };
</span><span class="cx"> 
</span><del>-    objectStore-&gt;getAllRecords(getAllRecordsData.keyRangeData, getAllRecordsData.count, getAllRecordsData.getAllType, result);
</del><ins>+    if (getAllRecordsData.indexIdentifier) {
+        auto* index = objectStore-&gt;indexForIdentifier(getAllRecordsData.indexIdentifier);
+        if (!index)
+            return { IDBDatabaseException::UnknownError, ASCIILiteral(&quot;No backing store index found&quot;) };
+
+        index-&gt;getAllRecords(getAllRecordsData.keyRangeData, getAllRecordsData.count, getAllRecordsData.getAllType, result);
+    } else
+        objectStore-&gt;getAllRecords(getAllRecordsData.keyRangeData, getAllRecordsData.count, getAllRecordsData.getAllType, result);
+
</ins><span class="cx">     return { };
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverMemoryIndexcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/MemoryIndex.cpp (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/MemoryIndex.cpp        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/server/MemoryIndex.cpp        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;IDBError.h&quot;
</span><ins>+#include &quot;IDBGetAllResult.h&quot;
</ins><span class="cx"> #include &quot;IDBGetResult.h&quot;
</span><span class="cx"> #include &quot;IDBKeyRangeData.h&quot;
</span><span class="cx"> #include &quot;IndexKey.h&quot;
</span><span class="lines">@@ -157,6 +158,45 @@
</span><span class="cx">     return count;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void MemoryIndex::getAllRecords(const IDBKeyRangeData&amp; keyRangeData, Optional&lt;uint32_t&gt; count, IndexedDB::GetAllType type, IDBGetAllResult&amp; result) const
+{
+    LOG(IndexedDB, &quot;MemoryIndex::getAllRecords&quot;);
+
+    result = { type };
+
+    if (!m_records)
+        return;
+
+    uint32_t targetCount;
+    if (count &amp;&amp; count.value())
+        targetCount = count.value();
+    else
+        targetCount = std::numeric_limits&lt;uint32_t&gt;::max();
+
+    IDBKeyRangeData range = keyRangeData;
+    uint32_t currentCount = 0;
+    while (currentCount &lt; targetCount) {
+        auto key = m_records-&gt;lowestKeyWithRecordInRange(range);
+        if (key.isNull())
+            return;
+
+        range.lowerKey = key;
+        range.lowerOpen = true;
+
+        auto allValues = m_records-&gt;allValuesForKey(key, targetCount - currentCount);
+        for (auto&amp; keyValue : allValues) {
+            if (type == IndexedDB::GetAllType::Keys) {
+                IDBKeyData keyCopy { keyValue };
+                result.addKey(WTFMove(keyCopy));
+            } else
+                result.addValue(m_objectStore.valueForKeyRange(keyValue));
+        }
+
+        currentCount += allValues.size();
+    }
+}
+
+
</ins><span class="cx"> IDBError MemoryIndex::putIndexKey(const IDBKeyData&amp; valueKey, const IndexKey&amp; indexKey)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;MemoryIndex::provisionalPutIndexKey&quot;);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverMemoryIndexh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/MemoryIndex.h (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/MemoryIndex.h        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/server/MemoryIndex.h        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> 
</span><span class="cx"> class IDBCursorInfo;
</span><span class="cx"> class IDBError;
</span><ins>+class IDBGetAllResult;
</ins><span class="cx"> class IDBGetResult;
</span><span class="cx"> class IDBKeyData;
</span><span class="cx"> class IndexKey;
</span><span class="lines">@@ -44,6 +45,7 @@
</span><span class="cx"> struct IDBKeyRangeData;
</span><span class="cx"> 
</span><span class="cx"> namespace IndexedDB {
</span><ins>+enum class GetAllType;
</ins><span class="cx"> enum class IndexRecordType;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -66,6 +68,7 @@
</span><span class="cx"> 
</span><span class="cx">     IDBGetResult getResultForKeyRange(IndexedDB::IndexRecordType, const IDBKeyRangeData&amp;) const;
</span><span class="cx">     uint64_t countForKeyRange(const IDBKeyRangeData&amp;);
</span><ins>+    void getAllRecords(const IDBKeyRangeData&amp;, Optional&lt;uint32_t&gt; count, IndexedDB::GetAllType, IDBGetAllResult&amp;) const;
</ins><span class="cx"> 
</span><span class="cx">     IDBError putIndexKey(const IDBKeyData&amp;, const IndexKey&amp;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverSQLiteIDBBackingStorecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -1878,8 +1878,13 @@
</span><span class="cx">     return { };
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static const ASCIILiteral&amp; queryForGetAllRecords(const IDBGetAllRecordsData&amp; getAllRecordsData)
</del><ins>+IDBError SQLiteIDBBackingStore::getAllRecords(const IDBResourceIdentifier&amp; transactionIdentifier, const IDBGetAllRecordsData&amp; getAllRecordsData, IDBGetAllResult&amp; result)
</ins><span class="cx"> {
</span><ins>+    return getAllRecordsData.indexIdentifier ? getAllIndexRecords(transactionIdentifier, getAllRecordsData, result) : getAllObjectStoreRecords(transactionIdentifier, getAllRecordsData, result);
+}
+
+static const ASCIILiteral&amp; queryForGetAllObjectStoreRecords(const IDBGetAllRecordsData&amp; getAllRecordsData)
+{
</ins><span class="cx">     static NeverDestroyed&lt;const ASCIILiteral&gt; lowerOpenUpperOpenKey(&quot;SELECT key FROM Records WHERE objectStoreID = ? AND key &gt; CAST(? AS TEXT) AND key &lt; CAST(? AS TEXT) ORDER BY key;&quot;);
</span><span class="cx">     static NeverDestroyed&lt;const ASCIILiteral&gt; lowerOpenUpperClosedKey(&quot;SELECT key FROM Records WHERE objectStoreID = ? AND key &gt; CAST(? AS TEXT) AND key &lt;= CAST(? AS TEXT) ORDER BY key;&quot;);
</span><span class="cx">     static NeverDestroyed&lt;const ASCIILiteral&gt; lowerClosedUpperOpenKey(&quot;SELECT key FROM Records WHERE objectStoreID = ? AND key &gt;= CAST(? AS TEXT) AND key &lt; CAST(? AS TEXT) ORDER BY key;&quot;);
</span><span class="lines">@@ -1912,9 +1917,9 @@
</span><span class="cx">     return lowerClosedUpperClosedValue.get();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-IDBError SQLiteIDBBackingStore::getAllRecords(const IDBResourceIdentifier&amp; transactionIdentifier, const IDBGetAllRecordsData&amp; getAllRecordsData, IDBGetAllResult&amp; result)
</del><ins>+IDBError SQLiteIDBBackingStore::getAllObjectStoreRecords(const IDBResourceIdentifier&amp; transactionIdentifier, const IDBGetAllRecordsData&amp; getAllRecordsData, IDBGetAllResult&amp; result)
</ins><span class="cx"> {
</span><del>-    LOG(IndexedDB, &quot;SQLiteIDBBackingStore::getAllRecords&quot;);
</del><ins>+    LOG(IndexedDB, &quot;SQLiteIDBBackingStore::getAllObjectStoreRecords&quot;);
</ins><span class="cx"> 
</span><span class="cx">     ASSERT(m_sqliteDB);
</span><span class="cx">     ASSERT(m_sqliteDB-&gt;isOpen());
</span><span class="lines">@@ -1943,7 +1948,7 @@
</span><span class="cx">         return { IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Unable to serialize upper IDBKey in lookup range&quot;) };
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    SQLiteStatement sql(*m_sqliteDB, queryForGetAllRecords(getAllRecordsData));
</del><ins>+    SQLiteStatement sql(*m_sqliteDB, queryForGetAllObjectStoreRecords(getAllRecordsData));
</ins><span class="cx">     if (sql.prepare() != SQLITE_OK
</span><span class="cx">         || sql.bindInt64(1, getAllRecordsData.objectStoreIdentifier) != SQLITE_OK
</span><span class="cx">         || sql.bindBlob(2, lowerBuffer-&gt;data(), lowerBuffer-&gt;size()) != SQLITE_OK
</span><span class="lines">@@ -1954,11 +1959,14 @@
</span><span class="cx"> 
</span><span class="cx">     result = { getAllRecordsData.getAllType };
</span><span class="cx"> 
</span><ins>+    uint32_t targetResults;
+    if (getAllRecordsData.count &amp;&amp; getAllRecordsData.count.value())
+        targetResults = getAllRecordsData.count.value();
+    else
+        targetResults = std::numeric_limits&lt;uint32_t&gt;::max();
+
</ins><span class="cx">     int sqlResult = sql.step();
</span><span class="cx">     uint32_t returnedResults = 0;
</span><del>-    uint32_t targetResults = getAllRecordsData.count ? getAllRecordsData.count.value() : 0;
-    if (!targetResults)
-        targetResults = std::numeric_limits&lt;uint32_t&gt;::max();
</del><span class="cx"> 
</span><span class="cx">     while (sqlResult == SQLITE_ROW &amp;&amp; returnedResults &lt; targetResults) {
</span><span class="cx">         if (getAllRecordsData.getAllType == IndexedDB::GetAllType::Values) {
</span><span class="lines">@@ -2004,6 +2012,54 @@
</span><span class="cx">     return { IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Error looking up record in object store by key range&quot;) };
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+IDBError SQLiteIDBBackingStore::getAllIndexRecords(const IDBResourceIdentifier&amp; transactionIdentifier, const IDBGetAllRecordsData&amp; getAllRecordsData, IDBGetAllResult&amp; result)
+{
+    LOG(IndexedDB, &quot;SQLiteIDBBackingStore::getAllIndexRecords - %s&quot;, getAllRecordsData.keyRangeData.loggingString().utf8().data());
+
+    ASSERT(m_sqliteDB);
+    ASSERT(m_sqliteDB-&gt;isOpen());
+
+    auto* transaction = m_transactions.get(transactionIdentifier);
+    if (!transaction || !transaction-&gt;inProgress()) {
+        LOG_ERROR(&quot;Attempt to get all index records from database without an in-progress transaction&quot;);
+        return { IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Attempt to get all index records from database without an in-progress transaction&quot;) };
+    }
+
+    auto cursor = transaction-&gt;maybeOpenBackingStoreCursor(getAllRecordsData.objectStoreIdentifier, getAllRecordsData.indexIdentifier, getAllRecordsData.keyRangeData);
+    if (!cursor) {
+        LOG_ERROR(&quot;Cannot open cursor to perform index gets in database&quot;);
+        return { IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Cannot open cursor to perform index gets in database&quot;) };
+    }
+
+    if (cursor-&gt;didError()) {
+        LOG_ERROR(&quot;Cursor failed while looking up index records in database&quot;);
+        return { IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Cursor failed while looking up index records in database&quot;) };
+    }
+
+    result = { getAllRecordsData.getAllType };
+    uint32_t currentCount = 0;
+    uint32_t targetCount = getAllRecordsData.count ? getAllRecordsData.count.value() : 0;
+    if (!targetCount)
+        targetCount = std::numeric_limits&lt;uint32_t&gt;::max();
+    while (!cursor-&gt;didComplete() &amp;&amp; !cursor-&gt;didError() &amp;&amp; currentCount &lt; targetCount) {
+        if (getAllRecordsData.getAllType == IndexedDB::GetAllType::Keys) {
+            IDBKeyData keyCopy = cursor-&gt;currentPrimaryKey();
+            result.addKey(WTFMove(keyCopy));
+        } else
+            result.addValue(cursor-&gt;currentValue() ? *cursor-&gt;currentValue() : IDBValue());
+
+        ++currentCount;
+        cursor-&gt;advance(1);
+    }
+
+    if (cursor-&gt;didError()) {
+        LOG_ERROR(&quot;Cursor failed while looking up index records in database&quot;);
+        return { IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Cursor failed while looking up index records in database&quot;) };
+    }
+
+    return { };
+}
+
</ins><span class="cx"> IDBError SQLiteIDBBackingStore::getIndexRecord(const IDBResourceIdentifier&amp; transactionIdentifier, uint64_t objectStoreID, uint64_t indexID, IndexedDB::IndexRecordType type, const IDBKeyRangeData&amp; range, IDBGetResult&amp; getResult)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;SQLiteIDBBackingStore::getIndexRecord - %s&quot;, range.loggingString().utf8().data());
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverSQLiteIDBBackingStoreh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.h (208260 => 208261)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.h        2016-11-01 23:39:11 UTC (rev 208260)
+++ trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.h        2016-11-01 23:51:54 UTC (rev 208261)
</span><span class="lines">@@ -114,6 +114,9 @@
</span><span class="cx"> 
</span><span class="cx">     IDBError deleteUnusedBlobFileRecords(SQLiteIDBTransaction&amp;);
</span><span class="cx"> 
</span><ins>+    IDBError getAllObjectStoreRecords(const IDBResourceIdentifier&amp; transactionIdentifier, const IDBGetAllRecordsData&amp;, IDBGetAllResult&amp; outValue);
+    IDBError getAllIndexRecords(const IDBResourceIdentifier&amp; transactionIdentifier, const IDBGetAllRecordsData&amp;, IDBGetAllResult&amp; outValue);
+
</ins><span class="cx">     JSC::VM&amp; vm();
</span><span class="cx">     JSC::JSGlobalObject&amp; globalObject();
</span><span class="cx">     void initializeVM();
</span></span></pre>
</div>
</div>

</body>
</html>