mirror of
https://github.com/HeyPuter/firefox.git
synced 2026-11-13 20:14:57 -10:00
Automatic update from web-platform-tests
[shared storage] Implement 'with_lock' modifier options for Window and SharedStorageWorklet
Implement the { withLock: <lock resource name> } option for the
modifier methods for Window and SharedStorageWorklet context. The
SharedStorageLockManager manages the state of the locks and locked
requests. It acts as the LockRequest receiver to listen to Granted()
calls to resolve those requests. The locks uses the shared storage
origin as the partitioning origin, and thus can interact with the
regular Web Locks API (i.e. navigator.locks.request()) from within
the shared storage worklet.
The locking function is gated behind
features::kSharedStorageWebLocks, which is checked in the browser
process in SharedStorageLockManager::SharedStorageUpdate().
Explainer PR(s):
- https://github.com/WICG/shared-storage/pull/199
- https://github.com/WICG/shared-storage/pull/205
Bug: 373899210
Change-Id: I7003d392076a65a9ff2d277f9f0c2791436d2f68
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6020796
Reviewed-by: Giovanni Ortuno Urquidi <[email protected]>
Commit-Queue: Yao Xiao <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1387751}
--
wpt-commits: 7e168195e3629f88bef6293c18ae8674f90893fd
wpt-pr: 49359
67 lines
2.4 KiB
HTML
67 lines
2.4 KiB
HTML
<!doctype html>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="/common/utils.js"></script>
|
|
<script src="/shared-storage/resources/util.js"></script>
|
|
<script src="/fenced-frame/resources/utils.js"></script>
|
|
|
|
<body>
|
|
<script>
|
|
'use strict';
|
|
|
|
promise_test(async t => {
|
|
let worklet = await sharedStorage.createWorklet('resources/simple-module.js');
|
|
|
|
const ancestor_key = token();
|
|
let url0 = generateURL("/shared-storage/resources/frame0.html",
|
|
[ancestor_key]);
|
|
let url1 = generateURL("/shared-storage/resources/frame1.html",
|
|
[ancestor_key]);
|
|
|
|
// Invoke `selectURL()` to perform the following steps:
|
|
// 1. Acquires the lock.
|
|
// 2. Reads the current value at the given key.
|
|
// 3. Waits for 500ms.
|
|
// 4. Sets the shared storage value to the read value appended with the given letter.
|
|
// 5. Releases the lock.
|
|
//
|
|
// After 100ms, invoke `sharedStorage.append()` with the same lock and the
|
|
// same letter to append.
|
|
//
|
|
// Expected behavior: After both of them finish, the value at the given key
|
|
// should contain the letter repeated twice.
|
|
//
|
|
// This demonstrates that the `withLock` option is effective, preventing the
|
|
// `append()` method interfering with the "get and set" operation. If the lock
|
|
// were not used, the final value would likely be a single letter.
|
|
//
|
|
// Note: This test remains valid even if the `append()` call happens outside
|
|
// the critical section protected by the lock within the worklet. The test
|
|
// effectively demonstrates mutual exclusion as long as there's a reasonable
|
|
// chance for `append()` to occur while the worklet is still running.
|
|
let select_url_result = await worklet.selectURL(
|
|
"get-wait-set-within-lock",
|
|
[{url: url0}, {url: url1}],
|
|
{data: {'key': 'key',
|
|
'lock_name': 'lock1',
|
|
'append_letter': 'a'},
|
|
resolveToConfig: true});
|
|
|
|
// Busy wait for 100ms.
|
|
const startWaitTime = Date.now();
|
|
while (Date.now() - startWaitTime < 100) {}
|
|
|
|
sharedStorage.append('key', 'a', {withLock: 'lock1'});
|
|
|
|
attachFencedFrame(select_url_result, 'opaque-ads');
|
|
const result = await nextValueFromServer(ancestor_key);
|
|
assert_equals(result, "frame1_loaded");
|
|
|
|
await verifyKeyValueForOrigin('key', 'aa', location.origin);
|
|
|
|
await deleteKeyForOrigin('key', location.origin);
|
|
}, 'Test for withLock option in a Window context');
|
|
|
|
</script>
|
|
</body>
|