diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /testing/web-platform/tests/html/semantics/forms/form-submission-target | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/html/semantics/forms/form-submission-target')
10 files changed, 220 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/semantics/forms/form-submission-target/form-target-iframe-helper.py b/testing/web-platform/tests/html/semantics/forms/form-submission-target/form-target-iframe-helper.py new file mode 100644 index 0000000000..bbc3b71e94 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/form-submission-target/form-target-iframe-helper.py @@ -0,0 +1,3 @@ +def main(request, response): + return ([(b"Content-Type", b"text/plain")], + b"OK") diff --git a/testing/web-platform/tests/html/semantics/forms/form-submission-target/form-target-iframe.html b/testing/web-platform/tests/html/semantics/forms/form-submission-target/form-target-iframe.html new file mode 100644 index 0000000000..f37bc33f6f --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/form-submission-target/form-target-iframe.html @@ -0,0 +1,29 @@ +<!DOCTYPE html> +<title>Form targetted at iframe</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +async_test(function(t) { + window.addEventListener("load", t.step_func(function() { + var frame = document.createElement("iframe"); + frame.name = "frame"; + document.documentElement.appendChild(frame); + var form = document.createElement("form"); + form.target = "frame"; + form.action = "form-target-iframe-helper.py"; + form.method = "POST"; + var input = document.createElement("input"); + input.name = "n"; + form.appendChild(input); + document.documentElement.appendChild(form); + form.submit(); + frame.addEventListener("load", t.step_func(function() { + if (frame.contentWindow.location.href.includes("form-target-iframe-helper.py")) { + assert_equals(frame.contentWindow.document.body.textContent, "OK"); + t.done(); + } + })); + })); +}, "Form targetted at iframe"); +</script> +<body> diff --git a/testing/web-platform/tests/html/semantics/forms/form-submission-target/form-target-request-header.html b/testing/web-platform/tests/html/semantics/forms/form-submission-target/form-target-request-header.html new file mode 100644 index 0000000000..a5cd68078d --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/form-submission-target/form-target-request-header.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<title>Form request header test</title> +<script src="/common/utils.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +async_test(t => { + window.addEventListener("load", function() { + let form = document.createElement("form"); + form.action = "resources/form-target-request-header-helper.py"; + form.method = "post"; + form.target = "_blank"; + + const channelName = token(); + const channel = new BroadcastChannel(channelName); + channel.onmessage = t.step_func_done(e => { + assert_equals(e.data, "OK"); + }); + + let url_input = document.createElement("input"); + url_input.type = "hidden"; + url_input.name = "channelname"; + url_input.value = channelName; + + form.appendChild(url_input); + document.body.appendChild(form); + form.submit(); + }); +}, 'Verify the content-type exist during a form submission toward "_blank"'); +</script> +<body> diff --git a/testing/web-platform/tests/html/semantics/forms/form-submission-target/rel-base-target.html b/testing/web-platform/tests/html/semantics/forms/form-submission-target/rel-base-target.html new file mode 100644 index 0000000000..222be95d2e --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/form-submission-target/rel-base-target.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<title><form rel> with <base target></title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src=resources/reltester.js></script> +<base target=_blank> +<div id=log></div> +<form action=resources/endpoint.html><input type=hidden name=channelname></form> +<script> +const submitter = document.querySelector("form"), + channelInput = document.querySelector("input"); +relTester(submitter, channelInput, "<base target>"); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/form-submission-target/rel-button-target.html b/testing/web-platform/tests/html/semantics/forms/form-submission-target/rel-button-target.html new file mode 100644 index 0000000000..76fa868590 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/form-submission-target/rel-button-target.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<title><form rel> with <button formtarget></title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src=resources/reltester.js></script> +<div id=log></div> +<form action=resources/endpoint.html><input type=hidden name=channelname><button type=submit formtarget=_blank></form> +<script> +const submitter = document.querySelector("button"), + channelInput = document.querySelector("input"); +relTester(submitter, channelInput, "<button formtarget>"); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/form-submission-target/rel-form-target.html b/testing/web-platform/tests/html/semantics/forms/form-submission-target/rel-form-target.html new file mode 100644 index 0000000000..58611f41a9 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/form-submission-target/rel-form-target.html @@ -0,0 +1,12 @@ +<!DOCTYPE html> +<title><form rel target></title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src=resources/reltester.js></script> +<div id=log></div> +<form action=resources/endpoint.html target=_blank><input type=hidden name=channelname></form> +<script> +const submitter = document.querySelector("form"), + channelInput = document.querySelector("input"); +relTester(submitter, channelInput, "<form target>"); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/form-submission-target/rel-input-target.html b/testing/web-platform/tests/html/semantics/forms/form-submission-target/rel-input-target.html new file mode 100644 index 0000000000..b80e0240ba --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/form-submission-target/rel-input-target.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<title><form rel> with <input formtarget></title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src=resources/reltester.js></script> +<base target=_blank> +<div id=log></div> +<form action=resources/endpoint.html><input type=hidden name=channelname><input type=submit formtarget=_blank></form> +<script> +const submitter = document.querySelector("input[type=submit]"), + channelInput = document.querySelector("input"); +relTester(submitter, channelInput, "<input formtarget>"); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/form-submission-target/resources/endpoint.html b/testing/web-platform/tests/html/semantics/forms/form-submission-target/resources/endpoint.html new file mode 100644 index 0000000000..be9e794292 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/form-submission-target/resources/endpoint.html @@ -0,0 +1,11 @@ +<script> + const channelName = new URL(location).searchParams.get("channelname"), + channel = new BroadcastChannel(channelName); + channel.postMessage({ haveOpener: window.opener !== null, + referrer: document.referrer }); + // Because messages are not delivered synchronously and because closing a + // browsing context prompts the eventual clearing of all task sources, this + // document should not be closed until the opener document has confirmed + // receipt. + channel.onmessage = () => window.close(); +</script> diff --git a/testing/web-platform/tests/html/semantics/forms/form-submission-target/resources/form-target-request-header-helper.py b/testing/web-platform/tests/html/semantics/forms/form-submission-target/resources/form-target-request-header-helper.py new file mode 100644 index 0000000000..80770167a8 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/form-submission-target/resources/form-target-request-header-helper.py @@ -0,0 +1,14 @@ +body_template=""" +<script> +const channel = new BroadcastChannel('{}'); +channel.postMessage('{}', '*'); +window.close(); +</script> +""" +def main(request, response): + has_content_type = bool(request.headers.get(b'Content-Type')) + result = u"OK" if has_content_type else u"FAIL" + channel_name = request.body.decode('utf-8').split("=")[1]; + body = body_template.format(channel_name, result); + headers = [(b"Content-Type", b"text/html")] + return headers, body diff --git a/testing/web-platform/tests/html/semantics/forms/form-submission-target/resources/reltester.js b/testing/web-platform/tests/html/semantics/forms/form-submission-target/resources/reltester.js new file mode 100644 index 0000000000..8ca9ddbc27 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/forms/form-submission-target/resources/reltester.js @@ -0,0 +1,82 @@ +function formUsesTargetBlank(submitter) { + if (submitter.formTarget && submitter.formTarget === "_blank") { + return true; + } + if (submitter.form && submitter.form.target === "_blank") { + return true; + } + if (submitter.target && submitter.target === "_blank") { + return true; + } + if (submitter.getRootNode().querySelector("base").target === "_blank") { + return true; + } + return false; +} + +function relTester(submitter, channelInput, title) { + [ + { + rel: "", + exposed: "all" + }, + { + rel: "noopener", + exposed: "noopener" + }, + { + rel: "noreferrer", + exposed: "noreferrer" + }, + { + rel: "opener", + exposed: "all" + }, + { + rel: "noopener noreferrer", + exposed: "noreferrer" + }, + { + rel: "noreferrer opener", + exposed: "noreferrer" + }, + { + rel: "opener noopener", + exposed: "noopener" + } + ].forEach(relTest => { + // Use promise_test to submit only after one test concluded + promise_test(t => { + return new Promise(resolve => { + const channelName = Date.now() + relTest.rel, + channel = new BroadcastChannel(channelName); + let form = submitter; + if (submitter.localName !== "form") { + form = submitter.form; + } + form.rel = relTest.rel; + channelInput.value = channelName; + if (submitter.localName !== "form") { + submitter.click(); + } else { + submitter.submit(); + } + channel.onmessage = t.step_func(e => { + if (relTest.exposed === "all" || relTest.exposed === "noopener") { + assert_equals(e.data.referrer, window.location.href, "referrer"); + } else { + assert_equals(e.data.referrer, "", "referrer"); + } + // When rel is not explicitly given, account for target=_blank defaulting to noopener + if (relTest.exposed === "all" && !(relTest.rel === "" && formUsesTargetBlank(submitter))) { + assert_true(e.data.haveOpener, "opener"); + } else { + assert_false(e.data.haveOpener, "opener"); + } + resolve(); + }); + t.add_cleanup(() => channel.postMessage(null)); + }); + }, `<form rel="${relTest.rel}"> with ${title}`); + }); +} |