91 lines
3 KiB
JavaScript
91 lines
3 KiB
JavaScript
// 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);
|
|
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');
|