"use strict"; const { FormStateManager } = ChromeUtils.importESModule( "resource://gre/modules/shared/FormStateManager.sys.mjs" ); const TESTCASES = [ { description: "Form containing 8 fields with autocomplete attribute.", document: `
`, targetElementId: "given-name", expectedResult: [ "given-name", "additional-name", "family-name", "street-addr", "city", "country", "email", "tel", ], }, { description: "Form containing only 2 fields with autocomplete attribute.", document: `
`, targetElementId: "street-addr", expectedResult: [], }, { description: "Fields without form element.", document: ` `, targetElementId: "street-addr", expectedResult: ["street-addr", "city", "country", "email", "tel"], }, { description: "Form containing credit card autocomplete attributes.", document: `
`, targetElementId: "cc-number", expectedResult: ["cc-number", "cc-name", "cc-exp-month", "cc-exp-year"], }, { description: "Form containing multiple cc-number fields without autocomplete attributes.", document: `
`, targetElementId: "cc-number1", expectedResult: [ "cc-number1", "cc-number2", "cc-number3", "cc-number4", "cc-name", "cc-exp-month", "cc-exp-year", ], }, { description: "Invalid form containing three consecutive cc-number fields without autocomplete attributes.", document: `
`, targetElementId: "cc-number1", expectedResult: [], prefs: [ [ "extensions.formautofill.creditCards.heuristics.fathom.testConfidence", "1.0", ], ], }, { description: "Invalid form containing five consecutive cc-number fields without autocomplete attributes.", document: `
`, targetElementId: "cc-number1", expectedResult: [], prefs: [ [ "extensions.formautofill.creditCards.heuristics.fathom.testConfidence", "1.0", ], ], }, { description: "Valid form containing three consecutive cc-number fields without autocomplete attributes.", document: `
`, targetElementId: "cc-number1", expectedResult: ["cc-number3", "cc-name", "cc-exp-month", "cc-exp-year"], prefs: [ [ "extensions.formautofill.creditCards.heuristics.fathom.testConfidence", "1.0", ], ], }, { description: "Valid form containing five consecutive cc-number fields without autocomplete attributes.", document: `
`, targetElementId: "cc-number1", expectedResult: ["cc-number5", "cc-name", "cc-exp-month", "cc-exp-year"], }, ]; TESTCASES.forEach(testcase => { add_task(async function () { info("Starting testcase: " + testcase.description); if (testcase.prefs) { testcase.prefs.forEach(pref => SetPref(pref[0], pref[1])); } const doc = MockDocument.createTestDocument( "http://localhost:8080/test/", testcase.document ); const element = doc.getElementById(testcase.targetElementId); const fsm = new FormStateManager(); fsm.updateActiveInput(element); const identifiedFields = fsm.identifyAutofillFields(element); const identifiedFieldIds = identifiedFields.map(x => x.element.id); Assert.deepEqual( identifiedFieldIds, testcase.expectedResult, "Check the fields were marked correctly." ); if (testcase.prefs) { testcase.prefs.forEach(pref => Services.prefs.clearUserPref(pref[0])); } }); });