<!DOCTYPE html>
<!--
original test: http://mxr.mozilla.org/mozilla2.0/source/dom/indexedDB/test/test_indexes.html?force=1
license of original test:
" Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ "
-->
<html>
<head>
<script src="../../../resources/js-test.js"></script>
<script src="../resources/shared.js"></script>
</head>
<body>
<script>
description("Test IndexedDB: iterating backwards through an index, skipping duplicates");
indexedDBTest(prepareDatabase, testPrev);
function prepareDatabase()
{
db = event.target.result;
trans = event.target.transaction;
objectStoreName = "People";
objectStoreData = [
{ key: "237-23-7732", value: { name: "Bob", height: 60, weight: 120 } },
{ key: "237-23-7733", value: { name: "Ann", height: 52, weight: 110 } },
{ key: "237-23-7734", value: { name: "Ron", height: 73, weight: 180 } },
{ key: "237-23-7735", value: { name: "Sue", height: 58, weight: 130 } },
{ key: "237-23-7736", value: { name: "Joe", height: 65, weight: 150 } },
{ key: "237-23-7737", value: { name: "Pat", height: 65, weight: 100 } },
{ key: "237-23-7738", value: { name: "Leo", height: 65, weight: 180 } },
{ key: "237-23-7739", value: { name: "Jef", height: 65, weight: 120 } },
{ key: "237-23-7740", value: { name: "Sam", height: 73, weight: 110 } },
];
indexData = [
{ name: "name", keyPath: "name", options: { unique: true } },
{ name: "height", keyPath: "height", options: { } },
{ name: "weight", keyPath: "weight", options: { unique: false } }
];
objectStoreDataHeightSort = [
{ key: "237-23-7733", value: { name: "Ann", height: 52, weight: 110 } },
{ key: "237-23-7735", value: { name: "Sue", height: 58, weight: 130 } },
{ key: "237-23-7732", value: { name: "Bob", height: 60, weight: 120 } },
{ key: "237-23-7736", value: { name: "Joe", height: 65, weight: 150 } },
{ key: "237-23-7737", value: { name: "Pat", height: 65, weight: 100 } },
{ key: "237-23-7738", value: { name: "Leo", height: 65, weight: 180 } },
{ key: "237-23-7739", value: { name: "Jef", height: 65, weight: 120 } },
{ key: "237-23-7734", value: { name: "Ron", height: 73, weight: 180 } },
{ key: "237-23-7740", value: { name: "Sam", height: 73, weight: 110 } },
];
objectStore = evalAndLog("objectStore = db.createObjectStore(objectStoreName);");
debug("First, add all our data to the object store.");
addedData = 0;
for (i in objectStoreData) {
request = evalAndLog("request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function(event)
{
if (++addedData == objectStoreData.length) {
createIndexes();
}
}
}
trans.oncomplete = function() {
evalAndLog("trans = db.transaction(objectStoreName, 'readwrite')");
evalAndLog("objectStore = trans.objectStore(objectStoreName)");
};
}
function createIndexes()
{
debug("Now create the indexes.");
for (i in indexData) {
evalAndLog("objectStore.createIndex(indexData[i].name, indexData[i].keyPath, indexData[i].options);");
}
}
function testPrev()
{
debug("testPrev()");
trans = evalAndLog("trans = db.transaction(objectStoreName)");
objectStore = evalAndLog("objectStore = trans.objectStore(objectStoreName);");
keyIndex = evalAndLog("keyIndex = 8;");
// first try with just PREV
request = evalAndLog("request = objectStore.index('height').openCursor(null, 'prev');");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function(event)
{
cursor = evalAndLog("cursor = event.target.result;");
if (cursor) {
shouldBe("cursor.key", "" + objectStoreDataHeightSort[keyIndex].value.height);
shouldBe("cursor.primaryKey", "'" + objectStoreDataHeightSort[keyIndex].key + "'");
shouldBe("cursor.value.name", "'" + objectStoreDataHeightSort[keyIndex].value.name + "'");
shouldBe("cursor.value.height", "" + objectStoreDataHeightSort[keyIndex].value.height);
if ('weight' in cursor.value) {
shouldBe("cursor.value.weight", "" + objectStoreDataHeightSort[keyIndex].value.weight);
}
evalAndLog("cursor.continue();");
evalAndLog("keyIndex--;");
debug(" => " + keyIndex);
}
else {
debug("No cursor: " + cursor);
shouldBe("keyIndex", "-1");
}
};
trans.oncomplete = testPrevNoDuplicate;
}
function testPrevNoDuplicate()
{
debug("testPrevNoDuplicate()");
objectStore = evalAndLog("objectStore = db.transaction(objectStoreName).objectStore(objectStoreName);");
keyIndex = evalAndLog("keyIndex = 8;");
request = evalAndLog("request = objectStore.index('height').openCursor(null, 'prevunique');");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function (event)
{
cursor = evalAndLog("cursor = event.target.result;");
if (keyIndex == 8) {
evalAndLog("keyIndex -= 1");
}
if (keyIndex == 6) {
evalAndLog("keyIndex -= 3;");
}
debug(" => Entering with keyIndex = " + keyIndex);
if (cursor) {
shouldBe("cursor.key", "" + objectStoreDataHeightSort[keyIndex].value.height);
shouldBe("cursor.primaryKey", "'" + objectStoreDataHeightSort[keyIndex].key + "'");
shouldBe("cursor.value.name", "'" + objectStoreDataHeightSort[keyIndex].value.name + "'");
shouldBe("cursor.value.height", "" + objectStoreDataHeightSort[keyIndex].value.height);
if ('weight' in cursor.value) {
shouldBe("cursor.value.weight", "" + objectStoreDataHeightSort[keyIndex].value.weight);
}
evalAndLog("cursor.continue();");
evalAndLog("keyIndex--;");
}
else {
debug("No cursor: " + cursor);
shouldBe("keyIndex", "-1");
finishJSTest();
}
}
}
var successfullyParsed = true;
</script>
</body>
</html>