| if (this.importScripts) { |
| importScripts('../../../resources/js-test.js'); |
| importScripts('shared.js'); |
| } |
| |
| description("Test IndexedDB's IDBObjectStore auto-increment feature."); |
| |
| indexedDBTest(prepareDatabase, setVersionCompleted); |
| function prepareDatabase() |
| { |
| db = event.target.result; |
| event.target.transaction.onabort = unexpectedAbortCallback; |
| |
| debug("createObjectStore():"); |
| self.store = evalAndLog("store = db.createObjectStore('StoreWithKeyPath', {keyPath: 'id', autoIncrement: true})"); |
| evalAndLog("db.createObjectStore('StoreWithAutoIncrement', {autoIncrement: true})"); |
| evalAndLog("db.createObjectStore('PlainOldStore', {autoIncrement: false})"); |
| evalAndLog("db.createObjectStore('StoreWithLongKeyPathAndUTF8', {keyPath: 'a.b.c.køi', autoIncrement: true})"); |
| var storeNames = evalAndLog("storeNames = db.objectStoreNames"); |
| |
| shouldBeEqualToString("store.name", "StoreWithKeyPath"); |
| shouldBeEqualToString("store.keyPath", "id"); |
| shouldBe("storeNames.contains('StoreWithKeyPath')", "true"); |
| shouldBe("storeNames.contains('StoreWithAutoIncrement')", "true"); |
| shouldBe("storeNames.contains('PlainOldStore')", "true"); |
| shouldBe("storeNames.length", "4"); |
| } |
| |
| function setVersionCompleted() |
| { |
| debug("setVersionCompleted():"); |
| |
| self.trans = evalAndLog("trans = db.transaction(['StoreWithKeyPath', 'StoreWithAutoIncrement', 'PlainOldStore'], 'readwrite')"); |
| trans.onabort = unexpectedAbortCallback; |
| trans.oncomplete = testLongKeyPath; |
| |
| self.store = evalAndLog("store = trans.objectStore('StoreWithKeyPath')"); |
| |
| debug("Insert into object store with auto increment and key path, with key in the object."); |
| request = evalAndLog("store.add({name: 'Jeffersson', number: '7010', id: 3})"); |
| request.onsuccess = addJefferssonSuccess; |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function addJefferssonSuccess() |
| { |
| debug("addJefferssonSuccess():"); |
| shouldBe("event.target.result", "3"); |
| |
| debug("Insert into object store with auto increment and key path, without key in the object."); |
| request = evalAndLog("store.add({name: 'Lincoln', number: '7012'})"); |
| request.onsuccess = addLincolnWithInjectKeySuccess; |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function addLincolnWithInjectKeySuccess() |
| { |
| debug("addLincolnWithInjectKeySuccess():"); |
| shouldBe("event.target.result", "4"); |
| |
| result = evalAndLog("store.get(4)"); |
| result.onsuccess = getLincolnAfterInjectedKeySuccess; |
| result.onerror = unexpectedErrorCallback; |
| } |
| |
| function getLincolnAfterInjectedKeySuccess() |
| { |
| debug("getLincolnAfterInjectedKeySuccess():"); |
| shouldBeEqualToString("event.target.result.name", "Lincoln"); |
| shouldBeEqualToString("event.target.result.number", "7012"); |
| shouldBe("event.target.result.id", "4"); |
| |
| request = evalAndLog("store.add({name: 'Bob', number: Uint8Array.from([100, 101])})"); |
| request.onsuccess = putBobSuccess; |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function putBobSuccess() |
| { |
| debug("putBobSuccess():"); |
| shouldBe("event.target.result", "5"); |
| |
| request = evalAndLog("store.get(5)"); |
| request.onsuccess = getBobSuccess; |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function getBobSuccess() |
| { |
| debug("getBobSuccess():"); |
| shouldBeEqualToString("event.target.result.name", "Bob"); |
| shouldBe("event.target.result.number", "[100, 101]"); |
| |
| self.store = evalAndLog("store = trans.objectStore('StoreWithAutoIncrement')"); |
| debug("Insert into object store with key gen using explicit key"); |
| request = evalAndLog("store.add({name: 'Lincoln', number: '7012'}, 6)"); |
| request.onsuccess = addLincolnWithExplicitKeySuccess; |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function addLincolnWithExplicitKeySuccess() |
| { |
| debug("addLincolnWithExplicitKeySuccess():"); |
| shouldBe("event.target.result", "6"); |
| |
| request = evalAndLog("store.get(6)"); |
| request.onsuccess = getLincolnSuccess; |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function getLincolnSuccess() |
| { |
| debug("getLincolnSuccess():"); |
| shouldBeEqualToString("event.target.result.name", "Lincoln"); |
| shouldBeEqualToString("event.target.result.number", "7012"); |
| |
| request = evalAndLog("store.put({name: 'Abraham', number: '2107'})"); |
| request.onsuccess = putAbrahamSuccess; |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function putAbrahamSuccess() |
| { |
| debug("putAbrahamSuccess():"); |
| shouldBe("event.target.result", "7"); |
| |
| request = evalAndLog("store.get(7)"); |
| request.onsuccess = getAbrahamSuccess; |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function getAbrahamSuccess() |
| { |
| debug("getAbrahamSuccess():"); |
| shouldBeEqualToString("event.target.result.name", "Abraham"); |
| shouldBeEqualToString("event.target.result.number", "2107"); |
| |
| self.store = evalAndLog("store = trans.objectStore('PlainOldStore')"); |
| debug("Try adding with no key to object store without auto increment."); |
| evalAndExpectException("store.add({name: 'Adam'})", "0", "'DataError'"); |
| request = evalAndLog("store.add({name: 'Adam'}, 1)"); |
| request.onsuccess = addAdamSuccess; |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function addAdamSuccess() |
| { |
| debug("addAdamSuccess():"); |
| shouldBe("event.target.result", "1"); |
| } |
| |
| function testLongKeyPath() |
| { |
| debug("testLongKeyPath():"); |
| trans = evalAndLog("trans = db.transaction('StoreWithLongKeyPathAndUTF8', 'readwrite')"); |
| trans.onabort = unexpectedAbortCallback; |
| trans.oncomplete = finishJSTest; |
| |
| store = evalAndLog("store = trans.objectStore('StoreWithLongKeyPathAndUTF8')"); |
| request = evalAndLog("store.add({foo: 'bar'})"); |
| request.onerror = unexpectedErrorCallback; |
| request = evalAndLog("store.add({foo: 'bar', a: {}})"); |
| request.onerror = unexpectedErrorCallback; |
| request = evalAndLog("store.add({foo: 'bar', a: {b: {}}})"); |
| request.onerror = unexpectedErrorCallback; |
| request = evalAndLog("store.add({foo: 'bar', a: {b: {c: {}}}})"); |
| request.onerror = unexpectedErrorCallback; |
| cursorRequest = evalAndLog("store.openCursor()"); |
| cursorRequest.onerror = unexpectedErrorCallback; |
| evalAndLog("expected = null"); |
| evalAndLog("count = 0"); |
| cursorRequest.onsuccess = function () { |
| cursor = cursorRequest.result; |
| if (!cursor) { |
| shouldBe("count", "4"); |
| return; |
| } |
| if (expected === null) { |
| evalAndLog("expected = cursor.value.a.b.c.køi + 1"); |
| } else { |
| shouldBeEqualToString("cursor.value.foo", "bar"); |
| shouldBe("cursor.value.a.b.c.køi", "expected"); |
| evalAndLog("expected = cursor.value.a.b.c.køi + 1"); |
| } |
| count++; |
| cursor.continue(); |
| }; |
| } |