Skip to content

Commit

Permalink
[shared storage] Allow creating multiple worklets per Window context
Browse files Browse the repository at this point in the history
Explainer PR: WICG/shared-storage#130

How:
- Introduce sharedStorage.createWorklet() method. In this patch,
we still restrict the script to same origin. Ultimately, we will
support cross-origin script/worklet (for the createWorklet() API).
- Also, move the document service Remote to a window supplement
class: This is a forward-looking change (e.g. it'll enable
constructing the worklet via `new SharedStorageWorklet()` / not
needing to exist along with the `sharedStorage` object, although
this isn't in the current proposal).

Bug: 1218540
Change-Id: I5bf64bdf6648a76875748b194e5dbceeb1400624
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5209102
Reviewed-by: Dominic Farolino <[email protected]>
Reviewed-by: Avi Drissman <[email protected]>
Commit-Queue: Yao Xiao <[email protected]>
Reviewed-by: Cammie Smith Barnes <[email protected]>
Cr-Commit-Position: refs/heads/main@{#1257412}
  • Loading branch information
yaoxiachromium authored and chromium-wpt-export-bot committed Feb 7, 2024
1 parent 5362cef commit a973f27
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<!doctype html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="/shared-storage-selecturl-limit/resources/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 () => {
const ancestorKey = token();
const perOriginBitLimit = 6;
const numUrls = 8;
const urls = generateUrls(numUrls, "/shared-storage/resources/frame",
[ancestorKey]);
const bitsPerCall = Math.log2(numUrls);

for (let i = 0; i < Math.floor(perOriginBitLimit / bitsPerCall); ++i) {
let worklet = await sharedStorage.createWorklet("/shared-storage/resources/simple-module.js");
let config = await worklet.selectURL(
"test-url-selection-operation", urls,
{data: {'mockResult': 1}, keepAlive: true, resolveToConfig: true});
assert_true(config instanceof FencedFrameConfig);
attachFencedFrame(config, 'opaque-ads');
const result = await nextValueFromServer(ancestorKey);
assert_equals(result, "frame1_loaded",
`for index ${i} when budget should remain;`);
}

// The per-origin per-pageload bit limit for `selectURL()` has been
// reached. The next call should return the default URL.
let worklet = await sharedStorage.createWorklet("/shared-storage/resources/simple-module.js");
let config = await worklet.selectURL(
"test-url-selection-operation", urls,
{data: {'mockResult': 1}, resolveToConfig: true});
assert_true(config instanceof FencedFrameConfig);
attachFencedFrame(config, 'opaque-ads');
const result = await nextValueFromServer(ancestorKey);
assert_equals(result, "frame0_loaded", 'when budget should be exhausted;');

}, 'selectURL() called on multiple worklets, with per-origin per-pageload limit');
</script>
</body>
46 changes: 46 additions & 0 deletions shared-storage/select-url-on-two-worklets.tentative.https.sub.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<!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 () => {
const ancestor_key = token();
let url0 = generateURL("/shared-storage/resources/frame0.html",
[ancestor_key]);
let url1 = generateURL("/shared-storage/resources/frame1.html",
[ancestor_key]);

let worklet0 = await sharedStorage.createWorklet("/shared-storage/resources/simple-module.js");
let worklet1 = await sharedStorage.createWorklet("/shared-storage/resources/simple-module.js");

let select_url_result0 = await worklet0.selectURL(
"increment-global-variable-and-return-original-value-operation",
[{url: url0}, {url: url1}], {resolveToConfig: true, keepAlive: true});
assert_true(validateSelectURLResult(select_url_result0, true));
attachFencedFrame(select_url_result0, 'opaque-ads');
const result0 = await nextValueFromServer(ancestor_key);
assert_equals(result0, "frame0_loaded");

let select_url_result1 = await worklet1.selectURL(
"increment-global-variable-and-return-original-value-operation",
[{url: url0}, {url: url1}], {resolveToConfig: true, keepAlive: true});
assert_true(validateSelectURLResult(select_url_result1, true));
attachFencedFrame(select_url_result1, 'opaque-ads');
const result1 = await nextValueFromServer(ancestor_key);

// This indicates that the prior worklet0.selectURL and worklet1.selectURL ran
// in two different worklet environments, as they did not share the global
// variable.
assert_equals(result1, "frame0_loaded");

}, 'selectURL() on two explicitly created SharedStorageWorklet. The two ' +
'calls should run in two different worklet environments.');

</script>
</body>

0 comments on commit a973f27

Please sign in to comment.