/** * Test for LoginFormState.getUserNameAndPasswordFields */ "use strict"; const { LoginManagerChild } = ChromeUtils.importESModule( "resource://gre/modules/LoginManagerChild.sys.mjs" ); const TESTCASES = [ { description: "1 password field outside of a
", document: ``, returnedFieldIDs: [null, "pw1", null], }, { description: "1 text field in a without a password field", document: `
`, returnedFieldIDs: [null, null, null], }, { description: "1 text field outside of a
without a password field", document: ``, returnedFieldIDs: [null, null, null], }, { description: "1 username & password field outside of a ", document: ` `, returnedFieldIDs: ["un1", "pw1", null], }, { description: "1 username & password field in a ", document: `
`, returnedFieldIDs: ["un1", "pw1", null], }, { description: "5 empty password fields outside of a
", document: ` `, returnedFieldIDs: [null, "pw1", null], }, { description: "6 empty password fields outside of a ", document: ` `, returnedFieldIDs: [null, null, null], }, { description: "Form with 1 password field", document: `
`, returnedFieldIDs: [null, "pw1", null], }, { description: "Form with 2 password fields", document: `
`, returnedFieldIDs: [null, "pw1", null], }, { description: "1 password field in a form, 1 outside (not processed)", document: `
`, returnedFieldIDs: [null, "pw1", null], }, { description: "1 password field in a form, 1 text field outside (not processed)", document: `
`, returnedFieldIDs: [null, "pw1", null], }, { description: "1 text field in a form, 1 password field outside (not processed)", document: `
`, returnedFieldIDs: [null, null, null], }, { description: "2 password fields outside of a
with 1 linked via @form", document: `
`, returnedFieldIDs: [null, "pw1", null], }, { description: "1 username field in a
", document: `
`, returnedFieldIDs: ["un1", null, null], }, { description: "1 username field outside of a
", document: ``, returnedFieldIDs: [null, null, null], }, { description: "username with type=user", document: `
`, returnedFieldIDs: ["un1", "pwd", null], }, { description: "username with type=username", document: `
`, returnedFieldIDs: ["un1", "pwd", null], }, ]; function _setPrefs() { Services.prefs.setBoolPref("signon.usernameOnlyForm.enabled", true); registerCleanupFunction(() => { Services.prefs.clearUserPref("signon.usernameOnlyForm.enabled"); }); } _setPrefs(); for (let tc of TESTCASES) { info("Sanity checking the testcase: " + tc.description); (function () { let testcase = tc; add_task(async function () { info("Starting testcase: " + testcase.description); let document = MockDocument.createTestDocument( "http://localhost:8080/test/", testcase.document ); let input = document.querySelector("input"); MockDocument.mockOwnerDocumentProperty( input, document, "http://localhost:8080/test/" ); MockDocument.mockNodePrincipalProperty( input, "http://localhost:8080/test/" ); // Additional mock to cache recipes let win = {}; Object.defineProperty(document, "defaultView", { value: win, }); let formOrigin = LoginHelper.getLoginOrigin(document.documentURI); LoginRecipesContent.cacheRecipes(formOrigin, win, new Set()); const loginManagerChild = new LoginManagerChild(); const docState = loginManagerChild.stateForDocument(document); let actual = docState.getUserNameAndPasswordFields(input); Assert.strictEqual( testcase.returnedFieldIDs.length, 3, "getUserNameAndPasswordFields returns 3 elements" ); for (let i = 0; i < testcase.returnedFieldIDs.length; i++) { let expectedID = testcase.returnedFieldIDs[i]; if (expectedID === null) { Assert.strictEqual( actual[i], expectedID, "Check returned field " + i + " is null" ); } else { Assert.strictEqual( actual[i].id, expectedID, "Check returned field " + i + " ID" ); } } }); })(); }