Test IndexedDB IDBDatabase internal closePending flag

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;

dbname = "database-closepending-flag.html"
indexedDB.deleteDatabase(dbname)
indexedDB.open(dbname)
store = connection.createObjectStore('store')

First, verify that the database connection is not closed:
PASS transaction = connection.transaction('store') did not throw exception.

Database closing steps
"1. Set the internal closePending flag of connection to true."
connection.close()
Expecting exception from connection.transaction('store')
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'
"2. Wait for all transactions created using connection to complete. Once they are complete, connection is closed."
transaction.oncomplete = testIDBDatabaseName

IDBDatabase.name:
"The function must return this name even if the closePending flag is set on the connection."
PASS connection.name is dbname

IDBDatabase.objectStoreNames:
"Once the closePending flag is set on the connection, this function must return a snapshot of the list of names of the object stores taken at the time when the close method was called."
request = indexedDB.open(dbname, 2)
version_change_connection = request.result
version_change_connection.createObjectStore('new_store')
PASS version_change_connection.objectStoreNames.contains('new_store') is true
PASS connection.objectStoreNames.contains('new_store') is false
version_change_connection.close()

IDBDatabase.transaction():
"...if this method is called on a IDBDatabase instance where the closePending flag is set, a InvalidStateError exception must be thrown."
Expecting exception from connection.transaction('store')
PASS Exception was thrown.
PASS code is DOMException.INVALID_STATE_ERR
PASS ename is 'InvalidStateError'

"versionchange" transaction steps:
"Fire a versionchange event at each object in openDatabases that is open. The event must not be fired on objects which has the closePending flag set."
request = indexedDB.open(dbname)
connection = request.result
versionChangeWasFired = false
connection.onversionchange = function () { versionChangeWasFired = true; }
transaction = connection.transaction('store')
connection.close()
closePending is set, but active transaction will keep connection from closing
request = indexedDB.open(dbname, 3)
'blocked' event fired, letting transaction complete and connection close
version_change_connection = request.result
PASS versionChangeWasFired is false
version_change_connection.close()

Database deletion steps:
"Fire a versionchange event at each object in openDatabases that is open. The event must not be fired on objects which has the closePending flag set."
request = indexedDB.open(dbname)
connection = request.result
versionChangeWasFired = false
connection.onversionchange = function () { versionChangeWasFired = true; }
transaction = connection.transaction('store')
connection.close()
closePending is set, but active transaction will keep connection from closing
request = indexedDB.deleteDatabase(dbname)
'blocked' event fired, letting transaction complete and connection close
PASS versionChangeWasFired is false
PASS successfullyParsed is true

TEST COMPLETE

