// original test:
// http://mxr.mozilla.org/mozilla2.0/source/dom/indexedDB/test/test_cursors.html?force=1
// license of original test:
// " Any copyright is dedicated to the Public Domain.
// http://creativecommons.org/publicdomain/zero/1.0/ "
if (this.importScripts) {
importScripts('../../../../resources/js-test.js');
importScripts('../../resources/shared.js');
}
description("Test IndexedDB cursor behavior");
indexedDBTest(prepareDatabase);
function prepareDatabase()
{
db = event.target.result;
event.target.transaction.onabort = unexpectedAbortCallback;
objectStore = evalAndLog("db.createObjectStore('autoIncrement', { autoIncrement: true });");
request = evalAndLog("request = objectStore.openCursor();");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function (event) {
shouldBe("event.target.result", "null");
testGroup2();
}
}
function testGroup2()
{
objectStore = evalAndLog("db.createObjectStore('autoIncrementKeyPath', { keyPath: 'foo', autoIncrement: true });");
request = evalAndLog("request = objectStore.openCursor();");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function (event) {
shouldBe("event.target.result", "null");
testGroup3();
}
}
function testGroup3()
{
objectStore = evalAndLog("db.createObjectStore('keyPath', { keyPath: 'foo' });");
request = evalAndLog("request = objectStore.openCursor();");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function (event) {
shouldBe("event.target.result", "null");
testGroup4();
}
}
function testGroup4()
{
objectStore = evalAndLog("db.createObjectStore('foo');");
request = evalAndLog("request = objectStore.openCursor();");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function (event) {
shouldBe("event.target.result", "null");
testGroup5();
}
}
function testGroup5()
{
keys = evalAndLog("keys = [1, -1, 0, 10, 2000, 'q', 'z', 'two', 'b', 'a'];");
sortedKeys = evalAndLog("sortedKeys = [-1, 0, 1, 10, 2000, 'a', 'b', 'q', 'two', 'z'];");
keyIndex = evalAndLog("keyIndex = 0;");
for (i in keys) {
request = evalAndLog("request = objectStore.add('foo', keys[i]);");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function(event) {
if (++keyIndex == keys.length) {
testGroup6();
}
};
}
}
function testGroup6()
{
keyIndex = 0;
request = evalAndLog("request = objectStore.openCursor();");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function (event) {
cursor = evalAndLog("cursor = event.target.result;");
if (cursor) {
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
evalAndLog("cursor.continue();");
evalAndExpectException("cursor.continue();", "DOMException.INVALID_STATE_ERR");
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
evalAndLog("keyIndex++;");
}
else {
shouldBe("keyIndex", "keys.length");
testGroup7();
}
}
}
function testGroup7()
{
keyIndex = evalAndLog("keyIndex = 4;");
range = evalAndLog("range = IDBKeyRange.bound(2000, 'q');");
request = evalAndLog("request = objectStore.openCursor(range);");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function (event) {
cursor = evalAndLog("cursor = event.target.result;");
if (cursor) {
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
evalAndLog("cursor.continue();");
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
evalAndLog("keyIndex++;");
}
else {
shouldBe("keyIndex", "8");
testGroup8();
}
}
}
function testGroup8()
{
keyIndex = 0;
request = evalAndLog("request = objectStore.openCursor();");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function (event) {
cursor = evalAndLog("cursor = event.target.result;");
if (cursor) {
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
if (keyIndex) {
evalAndLog("cursor.continue();");
}
else {
evalAndLog("cursor.continue('b');");
}
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
evalAndLog("keyIndex += keyIndex ? 1: 6;");
}
else {
shouldBe("keyIndex", "keys.length");
testGroup9();
}
}
}
function testGroup9()
{
keyIndex = evalAndLog("keyIndex = 0;");
request = evalAndLog("request = objectStore.openCursor();");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function (event) {
cursor = evalAndLog("cursor = event.target.result;");
if (cursor) {
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
if (keyIndex) {
evalAndLog("cursor.continue();");
}
else {
evalAndLog("cursor.continue(10);");
}
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
evalAndLog("keyIndex += keyIndex ? 1: 3;");
}
else {
shouldBe("keyIndex", "keys.length");
testGroup10();
}
}
}
function testGroup10()
{
keyIndex = evalAndLog("keyIndex = 0;");
request = evalAndLog("request = objectStore.openCursor();");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function (event) {
cursor = evalAndLog("cursor = event.target.result;");
if (cursor) {
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
if (keyIndex) {
evalAndLog("cursor.continue();");
}
else {
evalAndLog("cursor.continue('c');");
}
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
evalAndLog("keyIndex += keyIndex ? 1 : 7;");
}
else {
shouldBe("keyIndex", "keys.length");
testGroup11();
}
}
}
function testGroup11()
{
keyIndex = evalAndLog("keyIndex = 0;");
request = evalAndLog("request = objectStore.openCursor();");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function (event) {
cursor = evalAndLog("cursor = event.target.result;");
if (cursor) {
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
if (keyIndex == 4) {
request = evalAndLog("request = cursor.update('bar');");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function(event) {
evalAndLog("keyIndex++;");
evalAndLog("cursor.continue();");
};
}
else {
evalAndLog("keyIndex++;");
evalAndLog("cursor.continue();");
}
}
else {
shouldBe("keyIndex", "keys.length");
testGroup12();
}
}
}
function testGroup12()
{
request = evalAndLog("request = objectStore.get(sortedKeys[4]);");
request.onerror = unexpectedErrorCallback;
request.onsuccess = testGroup12b;
}
function testGroup12b()
{
shouldBe("event.target.result", "'bar'");
request = evalAndLog("request = objectStore.put('foo', sortedKeys[4]);");
request.onerror = unexpectedErrorCallback;
request.onsuccess = testGroup13;
}
function testGroup13()
{
keyIndex = evalAndLog("keyIndex = 0;");
gotRemoveEvent = false;
retval = false;
request = evalAndLog("request = objectStore.openCursor(null, 'next');");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function (event) {
cursor = evalAndLog("cursor = event.target.result;");
if (cursor) {
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
if (keyIndex == 4) {
request = evalAndLog("request = cursor.delete();");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function(event) {
shouldBe("keyIndex", "5");
gotRemoveEvent = evalAndLog("gotRemoveEvent = true;");
};
}
evalAndLog("keyIndex++;");
evalAndLog("cursor.continue();");
}
else {
shouldBe("keyIndex", "keys.length");
shouldBe("gotRemoveEvent", "true");
testGroup14();
}
}
}
function testGroup14()
{
request = evalAndLog("request = objectStore.get(sortedKeys[4]);");
request.onerror = unexpectedErrorCallback;
request.onsuccess = testGroup14b;
}
function testGroup14b()
{
shouldBe("event.target.result", "undefined");
request = evalAndLog("request = objectStore.add('foo', sortedKeys[4]);");
request.onerror = unexpectedErrorCallback;
request.onsuccess = testGroup15;
}
function testGroup15()
{
keyIndex = sortedKeys.length - 1;
request = evalAndLog("request = objectStore.openCursor(null, 'prev');");
request.onerror = unexpectedErrorCallback;
request.onsuccess = function (event) {
cursor = evalAndLog("cursor = event.target.result;");
if (cursor) {
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
evalAndLog("cursor.continue();");
shouldBe("cursor.key", "sortedKeys[keyIndex]");
shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
shouldBe("cursor.value", "'foo'");
evalAndLog("keyIndex--;");
}
else {
shouldBe("keyIndex", "-1");
finishJSTest();
}
}
}