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

description("h2 shouldn't receive any blocked events, and h3 should open after h2 is open");
indexedDBTest(prepareDatabase, openAnother);
function prepareDatabase()
{
    evalAndLog("blockedEventFired = false");
    evalAndLog("versionChangeComplete = false");
    evalAndLog("h2Opened = false");
}

function openAnother(evt)
{
    preamble(evt);
    evalAndLog("h1 = event.target.result");
    h1.onversionchange = unexpectedVersionChangeCallback;
    request = evalAndLog("indexedDB.open(dbname, 2)");
    request.onblocked = h2Blocked;
    request.onerror = unexpectedErrorCallback;
    request.onupgradeneeded = h2UpgradeNeeded;
    request.onsuccess = h2Success;

    request = evalAndLog("indexedDB.open(dbname)");
    request.onblocked = unexpectedBlockedCallback;
    request.onerror = unexpectedErrorCallback;
    request.onupgradeneeded = unexpectedUpgradeNeededCallback;
    request.onsuccess = h3Success;
    evalAndLog("h1.close()");
}

function h2Blocked(evt)
{
    // In multi-process ports h2 can erroneously get a blocked event after
    // finishJSTest is called, which adds extra output and causes the test to
    // fail.
    if (blockedEventFired)
        return;
    preamble(evt);
    evalAndLog("blockedEventFired = true");
}

function h2UpgradeNeeded(evt)
{
    preamble(evt);
    evalAndLog("h2 = event.target.result");
    h2.onversionchange = unexpectedVersionChangeCallback;
    transaction = event.target.transaction;
    transaction.onabort = unexpectedAbortCallback;
    transaction.oncomplete = function transactionOnComplete(evt) {
        preamble(evt);
        evalAndLog("versionChangeComplete = true");
    };
}

function h2Success(evt)
{
    preamble(evt);
    evalAndLog("h2Opened = true");
};

function h3Success(evt)
{
    preamble(evt);
    evalAndLog("h3 = event.target.result");
    shouldBe("h3.version", "2");
    shouldBeFalse("blockedEventFired");
    shouldBeTrue("versionChangeComplete");
    shouldBeTrue("h2Opened");
    finishJSTest();
}
