| <!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> |