/** * Test for LoginHelper.isInferredUsernameField and LoginHelper.isInferredEmailField. */ "use strict"; const attributeTestData = [ { testValues: [ "", "name", "e-mail", "user", "user name", "userid", "lastname", ], expectation: "none", }, { testValues: ["email", "EmaiL", "loginemail", "邮箱"], expectation: "email", }, { testValues: ["username", "usErNaMe", "my username"], expectation: "username", }, { testValues: ["usernameAndemail", "EMAILUSERNAME"], expectation: "username,email", }, ]; const classNameTestData = [ { testValues: [ "inputTxt form-control", "user-input form-name", "text name mail", ], expectation: "none", }, { testValues: ["input email", "signin-email form", "input form valid-Email"], expectation: "email", }, { testValues: [ "input username", "signup-username form", "input form my_username", ], expectation: "username", }, { testValues: ["input text form username email"], expectation: "username,email", }, ]; const labelTestData = [ { testValues: [ "First Name", "Last Name", "Company Name", "Password", "User Name", ], expectation: "none", }, { testValues: ["Email:", "Email Address*"], expectation: "email", }, { testValues: ["Username:", "choose a username"], expectation: "username", }, { testValues: ["Username/Email", "username or email"], expectation: "username,email", }, ]; const TESTCASES = [ { description: "Test input type", update: (doc, v) => { doc.querySelector("input").setAttribute("type", v); }, subtests: [ { testValues: ["text", "url", "number", "username"], expectation: "none", }, { testValues: ["email"], expectation: "email", }, ], }, { description: "Test autocomplete field", update: (doc, v) => { doc.querySelector("input").setAttribute("autocomplete", v); }, subtests: [ { testValues: [ "off", "on", "name", "new-password", "current-password", "tel", "tel-national", "url", ], expectation: "none", }, { testValues: ["email"], expectation: "email", }, { testValues: ["username"], expectation: "username", }, ], }, { description: "Test id attribute", update: (doc, v) => { doc.querySelector("input").setAttribute("id", v); }, subtests: attributeTestData, }, { description: "Test name attribute", update: (doc, v) => { doc.querySelector("input").setAttribute("name", v); }, subtests: attributeTestData, }, { description: "Test class attribute", update: (doc, v) => { doc.querySelector("input").setAttribute("class", v); }, subtests: [...attributeTestData, ...classNameTestData], }, { description: "Test placeholder attribute", update: (doc, v) => { doc.querySelector("input").setAttribute("placeholder", v); }, subtests: attributeTestData, }, { description: "Test the first label", update: (doc, v) => { doc.getElementById("l1").textContent = v; }, subtests: labelTestData, }, { description: "Test the second label", update: (doc, v) => { doc.getElementById("l2").textContent = v; }, subtests: labelTestData, // The username detection heuristic only examine the first label associated // with the input, so no matter what the data is for this label, it doesn't // affect the result. // We can update this testcase once we decide to support multiple labels. supported: false, }, ]; for (let testcase of TESTCASES) { info("Sanity checking the testcase: " + testcase.description); (function () { add_task(async function () { info("Starting testcase: " + testcase.description); for (let subtest of testcase.subtests) { let document = MockDocument.createTestDocument( "http://localhost:8080/test/", ` ` ); for (let value of subtest.testValues) { testcase.update(document, value); let ele = document.querySelector("input"); let ret = LoginHelper.isInferredUsernameField(ele); Assert.strictEqual( ret, testcase.supported !== false ? subtest.expectation.includes("username") : false, `${testcase.description}, isInferredUsernameField doesn't return correct result while setting the value to ${value}` ); ret = LoginHelper.isInferredEmailField(ele); Assert.strictEqual( ret, testcase.supported !== false ? subtest.expectation.includes("email") : false, `${testcase.description}, isInferredEmailField doesn't return correct result while setting the value to ${value}` ); } } }); })(); }