<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 exceptions in IDBRequest handlers cause aborts."); if (window.layoutTestController) layoutTestController.waitUntilDone(); function test() { request = evalAndLog("webkitIndexedDB.open('exception-in-event-aborts')"); request.onsuccess = setVersion; request.onerror = unexpectedErrorCallback; } function setVersion() { db = evalAndLog("db = event.target.result"); request = evalAndLog("db.setVersion('new version')"); request.onsuccess = deleteExisting; request.onerror = unexpectedErrorCallback; } function deleteExisting() { debug("setVersionSuccess():"); window.trans = evalAndLog("trans = event.target.result"); shouldBeTrue("trans !== null"); trans.onabort = unexpectedAbortCallback; evalAndLog("trans.oncomplete = startTest"); deleteAllObjectStores(db); 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([], webkitIDBTransaction.READ_WRITE)"); 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"); throw "this exception is expected"; } function transactionAborted1() { debug(""); testPassed("The transaction was aborted."); trans = evalAndLog("trans = db.transaction([], webkitIDBTransaction.READ_WRITE)"); 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(""); testPassed("The transaction was aborted."); trans = evalAndLog("trans = db.transaction([], webkitIDBTransaction.READ_WRITE)"); 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([], webkitIDBTransaction.READ_WRITE)"); 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 = unexpectedSuccessCallback; request.onerror = throwAndCatch; } function transactionCompleted2() { debug(""); testPassed("The transaction completed."); debug(""); done(); } test(); var successfullyParsed = true; </script> </body> </html>