Explores the edge cases of what IDBObjectStore objects look like after a version change transaction that changed them aborts.

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;

indexedDB.deleteDatabase(dbname)
indexedDB.open(dbname)
connection1 = event.target.result;
objectStore1_1 = connection1.createObjectStore('objectStore1');
objectStore1_2 = connection1.createObjectStore('objectStore2');
objectStore1_2.createIndex('index', 'foo');

PASS connection1.version is 1
PASS connection1.objectStoreNames.length is 2
PASS objectStore1_1.indexNames.length is 0
PASS objectStore1_2.indexNames.length is 1

connection1.close();
secondRequest = indexedDB.open(dbname, 2);
secondRequest.onupgradeneeded = secondUpgradeNeeded;
connection2 = event.target.result;
objectStore2_1 = secondRequest.transaction.objectStore('objectStore1');
objectStore2_2 = secondRequest.transaction.objectStore('objectStore2');
objectStore2_3 = connection2.createObjectStore('objectStore3');

PASS connection2.version is 2
PASS connection2.objectStoreNames.length is 3
PASS objectStore2_1.indexNames.length is 0
PASS objectStore2_2.indexNames.length is 1
PASS objectStore2_3.indexNames.length is 0

objectStore2_1.createIndex('index', 'foo');
objectStore2_2.deleteIndex('index');
objectStore2_3.createIndex('index', 'foo');

PASS connection2.version is 2
PASS connection2.objectStoreNames.length is 3
PASS objectStore2_1.indexNames.length is 1
PASS objectStore2_2.indexNames.length is 0
PASS objectStore2_3.indexNames.length is 1

secondRequest.transaction.abort();
connection2.close()

checkState():
PASS connection1.version is 1
PASS connection1.objectStoreNames.length is 2
PASS objectStore1_1.indexNames.length is 0
PASS objectStore1_2.indexNames.length is 1

PASS connection2.version is 1
PASS connection2.objectStoreNames.length is 2
PASS objectStore2_1.indexNames.length is 0
PASS objectStore2_2.indexNames.length is 1
PASS objectStore2_3.indexNames.length is 0
PASS successfullyParsed is true

TEST COMPLETE

