| if (this.importScripts) { |
| importScripts('../../../resources/js-test.js'); |
| importScripts('shared.js'); |
| } |
| |
| description("Test features of IndexedDB's unique indices."); |
| |
| indexedDBTest(prepareDatabase, setVersionCompleted); |
| function prepareDatabase() |
| { |
| db = event.target.result; |
| event.target.transaction.onabort = unexpectedAbortCallback; |
| |
| self.store = evalAndLog("db.createObjectStore('store')"); |
| self.indexObject = evalAndLog("store.createIndex('index', 'x', {unique: true})"); |
| } |
| |
| function setVersionCompleted() |
| { |
| debug("setVersionCompleted():"); |
| self.transaction = evalAndLog("transaction = db.transaction(['store'], 'readwrite')"); |
| |
| request = evalAndLog("transaction.objectStore('store').put({x: 1}, 'foo')"); |
| request.onerror = unexpectedErrorCallback; |
| request.onsuccess = addMoreData; |
| } |
| |
| function addMoreData() |
| { |
| debug("addMoreData():"); |
| |
| // The x value violates the uniqueness constraint of the index. |
| request = evalAndLog("transaction.objectStore('store').put({x: 1}, 'bar')"); |
| request.onerror = addMoreDataFailed; |
| request.onsuccess = unexpectedSuccessCallback; |
| } |
| |
| function addMoreDataFailed() |
| { |
| debug("addMoreDataFailed():"); |
| |
| // Don't abort the transaction. |
| evalAndLog("event.preventDefault()"); |
| |
| shouldBe("event.target.error.name", "'ConstraintError'"); |
| |
| // Update the 'foo' entry in object store, changing the value of x. |
| request = evalAndLog("transaction.objectStore('store').put({x: 0}, 'foo')"); |
| request.onerror = unexpectedErrorCallback; |
| request.onsuccess = changeDataSuccess; |
| } |
| |
| function changeDataSuccess() |
| { |
| debug("changeDataSuccess():"); |
| |
| // An index cursor starting at 1 should not find anything. |
| var request = evalAndLog("transaction.objectStore('store').index('index').openCursor(IDBKeyRange.lowerBound(1))"); |
| request.onsuccess = cursorSuccess; |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function cursorSuccess() |
| { |
| debug("cursorSuccess():"); |
| shouldBeNull("event.target.result"); |
| |
| // A key cursor starting at 1 should not find anything. |
| var request = evalAndLog("transaction.objectStore('store').index('index').openKeyCursor(IDBKeyRange.lowerBound(1))"); |
| request.onsuccess = keyCursorSuccess; |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function keyCursorSuccess() |
| { |
| debug("keyCursorSuccess():"); |
| shouldBeNull("event.target.result"); |
| |
| // Now we should be able to add a value with x: 1. |
| request = evalAndLog("transaction.objectStore('store').put({x: 1}, 'bar')"); |
| request.onerror = unexpectedErrorCallback; |
| request.onsuccess = addMoreDataSucces; |
| } |
| |
| function addMoreDataSucces() |
| { |
| debug("addMoreDataSucces():"); |
| |
| request = evalAndLog("transaction.objectStore('store').delete('bar')"); |
| request.onerror = unexpectedErrorCallback; |
| request.onsuccess = deleteSuccess; |
| } |
| |
| function deleteSuccess() |
| { |
| debug("deleteSuccess():"); |
| |
| // Now we should be able to add a value with x: 1 again. |
| request = evalAndLog("transaction.objectStore('store').put({x: 1}, 'baz')"); |
| request.onerror = unexpectedErrorCallback; |
| request.onsuccess = finalAddSuccess; |
| } |
| |
| function finalAddSuccess() { |
| debug("finalAddSuccess():"); |
| |
| // An overwrite should be ok. |
| request = evalAndLog("transaction.objectStore('store').put({x: 1}, 'baz')"); |
| request.onerror = unexpectedErrorCallback; |
| request.onsuccess = finishJSTest; |
| } |