blob: 473412784d9e67d8206be5b25aa27031a96b78ca [file] [log] [blame]
<html>
<head>
<script src="../../fast/js/resources/js-test-pre.js"></script>
<script src="resources/shared.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description("Test mutating an IndexedDB's objectstore from a cursor.");
if (window.layoutTestController)
layoutTestController.waitUntilDone();
test();
function test()
{
request = evalAndLog("webkitIndexedDB.open('mutating-cursor')");
request.onsuccess = openSuccess;
request.onerror = unexpectedErrorCallback;
}
function openSuccess()
{
var db = evalAndLog("db = event.target.result");
request = evalAndLog("db.setVersion('1')");
request.onsuccess = setVersionSuccess;
request.onerror = unexpectedErrorCallback;
}
function setVersionSuccess()
{
debug("setVersionSuccess():");
window.trans = evalAndLog("trans = event.target.result");
shouldBeTrue("trans !== null");
trans.onabort = unexpectedAbortCallback;
trans.oncomplete = openForwardCursor;
deleteAllObjectStores(db);
var objectStore = evalAndLog("objectStore = db.createObjectStore('store')");
evalAndLog("objectStore.add(1, 1).onerror = unexpectedErrorCallback");
evalAndLog("objectStore.add(2, 2).onerror = unexpectedErrorCallback");
evalAndLog("objectStore.add(3, 3).onerror = unexpectedErrorCallback");
evalAndLog("objectStore.add(4, 4).onerror = unexpectedErrorCallback");
}
function openForwardCursor()
{
debug("openForwardCursor()");
evalAndLog("trans = db.transaction(['store'], webkitIDBTransaction.READ_WRITE)");
trans.onabort = unexpectedAbortCallback;
trans.oncomplete = forwardCursorComplete;
window.objectStore = evalAndLog("trans.objectStore('store')");
request = evalAndLog("objectStore.openCursor()");
request.onsuccess = forwardCursor;
request.onerror = unexpectedErrorCallback;
window.cursorSteps = 0;
}
function forwardCursor()
{
debug("forwardCursor()");
window.cursor = event.target.result;
if (event.target.result == null) {
shouldBe("cursorSteps", "5");
// Let the transaction finish.
return;
}
debug(++cursorSteps);
shouldBe("cursor.key", "cursorSteps");
shouldBe("cursor.value", "cursorSteps");
if (cursorSteps == 1) {
request = evalAndLog("event.target.source.add(5, 5)");
request.onsuccess = function() { evalAndLog("cursor.continue()"); }
request.onerror = unexpectedErrorCallback;
} else {
evalAndLog("cursor.continue()");
}
}
function forwardCursorComplete()
{
debug("forwardCursorComplete()");
openReverseCursor()
}
function openReverseCursor()
{
debug("openReverseCursor()");
evalAndLog("trans = db.transaction(['store'], webkitIDBTransaction.READ_WRITE)");
trans.onabort = unexpectedAbortCallback;
trans.oncomplete = reverseCursorComplete;
window.objectStore = evalAndLog("trans.objectStore('store')");
request = evalAndLog("objectStore.openCursor(null, webkitIDBCursor.PREV)");
request.onsuccess = reverseCursor;
request.onerror = unexpectedErrorCallback;
window.cursorSteps = 6;
}
function reverseCursor()
{
debug("reverseCursor()");
window.cursor = event.target.result;
if (event.target.result == null) {
shouldBe("cursorSteps", "0");
// Let the transaction finish.
return;
}
debug(--cursorSteps);
shouldBe("cursor.key", "cursorSteps");
shouldBe("cursor.value", "cursorSteps");
if (cursorSteps == 2) {
request = evalAndLog("event.target.source.add(0, 0)");
request.onsuccess = function() { evalAndLog("cursor.continue()"); }
request.onerror = unexpectedErrorCallback;
} else {
evalAndLog("cursor.continue()");
}
}
function reverseCursorComplete()
{
debug("reverseCursorComplete()");
done();
}
</script>
</body>
</html>