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

description("Test IndexedDB database metadata mutation/snapshotting");

indexedDBTest(prepareDatabase, snapshotConnection1);
function prepareDatabase()
{
    connection1 = event.target.result;
    evalAndLog("connection1store1 = connection1.createObjectStore('store1')");
    evalAndLog("connection1store1.createIndex('index1', 'path')");

    shouldBe("connection1.version", "1");
    shouldBe("connection1.objectStoreNames.length", "1");
    shouldBe("connection1store1.indexNames.length", "1");
}

function snapshotConnection1()
{
    debug("Connection's properties should be snapshotted on close");
    evalAndLog("connection1.close()");
    secondOpen();
}

function secondOpen()
{
    debug("");
    debug("secondOpen():");
    evalAndLog("request = indexedDB.open(dbname, 2)");
    request.onerror = unexpectedErrorCallback;
    request.onblocked = unexpectedBlockedCallback;
    request.onupgradeneeded = function() {
        evalAndLog("connection2 = request.result");
        evalAndLog("trans = request.transaction");
        evalAndLog("connection2.createObjectStore('store2')");
        evalAndLog("connection2store1 = trans.objectStore('store1')");
        evalAndLog("connection2store1.createIndex('index2', 'path')");

        shouldBe("connection2.version", "2");
        shouldBe("connection2.objectStoreNames.length", "2");
        shouldBe("connection2store1.indexNames.length", "2");
    };
    request.onsuccess = function() {
        debug("Connection's properties should be snapshotted on close");
        evalAndLog("connection2.close()");
        thirdOpen();
    };
}

function thirdOpen()
{
    debug("");
    debug("thirdOpen():");
    evalAndLog("request = indexedDB.open(dbname, 3)");
    request.onsuccess = unexpectedSuccessCallback;
    request.onupgradeneeded = function() {
        evalAndLog("connection3 = request.result");
        evalAndLog("trans = request.transaction");
        evalAndLog("connection3.createObjectStore('store3')");
        evalAndLog("connection3store1 = trans.objectStore('store1')");
        evalAndLog("connection3store1.createIndex('index3', 'path')");

        shouldBe("connection3.version", "3");
        shouldBe("connection3.objectStoreNames.length", "3");
        shouldBe("connection3store1.indexNames.length", "3");

        trans.oncomplete = unexpectedCompleteCallback;
        debug("Connection's properties should be reverted on abort");
        evalAndLog("trans.abort()");
    };
    request.onerror = function() {
        debug("Connection's properties should be snapshotted on close");
        evalAndLog("connection3.close()");
        fourthOpen();
    }
}

function fourthOpen()
{
    debug("");
    debug("fourthOpen():");
    evalAndLog("request = indexedDB.open(dbname, 4)");
    request.onerror = unexpectedErrorCallback;
    request.onupgradeneeded = function() {
        evalAndLog("connection4 = request.result");
        evalAndLog("trans = request.transaction");
        evalAndLog("connection4.createObjectStore('store4')");
        evalAndLog("connection4store1 = trans.objectStore('store1')");
        evalAndLog("connection4store1.createIndex('index4', 'path')");

        shouldBe("connection4.version", "4");
        shouldBe("connection4.objectStoreNames.length", "3");
        shouldBe("connection4store1.indexNames.length", "3");
    };
    request.onsuccess = function() {
        debug("Connection's properties should be snapshotted on close");
        evalAndLog("connection4.close()");
        checkState();
    };
}

function checkState()
{
    debug("");
    debug("checkState():");

    shouldBe("connection1.version", "1");
    shouldBe("connection1.objectStoreNames.length", "1");
    shouldBe("connection1store1.indexNames.length", "1");
    debug("");

    shouldBe("connection2.version", "2");
    shouldBe("connection2.objectStoreNames.length", "2");
    shouldBe("connection2store1.indexNames.length", "2");
    debug("");

    shouldBe("connection3.version", "2");
    shouldBe("connection3.objectStoreNames.length", "2");
    shouldBe("connection3store1.indexNames.length", "2");
    debug("");

    shouldBe("connection4.version", "4");
    shouldBe("connection4.objectStoreNames.length", "3");
    shouldBe("connection4store1.indexNames.length", "3");
    debug("");

    finishJSTest();
}
