| 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; |
| } |