Files
UXP-Fixed/toolkit/components/passwordmgr/test/unit/test_getPasswordFields.js
T
2018-02-02 04:16:08 -05:00

157 lines
6.0 KiB
JavaScript

/*
* Test for LoginManagerContent._getPasswordFields using LoginFormFactory.
*/
"use strict";
const LMCBackstagePass = Cu.import("resource://gre/modules/LoginManagerContent.jsm");
const { LoginManagerContent, LoginFormFactory } = LMCBackstagePass;
const TESTCASES = [
{
description: "Empty document",
document: ``,
returnedFieldIDsByFormLike: [],
skipEmptyFields: undefined,
},
{
description: "Non-password input with no <form> present",
document: `<input>`,
// Only the IDs of password fields should be in this array
returnedFieldIDsByFormLike: [[]],
skipEmptyFields: undefined,
},
{
description: "1 password field outside of a <form>",
document: `<input id="pw1" type=password>`,
returnedFieldIDsByFormLike: [["pw1"]],
skipEmptyFields: undefined,
},
{
description: "4 empty password fields outside of a <form>",
document: `<input id="pw1" type=password>
<input id="pw2" type=password>
<input id="pw3" type=password>
<input id="pw4" type=password>`,
returnedFieldIDsByFormLike: [[]],
skipEmptyFields: undefined,
},
{
description: "4 password fields outside of a <form> (1 empty, 3 full) with skipEmpty",
document: `<input id="pw1" type=password>
<input id="pw2" type=password value="pass2">
<input id="pw3" type=password value="pass3">
<input id="pw4" type=password value="pass4">`,
returnedFieldIDsByFormLike: [["pw2", "pw3", "pw4"]],
skipEmptyFields: true,
},
{
description: "Form with 1 password field",
document: `<form><input id="pw1" type=password></form>`,
returnedFieldIDsByFormLike: [["pw1"]],
skipEmptyFields: undefined,
},
{
description: "Form with 2 password fields",
document: `<form><input id="pw1" type=password><input id='pw2' type=password></form>`,
returnedFieldIDsByFormLike: [["pw1", "pw2"]],
skipEmptyFields: undefined,
},
{
description: "1 password field in a form, 1 outside",
document: `<form><input id="pw1" type=password></form><input id="pw2" type=password>`,
returnedFieldIDsByFormLike: [["pw1"], ["pw2"]],
skipEmptyFields: undefined,
},
{
description: "2 password fields outside of a <form> with 1 linked via @form",
document: `<input id="pw1" type=password><input id="pw2" type=password form='form1'>
<form id="form1"></form>`,
returnedFieldIDsByFormLike: [["pw1"], ["pw2"]],
skipEmptyFields: undefined,
},
{
description: "2 password fields outside of a <form> with 1 linked via @form + skipEmpty",
document: `<input id="pw1" type=password><input id="pw2" type=password form="form1">
<form id="form1"></form>`,
returnedFieldIDsByFormLike: [[], []],
skipEmptyFields: true,
},
{
description: "skipEmptyFields should also skip white-space only fields",
document: `<input id="pw-space" type=password value=" ">
<input id="pw-tab" type=password value=" ">
<input id="pw-newline" type=password form="form1" value="
">
<form id="form1"></form>`,
returnedFieldIDsByFormLike: [[], []],
skipEmptyFields: true,
},
{
description: "2 password fields outside of a <form> with 1 linked via @form + skipEmpty with 1 empty",
document: `<input id="pw1" type=password value=" pass1 "><input id="pw2" type=password form="form1">
<form id="form1"></form>`,
returnedFieldIDsByFormLike: [["pw1"], []],
skipEmptyFields: true,
},
];
for (let tc of TESTCASES) {
do_print("Sanity checking the testcase: " + tc.description);
(function() {
let testcase = tc;
add_task(function*() {
do_print("Starting testcase: " + testcase.description);
let document = MockDocument.createTestDocument("http://localhost:8080/test/",
testcase.document);
let mapRootElementToFormLike = new Map();
for (let input of document.querySelectorAll("input")) {
let formLike = LoginFormFactory.createFromField(input);
let existingFormLike = mapRootElementToFormLike.get(formLike.rootElement);
if (!existingFormLike) {
mapRootElementToFormLike.set(formLike.rootElement, formLike);
continue;
}
// If the formLike is already present, ensure that the properties are the same.
do_print("Checking if the new FormLike for the same root has the same properties");
formLikeEqual(formLike, existingFormLike);
}
Assert.strictEqual(mapRootElementToFormLike.size, testcase.returnedFieldIDsByFormLike.length,
"Check the correct number of different formLikes were returned");
let formLikeIndex = -1;
for (let formLikeFromInput of mapRootElementToFormLike.values()) {
formLikeIndex++;
let pwFields = LoginManagerContent._getPasswordFields(formLikeFromInput,
testcase.skipEmptyFields);
if (formLikeFromInput.rootElement instanceof Ci.nsIDOMHTMLFormElement) {
let formLikeFromForm = LoginFormFactory.createFromForm(formLikeFromInput.rootElement);
do_print("Checking that the FormLike created for the <form> matches" +
" the one from a password field");
formLikeEqual(formLikeFromInput, formLikeFromForm);
}
if (testcase.returnedFieldIDsByFormLike[formLikeIndex].length === 0) {
Assert.strictEqual(pwFields, null,
"If no password fields were found null should be returned");
} else {
Assert.strictEqual(pwFields.length,
testcase.returnedFieldIDsByFormLike[formLikeIndex].length,
"Check the # of password fields for formLike #" + formLikeIndex);
}
for (let i = 0; i < testcase.returnedFieldIDsByFormLike[formLikeIndex].length; i++) {
let expectedID = testcase.returnedFieldIDsByFormLike[formLikeIndex][i];
Assert.strictEqual(pwFields[i].element.id, expectedID,
"Check password field " + i + " ID");
}
}
});
})();
}