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

description("Upgrade a database, open a second connection at the same version, ensure specifying a lower version causes an error");

function test()
{
    removeVendorPrefixes();
    setDBNameFromPath();

    request = evalAndLog("indexedDB.deleteDatabase(dbname)");
    shouldBeEqualToString("String(request)", "[object IDBOpenDBRequest]");
    request.onsuccess = deleteSuccess;
    request.onerror = unexpectedErrorCallback;
}

function deleteSuccess(evt) {
    debug("");
    debug("Call open with no version parameter:");
    request = evalAndLog("indexedDB.open(dbname)");
    request.onsuccess = openSuccess;
    request.onerror = unexpectedErrorCallback;
    request.onupgradeneeded = initialUpgradeNeeded;
    request.onblocked = unexpectedBlockedCallback;
}

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

function openSuccess(evt)
{
    event = evt;
    debug("");
    debug("openSuccess():");
    evalAndLog("connection1 = event.target.result");
    shouldBe("connection1.version", "1");
    evalAndLog("connection1.onversionchange = connection1VersionChangeCallback");
    evalAndLog("request = indexedDB.open(dbname, 2)");
    request.onupgradeneeded = connection2UpgradeNeeded
    request.onerror = unexpectedErrorCallback;
    request.onblocked = connection2BlockedCallback;
    request.onsuccess = connection2Success;
}

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

function connection2BlockedCallback(evt)
{
    preamble(evt);
    debug("This should not be called: http://crbug.com/100123");
}

function connection2UpgradeNeeded(evt)
{
    preamble(evt);
    evalAndLog("connection2 = event.target.result");
    shouldBeEqualToString("String(connection2)", "[object IDBDatabase]");
    shouldBeEqualToString("String(request.transaction)", "[object IDBTransaction]");
    shouldBe("event.oldVersion", "1");
    shouldBe("event.newVersion", "2");
    evalAndLog("request.transaction.oncomplete = transactionCompleted");
    request.transaction.onabort = unexpectedAbortCallback;
}

var didTransactionComplete = false;
function transactionCompleted(evt)
{
    preamble(evt);
    evalAndLog("didTransactionComplete = true");
}

function connection2Success(evt)
{
    preamble(evt);
    shouldBeTrue("didTransactionComplete");
    shouldBe("event.target.result", "connection2");
    debug("The next connection opens the database at the same version so connection2 shouldn't get a versionchange event.");
    evalAndLog("connection2.onversionchange = unexpectedVersionChangeCallback");
    shouldBeEqualToString("String(connection2)", "[object IDBDatabase]");
    shouldBeNull("request.transaction");
    shouldBe("connection2.version", "2");
    evalAndLog("request = indexedDB.open(dbname, 2)");
    evalAndLog("request.onsuccess = connection3Success");
    evalAndLog("request.onblocked = unexpectedBlockedCallback");
    request.onerror = unexpectedErrorCallback;
}

function connection3Success(evt)
{
    preamble(evt);
    evalAndLog("event.target.result.close()");
    evalAndLog("connection2.close()");
    evalAndLog("connection3 = event.target.result");
    shouldBe("connection3.version", "2");
    evalAndLog("request = indexedDB.open(dbname, 1)");
    evalAndLog("request.onerror = errorWhenTryingLowVersion");
    request.onblocked = unexpectedBlockedCallback;
    request.onsuccess = unexpectedSuccessCallback;
    request.onupgradeneeded = unexpectedUpgradeNeededCallback;
}

function errorWhenTryingLowVersion(evt)
{
    preamble(evt);
    debug("request.error.message = " + request.error.message);
    evalAndLog("request = indexedDB.open(dbname, 4)");
    request.onblocked = unexpectedBlockedCallback;
    request.onerror = unexpectedErrorCallback;
    evalAndLog("request.onupgradeneeded = connection4UpgradeNeeded");
    evalAndLog("request.onsuccess = connection4Success");
}

var gotConnection4UpgradeNeeded = false;
function connection4UpgradeNeeded(evt)
{
    preamble(evt);
    evalAndLog("gotConnection4UpgradeNeeded = true");
    shouldBe("event.oldVersion", "2");
    shouldBe("event.newVersion", "4");
}

function connection4Success(evt)
{
    preamble(evt);
    shouldBeTrue("gotConnection4UpgradeNeeded");
    evalAndLog("connection4 = event.target.result");
    shouldBe("connection4.version", "4");
    evalAndLog("connection4.close()");
    evalAndLog("request = indexedDB.open(dbname)");
    evalAndLog("request.onsuccess = connection5Success");
    request.onblocked = unexpectedBlockedCallback;
    request.onupgradeneeded = unexpectedUpgradeNeededCallback;
    request.onerror = unexpectedUpgradeNeededCallback;
}

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

test();
