| if (this.importScripts) { |
| importScripts('../../../resources/js-test.js'); |
| importScripts('shared.js'); |
| } |
| |
| description("Test IndexedDB keys ordering and readback from cursors."); |
| |
| indexedDBTest(prepareDatabase, populateStore); |
| function prepareDatabase() |
| { |
| db = event.target.result; |
| evalAndLog("db.createObjectStore('store')"); |
| } |
| |
| self.keys = [ |
| "-Infinity", |
| "-Number.MAX_VALUE", |
| "-1", |
| "-Number.MIN_VALUE", |
| "0", |
| "Number.MIN_VALUE", |
| "1", |
| "Number.MAX_VALUE", |
| "Infinity", |
| |
| "new Date(0)", |
| "new Date(1000)", |
| "new Date(1317399931023)", |
| |
| "''", |
| "'\x00'", |
| "'a'", |
| "'aa'", |
| "'b'", |
| "'ba'", |
| |
| "'\xA2'", // U+00A2 CENT SIGN |
| "'\u6C34'", // U+6C34 CJK UNIFIED IDEOGRAPH (water) |
| "'\uD834\uDD1E'", // U+1D11E MUSICAL SYMBOL G-CLEF (UTF-16 surrogate pair) |
| "'\uFFFD'", // U+FFFD REPLACEMENT CHARACTER |
| |
| "[]", |
| |
| "[-Infinity]", |
| "[-Number.MAX_VALUE]", |
| "[-1]", |
| "[-Number.MIN_VALUE]", |
| "[0]", |
| "[Number.MIN_VALUE]", |
| "[1]", |
| "[Number.MAX_VALUE]", |
| "[Infinity]", |
| |
| "[new Date(0)]", |
| "[new Date(1000)]", |
| "[new Date(1317399931023)]", |
| |
| "['']", |
| "['\x00']", |
| "['a']", |
| "['aa']", |
| "['b']", |
| "['ba']", |
| |
| "['\xA2']", // U+00A2 CENT SIGN |
| "['\u6C34']", // U+6C34 CJK UNIFIED IDEOGRAPH (water) |
| "['\uD834\uDD1E']", // U+1D11E MUSICAL SYMBOL G-CLEF (UTF-16 surrogate pair) |
| "['\uFFFD']", // U+FFFD REPLACEMENT CHARACTER |
| |
| "[[]]", |
| |
| "[[], []]", |
| "[[], [], []]", |
| |
| "[[[]]]", |
| "[[[[]]]]" |
| ]; |
| |
| function compare(a, b) |
| { |
| if (typeof a !== typeof b) { |
| return false; |
| } |
| |
| switch (typeof a) { |
| case 'undefined': // Not valid keys, but compare anyway. |
| case 'boolean': // Not valid keys, but compare anyway. |
| case 'string': |
| return a === b; |
| case 'number': |
| if (a === b) { |
| return (a !== 0) || (1 / a === 1 / b); // 0 isn't -0 |
| } else { |
| return a !== a && b !== b; // NaN is NaN |
| } |
| case 'object': |
| if (a instanceof Date && b instanceof Date) { |
| return +a === +b; |
| } else if (a instanceof Array && b instanceof Array) { |
| if (a.length !== b.length) { |
| return false; |
| } |
| for (var i = 0; i < a.length; i++) { |
| if (!compare(a[i], b[i])) { |
| return false; |
| } |
| } |
| return true; |
| } |
| // For the purposes of this test, other objects don't count |
| return false; |
| default: |
| return false; |
| } |
| } |
| |
| function populateStore() |
| { |
| debug(""); |
| debug("populating store..."); |
| evalAndLog("trans = db.transaction('store', 'readwrite')"); |
| evalAndLog("store = trans.objectStore('store');"); |
| trans.onerror = unexpectedErrorCallback; |
| trans.onabort = unexpectedAbortCallback; |
| var count = 0; |
| keys.forEach(function(key) { |
| evalAndLog("store.put(" + (count++) + ", " + key + ")"); |
| }); |
| trans.oncomplete = checkStore; |
| } |
| |
| function checkStore() |
| { |
| debug(""); |
| debug("iterating cursor..."); |
| evalAndLog("trans = db.transaction('store', 'readonly')"); |
| evalAndLog("store = trans.objectStore('store');"); |
| trans.onerror = unexpectedErrorCallback; |
| trans.onabort = unexpectedAbortCallback; |
| evalAndLog("count = 0"); |
| curreq = evalAndLog("curreq = store.openCursor()"); |
| curreq.onerror = unexpectedErrorCallback; |
| curreq.onsuccess = function() { |
| if (curreq.result) { |
| evalAndLog("cursor = curreq.result"); |
| shouldBeTrue("compare(cursor.key, " + keys[count] + ")"); |
| evalAndLog("getreq = store.get(cursor.key)"); |
| getreq.onerror = unexpectedErrorCallback; |
| getreq.onsuccess = function() { |
| shouldBe("getreq.result", "count++"); |
| cursor.continue(); |
| }; |
| } else { |
| shouldBe("count", "keys.length"); |
| finishUp(); |
| } |
| }; |
| } |
| |
| function finishUp() |
| { |
| testKeyCompare(); |
| finishJSTest(); |
| } |
| |
| function testKeyCompare() |
| { |
| debug(""); |
| debug("validate compare function"); |
| var cases = [ |
| "undefined", |
| "true", |
| "false", |
| "0", |
| "-0", |
| "123", |
| "Infinity", |
| "-Infinity", |
| "NaN", |
| "''", |
| "'abc'", |
| "'xyz'", |
| "new Date(0)", |
| "new Date(1e3)", |
| "new Date(1e9)", |
| "[]", |
| "[123]", |
| "['abc']", |
| "[123, 'abc']", |
| "['abc', 123]", |
| "[[]]", |
| "[[123]]", |
| "[['abc']]", |
| "[[123], 'abc']", |
| "[[123], 123]" |
| ]; |
| |
| for (var i = 0; i < cases.length; ++i) { |
| for (var j = 0; j < cases.length; ++j) { |
| if (i === j) { |
| shouldBeTrue("compare(" + cases[i] + ", " + cases[j] + ")"); |
| } else { |
| shouldBeFalse("compare(" + cases[i] + ", " + cases[j] + ")"); |
| } |
| } |
| } |
| } |