/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
"use strict";
const PAGE_URL =
"https://example.com/chrome/dom/base/test/file_empty.html";
const languages = [
"en-US",
"es-ES",
"fr-FR"];
add_task(async
function test_set_language_override() {
const tab = BrowserTestUtils.addTab(gBrowser, PAGE_URL);
const browser = gBrowser.getBrowserForTab(tab);
await BrowserTestUtils.browserLoaded(browser);
info(
"Get default language");
const defaultLanguage = await getIntlLanguage(browser);
const defaultNavigatorLanguage = await getNavigatorLanguage(browser);
const browsingContext = browser.browsingContext;
const languageOverride = getLanguageToOverride(defaultLanguage);
info(
"Set language override");
browsingContext.languageOverride = languageOverride;
await assertLanguageOverridden(browser, languageOverride);
const secondLanguageOverride = getSecondLanguageToOverride(
defaultLanguage,
languageOverride
);
info(
"Set language override again");
browsingContext.languageOverride = secondLanguageOverride;
await assertLanguageOverridden(browser, secondLanguageOverride);
info(
"Reset language override");
browsingContext.languageOverride =
"";
await assertLanguageIsNotOverridden(
browser,
defaultLanguage,
defaultNavigatorLanguage
);
BrowserTestUtils.removeTab(tab);
});
add_task(async
function test_set_language_override_and_navigate() {
const tab = BrowserTestUtils.addTab(gBrowser, PAGE_URL);
const browser = gBrowser.getBrowserForTab(tab);
await BrowserTestUtils.browserLoaded(browser);
info(
"Get default language");
const defaultLanguage = await getIntlLanguage(browser);
const browsingContext = browser.browsingContext;
const languageOverride = getLanguageToOverride(defaultLanguage);
info(
"Set language override");
browsingContext.languageOverride = languageOverride;
await assertLanguageOverridden(browser, languageOverride);
info(
"Navigate browsing context");
const url =
"https://example.com/chrome/dom/base/test/dummy.html";
const loaded = BrowserTestUtils.browserLoaded(browser,
false, url,
false);
BrowserTestUtils.startLoadingURIString(browser, url);
await loaded;
await assertLanguageOverridden(browser, languageOverride);
BrowserTestUtils.removeTab(tab);
});
add_task(async
function test_set_language_override_in_different_contexts() {
const tab1 = BrowserTestUtils.addTab(gBrowser, PAGE_URL);
const browser1 = gBrowser.getBrowserForTab(tab1);
await BrowserTestUtils.browserLoaded(browser1);
const tab2 = BrowserTestUtils.addTab(gBrowser, PAGE_URL);
const browser2 = gBrowser.getBrowserForTab(tab2);
await BrowserTestUtils.browserLoaded(browser2);
info(
"Get default language in the first tab");
const defaultLanguage1 = await getIntlLanguage(browser1);
const defaultNavigatorLanguage1 = await getNavigatorLanguage(browser1);
info(
"Get default language in the second tab");
const defaultLanguage2 = await getIntlLanguage(browser2);
const defaultNavigatorLanguage2 = await getNavigatorLanguage(browser2);
const browsingContext1 = browser1.browsingContext;
const languageOverride = getLanguageToOverride(defaultLanguage1);
info(
"Set language override to the first tab");
browsingContext1.languageOverride = languageOverride;
await assertLanguageOverridden(browser1, languageOverride);
info(
"Make sure that in the second tab language is not overridden");
await assertLanguageIsNotOverridden(
browser2,
defaultLanguage2,
defaultNavigatorLanguage2
);
info(
"Reset language override");
browsingContext1.languageOverride =
"";
await assertLanguageIsNotOverridden(
browser1,
defaultLanguage1,
defaultNavigatorLanguage1
);
BrowserTestUtils.removeTab(tab1);
BrowserTestUtils.removeTab(tab2);
});
function getLanguageToOverride(defaultLanguage) {
return languages.find(lang => lang !== defaultLanguage);
}
function getSecondLanguageToOverride(defaultLanguage, secondLanguage) {
return languages.find(
lang => lang !== defaultLanguage && lang !== secondLanguage
);
}
async
function getIntlLanguage(browser) {
return SpecialPowers.spawn(browser, [], () => {
return content.eval(`Intl.DateTimeFormat().resolvedOptions().locale`);
});
}
async
function getNavigatorLanguage(browser) {
return SpecialPowers.spawn(browser, [], () => {
return content.eval(`window.navigator.language`);
});
}
async
function getNavigatorLanguages(browser) {
return SpecialPowers.spawn(browser, [], () => {
return content.eval(`window.navigator.languages`);
});
}
async
function assertLanguageOverridden(browser, languageOverride) {
is(
await getIntlLanguage(browser),
languageOverride,
"new Intl.DateTimeFormat().resolvedOptions().locale is overridden"
);
is(
await getNavigatorLanguage(browser),
languageOverride,
"navigator.language is overridden"
);
const navigatorLanguages = await getNavigatorLanguages(browser);
is(
navigatorLanguages.includes(languageOverride),
true,
"navigator.languages is overridden"
);
}
async
function assertLanguageIsNotOverridden(
browser,
defaultLanguage,
defaultNavigatorLanguage
) {
is(
await getIntlLanguage(browser),
defaultLanguage,
"new Intl.DateTimeFormat().resolvedOptions().locale is not overridden"
);
is(
await getNavigatorLanguage(browser),
defaultNavigatorLanguage,
"navigator.language is not overridden"
);
const navigatorLanguages = await getNavigatorLanguages(browser);
is(
navigatorLanguages.includes(defaultNavigatorLanguage),
true,
"navigator.languages is not overridden"
);
}