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