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

description("Test that an aborted 'versionchange' transaction closes the connection.");

indexedDBTest(prepareDatabase, onOpen, {version: 1});
function prepareDatabase(evt)
{
    preamble(evt);
    evalAndLog("db = event.target.result");
    evalAndLog("db.createObjectStore('store')");
}

function onOpen(evt)
{
    preamble(evt);
    evalAndLog("db = event.target.result");
    evalAndLog("db.close()");
    openAgain();
}

function openAgain() {
    preamble();
    evalAndLog("request = indexedDB.open(dbname, 2)");
    request.onsuccess = unexpectedSuccessCallback;
    request.onblocked = unexpectedBlockedCallback;
    request.onupgradeneeded = onUpgradeNeeded;
    request.onerror = onOpenError;
}

function onUpgradeNeeded(evt)
{
    preamble(evt);
    evalAndLog("db = event.target.result");
    evalAndLog("transaction = event.target.transaction");
    evalAndLog("sawTransactionAbort = false");
    transaction.oncomplete = unexpectedCompleteCallback;
    transaction.onabort = onTransactionAbort;
    transaction.abort();
}

function onTransactionAbort(evt)
{
    preamble(evt);
    evalAndLog("sawTransactionAbort = true");
    debug("creating a transaction should fail because connection is closed:");
    evalAndExpectException("db.transaction('store')", "DOMException.INVALID_STATE_ERR", "'InvalidStateError'");
}

function onOpenError(evt)
{
    preamble(evt);
    shouldBeTrue("sawTransactionAbort");
    debug("creating a transaction should fail because connection is closed:");
    evalAndExpectException("db.transaction('store')", "DOMException.INVALID_STATE_ERR", "'InvalidStateError'");
    finishJSTest();
}
