Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- This WPT test may be referenced by the following Test IDs:
- /IndexedDB/event-dispatch-active-flag.any.html - WPT Dashboard Interop Dashboard
- /IndexedDB/event-dispatch-active-flag.any.serviceworker.html - WPT Dashboard Interop Dashboard
- /IndexedDB/event-dispatch-active-flag.any.sharedworker.html - WPT Dashboard Interop Dashboard
- /IndexedDB/event-dispatch-active-flag.any.worker.html - WPT Dashboard Interop Dashboard
// META: title=IndexedDB Transaction - active flag is set during event dispatch
// META: global=window,worker
// META: script=resources/support.js
'use strict';
function createObjectStore() {
return (t, db) => {
db.createObjectStore('store');
};
}
function initializeTransaction(t, db, mode = 'readonly') {
const tx = db.transaction('store', mode, {durability: 'relaxed'});
const release_tx = keep_alive(tx, 'store');
assert_true(
is_transaction_active(tx, 'store'),
'Transaction should be active after creation');
return {tx, release_tx};
}
function assertLifetimeInMicrotasksAndEventLoop(
t, tx, release_tx, handlerMessage) {
assert_true(is_transaction_active(tx, 'store'), handlerMessage);
let saw_promise = false;
Promise.resolve().then(t.step_func(() => {
saw_promise = true;
assert_true(
is_transaction_active(tx, 'store'),
'Transaction should be active in microtasks');
}));
setTimeout(
t.step_func(() => {
assert_true(saw_promise);
assert_false(
is_transaction_active(tx, 'store'),
'Transaction should be inactive in next task');
release_tx();
t.done();
}),
0);
};
indexeddb_test(createObjectStore(), (t, db) => {
const {tx, release_tx} = initializeTransaction(t, db);
const request = tx.objectStore('store').get(0);
request.onerror = t.unreached_func('request should succeed');
request.onsuccess = t.step_func((e) => {
assertLifetimeInMicrotasksAndEventLoop(
t, tx, release_tx,
'Transaction should be active during success handler');
});
}, 'Active during success handlers');
indexeddb_test(createObjectStore(), (t, db) => {
const {tx, release_tx} = initializeTransaction(t, db);
const request = tx.objectStore('store').get(0);
request.onerror = t.unreached_func('request should succeed');
request.onsuccess = t.step_func((e) => {
assertLifetimeInMicrotasksAndEventLoop(
t, tx, release_tx,
'Transaction should be active during success listener');
});
}, 'Active during success listeners');
indexeddb_test(createObjectStore(), (t, db) => {
const {tx, release_tx} = initializeTransaction(t, db, 'readwrite');
tx.objectStore('store').put(0, 0);
const request = tx.objectStore('store').add(0, 0);
request.onsuccess = t.unreached_func('request should fail');
request.onerror = t.step_func((e) => {
e.preventDefault();
assertLifetimeInMicrotasksAndEventLoop(
t, tx, release_tx, 'Transaction should be active during error handler');
});
}, 'Active during error handlers');
indexeddb_test(createObjectStore(), (t, db) => {
const {tx, release_tx} = initializeTransaction(t, db, 'readwrite');
tx.objectStore('store').put(0, 0);
const request = tx.objectStore('store').add(0, 0);
request.onsuccess = t.unreached_func('request should fail');
request.onerror = t.step_func((e) => {
e.preventDefault();
assertLifetimeInMicrotasksAndEventLoop(
t, tx, release_tx,
'Transaction should be active during error listener');
});
}, 'Active during error listeners');