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

description("Test that a database is recreated correctly when an open-with-version call is queued behind both a deleteDatabase and an open-with-version call");

indexedDBTest(prepareDatabase, connection1Success);
function prepareDatabase(evt)
{
    preamble(evt);
    evalAndLog("db = event.target.result");
}

function connection1Success(evt)
{
    preamble(evt);
    evalAndLog("connection1 = event.target.result");
    shouldBe("db", "connection1");
    evalAndLog("connection1.onversionchange = connection1VersionChangeCallback");
    evalAndLog("request = indexedDB.open(dbname, 2)");
    evalAndLog("request.onsuccess = connection2Success");
    evalAndLog("request.onupgradeneeded = connection2UpgradeNeeded");
    evalAndLog("request.onblocked = connection2Blocked");
    request.onerror = unexpectedErrorCallback;
}

function connection1VersionChangeCallback(evt)
{
    preamble(evt);
    shouldBeEqualToString("event.type", "versionchange");
    shouldBe("event.oldVersion", "1");
    shouldBe("event.newVersion", "2");
}

function connection2Blocked(evt)
{
    preamble(evt);
    evalAndLog("request = indexedDB.deleteDatabase(dbname)");
    evalAndLog("request.onsuccess = deleteDatabaseSuccessCallback");
    request.onerror = unexpectedErrorCallback;

    evalAndLog("request = indexedDB.open(dbname, 3)");
    evalAndLog("request.onupgradeneeded = connection3UpgradeNeeded");
    evalAndLog("request.onsuccess = connection3Success");
    request.onerror = unexpectedErrorCallback;
    evalAndLog("connection1.close()");
}

function deleteDatabaseSuccessCallback(evt)
{
    preamble(evt);
    shouldBeUndefined("event.target.result");
    shouldBeEqualToString("event.type", "success");
}

function connection2UpgradeNeeded(evt)
{
    preamble(evt);
    shouldBe("event.oldVersion", "1");
    shouldBe("event.newVersion", "2");
    evalAndLog("db = event.target.result");
    evalAndLog("db.onversionchange = connection2VersionChangeCallback");
    shouldBe("db.objectStoreNames.length", "0");
    evalAndLog("db.createObjectStore('some object store')");
    evalAndLog("transaction = event.target.transaction");
    evalAndLog("transaction.oncomplete = connection2TransactionComplete");
}

function connection2Success(evt)
{
    preamble(evt);
    evalAndLog("connection2 = event.target.result");
    connection2.onversionchange = unexpectedVersionChangeCallback;
    evalAndLog("connection2.close()");
}

function connection2TransactionComplete(evt)
{
    preamble(evt);
    shouldBe("db.version", "2");
}

function connection2VersionChangeCallback(evt)
{
    preamble(evt);
    shouldBe("event.oldVersion", "2");
    shouldBeNull("event.newVersion");
}

var gotUpgradeNeededEvent = false;
function connection3UpgradeNeeded(evt)
{
    preamble(evt);
    evalAndLog("gotUpgradeNeededEvent = true");
    shouldBe("event.newVersion", "3");
    shouldBe("event.oldVersion", "0");
}

function connection3Success(evt)
{
    preamble(evt);
    shouldBeTrue("gotUpgradeNeededEvent");
    shouldBe("event.target.result.objectStoreNames.length", "0");
    finishJSTest();
}
