Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'linux' && os_version == '18.04' && asan OR os == 'linux' && os_version == '18.04' && tsan OR win11_2009 && asan
- Manifest: browser/components/preferences/tests/browser.toml
/* Any copyright is dedicated to the Public Domain.
add_task(async function initialState() {
// check pref permutations to verify the UI opens in the correct state
const prefTests = [
{
initialPrefs: [
["signon.firefoxRelay.feature", undefined],
["signon.rememberSignons", true],
],
expected: "hidden",
},
{
initialPrefs: [
["signon.firefoxRelay.feature", "available"],
["signon.rememberSignons", true],
],
expected: "checked",
},
{
initialPrefs: [
["signon.firefoxRelay.feature", "enabled"],
["signon.rememberSignons", true],
],
expected: "checked",
},
{
initialPrefs: [
["signon.firefoxRelay.feature", "disabled"],
["signon.rememberSignons", true],
],
expected: "unchecked",
},
{
initialPrefs: [
["signon.firefoxRelay.feature", undefined],
["signon.rememberSignons", false],
],
expected: "hidden",
},
{
initialPrefs: [
["signon.firefoxRelay.feature", "available"],
["signon.rememberSignons", false],
],
expected: "checked",
},
{
initialPrefs: [
["signon.firefoxRelay.feature", "enabled"],
["signon.rememberSignons", false],
],
expected: "checked",
},
{
initialPrefs: [
["signon.firefoxRelay.feature", "disabled"],
["signon.rememberSignons", false],
],
expected: "unchecked",
},
];
for (let test of prefTests) {
// set initial pref values
info("initialState, testing with: " + JSON.stringify(test));
await SpecialPowers.pushPrefEnv({ set: test.initialPrefs });
// open about:privacy in a tab
// verify expected conditions
await BrowserTestUtils.withNewTab(
{
gBrowser,
url: "about:preferences#privacy",
},
async function (browser) {
const doc = browser.contentDocument;
const relayGroup = doc.getElementById("relayIntegrationBox");
const checkbox = doc.getElementById("relayIntegration");
const savePasswords = doc.getElementById("savePasswords");
doc.getElementById("passwordSettings").scrollIntoView();
Assert.equal(
checkbox.disabled,
!savePasswords.checked,
"#relayIntegration checkbox disabled when #passwordAutofillCheckbox is unchecked"
);
switch (test.expected) {
case "hidden":
is_element_hidden(relayGroup, "#relayIntegrationBox is hidden");
break;
case "checked":
is_element_visible(relayGroup, "#relayIntegrationBox is visible");
Assert.ok(
checkbox.checked,
"#relayIntegration checkbox is checked"
);
break;
case "unchecked":
is_element_visible(relayGroup, "#relayIntegrationBox is visible");
Assert.ok(
!checkbox.checked,
"#relayIntegration checkbox is un-checked"
);
break;
default:
Assert.ok(false, "Unknown expected state: " + test.expected);
break;
}
}
);
await SpecialPowers.popPrefEnv();
}
});
add_task(async function toggleRelayIntegration() {
await SpecialPowers.pushPrefEnv({
set: [
["signon.firefoxRelay.feature", "enabled"],
["signon.rememberSignons", true],
],
});
await BrowserTestUtils.withNewTab(
{
gBrowser,
url: "about:preferences#privacy",
},
async browser => {
await SimpleTest.promiseFocus(browser);
// the preferences "Search" bar obscures the checkbox if we scrollIntoView and try to click on it
// so use keyboard events instead
const doc = browser.contentDocument;
const relayCheckbox = doc.getElementById("relayIntegration");
relayCheckbox.focus();
Assert.equal(doc.activeElement, relayCheckbox, "checkbox is focused");
Assert.equal(
relayCheckbox.checked,
true,
"#relayIntegration checkbox is not checked"
);
async function clickOnFeatureCheckbox(
expectedPrefValue,
expectedCheckValue,
message
) {
const prefChanged = TestUtils.waitForPrefChange(
"signon.firefoxRelay.feature"
);
EventUtils.synthesizeKey(" ");
await prefChanged;
Assert.equal(
Services.prefs.getStringPref("signon.firefoxRelay.feature"),
expectedPrefValue,
message
);
Assert.equal(
relayCheckbox.checked,
expectedCheckValue,
`#relayIntegration checkbox is ${
expectedCheckValue ? "checked" : "unchecked"
}`
);
}
await clickOnFeatureCheckbox(
"disabled",
false,
'Turn integration off from "enabled" feature state'
);
await clickOnFeatureCheckbox(
"available",
true,
'Turn integration on from "enabled" feature state'
);
await clickOnFeatureCheckbox(
"disabled",
false,
'Turn integration off from "enabled" feature state'
);
}
);
await SpecialPowers.popPrefEnv();
});
add_task(async function toggleRememberSignon() {
// toggling rememberSignons checkbox should make generation checkbox disabled
SpecialPowers.pushPrefEnv({
set: [
["signon.firefoxRelay.feature", "available"],
["signon.rememberSignons", true],
],
});
await BrowserTestUtils.withNewTab(
{
gBrowser,
url: "about:preferences#privacy",
},
async function (browser) {
const doc = browser.contentDocument;
const checkbox = doc.getElementById("savePasswords");
const relayCheckbox = doc.getElementById("relayIntegration");
Assert.ok(
!relayCheckbox.disabled,
"generation checkbox is not initially disabled"
);
await SimpleTest.promiseFocus(browser);
const prefChanged = TestUtils.waitForPrefChange("signon.rememberSignons");
// the preferences "Search" bar obscures the checkbox if we scrollIntoView and try to click on it
// so use keyboard events instead
checkbox.focus();
Assert.equal(doc.activeElement, checkbox, "checkbox is focused");
EventUtils.synthesizeKey(" ");
await prefChanged;
Assert.ok(!checkbox.checked, "#savePasswords checkbox is un-checked");
Assert.ok(
relayCheckbox.disabled,
"Relay integration checkbox becomes disabled"
);
}
);
await SpecialPowers.popPrefEnv();
});
add_task(async function testLockedRelayPreference() {
// Locking relay preference should disable checkbox
Services.prefs.lockPref("signon.firefoxRelay.feature");
await BrowserTestUtils.withNewTab(
{
gBrowser,
url: "about:preferences#privacy",
},
async function (browser) {
const doc = browser.contentDocument;
const relayCheckbox = doc.getElementById("relayIntegration");
Assert.ok(relayCheckbox.disabled, "Relay checkbox should be disabled");
}
);
Services.prefs.unlockPref("signon.firefoxRelay.feature");
});