summaryrefslogtreecommitdiffstats
path: root/toolkit/components/passwordmgr/test/mochitest/test_formless_submit_navigation_negative.html
blob: 4283f128c21afff3f8386349eac5d4bba3302d0c (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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Test no capturing of fields outside of a form due to navigation</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <script src="/tests/SimpleTest/SpawnTask.js"></script>
  <script src="pwmgr_common.js"></script>
  <link rel="stylesheet" href="/tests/SimpleTest/test.css" />
</head>
<body>
<script type="application/javascript;version=1.8">
const LMCBackstagePass = SpecialPowers.Cu.import("resource://gre/modules/LoginManagerContent.jsm");
const { LoginManagerContent, LoginFormFactory } = LMCBackstagePass;

SimpleTest.requestFlakyTimeout("Testing that a message doesn't arrive");

let chromeScript = runInParent(SimpleTest.getTestFileURL("pwmgr_common.js"));

let loadPromise = new Promise(resolve => {
  document.addEventListener("DOMContentLoaded", () => {
    document.getElementById("loginFrame").addEventListener("load", (evt) => {
      resolve();
    });
  });
});

function submissionProcessed(...args) {
  ok(false, "No formSubmissionProcessed should occur in this test");
  info("got: " + JSON.stringify(args));
}

add_task(function* setup() {
  yield SpecialPowers.pushPrefEnv({
    set: [
      ["signon.formlessCapture.enabled", true],
    ],
  });

  info("Waiting for page and frame loads");
  yield loadPromise;

  chromeScript.addMessageListener("formSubmissionProcessed", submissionProcessed);

  SimpleTest.registerCleanupFunction(() => {
    chromeScript.removeMessageListener("formSubmissionProcessed", submissionProcessed);
  });
});

const DEFAULT_ORIGIN = "http://test1.mochi.test:8888";
const SCRIPTS = {
  PUSHSTATE: `history.pushState({}, "Pushed state", "?pushed");`,
  WINDOW_LOCATION: `window.location = "data:text/html;charset=utf-8,window.location";`,
  WINDOW_LOCATION_RELOAD: `window.location.reload();`,
  HISTORY_BACK: `history.back();`,
  HISTORY_GO_MINUS1: `history.go(-1);`,
};
const TESTCASES = [
  // Begin test cases that shouldn't trigger capture.
  {
    // For now we don't trigger upon navigation if <form> is used.
    document: `<form><input type=password value="pass1"></form>`,
  },
  {
    // Empty password field
    document: `<input type=password value="">`,
  },
  {
    // Test with an input that would normally be captured but with SCRIPTS that
    // shouldn't trigger capture.
    document: `<input type=password value="pass2">`,
    wouldCapture: true,
  },
];

add_task(function* test() {
  let loginFrame = document.getElementById("loginFrame");

  for (let tc of TESTCASES) {
    for (let scriptName of Object.keys(SCRIPTS)) {
      if (tc.wouldCapture && ["PUSHSTATE", "WINDOW_LOCATION"].includes(scriptName)) {
        // Don't run scripts that should actually capture for this testcase.
        continue;
      }

      info("Starting testcase with script " + scriptName + ": " + JSON.stringify(tc));
      let loadedPromise = new Promise((resolve) => {
        loginFrame.addEventListener("load", function frameLoaded() {
          loginFrame.removeEventListener("load", frameLoaded);
          resolve();
        });
      });
      loginFrame.src = DEFAULT_ORIGIN + "/tests/toolkit/components/passwordmgr/test/mochitest/blank.html";
      yield loadedPromise;

      let frameDoc = SpecialPowers.wrap(loginFrame.contentWindow).document;
      frameDoc.documentElement.innerHTML = tc.document;

      // Wait for the form to be processed before trying to submit.
      yield promiseFormsProcessed();

      info("Running " + scriptName + " script to check for a submission");
      frameDoc.defaultView.eval(SCRIPTS[scriptName]);

      // Wait for 5000ms to see if the promise above resolves.
      yield new Promise(resolve => setTimeout(resolve, 5000));
      ok(true, "Done waiting for captures");
    }
  }
});

</script>

<p id="display"></p>

<div id="content">
  <iframe id="loginFrame" src="http://test1.mochi.test:8888/tests/toolkit/components/passwordmgr/test/mochitest/blank.html"></iframe>
</div>
<pre id="test"></pre>
</body>
</html>