-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
IDB WPTs: Extend event-dispatch-active-flag IDB WPT to workers
This IndexedDB WPT currently only runs in a window environment. This change extends it to also run in dedicated, shared, and service worker environments. As part of this update, repetitive code has been pulled out into helper methods. Bug: 41455766 Change-Id: I018cb4649449bf4d7bbdaa9b6b13ee861d53cc0d Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5951326 Reviewed-by: Abhishek Shanthkumar <[email protected]> Commit-Queue: Rahul Singh <[email protected]> Cr-Commit-Position: refs/heads/main@{#1385763}
- Loading branch information
1 parent
92f1c29
commit ea5f982
Showing
2 changed files
with
91 additions
and
154 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,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, {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'); |
This file was deleted.
Oops, something went wrong.