summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/fenced-frame/deep-copy-config.https.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/fenced-frame/deep-copy-config.https.html')
-rw-r--r--testing/web-platform/tests/fenced-frame/deep-copy-config.https.html108
1 files changed, 108 insertions, 0 deletions
diff --git a/testing/web-platform/tests/fenced-frame/deep-copy-config.https.html b/testing/web-platform/tests/fenced-frame/deep-copy-config.https.html
new file mode 100644
index 0000000000..54a976233c
--- /dev/null
+++ b/testing/web-platform/tests/fenced-frame/deep-copy-config.https.html
@@ -0,0 +1,108 @@
+<!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>