-
Notifications
You must be signed in to change notification settings - Fork 3.9k
Expand file tree
/
Copy pathevent-dispatch-active-flag.any.js
More file actions
91 lines (81 loc) · 3.03 KB
/
Copy pathevent-dispatch-active-flag.any.js
File metadata and controls
91 lines (81 loc) · 3.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// 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');