| if (this.importScripts) { |
| importScripts('../../../resources/js-test.js'); |
| importScripts('shared.js'); |
| } |
| |
| description("Test exceptions in IDBRequest handlers cause aborts."); |
| |
| indexedDBTest(prepareDatabase, startTest); |
| function prepareDatabase() |
| { |
| db = event.target.result; |
| event.target.transaction.onabort = unexpectedAbortCallback; |
| store = evalAndLog("store = db.createObjectStore('storeName', null)"); |
| request = evalAndLog("store.add({x: 'value', y: 'zzz'}, 'key')"); |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function startTest() |
| { |
| debug(""); |
| trans = evalAndLog("trans = db.transaction(['storeName'], 'readwrite')"); |
| evalAndLog("trans.onabort = transactionAborted1"); |
| evalAndLog("trans.oncomplete = unexpectedCompleteCallback"); |
| store = evalAndLog("store = trans.objectStore('storeName')"); |
| request = evalAndLog("store.add({x: 'value2', y: 'zzz2'}, 'key2')"); |
| trans.addEventListener('success', causeException, true); |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function causeException() |
| { |
| debug(""); |
| evalAndLog("event.preventDefault()"); |
| debug("Throwing"); |
| expectError(); |
| throw "this exception is expected"; |
| } |
| |
| function transactionAborted1() |
| { |
| debug(""); |
| shouldHaveHadError("this exception is expected"); |
| testPassed("The transaction was aborted."); |
| trans = evalAndLog("trans = db.transaction(['storeName'], 'readwrite')"); |
| evalAndLog("trans.onabort = transactionAborted2"); |
| evalAndLog("trans.oncomplete = unexpectedCompleteCallback"); |
| store = evalAndLog("store = trans.objectStore('storeName')"); |
| request = evalAndLog("store.add({x: 'value', y: 'zzz'}, 'key')"); |
| request.onsuccess = unexpectedSuccessCallback; |
| db.onerror = causeException; |
| } |
| |
| function transactionAborted2() |
| { |
| debug(""); |
| shouldHaveHadError("this exception is expected"); |
| testPassed("The transaction was aborted."); |
| trans = evalAndLog("trans = db.transaction(['storeName'], 'readwrite')"); |
| evalAndLog("trans.onabort = unexpectedAbortCallback"); |
| evalAndLog("trans.oncomplete = transactionCompleted1"); |
| store = evalAndLog("store = trans.objectStore('storeName')"); |
| request = evalAndLog("store.add({x: 'value3', y: 'zzz3'}, 'key3')"); |
| request.onsuccess = throwAndCatch; |
| request.onerror = unexpectedErrorCallback; |
| db.onerror = null; |
| } |
| |
| function throwAndCatch() |
| { |
| debug(""); |
| evalAndLog("event.preventDefault()"); |
| debug("Throwing within a try block"); |
| try { |
| throw "AHHH"; |
| } catch (e) { |
| } |
| } |
| |
| function transactionCompleted1() |
| { |
| debug(""); |
| testPassed("The transaction completed."); |
| trans = evalAndLog("trans = db.transaction(['storeName'], 'readwrite')"); |
| evalAndLog("trans.onabort = unexpectedAbortCallback"); |
| evalAndLog("trans.oncomplete = transactionCompleted2"); |
| store = evalAndLog("store = trans.objectStore('storeName')"); |
| request = evalAndLog("store.add({x: 'value4', y: 'zzz4'}, 'key4')"); |
| request.onsuccess = function() { testPassed("key4 added"); } |
| request.onerror = unexpectedErrorCallback; |
| } |
| |
| function transactionCompleted2() |
| { |
| debug(""); |
| testPassed("The transaction completed."); |
| debug(""); |
| finishJSTest(); |
| } |