summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/semantics/forms/form-submission-target/resources
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/html/semantics/forms/form-submission-target/resources')
-rw-r--r--testing/web-platform/tests/html/semantics/forms/form-submission-target/resources/endpoint.html11
-rw-r--r--testing/web-platform/tests/html/semantics/forms/form-submission-target/resources/form-target-request-header-helper.py14
-rw-r--r--testing/web-platform/tests/html/semantics/forms/form-submission-target/resources/reltester.js82
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}`);
+ });
+}