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

description("Try to call db.close() after upgradeneeded but before the corresponding success event fires");

function test()
{
    setDBNameFromPath();

    request = evalAndLog("indexedDB.deleteDatabase(dbname)");
    request.onsuccess = deleteSuccess;
    request.onerror = unexpectedErrorCallback;
}

function deleteSuccess(evt) {
    preamble(evt);

    evalAndLog("request = indexedDB.open(dbname, 7)");
    request.onsuccess = request.onerror = openSuccessOrError;
    request.onupgradeneeded = upgradeNeeded;
    request.onblocked = unexpectedBlockedCallback;
}

var sawTransactionComplete = false;
function upgradeNeeded(evt)
{
    preamble(evt);
    evalAndLog("db = event.target.result");
    shouldBe("event.newVersion", "7");
    evalAndLog("db.createObjectStore('objectstore')");

    evalAndLog("transaction = event.target.transaction");
    transaction.onabort = unexpectedAbortCallback;
    transaction.oncomplete = function transactionComplete(evt) {
        preamble(evt);
        evalAndLog("sawTransactionComplete = true");

        debug("");
        debug("Now try and close the database after oncomplete but before onsuccess.");
        debug("This will not happen in single process ports. In multi-process ports");
        debug("it may and is fine; but flaky crashes would indicate a regression.");
        debug("");

        evalAndLog("setTimeout(closeDB, 0)");
    };
}

var didCallCloseDB = false;
var didGetOpenSuccessOrError = false;

function closeDB()
{
    db.close();
    didCallCloseDB = true;
    checkFinished();
}

function openSuccessOrError(evt)
{
    // May get either a success or error event, depending on when the timeout fires
    // relative to the open steps.
    didGetOpenSuccessOrError = true;

    var quiet = true;
    if (didCallCloseDB) {
        evalAndExpectException("db.transaction(db.objectStoreNames)", "DOMException.INVALID_STATE_ERR", "'InvalidStateError'", quiet);
    } else {
        evalAndLog("db.transaction(db.objectStoreNames)", quiet);
    }

    checkFinished();
}

function checkFinished()
{
    preamble();

    if (!didCallCloseDB || !didGetOpenSuccessOrError) {
        debug("Not done yet...");
        return;
    }

    shouldBeTrue("didCallCloseDB");
    shouldBeTrue("sawTransactionComplete");
    shouldBe('db.version', "7");
    shouldBe("db.objectStoreNames.length", "1");

    finishJSTest();
}

test();
