Test IndexedDB IDBDatabase internal closePending flag

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

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'
Exception message: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.
"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'
Exception message: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.


"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

