108 lines
3.9 KiB
HTML
108 lines
3.9 KiB
HTML
<!DOCTYPE html>
|
|
<title>Test deep copying FencedFrameConfig objects</title>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="/common/utils.js"></script>
|
|
<script src="/common/dispatcher/dispatcher.js"></script>
|
|
<script src="resources/utils.js"></script>
|
|
<script src="/common/get-host-info.sub.js"></script>
|
|
|
|
<body>
|
|
<script>
|
|
promise_test(async(t) => {
|
|
const key = token();
|
|
|
|
// Create a FencedFrameConfig from a FLEDGE auction, then deep copy it.
|
|
let old_config = await generateURNFromFledge(
|
|
"resources/embeddee.html", [key], [], true);
|
|
assert_true(old_config instanceof FencedFrameConfig);
|
|
let new_config = structuredClone(old_config);
|
|
|
|
const fencedframe = attachFencedFrame(new_config);
|
|
const response = await nextValueFromServer(key);
|
|
assert_equals(response, "PASS",
|
|
"The page should have loaded from the cloned config.");
|
|
}, 'A cloned config with a URN will navigate.');
|
|
|
|
promise_test(async(t) => {
|
|
const key = token();
|
|
|
|
// Create a FencedFrameConfig from a FLEDGE auction, then deep copy it.
|
|
let old_config = new FencedFrameConfig(generateURL(
|
|
"resources/embeddee.html", [key]));
|
|
assert_true(old_config instanceof FencedFrameConfig);
|
|
let new_config = structuredClone(old_config);
|
|
|
|
const fencedframe = attachFencedFrame(new_config);
|
|
const response = await nextValueFromServer(key);
|
|
assert_equals(response, "PASS",
|
|
"The page should have loaded from the cloned config.");
|
|
}, 'A cloned config with a URL will navigate.');
|
|
|
|
promise_test(async(t) => {
|
|
const key = token();
|
|
const fenced_url = generateURL("resources/embeddee.html", [key]);
|
|
|
|
// Create a fenced frame once the config comes in through postMessage.
|
|
window.addEventListener(
|
|
"message",
|
|
(event) => {
|
|
attachFencedFrame(event.data);
|
|
},
|
|
false,
|
|
);
|
|
|
|
// Create an iframe that creates a FencedFrameConfig
|
|
const frame = await attachIFrameContext(
|
|
{origin: get_host_info().HTTPS_REMOTE_ORIGIN});
|
|
await frame.execute(async (fenced_url) => {
|
|
const config = await generateURNFromFledge(fenced_url, [], [], true);
|
|
window.parent.postMessage(config, "*");
|
|
}, [fenced_url]);
|
|
|
|
const response = await nextValueFromServer(key);
|
|
assert_equals(response, "PASS",
|
|
"The page should have loaded from the postMessage'd config.");
|
|
}, 'A config received through window.postMessage will navigate.');
|
|
|
|
promise_test(async(t) => {
|
|
// Create a FencedFrameConfig from a FLEDGE auction.
|
|
let config = await generateURNFromFledge(
|
|
"resources/embeddee.html", [], [], true);
|
|
assert_true(config instanceof FencedFrameConfig);
|
|
|
|
assert_throws_dom("DataCloneError", () => {
|
|
history.pushState(config, "", location.href);
|
|
}, "The write should fail for a FencedFrameConfig.");
|
|
}, 'A FencedFrameConfig cannot be written to storage.');
|
|
|
|
promise_test(async(t) => {
|
|
const key = token();
|
|
|
|
// Create a fenced frame once the config comes in through postMessage.
|
|
window.addEventListener(
|
|
"message",
|
|
(event) => {
|
|
attachFencedFrame(event.data);
|
|
},
|
|
false,
|
|
);
|
|
|
|
// The pop-up will generate a FencedFrameConfig from a FLEDGE auction, and
|
|
// then pass it back into this page through postMessage(). Since config
|
|
// mappings are only valid within the same frame tree, this page will not be
|
|
// able to navigate a fenced frame to the config.
|
|
window.open(generateURL("resources/postmessage-config.html", [key]), "foo");
|
|
|
|
// Set up a timeout to ensure that there's enough time for any messages to be
|
|
// sent from a fenced frame if it loads.
|
|
const timeout = new Promise(resolve => t.step_timeout(resolve, 1000));
|
|
const result = await Promise.race([nextValueFromServer(key), timeout]);
|
|
assert_true(typeof result === "undefined",
|
|
"The fenced frame should not have loaded.");
|
|
}, 'A FencedFrameConfig sent to a context that does not support it gracefully' +
|
|
' fails to load.');
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|