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