chromium/third_party/blink/web_tests/storage/indexeddb/resources/transaction-complete-workers.js

if (this.importScripts) {
    importScripts('../../../resources/js-test.js');
    importScripts('shared.js');
}

description("Test IndexedDB workers, recursion, and transaction termination.");

indexedDBTest(prepareDatabase, createTransaction);
function prepareDatabase(evt)
{
    preamble(evt);
    db = event.target.result;
    event.target.transaction.onabort = unexpectedAbortCallback;
    evalAndLog("db.createObjectStore('store')");
}

function createTransaction()
{
    debug("");
    debug("createTransaction():");
    evalAndLog("transaction = db.transaction('store', 'readonly', {durability: 'relaxed'})");
    evalAndLog("store = transaction.objectStore('store')");
    transaction.onerror = unexpectedErrorCallback;
    transaction.onabort = unexpectedAbortCallback;
    transaction.oncomplete = emptyTransactionCompleted;
}

function emptyTransactionCompleted()
{
    testPassed("Transaction completed");
    evalAndExpectException("store.get(0)", "0", "'TransactionInactiveError'");
    recursionTest();
}

function recursionTest()
{
    debug("");
    debug("recursionTest():");
    evalAndLog("transaction = db.transaction('store', 'readonly', {durability: 'relaxed'})");
    evalAndLog("store = transaction.objectStore('store')");
    transaction.oncomplete = transactionCompleted;
    transaction.onabort = unexpectedAbortCallback;
    evalAndLog("store.get(0)");
    testPassed("transaction is active");
    recurse(1);
}

function recurse(count)
{
    debug("recursion depth: " + count);
    evalAndLog("store.get(0)");
    testPassed("transaction is still active");
    if (count < 3) {
        recurse(count + 1);
    }
    debug("recursion depth: " + count);
    evalAndLog("store.get(0)");
    testPassed("transaction is still active");
}

function transactionCompleted()
{
    testPassed("transaction completed");
    evalAndExpectException("store.get(0)", "0", "'TransactionInactiveError'");

    debug("");
    debug("trying a timeout callback:");
    evalAndLog("setTimeout(timeoutTest, 0)");
}

function timeoutTest()
{
    debug("");
    debug("timeoutTest():");

    evalAndLog("transaction = db.transaction('store', 'readonly', {durability: 'relaxed'})");
    evalAndLog("store = transaction.objectStore('store')");
    transaction.onabort = unexpectedAbortCallback;
    transaction.oncomplete = function () {
        testPassed("transaction started in setTimeout() callback completed");
        evalAndExpectException("store.get(0)", "0", "'TransactionInactiveError'");

        errorTest();
    };
}

function errorTest()
{
    debug("");
    debug("errorTest():");
    evalAndLog("self.old_onerror = self.onerror");
    evalAndLog("self.onerror = errorHandler");
    throw new Error("ignore this");
}

function errorHandler(e)
{
    debug("");
    debug("errorHandler():");
    // FIXME: Should be able to stop the error here, but it isn't an Event object.
    // evalAndLog("event.preventDefault()");
    evalAndLog("self.onerror = self.old_onerror");
    evalAndLog("transaction = db.transaction('store', 'readonly', {durability: 'relaxed'})");
    evalAndLog("store = transaction.objectStore('store')");
    transaction.onerror = unexpectedErrorCallback;
    transaction.onabort = unexpectedAbortCallback;
    transaction.oncomplete = errorTransactionCompleted;
}

function errorTransactionCompleted()
{
    testPassed("Transaction completed");
    evalAndExpectException("store.get(0)", "0", "'TransactionInactiveError'");
    finishJSTest();
}