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

description("Test calling db.open in upgradeneeded.");

function test()
{
    setDBNameFromPath();

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

function deleteSuccess(evt) {
    evalAndLog("request = indexedDB.open(dbname, 1)");
    evalAndLog("request.onupgradeneeded = upgradeNeeded1");
    evalAndLog("request.onsuccess = openSuccess1");
    request.onblocked = unexpectedBlockedCallback;
    request.onerror = unexpectedErrorCallback;
}

var sawTransactionComplete = false;
function upgradeNeeded1(evt)
{
    preamble(evt);
    evalAndLog("db = event.target.result");
    shouldBe("event.newVersion", "1");

    evalAndLog("transaction = event.target.transaction");
    evalAndLog("db.createObjectStore('os')");
    transaction.onabort = unexpectedAbortCallback;
    transaction.oncomplete = function transactionOnComplete() {
        preamble();
        evalAndLog("sawTransactionComplete = true");
    };
    evalAndLog("db.onversionchange = onVersionChange");
    evalAndLog("request = indexedDB.open(dbname, 3)");
    evalAndLog("request.onupgradeneeded = upgradeNeeded2");
    evalAndLog("request.onsuccess = openSuccess2");
    request.onblocked = unexpectedBlockedCallback;
    request.onerror = unexpectedErrorCallback;
}

function openSuccess1(evt)
{
    preamble(evt);
    shouldBeTrue("sawTransactionComplete");
    db = evalAndLog("db = event.target.result");
    shouldBe('db.version', "1");
    debug("Start a transaction to ensure the connection is still open.");
    evalAndLog("transaction = db.transaction('os')");
}

function onVersionChange(evt)
{
    preamble(evt);
    evalAndLog("db.close()");
}

function upgradeNeeded2(evt)
{
    preamble(evt);
    evalAndLog("db = event.target.result");
    shouldBe("event.newVersion", "3");
}

function openSuccess2(evt)
{
    preamble(evt);
    evalAndLog("db = event.target.result");
    shouldBe("db.version", "3");
    finishJSTest();
}

test();
