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
76 lines
2.9 KiB
HTML
76 lines
2.9 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 worklet1 = await sharedStorage.createWorklet('resources/simple-module.js');
|
|
let worklet2 = await sharedStorage.createWorklet('resources/simple-module.js');
|
|
|
|
const ancestor_key1 = token();
|
|
let url1_0 = generateURL("/shared-storage/resources/frame0.html",
|
|
[ancestor_key1]);
|
|
let url1_1 = generateURL("/shared-storage/resources/frame1.html",
|
|
[ancestor_key1]);
|
|
|
|
const ancestor_key2 = token();
|
|
let url2_0 = generateURL("/shared-storage/resources/frame0.html",
|
|
[ancestor_key2]);
|
|
let url2_1 = generateURL("/shared-storage/resources/frame1.html",
|
|
[ancestor_key2]);
|
|
|
|
// 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.
|
|
//
|
|
// In parallel, invoke another `selectURL()`, which subsequently invokes
|
|
// `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.
|
|
//
|
|
// 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_result1 = await worklet1.selectURL(
|
|
"get-wait-set-within-lock",
|
|
[{url: url1_0}, {url: url1_1}],
|
|
{data: {'key': 'key',
|
|
'lock_name': 'lock1',
|
|
'append_letter': 'a'},
|
|
resolveToConfig: true});
|
|
|
|
let select_url_result2 = await worklet2.selectURL(
|
|
"append-with-lock-option",
|
|
[{url: url2_0}, {url: url2_1}],
|
|
{data: {'key': 'key',
|
|
'lock_name': 'lock1',
|
|
'append_letter': 'a'},
|
|
resolveToConfig: true});
|
|
|
|
attachFencedFrame(select_url_result1, 'opaque-ads');
|
|
const result1 = await nextValueFromServer(ancestor_key1);
|
|
assert_equals(result1, "frame1_loaded");
|
|
|
|
attachFencedFrame(select_url_result2, 'opaque-ads');
|
|
const result2 = await nextValueFromServer(ancestor_key2);
|
|
assert_equals(result2, "frame1_loaded");
|
|
|
|
await verifyKeyValueForOrigin('key', 'aa', location.origin);
|
|
|
|
await deleteKeyForOrigin('key', location.origin);
|
|
}, 'Test for withLock option in a SharedStorageWorklet context');
|
|
|
|
</script>
|
|
</body>
|