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 a deleteDatabase call");

function test()
{
    removeVendorPrefixes();
    setDBNameFromPath();
    request = evalAndLog("indexedDB.deleteDatabase(dbname)");
    request.onsuccess = deleteSuccess;
    request.onerror = unexpectedErrorCallback;
}

function deleteSuccess(evt) {
    preamble(evt);
    debugger;
    evalAndLog("request = indexedDB.open(dbname)");
    evalAndLog("request.onsuccess = firstSuccessCallback");
    request.onerror = unexpectedErrorCallback;
}

function firstSuccessCallback(evt)
{
    event = evt;
    debug("");
    debug("firstSuccessCallback():");
    evalAndLog("connection1 = event.target.result");
    evalAndLog("connection1.onversionchange = connection1VersionChangeCallback");
    evalAndLog("request = indexedDB.open(dbname)");
    evalAndLog("request.onsuccess = secondSuccessCallback");
    request.onerror = unexpectedErrorCallback;

    evalAndLog("request = indexedDB.deleteDatabase(dbname)");
    evalAndLog("request.onblocked = deleteDatabaseBlockedCallback");
    evalAndLog("request.onsuccess = deleteDatabaseSuccessCallback");
    request.onerror = unexpectedErrorCallback;

    evalAndLog("request = indexedDB.open(dbname, 1)");
    evalAndLog("request.onupgradeneeded = upgradeNeededCallback");
    evalAndLog("request.onsuccess = openWithVersionSuccessCallback");
    request.onblocked = unexpectedBlockedCallback;
    request.onerror = unexpectedErrorCallback;
}

function secondSuccessCallback(evt)
{
    preamble(evt);
    evalAndLog("db = event.target.result");
    evalAndLog("db.onversionchange = connection2VersionChangeCallback");
}

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

function connection2VersionChangeCallback(evt)
{
    preamble(evt);
    shouldBeEqualToString("event.type", "versionchange");
    evalAndLog("event.target.close()");
}

function deleteDatabaseBlockedCallback(evt)
{
    preamble(evt);
    evalAndLog("connection1.close()");
}

function deleteDatabaseSuccessCallback(evt)
{
    preamble(evt);
}

function upgradeNeededCallback(evt)
{
    preamble(evt);
    shouldBe("event.newVersion", "1");
    shouldBe("event.oldVersion", "0");
}

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

test();
