15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These constants should match the ones in renderer_webidbcursor_impl.h
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to make sure the test hits the right code paths.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var kPrefetchThreshold = 2;
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var kMinPrefetchAmount = 5;
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)var kNumberOfItems = 200;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function test() {
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  indexedDBTest(setVersionSuccess, fillObjectStore);
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function setVersionSuccess() {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  debug("setVersionSuccess():");
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window.db = event.target.result;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window.trans = event.target.transaction;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  shouldBeTrue("trans !== null");
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var store = db.createObjectStore('store');
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store.createIndex('index', '');
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function fillObjectStore() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  debug("fillObjectStore()");
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var trans = db.transaction(['store'], 'readwrite');
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.onabort = unexpectedAbortCallback;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.oncomplete = firstTest;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var store = trans.objectStore('store');
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  debug("Storing " + kNumberOfItems + " object in the object store.");
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (var i = 0; i < kNumberOfItems; ++i) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var req = store.put(i, i);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    req.onerror = unexpectedErrorCallback;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let the transaction finish.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function firstTest() {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  debug("firstTest()");
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test iterating straight through the object store.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var trans = db.transaction(['store'], 'readwrite');
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.onabort = unexpectedAbortCallback;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.oncomplete = secondTest;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var store = trans.objectStore('store');
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var cursorReq = store.openCursor();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onerror = unexpectedErrorCallback;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count = 0;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onsuccess = function() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor = event.target.result;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor === null) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("count", "kNumberOfItems");
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return; // Let the transaction finish.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor.key !== count)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor.key", "count");
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor.value !== count)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor.value", "count");
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++count;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor.continue();
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function secondTest() {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  debug("secondTest()");
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test iterating through the object store, intermixed with
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // continue calls to specific keys.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var trans = db.transaction(['store'], 'readwrite');
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.onabort = unexpectedAbortCallback;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.oncomplete = thirdTest;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var store = trans.objectStore('store');
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var cursorReq = store.openCursor();
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onerror = unexpectedErrorCallback;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var jumpTable = [{from: 5,   to: 17},
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   {from: 25,  to: 30},
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   {from: 31,  to: 35},
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   {from: 70,  to: 80},
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   {from: 98,  to: 99}];
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count = 0;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expectedKey = 0;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onsuccess = function() {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor = event.target.result;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor === null) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      debug("Finished iterating after " + count + " steps.");
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return; // Let the transaction finish.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor.key !== expectedKey)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor.key", "expectedKey");
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor.value !== expectedKey)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor.value", "expectedKey");
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++count;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (var i = 0; i < jumpTable.length; ++i) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (jumpTable[i].from === cursor.key) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        expectedKey = jumpTable[i].to;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        debug("Jumping from "+ cursor.key + " to " + expectedKey);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cursor.continue(expectedKey);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++expectedKey;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor.continue();
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function thirdTest() {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  debug("thirdTest()");
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test iterating straight through the object store in reverse.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var trans = db.transaction(['store'], 'readwrite');
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.onabort = unexpectedAbortCallback;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.oncomplete = fourthTest;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var store = trans.objectStore('store');
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var cursorReq = store.openCursor(
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDBKeyRange.upperBound(kNumberOfItems-1), 'prev');
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onerror = unexpectedErrorCallback;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count = 0;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onsuccess = function() {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor = event.target.result;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor === null) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("count", "kNumberOfItems");
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return; // Let the transaction finish.
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expectedKey = kNumberOfItems - count - 1;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor.key !== expectedKey)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor.key", "expectedKey");
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor.value !== expectedKey)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor.value", "expectedKey");
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++count;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor.continue();
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function fourthTest() {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  debug("fourthTest()");
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test iterating, and then stopping before reaching the end.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure transaction terminates anyway.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var trans = db.transaction(['store'], 'readwrite');
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.onabort = unexpectedAbortCallback;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.oncomplete = function() {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debug("fourthTest() transaction completed");
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fifthTest();
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var store = trans.objectStore('store');
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var cursorReq = store.openCursor();
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onerror = unexpectedErrorCallback;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count = 0;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onsuccess = function() {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor = event.target.result;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor.key !== count)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor.key", "count");
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor.value !== count)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor.value", "count");
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++count;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (count === 25) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Schedule some other request.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var otherReq = store.get(42);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      otherReq.onerror = unexpectedErrorCallback;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      otherReq.onsuccess = function() {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (count === 25) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          debug("Other request fired before continue, as expected.");
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          debug("Other request fired out-of-order!");
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          fail();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      };
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cursor.continue();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (count === 30) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Do a continue first, then another request.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cursor.continue();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      var otherReq = store.get(42);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      otherReq.onerror = unexpectedErrorCallback;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      otherReq.onsuccess = function() {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (count === 31) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          debug("Other request fired right after continue as expected.");
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          debug("Other request didn't fire right after continue as expected.");
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          fail();
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      };
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (count === 75) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;  // Sudden stop.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor.continue();
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function fifthTest() {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  debug("fifthTest()");
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test iterating over the pre-fetch threshold, but make sure the
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cursor is positioned so that it is actually at the last element
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in the range when pre-fetch fires, and make sure a null cursor
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is the result as expected.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var trans = db.transaction(['store'], 'readwrite');
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.onabort = unexpectedAbortCallback;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.oncomplete = sixthTest;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var store = trans.objectStore('store');
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var startKey = kNumberOfItems - 1 - kPrefetchThreshold;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var cursorReq = store.openCursor(IDBKeyRange.lowerBound(startKey));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onerror = unexpectedErrorCallback;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count = 0;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onsuccess = function() {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor = event.target.result;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor === null) {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      debug("cursor is null");
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("count", "kPrefetchThreshold + 1");
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    debug("count: " + count);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++count;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor.continue();
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function sixthTest() {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  debug("sixthTest()");
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test stepping two cursors simultaneously. First cursor1 steps
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for a while, then cursor2, then back to cursor1, etc.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var trans = db.transaction(['store'], 'readwrite');
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.onabort = unexpectedAbortCallback;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.oncomplete = seventhTest;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var store = trans.objectStore('store');
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursor1 = null;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursor2 = null;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count1 = 0;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count2 = 0;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var cursor1func = function() {
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var cursor = event.target.result;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor === null) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("count1", "kNumberOfItems");
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cursor2.continue();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor1 === null) {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cursor1 = cursor;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor1.key !== count1)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor1.key", "count1");
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor1.value !== count1)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor1.value", "count1");
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++count1;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (count1 % 20 === 0) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (cursor2 !== null) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cursor2.continue();
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var req = store.openCursor();
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        req.onerror = unexpectedErrorCallback;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        req.onsuccess = cursor2func;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cursor1.continue();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var cursor2func = function() {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    var cursor = event.target.result;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor === null) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("count2", "kNumberOfItems");
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor2 === null) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cursor2 = cursor;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor2.key !== count2)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor2.key", "count2");
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor2.value !== count2)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor2.value", "count2");
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++count2;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (count2 % 20 === 0) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cursor1.continue();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cursor2.continue();
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var req = store.openCursor();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.onerror = unexpectedErrorCallback;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  req.onsuccess = cursor1func;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function seventhTest() {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  debug("seventhTest()");
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test iterating straight through an index.
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var trans = db.transaction(['store'], 'readwrite');
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.onabort = unexpectedAbortCallback;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.oncomplete = eighthTest;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var store = trans.objectStore('store');
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var index = store.index('index');
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var cursorReq = index.openCursor();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onerror = unexpectedErrorCallback;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count = 0;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onsuccess = function() {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor = event.target.result;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor === null) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("count", "kNumberOfItems");
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor.key !== count)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor.key", "count");
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor.primaryKey !== count)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor.primaryKey", "count");
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor.value !== count)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor.value", "count");
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++count;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor.continue();
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function eighthTest() {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  debug("eighthTest()");
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Run a key cursor over an index.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var trans = db.transaction(['store'], 'readwrite');
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.onabort = unexpectedAbortCallback;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  trans.oncomplete = done;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var store = trans.objectStore('store');
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var index = store.index('index');
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  var cursorReq = index.openKeyCursor();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onerror = unexpectedErrorCallback;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count = 0;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cursorReq.onsuccess = function() {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor = event.target.result;
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor === null) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("count", "kNumberOfItems");
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor.key !== count)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor.key", "count");
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cursor.primaryKey !== count)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shouldBe("cursor.primaryKey", "count");
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++count;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cursor.continue();
4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  };
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
410