Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
AddonTestUtils.initMochitest(this);
// The fallback dropdown should be hidden when only one language is installed.
add_task(async function testFallbackHiddenWithSingleLanguage() {
await SpecialPowers.pushPrefEnv({
set: [
["intl.multilingual.enabled", true],
["intl.multilingual.downloadEnabled", false],
],
});
is(Services.locale.availableLocales.length, 1, "Only one language available");
let doc = await openLanguagesPrefs();
let win = doc.defaultView;
await waitForLanguageUI(doc);
let fallbackControl = getSettingControl("browserLanguageFallback", win);
is(
fallbackControl.hidden,
true,
"Fallback dropdown is hidden with one language"
);
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
// The fallback dropdown should appear when >=2 languages are installed and the
// preferred language isn't the default locale.
add_task(async function testFallbackVisibleWithMultipleLanguages() {
await SpecialPowers.pushPrefEnv({
set: [
["intl.multilingual.enabled", true],
["intl.multilingual.downloadEnabled", false],
["extensions.langpacks.signatures.required", false],
],
});
let addon = await installLangpack("fr");
let doc = await openLanguagesPrefs();
let win = doc.defaultView;
await waitForLanguageUI(doc);
// Fallback stays hidden while the preferred language is still the default.
let fallbackControl = getSettingControl("browserLanguageFallback", win);
is(
fallbackControl.hidden,
true,
"Fallback is hidden while preferred matches the default locale"
);
await changeLocale(doc, "fr");
await waitForSettingVisible("browserLanguageFallback", win);
await addon.uninstall();
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
// The fallback dropdown should remain hidden when the preferred language is
// the default locale, even with multiple languages installed.
add_task(async function testFallbackHiddenWhenPreferredIsDefault() {
await SpecialPowers.pushPrefEnv({
set: [
["intl.multilingual.enabled", true],
["intl.multilingual.downloadEnabled", false],
["extensions.langpacks.signatures.required", false],
// Pin requested locale so this test's precondition (preferred ==
// default) holds independent of state leaked by earlier tests.
["intl.locale.requested", Services.locale.defaultLocale],
],
});
let addons = await installLangpacks(["fr", "de"]);
let doc = await openLanguagesPrefs();
let win = doc.defaultView;
await waitForLanguageUI(doc);
let fallbackControl = getSettingControl("browserLanguageFallback", win);
is(
fallbackControl.hidden,
true,
"Fallback is hidden when preferred equals the default locale"
);
await Promise.all(addons.map(addon => addon.uninstall()));
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
// The fallback dropdown should only contain installed locales, not remote ones.
add_task(async function testFallbackOnlyShowsInstalledLocales() {
let sandbox = sinon.createSandbox();
sandbox
.stub(LangPackMatcher.mockable, "getAvailableLangpacks")
.resolves(["de", "it"].map(createRemoteLangpack));
await SpecialPowers.pushPrefEnv({
set: [
["intl.multilingual.enabled", true],
["intl.multilingual.downloadEnabled", true],
["extensions.langpacks.signatures.required", false],
],
});
let addon = await installLangpack("fr");
let doc = await openLanguagesPrefs();
let win = doc.defaultView;
await waitForLanguageUI(doc);
// Fallback only becomes visible once preferred differs from the default.
await changeLocale(doc, "fr");
let fallbackControl = getSettingControl("browserLanguageFallback", win);
await waitForSettingVisible("browserLanguageFallback", win);
let children = Array.from(fallbackControl.controlEl.children);
let visibleOptions = children.filter(el => !el.hidden).map(el => el.value);
Assert.deepEqual(
visibleOptions,
["en-US"],
"Fallback only shows installed locales, excluding preferred"
);
ok(!visibleOptions.includes("de"), "Remote-only locale de not in fallback");
ok(!visibleOptions.includes("it"), "Remote-only locale it not in fallback");
await addon.uninstall();
sandbox.restore();
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
// The fallback dropdown should not include the currently preferred language.
add_task(async function testFallbackExcludesPreferredLanguage() {
await SpecialPowers.pushPrefEnv({
set: [
["intl.multilingual.enabled", true],
["intl.multilingual.downloadEnabled", false],
["intl.locale.requested", "en-US"],
["extensions.langpacks.signatures.required", false],
],
});
let addons = await installLangpacks(["fr", "de"]);
let doc = await openLanguagesPrefs();
let win = doc.defaultView;
await waitForLanguageUI(doc);
// Make preferred non-default so the fallback dropdown appears.
await changeLocale(doc, "fr");
let fallbackControl = getSettingControl("browserLanguageFallback", win);
await waitForSettingVisible("browserLanguageFallback", win);
let children = Array.from(fallbackControl.controlEl.children);
let fr = children.find(el => el.value === "fr");
ok(fr?.hidden, "Preferred locale fr is hidden in fallback options");
let visibleOptions = children.filter(el => !el.hidden).map(el => el.value);
ok(
visibleOptions.includes("en-US"),
"Installed en-US is in fallback options"
);
ok(visibleOptions.includes("de"), "Installed de is in fallback options");
await Promise.all(addons.map(addon => addon.uninstall()));
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
// Changing the fallback language when liveReload is off should show a restart
// message and record the "reorder" telemetry event.
add_task(async function testFallbackChangeShowsRestart() {
await SpecialPowers.pushPrefEnv({
set: [
["intl.multilingual.enabled", true],
["intl.multilingual.downloadEnabled", false],
["intl.multilingual.liveReload", true],
["intl.multilingual.liveReloadBidirectional", true],
["intl.locale.requested", "en-US"],
["extensions.langpacks.signatures.required", false],
],
});
let addons = await installLangpacks(["fr", "de"]);
let doc = await openLanguagesPrefs();
let win = doc.defaultView;
await waitForLanguageUI(doc);
// Live-reload to fr so preferred != default (fallback becomes visible)
// without triggering a restart message.
await changeLocale(doc, "fr");
await BrowserTestUtils.waitForCondition(
() => Services.locale.requestedLocales[0] === "fr",
"fr is live-applied"
);
let fallbackControl = getSettingControl("browserLanguageFallback", win);
await waitForSettingVisible("browserLanguageFallback", win);
assertRestartMessageHidden(doc);
// Turn off live reload so a fallback change triggers the restart flow.
await SpecialPowers.pushPrefEnv({
set: [
["intl.multilingual.liveReload", false],
["intl.multilingual.liveReloadBidirectional", false],
],
});
await changeMozSelectValue(fallbackControl.controlEl, "de");
await waitForRestartMessage(doc);
await Promise.all(addons.map(addon => addon.uninstall()));
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});