Files
firefox/testing/web-platform/tests/shared-storage/web-locks.tentative.https.sub.html
Yao Xiao c92ace34a6 Bug 1933284 [wpt PR 49359] - [shared storage] Implement 'with_lock' modifier options for Window and SharedStorageWorklet, a=testonly
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
2024-11-28 11:57:41 +00:00

65 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 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]);
// Two `selectURL()`s run in parallel. Each performs the following steps:
// 1. Acquires the lock.
// 2. Reads the current value of the given key.
// 3. Waits for 100ms.
// 4. Increments the value.
// 5. Releases the lock.
//
// Expected behavior: After both operations finish, the value of the given key
// should be 2.
//
// This demonstrates that the lock is effective, preventing the
// "get and increment" operations from interleaving. If the lock were not
// used, both worklets would likely read 0 and set the value to 1.
let select_url_result1 = await worklet1.selectURL(
"get-wait-increment-within-lock", [{url: url1_0}, {url: url1_1}],
{data: {'key': 'key'}, resolveToConfig: true});
let select_url_result2 = await worklet2.selectURL(
"get-wait-increment-within-lock", [{url: url2_0}, {url: url2_1}],
{data: {'key': 'key'}, 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', '2', location.origin);
await deleteKeyForOrigin('key', location.origin);
}, 'Basic test for Web Locks API in the shared storage worklet');
</script>
</body>