diff options
Diffstat (limited to 'LayoutTests/storage/indexeddb/cursor-skip-deleted.html')
-rw-r--r-- | LayoutTests/storage/indexeddb/cursor-skip-deleted.html | 218 |
1 files changed, 218 insertions, 0 deletions
diff --git a/LayoutTests/storage/indexeddb/cursor-skip-deleted.html b/LayoutTests/storage/indexeddb/cursor-skip-deleted.html new file mode 100644 index 0000000..a97c4af --- /dev/null +++ b/LayoutTests/storage/indexeddb/cursor-skip-deleted.html @@ -0,0 +1,218 @@ +<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 cursor skips deleted entries."); +if (window.layoutTestController) + layoutTestController.waitUntilDone(); + +var names = ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', + 'Hotel', 'India', 'Juliet', 'Kilo', 'Lima', 'Mike', 'November', + 'Oscar', 'Papa', 'Quebec', 'Romeo', 'Sierra', 'Tango', 'Uniform', + 'Victor', 'Whiskey', 'X-ray', 'Yankee', 'Zulu']; + +test(); + +function test() +{ + result = evalAndLog("webkitIndexedDB.open('name')"); + verifyResult(result); + result.onsuccess = openSuccess; + result.onerror = unexpectedErrorCallback; +} + +function openSuccess() +{ + verifySuccessEvent(event); + var db = evalAndLog("db = event.result"); + + result = evalAndLog("db.setVersion('new version')"); + verifyResult(result); + result.onsuccess = setVersionSuccess; + result.onerror = unexpectedErrorCallback; +} + +function setVersionSuccess() +{ + debug("setVersionSuccess():"); + verifySuccessEvent(event); + window.trans = evalAndLog("trans = event.result"); + shouldBeTrue("trans !== null"); + trans.onabort = unexpectedAbortCallback; + trans.oncomplete = basicCursorTest; + + deleteAllObjectStores(db, createAndPopulateObjectStore); +} + +function createAndPopulateObjectStore() +{ + debug("createAndPopulateObjectStore():"); + + var objectStore = evalAndLog("objectStore = db.createObjectStore('store', {keyPath: 'id'})"); + evalAndLog("objectStore.createIndex('nameIndex', 'name')"); + resetObjectStore(function() {}); +} + +var silentErrorHandler = function() { event.preventDefault(); } + +function resetObjectStore(callback) +{ + debug("\nresetObjectStore():"); + if (callback === undefined) + callback = function () {}; + + var objectStore = trans.objectStore('store'); + for (var i = 0; i < names.length; i++) + objectStore.delete(i).onerror = silentErrorHandler; + for (var i = 0; i < names.length; i++) + objectStore.add({id: i, name: names[i]}).onerror = unexpectedErrorCallback; + + debug(""); + callback(); +} + +function contains(arr, obj) +{ + for (var i = 0; i < arr.length; i++) { + if (arr[i] == obj) + return true; + } + return false; +} + +var cursor; +var deleted; +var seen; + +function testCursor(deleteList, createCursorCommand, callback) +{ + debug("\ntestCursor():"); + deleted = []; + seen = []; + + // Create the cursor. + request = evalAndLog(createCursorCommand); + verifyResult(request); + + request.onerror = unexpectedErrorCallback; + request.onsuccess = function () { + if (event.result == null) { + // Make sure we have seen every non-deleted item. + for (var i = 0; i < names.length; i++) { + if (contains(deleted, i)) + continue; + + if (!contains(seen, i)) + testFailed("Cursor did not see item with id: " + i); + } + + // Make sure we used every rule in |deleteList|. + for (var i = 0; i < deleteList.length; i++) { + if (!contains(seen, deleteList[i].id)) + testFailed("deleteList rule with id: " + deleteList[i].id + " was never used."); + } + + debug(""); + callback(); + return; + } + + cursor = event.result; + debug(event.result.value.id + ": " + event.result.value.name); + seen.push(event.result.value.id); + + // Make sure we don't see any deleted items. + if (contains(deleted, event.result.value.id)) + testFailed("Cursor hit previously deleted element."); + + for (var i = 0; i < deleteList.length; i++) { + if (event.result.value.id == deleteList[i].id) { + // Delete objects targeted by this id. + var targets = deleteList[i].targets; + for (var j = 0; j < targets.length; j++) { + deleted.push(targets[j]); + request = evalAndLog("request = trans.objectStore('store').delete(" + targets[j] + ")"); + request.onerror = unexpectedErrorCallback; + if (j == targets.length - 1) + request.onsuccess = function() { cursor.continue(); } + } + return; + } + } + + cursor.continue(); + } +} + +function basicCursorTest() +{ + debug("basicCursorTest()"); + + evalAndLog("trans = db.transaction([], webkitIDBTransaction.READ_WRITE)"); + trans.onabort = unexpectedAbortCallback; + trans.oncomplete = transactionComplete; + + var deletes = [{id: 1, targets: [0]}, + {id: 2, targets: [names.length - 1]}, + {id: 3, targets: [5,6,7]}, + {id: 10, targets: [10]}, + {id: 12, targets: [13]}, + {id: 15, targets: [14]}, + {id: 20, targets: [17,18]} + ]; + + testCursor(deletes, "trans.objectStore('store').openCursor(webkitIDBKeyRange.lowerBound(0))", function() { resetObjectStore(reverseCursorTest); }); +} + +function reverseCursorTest() +{ + debug("reverseCursorTest():"); + + var deletes = [{id: 24, targets: [names.length - 1]}, + {id: 23, targets: [0]}, + {id: 22, targets: [20, 19, 18]}, + {id: 15, targets: [15]}, + {id: 13, targets: [12]}, + {id: 10, targets: [11]}, + {id: 5, targets: [7,8]} + ]; + + + testCursor(deletes, "trans.objectStore('store').openCursor(webkitIDBKeyRange.lowerBound(0), webkitIDBCursor.PREV)", function() { resetObjectStore(indexCursorTest); }); +} + +function indexCursorTest() +{ + debug("indexCursorTest():"); + + var deletes = [{id: 1, targets: [0]}, + {id: 2, targets: [names.length - 1]}, + {id: 3, targets: [5,6,7]}, + {id: 10, targets: [10]}, + {id: 12, targets: [13]}, + {id: 15, targets: [14]}, + {id: 20, targets: [17,18]} + ]; + + testCursor(deletes, "trans.objectStore('store').index('nameIndex').openCursor(webkitIDBKeyRange.lowerBound('Alpha'))", function() { }); +} + +function transactionComplete() +{ + debug("transactionComplete():"); + done(); +} + +var successfullyParsed = true; + +</script> +</body> +</html> |