Source code
Revision control
Copy as Markdown
Other Tools
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title>setting-control extension controlled tests</title>
<link
rel="stylesheet"
/>
<script src="../../../../../toolkit/content/tests/widgets/lit-test-helpers.js"></script>
<script
type="module"
src="chrome://browser/content/preferences/widgets/setting-group.mjs"
></script>
<script
type="module"
src="chrome://browser/content/preferences/widgets/setting-control.mjs"
></script>
<script
type="module"
src="chrome://global/content/elements/moz-message-bar.mjs"
></script>
<script
type="application/javascript"
src="chrome://global/content/preferencesBindings.js"
></script>
<script>
const { Assert } = ChromeUtils.importESModule(
);
/* import-globals-from /toolkit/content/preferencesBindings.js */
let html, testHelpers;
async function renderTemplate(itemConfig) {
let config = {
items: [itemConfig],
};
let result = await testHelpers.renderTemplate(html`
<setting-group
.config=${config}
.getSetting=${(...args) => Preferences.getSetting(...args)}
></setting-group>
`);
if (document.hasPendingL10nMutations) {
await BrowserTestUtils.waitForEvent(
document,
"L10nMutationsFinished"
);
}
return result.querySelector("setting-control");
}
add_setup(async function setup() {
testHelpers = new InputTestHelpers();
({ html } = await testHelpers.setupLit());
testHelpers.setupTests({
templateFn: () => html`<setting-group></setting-group>`,
});
MozXULElement.insertFTLIfNeeded("branding/brand.ftl");
MozXULElement.insertFTLIfNeeded("browser/preferences/preferences.ftl");
});
add_task(async function testExtensionControlledConfigBasedControl() {
// Setup pre-test items: extension, Preferences, ExtensionSettingStore
const SETTING_ID = "extension-controlled-setting";
const ADDON_ID = "ext-controlled@mochi.test";
const ADDON_NAME = "Ext Controlled";
const STORE_ID = "privacy.containers";
const PREF_ID = "test.setting-control.bar";
const TEST_FLUENT_ID = "test-fluent-id";
await SpecialPowers.pushPrefEnv({
set: [[PREF_ID, false]],
});
Preferences.addAll([{ id: PREF_ID }]);
let extension = ExtensionTestUtils.loadExtension({
manifest: {
browser_specific_settings: { gecko: { id: ADDON_ID } },
name: ADDON_NAME,
permissions: ["contextualIdentities", "cookies"],
},
// We need to be able to find the extension using AddonManager.
useAddonManager: "temporary",
});
await extension.startup();
// Assert there is no markup that is generated by pre-test setup since we
// don't have a setting that is being controlled by the STORE_ID
let settingControl = document.getElementById(SETTING_ID);
is(
settingControl,
null,
"The setting control under test should not exist yet."
);
// Add setting that is being controlled by our test extension
Preferences.addSetting({
id: SETTING_ID,
pref: PREF_ID,
controllingExtensionInfo: {
storeId: STORE_ID,
l10nId: TEST_FLUENT_ID,
},
});
// Create itemConfig for expected setting-control element
let itemConfig = {
l10nId: "test-fluent-id",
id: SETTING_ID,
};
// Wait for setting-control element to be rendered
let setting = Preferences.getSetting(SETTING_ID);
let control = await renderTemplate(itemConfig, setting);
// Assert checkbox control is created and disabled due to extension controlling the pref
is(
control.controlEl.localName,
"moz-checkbox",
"The control rendered the default checkbox"
);
is(
control.controlEl.disabled,
true,
"The control should be disabled since it is controlled by an extension"
);
// Assert that moz-message-bar appears with the correct Fluent attributes/args
let messageBar = control.querySelector("moz-message-bar");
ok(
messageBar,
"There should be an extension controlled message bar element"
);
is(
messageBar.messageL10nId,
TEST_FLUENT_ID,
"The l10nId should be the same as the one in the config"
);
is(
messageBar.messageL10nArgs.name,
ADDON_NAME,
"The name used within the message-bar should be the extension name"
);
// Clear the test pref
await extension.unload();
});
</script>
</head>
<body>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test"></pre>
</body>
</html>