• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
4<script src="../../fast/js/resources/js-test-pre.js"></script>
5<script src="../../fast/js/resources/js-test-post-function.js"></script>
6<script src="resources/shared.js"></script>
7</head>
8<body>
9<p id="description"></p>
10<div id="console"></div>
11<script>
12
13description("Test IndexedDB's objectStore.openCursor + the cursor it produces in depth.");
14if (window.layoutTestController)
15    layoutTestController.waitUntilDone();
16
17// In order of how it should be sorted by IndexedDB.
18window.testData = [
19    2.718281828459,
20    3,
21    3.14159265,
22    10,
23    // FIXME: Dates.
24    "A bigger string",
25    "The biggest",
26    "a low string"
27];
28
29function openDatabase()
30{
31    request = evalAndLog("webkitIndexedDB.open('objectstore-cursor')");
32    request.onsuccess = setVersion;
33    request.onerror = unexpectedErrorCallback;
34}
35
36function setVersion()
37{
38    window.db = evalAndLog("db = event.target.result");
39
40    request = evalAndLog("db.setVersion('new version')");
41    request.onsuccess = deleteExisting;
42    request.onerror = unexpectedErrorCallback;
43}
44
45function deleteExisting()
46{
47    window.trans = evalAndLog("trans = event.target.result");
48    shouldBeTrue("trans !== null");
49    trans.onabort = unexpectedAbortCallback;
50
51    deleteAllObjectStores(db);
52
53    window.objectStore = evalAndLog("db.createObjectStore('someObjectStore')");
54    window.nextToAdd = 0;
55    addData();
56}
57
58function addData()
59{
60    request = evalAndLog("objectStore.add('', testData[nextToAdd])");
61    request.onsuccess = ++window.nextToAdd < testData.length ? addData : scheduleTests;
62    request.onerror = unexpectedErrorCallback;
63}
64
65function scheduleTests()
66{
67    debug("Scheduling tests...");
68    window.scheduledTests = [];
69    for (var i = 0; i < testData.length; ++i) {
70        /* left bound, is open, right bound, is open, ascending */
71        scheduledTests.unshift([i, true, null, null, true]);
72        scheduledTests.unshift([i, false, null, null, true]);
73        scheduledTests.unshift([null, null, i, true, true]);
74        scheduledTests.unshift([null, null, i, false, true]);
75        scheduledTests.unshift([i, true, null, null, false]);
76        scheduledTests.unshift([i, false, null, null, false]);
77        scheduledTests.unshift([null, null, i, true, false]);
78        scheduledTests.unshift([null, null, i, false, false]);
79        for (var j = 6; j < testData.length; ++j) {
80            scheduledTests.unshift([i, true, j, true, true]);
81            scheduledTests.unshift([i, true, j, false, true]);
82            scheduledTests.unshift([i, false, j, true, true]);
83            scheduledTests.unshift([i, false, j, false, true]);
84            scheduledTests.unshift([i, true, j, true, false]);
85            scheduledTests.unshift([i, true, j, false, false]);
86            scheduledTests.unshift([i, false, j, true, false]);
87            scheduledTests.unshift([i, false, j, false, false]);
88        }
89    }
90
91    debug("Running tests...");
92    runNextTest();
93}
94
95function runNextTest()
96{
97    if (!scheduledTests.length) {
98        testNullKeyRange();
99        return;
100    }
101
102    var test = scheduledTests.pop();
103    window.lower = test[0];
104    window.lowerIsOpen = test[1];
105    window.upper = test[2];
106    window.upperIsOpen = test[3];
107    window.ascending = test[4];
108
109    str = "Next test: ";
110    if (lower !== null) {
111        str += "lower ";
112        if (lowerIsOpen)
113            str += "open ";
114        str += "bound is " + lower + "; ";
115    }
116    if (upper !== null) {
117        str += "upper ";
118        if (upperIsOpen)
119            str += "open ";
120        str += "bound is " + upper + "; ";
121    }
122    if (ascending)
123        str += "sorted ascending.";
124    else
125        str += "sorted descending.";
126
127    debug("");
128    debug(str);
129
130    if (ascending) {
131        if (lower !== null) {
132            if (!lowerIsOpen)
133                window.expectedIndex = lower;
134            else
135                window.expectedIndex = lower+1;
136        } else
137            window.expectedIndex = 0;
138    } else {
139        if (upper !== null) {
140            if (!upperIsOpen)
141                window.expectedIndex = upper;
142            else
143                window.expectedIndex = upper-1;
144        } else
145            window.expectedIndex = testData.length-1;
146    }
147    testWithinBounds();
148
149    var keyRange;
150    if (lower !== null && upper !== null)
151        keyRange = webkitIDBKeyRange.bound(testData[lower], testData[upper], lowerIsOpen, upperIsOpen);
152    else if (lower !== null)
153        keyRange = webkitIDBKeyRange.lowerBound(testData[lower], lowerIsOpen);
154    else
155        keyRange = webkitIDBKeyRange.upperBound(testData[upper], upperIsOpen);
156
157    var request = objectStore.openCursor(keyRange, ascending ? webkitIDBCursor.NEXT : webkitIDBCursor.PREV);
158    request.onsuccess = cursorIteration;
159    request.onerror = unexpectedErrorCallback;
160}
161
162function testWithinBounds()
163{
164    if (expectedIndex < 0 || testData.length <= expectedIndex)
165        window.expectedIndex = null;
166    if (lower !== null && expectedIndex < lower)
167        window.expectedIndex = null;
168    if (upper !== null && upper < expectedIndex)
169        window.expectedIndex = null;
170    if (lower !== null && lowerIsOpen && expectedIndex <= lower)
171        window.expectedIndex = null;
172    if (upper !== null && upperIsOpen && upper <= expectedIndex)
173        window.expectedIndex = null;
174}
175
176function cursorIteration()
177{
178    if (expectedIndex === null) {
179        shouldBeNull("event.target.result");
180        runNextTest();
181        return;
182    }
183    if (event.target.result === null) {
184        testFailed("event.target.result should not be null.");
185        runNextTest();
186        return;
187    }
188
189    shouldBe("event.target.result.key", "testData[" + expectedIndex + "]");
190    window.expectedIndex = ascending ? expectedIndex+1 : expectedIndex-1;
191    testWithinBounds();
192
193    event.target.result.continue();
194}
195
196window.nullKeyRangeStep = 0;
197function testNullKeyRange()
198{
199    window.lower = 0;
200    window.lowerIsOpen = false;
201    window.upper = testData.length-1;
202    window.upperIsOpen = false;
203
204    str = "Next test: null key path ";
205    if (window.nullKeyRangeStep == 0) {
206        str += "sorted ascending.";
207        window.ascending = true;
208        window.expectedIndex = lower;
209        window.nullKeyRangeStep = 1;
210    } else if (window.nullKeyRangeStep == 1) {
211        str += "sorted descending.";
212        window.ascending = false;
213        window.expectedIndex = upper;
214        window.nullKeyRangeStep = 2;
215    } else {
216        done();
217        return;
218    }
219
220    debug("");
221    debug(str);
222
223    var request = objectStore.openCursor(null, ascending ? webkitIDBCursor.NEXT : webkitIDBCursor.PREV);
224    request.onsuccess = cursorIteration;
225    request.onerror = unexpectedErrorCallback;
226}
227
228openDatabase(); // The first step.
229var successfullyParsed = true;
230
231</script>
232</body>
233</html>
234