fune/toolkit/components/passwordmgr/test/browser/browser_DOMFormHasPossibleUsername.js

240 lines
6 KiB
JavaScript

const ids = {
INPUT_ID: "input1",
FORM1_ID: "form1",
FORM2_ID: "form2",
CHANGE_INPUT_ID: "input2",
INPUT_TYPE: "",
};
function task({ contentIds, expected }) {
let resolve;
let promise = new Promise(r => {
resolve = r;
});
function unexpectedContentEvent(evt) {
ok(false, "Received a " + evt.type + " event on content");
}
var gDoc = null;
addEventListener("load", tabLoad, true);
function tabLoad() {
if (content.location.href == "about:blank") {
return;
}
removeEventListener("load", tabLoad, true);
gDoc = content.document;
gDoc.addEventListener("DOMFormHasPossibleUsername", unexpectedContentEvent);
gDoc.defaultView.setTimeout(test_inputAdd, 0);
}
function test_inputAdd() {
if (expected) {
addEventListener(
"DOMFormHasPossibleUsername",
test_inputAddHandler,
false
);
} else {
addEventListener(
"DOMFormHasPossibleUsername",
unexpectedContentEvent,
false
);
gDoc.defaultView.setTimeout(test_inputAddHandler, 0);
}
let input = gDoc.createElementNS("http://www.w3.org/1999/xhtml", "input");
input.setAttribute("type", contentIds.INPUT_TYPE);
input.setAttribute("id", contentIds.INPUT_ID);
input.setAttribute("data-test", "unique-attribute");
gDoc.getElementById(contentIds.FORM1_ID).appendChild(input);
}
function test_inputAddHandler(evt) {
if (expected) {
removeEventListener(evt.type, test_inputAddHandler, false);
is(
evt.target.id,
contentIds.FORM1_ID,
evt.type +
" event targets correct form element (added possible username element)"
);
}
gDoc.defaultView.setTimeout(test_inputChangeForm, 0);
}
function test_inputChangeForm() {
if (expected) {
addEventListener(
"DOMFormHasPossibleUsername",
test_inputChangeFormHandler,
false
);
} else {
gDoc.defaultView.setTimeout(test_inputChangeFormHandler, 0);
}
let input = gDoc.getElementById(contentIds.INPUT_ID);
input.setAttribute("form", contentIds.FORM2_ID);
}
function test_inputChangeFormHandler(evt) {
if (expected) {
removeEventListener(evt.type, test_inputChangeFormHandler, false);
is(
evt.target.id,
contentIds.FORM2_ID,
evt.type + " event targets correct form element (changed form)"
);
}
gDoc.defaultView.setTimeout(test_inputChangesType, 0);
}
function test_inputChangesType() {
if (expected) {
addEventListener(
"DOMFormHasPossibleUsername",
test_inputChangesTypeHandler,
false
);
} else {
gDoc.defaultView.setTimeout(test_inputChangesTypeHandler, 0);
}
let input = gDoc.getElementById(contentIds.CHANGE_INPUT_ID);
input.setAttribute("type", contentIds.INPUT_TYPE);
}
function test_inputChangesTypeHandler(evt) {
if (expected) {
removeEventListener(evt.type, test_inputChangesTypeHandler, false);
is(
evt.target.id,
contentIds.FORM1_ID,
evt.type + " event targets correct form element (changed type)"
);
}
gDoc.defaultView.setTimeout(finish, 0);
}
function finish() {
if (!expected) {
removeEventListener("DOMFormHasPossibleUsername", unexpectedContentEvent);
}
gDoc.removeEventListener(
"DOMFormHasPossibleUsername",
unexpectedContentEvent
);
resolve();
}
return promise;
}
add_task(async function test_initialize() {
Services.prefs.setBoolPref("signon.usernameOnlyForm.enabled", true);
registerCleanupFunction(() => {
Services.prefs.clearUserPref("signon.usernameOnlyForm.enabled");
});
});
add_task(async function test_usernameOnlyForm() {
for (let type of ["text", "email"]) {
let tab = (gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser));
ids.INPUT_TYPE = type;
let promise = ContentTask.spawn(
tab.linkedBrowser,
{ contentIds: ids, expected: true },
task
);
BrowserTestUtils.loadURI(
tab.linkedBrowser,
"data:text/html;charset=utf-8," +
"<html><body>" +
"<form id='" +
ids.FORM1_ID +
"'>" +
"<input id='" +
ids.CHANGE_INPUT_ID +
"'></form>" +
"<form id='" +
ids.FORM2_ID +
"'></form>" +
"</body></html>"
);
await promise;
ok(true, "Test completed");
gBrowser.removeCurrentTab();
}
});
add_task(async function test_nonSupportedInputType() {
for (let type of ["url", "tel", "number"]) {
let tab = (gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser));
ids.INPUT_TYPE = type;
let promise = ContentTask.spawn(
tab.linkedBrowser,
{ contentIds: ids, expected: false },
task
);
BrowserTestUtils.loadURI(
tab.linkedBrowser,
"data:text/html;charset=utf-8," +
"<html><body>" +
"<form id='" +
ids.FORM1_ID +
"'>" +
"<input id='" +
ids.CHANGE_INPUT_ID +
"'></form>" +
"<form id='" +
ids.FORM2_ID +
"'></form>" +
"</body></html>"
);
await promise;
ok(true, "Test completed");
gBrowser.removeCurrentTab();
}
});
add_task(async function test_usernameOnlyFormPrefOff() {
Services.prefs.setBoolPref("signon.usernameOnlyForm.enabled", false);
for (let type of ["text", "email"]) {
let tab = (gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser));
ids.INPUT_TYPE = type;
let promise = ContentTask.spawn(
tab.linkedBrowser,
{ contentIds: ids, expected: false },
task
);
BrowserTestUtils.loadURI(
tab.linkedBrowser,
"data:text/html;charset=utf-8," +
"<html><body>" +
"<form id='" +
ids.FORM1_ID +
"'>" +
"<input id='" +
ids.CHANGE_INPUT_ID +
"'></form>" +
"<form id='" +
ids.FORM2_ID +
"'></form>" +
"</body></html>"
);
await promise;
ok(true, "Test completed");
gBrowser.removeCurrentTab();
}
Services.prefs.clearUserPref("signon.usernameOnlyForm.enabled");
});