<html> <head> <link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"> <script src="../../fast/js/resources/js-test-pre.js"></script> <script src="../../fast/js/resources/js-test-post-function.js"></script> <script src="resources/shared.js"></script> </head> <body> <p id="description"></p> <div id="console"></div> <script> description("Test IndexedDB's webkitIDBIndex.openCursor + the cursor it produces in depth."); if (window.layoutTestController) layoutTestController.waitUntilDone(); // In order of how it should be sorted by IndexedDB. window.testData = [ 1, 1, 3.14159, 3.14159, 10, // FIXME: Dates. "A big string", "the BIGEST string", "the BIGEST string" ]; function openDatabase() { result = evalAndLog("webkitIndexedDB.open('index-cursor')"); result.onsuccess = setVersion; result.onerror = unexpectedErrorCallback; } function setVersion() { window.db = evalAndLog("db = event.target.result"); result = evalAndLog("db.setVersion('new version')"); result.onsuccess = deleteExisting; result.onerror = unexpectedErrorCallback; } function deleteExisting() { window.trans = evalAndLog("trans = event.target.result"); shouldBeTrue("trans !== null"); trans.onabort = unexpectedAbortCallback; deleteAllObjectStores(db); window.objectStore = evalAndLog("db.createObjectStore('someObjectStore')"); window.indexObject = evalAndLog("objectStore.createIndex('someIndex', 'x')"); window.nextToAdd = 0; addData(); } function addData() { result = evalAndLog("objectStore.add({'x': testData[nextToAdd]}, nextToAdd)"); result.onsuccess = ++window.nextToAdd < testData.length ? addData : scheduleTests; result.onerror = unexpectedErrorCallback; } function scheduleTests() { debug("Scheduling tests..."); window.scheduledTests = []; for (var i = 0; i < testData.length; ++i) { /* left bound, is open, right bound, is open, ascending */ scheduledTests.unshift([i, true, null, null, true]); scheduledTests.unshift([i, false, null, null, true]); scheduledTests.unshift([null, null, i, true, true]); scheduledTests.unshift([null, null, i, false, true]); scheduledTests.unshift([i, true, null, null, false]); scheduledTests.unshift([i, false, null, null, false]); scheduledTests.unshift([null, null, i, true, false]); scheduledTests.unshift([null, null, i, false, false]); for (var j = 6; j < testData.length; ++j) { scheduledTests.unshift([i, true, j, true, true]); scheduledTests.unshift([i, true, j, false, true]); scheduledTests.unshift([i, false, j, true, true]); scheduledTests.unshift([i, false, j, false, true]); scheduledTests.unshift([i, true, j, true, false]); scheduledTests.unshift([i, true, j, false, false]); scheduledTests.unshift([i, false, j, true, false]); scheduledTests.unshift([i, false, j, false, false]); } } debug("Running tests..."); runNextTest(); } function runNextTest() { if (!scheduledTests.length) { testNullKeyRange(); return; } var test = scheduledTests.pop(); window.lower = test[0]; window.lowerIsOpen = test[1]; window.upper = test[2]; window.upperIsOpen = test[3]; window.ascending = test[4]; str = "Next test: "; if (lower !== null) { str += "lower "; if (lowerIsOpen) str += "open "; str += "bound is " + lower + "; "; } if (upper !== null) { str += "upper "; if (upperIsOpen) str += "open "; str += "bound is " + upper + "; "; } if (ascending) str += "sorted ascending."; else str += "sorted descending."; debug(""); debug(str); // Work around for duplicate values. if (upper !== null) { if (upperIsOpen) { while (upper > 0 && testData[upper] === testData[upper - 1]) --window.upper; } else { while (upper < testData.length - 1 && testData[upper] === testData[upper + 1]) ++window.upper; } } if (lower !== null) { if (lowerIsOpen) { while (lower < testData.length - 1 && testData[lower] === testData[lower + 1]) ++window.lower; } else { while (lower > 0 && testData[lower] === testData[lower - 1]) --window.lower; } } if (ascending) { if (lower !== null) { if (!lowerIsOpen) window.expectedIndex = lower; else window.expectedIndex = lower + 1; } else window.expectedIndex = 0; } else { if (upper !== null) { if (!upperIsOpen) window.expectedIndex = upper; else window.expectedIndex = upper - 1; } else window.expectedIndex = testData.length - 1; } testWithinBounds(); var keyRange; if (lower !== null && upper !== null) keyRange = webkitIDBKeyRange.bound(testData[lower], testData[upper], lowerIsOpen, upperIsOpen); else if (lower !== null) keyRange = webkitIDBKeyRange.lowerBound(testData[lower], lowerIsOpen); else keyRange = webkitIDBKeyRange.upperBound(testData[upper], upperIsOpen); var request = indexObject.openKeyCursor(keyRange, ascending ? webkitIDBCursor.NEXT : webkitIDBCursor.PREV); request.onsuccess = cursorIteration; request.onerror = unexpectedErrorCallback; } function testWithinBounds() { if (expectedIndex < 0 || testData.length <= expectedIndex) window.expectedIndex = null; if (lower !== null && expectedIndex < lower) window.expectedIndex = null; if (upper !== null && upper < expectedIndex) window.expectedIndex = null; if (lower !== null && lowerIsOpen && expectedIndex <= lower) window.expectedIndex = null; if (upper !== null && upperIsOpen && upper <= expectedIndex) window.expectedIndex = null; } function cursorIteration() { if (expectedIndex === null) { shouldBeNull("event.target.result"); runNextTest(); return; } if (event.target.result === null) { testFailed("event.target.result should not be null."); runNextTest(); return; } shouldBe("event.target.result.primaryKey", "expectedIndex"); shouldBe("event.target.result.key", "testData[" + expectedIndex + "]"); window.expectedIndex = ascending ? expectedIndex + 1 : expectedIndex - 1; testWithinBounds(); event.target.result.continue(); } window.nullKeyRangeStep = 0; function testNullKeyRange() { window.lower = 0; window.lowerIsOpen = false; window.upper = testData.length-1; window.upperIsOpen = false; str = "Next test: null key path "; if (window.nullKeyRangeStep == 0) { str += "sorted ascending."; window.ascending = true; window.expectedIndex = lower; window.nullKeyRangeStep = 1; } else if (window.nullKeyRangeStep == 1) { str += "sorted descending."; window.ascending = false; window.expectedIndex = upper; window.nullKeyRangeStep = 2; } else { done(); return; } debug(""); debug(str); var request = indexObject.openKeyCursor(null, ascending ? webkitIDBCursor.NEXT : webkitIDBCursor.PREV); request.onsuccess = cursorIteration; request.onerror = unexpectedErrorCallback; } openDatabase(); // The first step. var successfullyParsed = true; </script> </body> </html>