summaryrefslogtreecommitdiffstats
path: root/toolkit/components/passwordmgr/test/mochitest/test_dismissed_doorhanger_in_shadow_DOM.html
blob: 87638b1132df22f0ff8c2f5d14b53c4b58e9f472 (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
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Test the password manager dismissed doorhanger can detect username and password fields in a Shadow DOM.</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <script src="pwmgr_common.js"></script>
  <link rel="stylesheet" href="/tests/SimpleTest/test.css" />
</head>
<body>

<iframe></iframe>

<script type="application/javascript">
add_setup(async () => {
  const readyPromise = registerRunTests();
  info("Waiting for setup and page load");
  await readyPromise;

  // assert that there are no logins
  const allLogins = await LoginManager.getAllLogins();
  is(allLogins.length, 0, "There are no logins");
});

const IFRAME = document.querySelector("iframe");
const PASSWORD_VALUE = "!@$*";
const TESTCASES = [
  // Check that the Shadow DOM version of form_basic.html works
  {
    name: "test_form_each_field_in_its_own_shadow_root",
    filename: "form_basic_shadow_DOM_each_field_in_its_own_shadow_root.html",
  },
  // Check that the Shadow DOM version of formless_basic.html works
  {
    name: "test_formless_each_field_in_its_own_shadow_root",
    filename: "formless_basic_shadow_DOM_each_field_in_its_own_shadow_root.html",
  },
  // Check that the nested Shadow DOM version of form_basic.html works
  {
    name: "test_form_nested_each_field_in_its_own_shadow_root",
    filename: "form_nested_shadow_DOM_each_field_in_its_own_shadow_root.html",
  }
];

async function editPasswordFieldInShadowDOM() {
  info("Editing the input field in the form with a Shadow DOM");
  await SpecialPowers.spawn(getIframeBrowsingContext(window, 0), [PASSWORD_VALUE], function(val) {
      const doc = this.content.document;
      // Grab the wrapper element to get the shadow root containing the password field
      let wrapper = doc.getElementById("wrapper-password");
      if (!wrapper) {
        // This is a nested Shadow DOM test case
        const outerWrapper = doc.getElementById("outer-wrapper-password");
        const outerShadowRoot = outerWrapper.openOrClosedShadowRoot;
        wrapper = outerShadowRoot.querySelector("#wrapper-password");
      }
      // If the ShadowRoot's mode is "closed", it can only be accessed from a chrome-privileged
      // (Bug 1421568) or addon context (Bug 1439153)
      const shadowRoot = wrapper.openOrClosedShadowRoot;
      const passwordField = shadowRoot.querySelector("[name='password']");
      Assert.equal(passwordField.value, "", "Check password didn't get autofilled");
      passwordField.setUserInput(val);
      Assert.equal(passwordField.value, val, "Checking for filled password");
    }
  );
}

async function testForm(testcase) {
  const iframeLoaded = new Promise(resolve => {
    IFRAME.addEventListener(
      "load",
      function(e) {
        resolve(true);
      },
      { once: true }
    );
  });

  // This could complete before the page finishes loading.
  const formsProcessed = promiseFormsProcessed();

  IFRAME.src = testcase.filename;
  info("Waiting for test page to load in the iframe");
  await iframeLoaded;

  info("Waiting for 'input' event listener to be added to the form before editing");
  await formsProcessed;

  const passwordEditProcessed = getPasswordEditedMessage();

  await editPasswordFieldInShadowDOM();

  info("Waiting for parent process to receive input field edit message from content");
  await passwordEditProcessed;
}

for (let testcase of TESTCASES) {
  const taskName = testcase.name;
  const tmp = {
    async [taskName]() {
      await testForm(testcase);
    }
  }
  add_task(tmp[taskName]);
}
</script>
</body>
</html>