summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/IndexedDB/event-dispatch-active-flag.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/IndexedDB/event-dispatch-active-flag.html')
-rw-r--r--testing/web-platform/tests/IndexedDB/event-dispatch-active-flag.html154
1 files changed, 154 insertions, 0 deletions
diff --git a/testing/web-platform/tests/IndexedDB/event-dispatch-active-flag.html b/testing/web-platform/tests/IndexedDB/event-dispatch-active-flag.html
new file mode 100644
index 0000000000..46f249c984
--- /dev/null
+++ b/testing/web-platform/tests/IndexedDB/event-dispatch-active-flag.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Transaction active flag is set during event dispatch</title>
+<link rel="help" href="https://w3c.github.io/IndexedDB/#fire-success-event">
+<link rel="help" href="https://w3c.github.io/IndexedDB/#fire-error-event">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src=resources/support.js></script>
+<script>
+
+indexeddb_test(
+ (t, db, tx) => {
+ db.createObjectStore('store');
+ },
+ (t, db) => {
+ const tx = db.transaction('store', 'readonly', {durability: 'relaxed'});
+ const release_tx = keep_alive(tx, 'store');
+
+ assert_true(is_transaction_active(tx, 'store'),
+ 'Transaction should be active after creation');
+
+ const request = tx.objectStore('store').get(0);
+ request.onerror = t.unreached_func('request should succeed');
+ request.onsuccess = () => {
+ assert_true(is_transaction_active(tx, 'store'),
+ 'Transaction should be active during success handler');
+
+ let saw_handler_promise = false;
+ Promise.resolve().then(t.step_func(() => {
+ saw_handler_promise = true;
+ assert_true(is_transaction_active(tx, 'store'),
+ 'Transaction should be active in handler\'s microtasks');
+ }));
+
+ setTimeout(t.step_func(() => {
+ assert_true(saw_handler_promise);
+ assert_false(is_transaction_active(tx, 'store'),
+ 'Transaction should be inactive in next task');
+ release_tx();
+ t.done();
+ }), 0);
+ };
+ },
+ 'Transactions are active during success handlers');
+
+indexeddb_test(
+ (t, db, tx) => {
+ db.createObjectStore('store');
+ },
+ (t, db) => {
+ const tx = db.transaction('store', 'readonly', {durability: 'relaxed'});
+ const release_tx = keep_alive(tx, 'store');
+ assert_true(is_transaction_active(tx, 'store'),
+ 'Transaction should be active after creation');
+
+ const request = tx.objectStore('store').get(0);
+ request.onerror = t.unreached_func('request should succeed');
+ request.addEventListener('success', () => {
+ assert_true(is_transaction_active(tx, 'store'),
+ 'Transaction should be active during success listener');
+
+ let saw_listener_promise = false;
+ Promise.resolve().then(t.step_func(() => {
+ saw_listener_promise = true;
+ assert_true(is_transaction_active(tx, 'store'),
+ 'Transaction should be active in listener\'s microtasks');
+ }));
+
+ setTimeout(t.step_func(() => {
+ assert_true(saw_listener_promise);
+ assert_false(is_transaction_active(tx, 'store'),
+ 'Transaction should be inactive in next task');
+ release_tx();
+ t.done();
+ }), 0);
+ });
+ },
+ 'Transactions are active during success listeners');
+
+indexeddb_test(
+ (t, db, tx) => {
+ db.createObjectStore('store');
+ },
+ (t, db) => {
+ const tx = db.transaction('store', 'readwrite', {durability: 'relaxed'});
+ const release_tx = keep_alive(tx, 'store');
+ assert_true(is_transaction_active(tx, 'store'),
+ 'Transaction should be active after creation');
+
+ tx.objectStore('store').put(0, 0);
+ const request = tx.objectStore('store').add(0, 0);
+ request.onsuccess = t.unreached_func('request should fail');
+ request.onerror = e => {
+ e.preventDefault();
+
+ assert_true(is_transaction_active(tx, 'store'),
+ 'Transaction should be active during error handler');
+
+ let saw_handler_promise = false;
+ Promise.resolve().then(t.step_func(() => {
+ saw_handler_promise = true;
+ assert_true(is_transaction_active(tx, 'store'),
+ 'Transaction should be active in handler\'s microtasks');
+ }));
+
+ setTimeout(t.step_func(() => {
+ assert_true(saw_handler_promise);
+ assert_false(is_transaction_active(tx, 'store'),
+ 'Transaction should be inactive in next task');
+ release_tx();
+ t.done();
+ }), 0);
+ };
+ },
+ 'Transactions are active during error handlers');
+
+indexeddb_test(
+ (t, db, tx) => {
+ db.createObjectStore('store');
+ },
+ (t, db) => {
+ const tx = db.transaction('store', 'readwrite', {durability: 'relaxed'});
+ const release_tx = keep_alive(tx, 'store');
+ assert_true(is_transaction_active(tx, 'store'),
+ 'Transaction should be active after creation');
+
+ tx.objectStore('store').put(0, 0);
+ const request = tx.objectStore('store').add(0, 0);
+ request.onsuccess = t.unreached_func('request should fail');
+ request.addEventListener('error', e => {
+ e.preventDefault();
+
+ assert_true(is_transaction_active(tx, 'store'),
+ 'Transaction should be active during error listener');
+
+ let saw_listener_promise = false;
+ Promise.resolve().then(t.step_func(() => {
+ saw_listener_promise = true;
+ assert_true(is_transaction_active(tx, 'store'),
+ 'Transaction should be active in listener\'s microtasks');
+ }));
+
+ setTimeout(t.step_func(() => {
+ assert_true(saw_listener_promise);
+ assert_false(is_transaction_active(tx, 'store'),
+ 'Transaction should be inactive in next task');
+ release_tx();
+ t.done();
+ }), 0);
+ });
+ },
+ 'Transactions are active during error listeners');
+
+</script>