Test that a database is recreated correctly when an open-with-version call is queued behind both a deleteDatabase and an open-with-version call

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)

prepareDatabase():
db = event.target.result

connection1Success():
connection1 = event.target.result
PASS db is connection1
connection1.onversionchange = connection1VersionChangeCallback
request = indexedDB.open(dbname, 2)
request.onsuccess = connection2Success
request.onupgradeneeded = connection2UpgradeNeeded
request.onblocked = connection2Blocked

connection1VersionChangeCallback():
PASS event.type is "versionchange"
PASS event.oldVersion is 1
PASS event.newVersion is 2

connection2Blocked():
request = indexedDB.deleteDatabase(dbname)
request.onblocked = deleteDatabaseBlockedCallback
request.onsuccess = deleteDatabaseSuccessCallback
request = indexedDB.open(dbname, 3)
request.onupgradeneeded = connection3UpgradeNeeded
request.onsuccess = connection3Success
connection1.close()

connection2UpgradeNeeded():
PASS event.oldVersion is 1
PASS event.newVersion is 2
db = event.target.result
PASS db.objectStoreNames.length is 0
db.createObjectStore('some object store')
transaction = event.target.transaction
transaction.oncomplete = connection2TransactionComplete

deleteDatabaseBlockedCallback():
PASS event.oldVersion is 2
PASS event.newVersion is null

connection2TransactionComplete():
PASS db.version is 2

connection2Success():
connection2 = event.target.result
connection2.close()

deleteDatabaseSuccessCallback():
PASS event.target.result is undefined.
PASS event.type is "success"

connection3UpgradeNeeded():
gotUpgradeNeededEvent = true
PASS event.newVersion is 3
PASS event.oldVersion is 0

connection3Success():
PASS gotUpgradeNeededEvent is true
PASS event.target.result.objectStoreNames.length is 0
PASS successfullyParsed is true

TEST COMPLETE

