Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- This WPT test may be referenced by the following Test IDs:
            
- /shared-storage/web-locks-worklet-modifier-method.tentative.https.sub.html - WPT Dashboard Interop Dashboard
 
 
<!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>