diff options
Diffstat (limited to 'testing/web-platform/tests/html/semantics/forms/form-submission-target/resources')
3 files changed, 107 insertions, 0 deletions
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}`); + }); +} |