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