Bug 1963938 - Disable config-based prefs when locked r=reusable-components-reviewers,settings-reviewers,tgiles

Differential Revision: https://phabricator.services.mozilla.com/D247503
This commit is contained in:
Mark Striemer
2025-05-12 21:23:13 +00:00
committed by mstriemer@mozilla.com
parent 5eef155802
commit 6c85e64f09
6 changed files with 83 additions and 2 deletions

View File

@@ -92,6 +92,7 @@
);
is(control.inputEl.dataset.l10nId, LABEL_L10N_ID, "Label is set");
is(control.inputEl.checked, true, "checkbox is checked");
is(control.inputEl.disabled, false, "checkbox is enabled");
is(Services.prefs.getBoolPref(PREF), true, "pref is true");
let settingChanged = waitForSettingChange(setting);
@@ -113,6 +114,21 @@
"checkbox becomes checked after pfef change"
);
is(Services.prefs.getBoolPref(PREF), true, "pref is true");
// Pref locking
settingChanged = waitForSettingChange(setting);
Services.prefs.lockPref(PREF);
await settingChanged;
is(control.inputEl.disabled, true, "checkbox is disabled when locked");
settingChanged = waitForSettingChange(setting);
Services.prefs.unlockPref(PREF);
await settingChanged;
is(
control.inputEl.disabled,
false,
"checkbox is enabled when unlocked"
);
});
add_task(async function testSupportLinkCheckbox() {

View File

@@ -102,6 +102,7 @@
is(checkboxes.length, 2, "Rendered two checkboxes");
is(checkboxes[0].dataset.l10nId, LABEL_L10N_ID, "Label is set");
is(checkboxes[0].checked, true, "First checkbox is checked");
is(checkboxes[0].disabled, false, "First checkbox is enabled");
is(Services.prefs.getBoolPref(PREF_ONE), true, "First pref is true");
is(checkboxes[1].checked, false, "Second checkbox is unchecked");
is(Services.prefs.getBoolPref(PREF_TWO), false, "Second pref is false");
@@ -151,6 +152,23 @@
"Second checkbox becomes unchecked after pref change"
);
is(Services.prefs.getBoolPref(PREF_TWO), false, "Second pref is false");
// Test pref locking
settingChanged = waitForSettingChange(
Preferences.getSetting(SETTING_ONE)
);
Services.prefs.lockPref(PREF_ONE);
await settingChanged;
is(checkboxes[0].disabled, true, "Checkbox is disabled when locked");
settingChanged = waitForSettingChange(
Preferences.getSetting(SETTING_ONE)
);
Services.prefs.unlockPref(PREF_ONE);
await settingChanged;
is(checkboxes[0].disabled, false, "Checkbox is enabled when unlocked");
});
add_task(async function testSupportLinkXulCheckbox() {

View File

@@ -58,6 +58,7 @@ export class SettingControl extends MozLitElement {
.checked=${this.value}
.supportPage=${this.config.supportPage}
data-subcategory=${ifDefined(this.config.subcategory)}
?disabled=${this.setting.locked}
@change=${this.onChange}
></moz-checkbox>`;
}

View File

@@ -36,8 +36,14 @@ export class SettingGroup extends MozLitElement {
checkbox.addEventListener("command", e =>
setting.userChange(e.target.checked)
);
setting.on("change", () => (checkbox.checked = setting.value));
checkbox.checked = setting.value;
function setValue() {
checkbox.checked = setting.value;
checkbox.disabled = setting.locked;
}
setting.on("change", setValue);
setValue();
if (item.supportPage) {
let container = document.createXULElement("hbox");
container.setAttribute("align", "center");

View File

@@ -714,6 +714,10 @@ const Preferences = (window.Preferences = (function () {
}
}
get locked() {
return this.pref?.locked ?? false;
}
get visible() {
return this.config.visible ? this.config.visible() : true;
}

View File

@@ -145,6 +145,42 @@
is(setting.visible, false, "Setting is not visible");
});
add_task(async function testPrefIsLocked() {
const PREF_ID = "test.setting.locked";
const SETTING_ID = "testSettingLocked";
const NO_PREF_ID = "noSettingLocked";
await SpecialPowers.pushPrefEnv({
set: [[PREF_ID, false]],
});
Preferences.add({
id: PREF_ID,
type: "bool",
});
Preferences.addSetting({
id: SETTING_ID,
pref: PREF_ID,
});
Preferences.addSetting({
id: NO_PREF_ID,
get: () => true,
});
let setting = Preferences.getSetting(SETTING_ID);
ok(setting, "Got a setting object");
is(setting.locked, false, "Setting is not locked");
Services.prefs.lockPref(PREF_ID);
is(setting.locked, true, "Setting is locked");
Services.prefs.unlockPref(PREF_ID);
is(setting.locked, false, "Setting is not unlocked");
let noPrefSetting = Preferences.getSetting(NO_PREF_ID);
ok(noPrefSetting, "Got a setting not backed by prefs");
is(noPrefSetting.locked, false, "Non-pref setting is not locked");
});
</script>
</head>
<body>