chromium/third_party/blink/web_tests/storage/indexeddb/resources/metadata.js

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