summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/semantics/forms/form-submission-target/resources/reltester.js
blob: 8ca9ddbc2791b3b95d63781d1777161d323007e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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}`);
  });
}