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', 'readonly', {durability: 'relaxed'}) 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', 'readonly', {durability: 'relaxed'})
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', 'readonly', {durability: 'relaxed'})
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', 'readonly', {durability: 'relaxed'})
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', 'readonly', {durability: 'relaxed'})
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