111 lines
3.3 KiB
JavaScript
111 lines
3.3 KiB
JavaScript
if (this.importScripts) {
|
|
importScripts('../../../resources/js-test.js');
|
|
importScripts('shared.js');
|
|
}
|
|
|
|
description("Test IndexedDB's cursor value property.");
|
|
|
|
indexedDBTest(prepareDatabase, testCursor);
|
|
function prepareDatabase()
|
|
{
|
|
db = event.target.result;
|
|
evalAndLog("db.createObjectStore('store')");
|
|
}
|
|
|
|
function testCursor()
|
|
{
|
|
debug("");
|
|
debug("testCursor():");
|
|
evalAndLog("transaction = db.transaction('store', 'readwrite')");
|
|
evalAndLog("store = transaction.objectStore('store')");
|
|
evalAndLog("store.put({a: 1, b: 10}, 'key1')");
|
|
evalAndLog("store.put({a: 2, b: 20}, 'key2')");
|
|
evalAndLog("store.put({a: 3, b: 30}, 'key3')");
|
|
evalAndLog("store.put({a: 4, b: 40}, 'key4')");
|
|
evalAndLog("store.put({a: 5, b: 50}, 'key5')");
|
|
evalAndLog("request = store.openCursor()");
|
|
request.onerror = unexpectedErrorCallback;
|
|
var index = 0;
|
|
request.onsuccess = function() {
|
|
debug("");
|
|
debug("----------");
|
|
debug("Value at index: " + index);
|
|
evalAndLog("cursor = request.result");
|
|
if (index == 0) {
|
|
ensureObjectData(1, 10, 'key1');
|
|
cursor.continue();
|
|
index++;
|
|
} else if (index == 1) {
|
|
ensureObjectData(2, 20, 'key2');
|
|
cursor.advance(2);
|
|
index += 2;
|
|
} else if (index == 3) {
|
|
ensureObjectData(4, 40, 'key4');
|
|
} else {
|
|
testFailed("Bad index: " + index);
|
|
}
|
|
};
|
|
|
|
transaction.oncomplete = ensureModificationsNotPersisted;
|
|
}
|
|
|
|
function ensureObjectData(a, b, key)
|
|
{
|
|
expectedA = a;
|
|
expectedB = b;
|
|
expectedKey = key;
|
|
shouldBe("cursor.key", "expectedKey");
|
|
|
|
debug("");
|
|
debug("Check expected values:");
|
|
shouldBe("cursor.value.a", "expectedA");
|
|
shouldBe("cursor.value.b", "expectedB");
|
|
shouldBe("cursor.value.foo", "undefined");
|
|
|
|
debug("");
|
|
debug("Modify values:");
|
|
evalAndLog("cursor.value.a = 3");
|
|
evalAndLog("delete cursor.value.b");
|
|
evalAndLog("cursor.value.foo = 'bar'");
|
|
|
|
debug("");
|
|
debug("Ensure modifications are retained:");
|
|
shouldBe("cursor.value.a", "3");
|
|
shouldBe("cursor.value.b", "undefined");
|
|
shouldBe("cursor.value.foo", "'bar'");
|
|
|
|
// make sure to test GC before holding a specific ref to the value
|
|
debug("");
|
|
debug("Check object value survives gc");
|
|
evalAndLog("gc()");
|
|
shouldBe("cursor.value.a", "3");
|
|
shouldBe("cursor.value.b", "undefined");
|
|
shouldBe("cursor.value.foo", "'bar'");
|
|
|
|
debug("");
|
|
debug("Check object identity");
|
|
evalAndLog("localValueRef = cursor.value");
|
|
shouldBe("localValueRef", "cursor.value");
|
|
}
|
|
|
|
function ensureModificationsNotPersisted()
|
|
{
|
|
debug("");
|
|
debug("ensureModificationsNotPersisted():");
|
|
evalAndLog("transaction = db.transaction('store', 'readonly')");
|
|
evalAndLog("store = transaction.objectStore('store')");
|
|
evalAndLog("request = store.openCursor()");
|
|
request.onerror = unexpectedErrorCallback;
|
|
request.onsuccess = function() {
|
|
evalAndLog("cursor = request.result");
|
|
shouldBe("cursor.key", "'key1'");
|
|
|
|
debug("");
|
|
debug("Check expected values:");
|
|
shouldBe("cursor.value.a", "1");
|
|
shouldBe("cursor.value.b", "10");
|
|
shouldBe("cursor.value.foo", "undefined");
|
|
};
|
|
transaction.oncomplete = finishJSTest;
|
|
}
|