chromium/third_party/blink/web_tests/storage/indexeddb/resources/version-change-abort.js

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();
    }
}