Explores the edge cases of what IDBIndex 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 = connection1.createObjectStore('objectStore');
index1_1 = objectStore1.createIndex('foo', 'foo');

PASS connection1.version is 1
PASS objectStore1.indexNames.length is 1
PASS index1_1.name is "foo"
connection1.close();
secondRequest = indexedDB.open(dbname, 2);
secondRequest.onupgradeneeded = secondUpgradeNeeded;

connection2 = event.target.result;
objectStore2 = secondRequest.transaction.objectStore('objectStore');
index2_1 = objectStore2.index('foo');

PASS connection2.version is 2
PASS objectStore2.indexNames.length is 1
PASS index2_1.name is "foo"

objectStore2.deleteIndex('foo');
new_index2_1 = objectStore2.createIndex('foo', 'foo');
index2_2 = objectStore2.createIndex('bar', 'bar');

PASS objectStore2.indexNames.length is 2
PASS new_index2_1.name is "foo"
PASS index2_2.name is "bar"

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

PASS connection1.version is 1
PASS objectStore1.indexNames.length is 1
PASS index1_1.name is "foo"
PASS connection2.version is 1
PASS objectStore2.indexNames.length is 1
PASS index2_1.name is "foo"
PASS new_index2_1.name is "foo"
PASS index2_2.name is "bar"
PASS successfullyParsed is true

TEST COMPLETE

