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

description("Ensure that aborted VERSION_CHANGE transactions are completely rolled back");

indexedDBTest(prepareDatabase, setVersion1Complete);
function prepareDatabase()
{
    db = event.target.result;
    trans = event.target.transaction;
    shouldBeTrue("trans instanceof IDBTransaction");
    trans.onabort = unexpectedAbortCallback;
    trans.onerror = unexpectedErrorCallback;

    evalAndLog("store = db.createObjectStore('store1')");
}

function setVersion1Complete()
{
    debug("setVersion1 complete");
    shouldBe("db.version", "1");
    debug("");
    db.close();

    evalAndLog("vcreq = indexedDB.open(dbname, 2)");
    vcreq.onupgradeneeded = inSetVersion2;
    vcreq.onerror = setVersion2Abort;
    vcreq.onblocked = unexpectedBlockedCallback;
    vcreq.onsuccess = unexpectedSuccessCallback;
}

function inSetVersion2()
{
    db = event.target.result;
    debug("setVersion2() callback");
    shouldBe("db.version", "2");
    shouldBeTrue("vcreq.transaction instanceof IDBTransaction");
    trans = vcreq.result;
    trans.onerror = unexpectedErrorCallback;
    trans.oncomplete = unexpectedCompleteCallback;

    evalAndLog("store = db.deleteObjectStore('store1')");
    evalAndLog("store = db.createObjectStore('store2')");

    // Ensure the test harness error handler is not invoked.
    self.originalWindowOnError = self.onerror;
    self.onerror = null;

    debug("raising exception");
    throw new Error("This should *NOT* be caught!");
}

function setVersion2Abort()
{
    debug("");
    debug("setVersion2Abort() callback");

    // Restore test harness error handler.
    self.onerror = self.originalWindowOnError;
    db.close();
    evalAndLog("request = indexedDB.open(dbname)");
    request.onblocked = unexpectedBlockedCallback;
    request.onupgradeneeded = unexpectedUpgradeNeededCallback;
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (e) {
        db = event.target.result;
        shouldBe("db.version", "1");
        shouldBeTrue("db.objectStoreNames.contains('store1')");
        shouldBeFalse("db.objectStoreNames.contains('store2')");

        finishJSTest();
    }
}
