| <html> |
| <head> |
| <link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"> |
| <script src="../../fast/js/resources/js-test-pre.js"></script> |
| <script src="../../fast/js/resources/js-test-post-function.js"></script> |
| <script src="resources/shared.js"></script> |
| </head> |
| <body> |
| <p id="description"></p> |
| <div id="console"></div> |
| <script> |
| |
| description("Test the basics of IndexedDB's IDBObjectStore."); |
| if (window.layoutTestController) |
| layoutTestController.waitUntilDone(); |
| |
| function test() |
| { |
| result = evalAndLog("webkitIndexedDB.open('name')"); |
| verifyResult(result); |
| result.onsuccess = openSuccess; |
| result.onerror = unexpectedErrorCallback; |
| } |
| |
| function openSuccess() |
| { |
| debug("openSuccess():"); |
| verifySuccessEvent(event); |
| window.db = evalAndLog("db = event.result"); |
| |
| result = evalAndLog("db.setVersion('new version')"); |
| verifyResult(result); |
| result.onsuccess = setVersionSuccess; |
| result.onerror = unexpectedErrorCallback; |
| } |
| |
| function setVersionSuccess() |
| { |
| debug("setVersionSuccess():"); |
| verifySuccessEvent(event); |
| window.trans = evalAndLog("trans = event.result"); |
| shouldBeTrue("trans !== null"); |
| trans.onabort = unexpectedAbortCallback; |
| |
| deleteAllObjectStores(db, createObjectStore); |
| } |
| |
| function createObjectStore() |
| { |
| debug("createObjectStore():"); |
| window.store = evalAndLog("store = db.createObjectStore('storeName', null)"); |
| var storeNames = evalAndLog("storeNames = db.objectStoreNames"); |
| |
| shouldBeEqualToString("store.name", "storeName"); |
| shouldBeNull("store.keyPath"); |
| shouldBe("storeNames.contains('storeName')", "true"); |
| shouldBe("storeNames.length", "1"); |
| // FIXME: test all of object store's methods. |
| |
| debug("Ask for an index that doesn't exist:"); |
| try { |
| debug("index = store.index('asdf')"); |
| index = store.index('asdf'); |
| testFailed("Asking for a store that doesn't exist should have thrown."); |
| } catch (err) { |
| testPassed("Exception thrown."); |
| // FIXME: Verify the correct exception thrown. |
| } |
| |
| createIndex(); |
| } |
| |
| function createIndex() |
| { |
| debug("createIndex():"); |
| var index = evalAndLog("index = store.createIndex('indexName', 'x', true)"); // true == unique requirement. |
| shouldBeTrue("index !== null"); |
| shouldBeTrue("store.indexNames.contains('indexName')"); |
| index = evalAndLog("index = store.index('indexName')"); |
| shouldBeTrue("index !== null"); |
| |
| debug("Ask for an index that doesn't exist:"); |
| try { |
| debug("index = store.index('asdf')"); |
| index = store.index('asdf'); |
| testFailed("Asking for a store that doesn't exist should have thrown."); |
| } catch (err) { |
| testPassed("Exception thrown."); |
| // FIXME: Verify the correct exception thrown. |
| } |
| |
| commitAndContinue(); |
| } |
| |
| function commitAndContinue() |
| { |
| window.setTimeout(testSetVersionAbort, 0); |
| } |
| |
| function testSetVersionAbort() |
| { |
| result = evalAndLog('db.setVersion("version fail")'); |
| verifyResult(result); |
| result.onsuccess = createAnotherIndex; |
| result.onerror = unexpectedErrorCallback; |
| } |
| |
| function createAnotherIndex() |
| { |
| verifySuccessEvent(event); |
| shouldBeEqualToString("db.version", "version fail"); |
| |
| var setVersionTrans = evalAndLog("setVersionTrans = event.result"); |
| shouldBeTrue("setVersionTrans !== null"); |
| setVersionTrans.oncomplete = unexpectedCompleteCallback; |
| setVersionTrans.onabort = checkMetadata; |
| window.store = evalAndLog("store = setVersionTrans.objectStore('storeName')"); |
| var index = evalAndLog("index = store.createIndex('indexFail', 'x')"); |
| |
| setVersionTrans.abort(); |
| } |
| |
| function checkMetadata() |
| { |
| shouldBeEqualToString("db.version", "new version"); |
| shouldBe("store.indexNames", "['indexName']"); |
| shouldBe("store.indexNames.length", "1"); |
| shouldBe("store.indexNames.contains('')", "false"); |
| shouldBe("store.indexNames.contains('indexFail')", "false"); |
| shouldBe("store.indexNames.contains('indexName')", "true"); |
| shouldBeEqualToString("store.indexNames[0]", "indexName"); |
| shouldBeNull("store.indexNames[1]"); |
| shouldBeNull("store.indexNames[100]"); |
| shouldBeNull("store.indexNames.item(1)"); |
| shouldBeNull("store.indexNames.item(100)"); |
| addData(); |
| } |
| |
| |
| function addData() |
| { |
| var transaction = evalAndLog("transaction = db.transaction()"); |
| transaction.onabort = unexpectedAbortCallback; |
| window.store = evalAndLog("store = transaction.objectStore('storeName')"); |
| |
| debug("Try to insert data with a Date key:"); |
| // FIXME: This should work in the future. |
| try { |
| debug("store.add({x: 'foo'}, new Date())"); |
| store.add({x: 'foo'}, new Date()); |
| testFailed("Passing a Date as key argument should have thrown."); |
| } catch (err) { |
| testPassed("Exception thrown"); |
| code = err.code; |
| shouldBe("code", "DOMException.TYPE_MISMATCH_ERR"); |
| } |
| |
| // FIXME: This should work in the future. |
| debug("Try to insert data where key path yields a Date key:"); |
| result = evalAndLog("store.add({x: new Date()}, 'foo')"); |
| result.onsuccess = unexpectedSuccessCallback; |
| result.onerror = addKeyPathYieldingDateFailure; |
| } |
| |
| function addKeyPathYieldingDateFailure() |
| { |
| testPassed("Adding data where key path yielded Date key resulted in error."); |
| |
| result = evalAndLog("store.add({x: 'value'}, 'key')"); |
| verifyResult(result); |
| result.onsuccess = addSuccess; |
| result.onerror = unexpectedErrorCallback; |
| } |
| |
| function addSuccess() |
| { |
| debug("addSuccess():"); |
| verifySuccessEvent(event); |
| shouldBeEqualToString("event.result", "key"); |
| |
| result = evalAndLog("event.source.add({x: 'value'}, 'zzz')"); |
| verifyResult(result); |
| result.onsuccess = unexpectedSuccessCallback; |
| result.onerror = addAgainFailure; |
| } |
| |
| function addAgainFailure() |
| { |
| debug("addAgainFailure():"); |
| verifyErrorEvent(event); |
| // FIXME: This error code needs to be specced. |
| shouldBe("event.code", "webkitIDBDatabaseException.UNKNOWN_ERR"); |
| |
| transaction = evalAndLog("db.transaction()"); |
| transaction.onabort = unexpectedErrorCallback; |
| var store = evalAndLog("store = transaction.objectStore('storeName')"); |
| |
| result = evalAndLog("store.add({x: 'othervalue'}, null)"); |
| verifyResult(result); |
| result.onsuccess = unexpectedSuccessCallback; |
| result.onerror = addWithNullKeyFailure; |
| } |
| |
| function addWithNullKeyFailure() |
| { |
| debug("addWithNullKeyFailre():"); |
| verifyErrorEvent(event); |
| shouldBe("event.code", "webkitIDBDatabaseException.DATA_ERR"); |
| |
| transaction = evalAndLog("db.transaction()"); |
| transaction.onabort = unexpectedErrorCallback; |
| var store = evalAndLog("store = transaction.objectStore('storeName')"); |
| |
| result = evalAndLog("store.add({x: null}, 'validkey')"); |
| verifyResult(result); |
| result.onsuccess = unexpectedSuccessCallback; |
| result.onerror = addWithNullIndexFailure; |
| } |
| |
| function addWithNullIndexFailure() |
| { |
| debug("addWithNullIndexFailure():"); |
| verifyErrorEvent(event); |
| shouldBe("event.code", "webkitIDBDatabaseException.DATA_ERR"); |
| |
| transaction = evalAndLog("db.transaction()"); |
| transaction.onabort = unexpectedErrorCallback; |
| var store = evalAndLog("store = transaction.objectStore('storeName')"); |
| |
| result = evalAndLog("store.get('key')"); |
| verifyResult(result); |
| result.onsuccess = getSuccess; |
| result.onerror = unexpectedErrorCallback; |
| } |
| |
| function getSuccess() |
| { |
| debug("getSuccess():"); |
| verifySuccessEvent(event); |
| shouldBeEqualToString("event.result.x", "value"); |
| var store = evalAndLog("store = event.source"); |
| |
| result = evalAndLog("store.remove('key')"); |
| verifyResult(result); |
| result.onsuccess = removeSuccess; |
| result.onerror = unexpectedErrorCallback; |
| } |
| |
| function removeSuccess() |
| { |
| debug("removeSuccess():"); |
| verifySuccessEvent(event); |
| shouldBeNull("event.result"); |
| var store = evalAndLog("store = event.source"); |
| |
| try { |
| debug("Passing an invalid key into store.get()."); |
| store.get([]); |
| testFailed("No exception thrown"); |
| } catch (e) { |
| testPassed("Caught exception: " + e.toString()); |
| } |
| |
| try { |
| debug("Passing an invalid key into store.remove()."); |
| store.remove([]); |
| testFailed("No exception thrown"); |
| } catch (e) { |
| testPassed("Caught exception: " + e.toString()); |
| } |
| |
| try { |
| debug("Passing an invalid key into store.add()."); |
| store.add(null, []); |
| testFailed("No exception thrown"); |
| } catch (e) { |
| testPassed("Caught exception: " + e.toString()); |
| } |
| |
| try { |
| debug("Passing an invalid key into store.put()."); |
| store.put(null, []); |
| testFailed("No exception thrown"); |
| } catch (e) { |
| testPassed("Caught exception: " + e.toString()); |
| } |
| |
| done(); |
| } |
| |
| test(); |
| |
| var successfullyParsed = true; |
| |
| </script> |
| </body> |
| </html> |