browser_language_override.js (5811B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 */ 5 6 "use strict"; 7 8 const PAGE_URL = "https://example.com/chrome/dom/base/test/file_empty.html"; 9 const languages = ["en-US", "es-ES", "fr-FR"]; 10 11 add_task(async function test_set_language_override() { 12 const tab = BrowserTestUtils.addTab(gBrowser, PAGE_URL); 13 const browser = gBrowser.getBrowserForTab(tab); 14 15 await BrowserTestUtils.browserLoaded(browser); 16 17 info("Get default language"); 18 const defaultLanguage = await getIntlLanguage(browser); 19 const defaultNavigatorLanguage = await getNavigatorLanguage(browser); 20 21 const browsingContext = browser.browsingContext; 22 23 const languageOverride = getLanguageToOverride(defaultLanguage); 24 25 info("Set language override"); 26 browsingContext.languageOverride = languageOverride; 27 await assertLanguageOverridden(browser, languageOverride); 28 29 const secondLanguageOverride = getSecondLanguageToOverride( 30 defaultLanguage, 31 languageOverride 32 ); 33 34 info("Set language override again"); 35 browsingContext.languageOverride = secondLanguageOverride; 36 await assertLanguageOverridden(browser, secondLanguageOverride); 37 38 info("Reset language override"); 39 browsingContext.languageOverride = ""; 40 await assertLanguageIsNotOverridden( 41 browser, 42 defaultLanguage, 43 defaultNavigatorLanguage 44 ); 45 46 BrowserTestUtils.removeTab(tab); 47 }); 48 49 add_task(async function test_set_language_override_and_navigate() { 50 const tab = BrowserTestUtils.addTab(gBrowser, PAGE_URL); 51 const browser = gBrowser.getBrowserForTab(tab); 52 53 await BrowserTestUtils.browserLoaded(browser); 54 55 info("Get default language"); 56 const defaultLanguage = await getIntlLanguage(browser); 57 58 const browsingContext = browser.browsingContext; 59 60 const languageOverride = getLanguageToOverride(defaultLanguage); 61 62 info("Set language override"); 63 browsingContext.languageOverride = languageOverride; 64 await assertLanguageOverridden(browser, languageOverride); 65 66 info("Navigate browsing context"); 67 const url = "https://example.com/chrome/dom/base/test/dummy.html"; 68 const loaded = BrowserTestUtils.browserLoaded(browser, false, url, false); 69 BrowserTestUtils.startLoadingURIString(browser, url); 70 await loaded; 71 await assertLanguageOverridden(browser, languageOverride); 72 73 BrowserTestUtils.removeTab(tab); 74 }); 75 76 add_task(async function test_set_language_override_in_different_contexts() { 77 const tab1 = BrowserTestUtils.addTab(gBrowser, PAGE_URL); 78 const browser1 = gBrowser.getBrowserForTab(tab1); 79 80 await BrowserTestUtils.browserLoaded(browser1); 81 82 const tab2 = BrowserTestUtils.addTab(gBrowser, PAGE_URL); 83 const browser2 = gBrowser.getBrowserForTab(tab2); 84 85 await BrowserTestUtils.browserLoaded(browser2); 86 87 info("Get default language in the first tab"); 88 const defaultLanguage1 = await getIntlLanguage(browser1); 89 const defaultNavigatorLanguage1 = await getNavigatorLanguage(browser1); 90 91 info("Get default language in the second tab"); 92 const defaultLanguage2 = await getIntlLanguage(browser2); 93 const defaultNavigatorLanguage2 = await getNavigatorLanguage(browser2); 94 95 const browsingContext1 = browser1.browsingContext; 96 97 const languageOverride = getLanguageToOverride(defaultLanguage1); 98 99 info("Set language override to the first tab"); 100 browsingContext1.languageOverride = languageOverride; 101 await assertLanguageOverridden(browser1, languageOverride); 102 103 info("Make sure that in the second tab language is not overridden"); 104 await assertLanguageIsNotOverridden( 105 browser2, 106 defaultLanguage2, 107 defaultNavigatorLanguage2 108 ); 109 110 info("Reset language override"); 111 browsingContext1.languageOverride = ""; 112 await assertLanguageIsNotOverridden( 113 browser1, 114 defaultLanguage1, 115 defaultNavigatorLanguage1 116 ); 117 118 BrowserTestUtils.removeTab(tab1); 119 BrowserTestUtils.removeTab(tab2); 120 }); 121 122 function getLanguageToOverride(defaultLanguage) { 123 return languages.find(lang => lang !== defaultLanguage); 124 } 125 126 function getSecondLanguageToOverride(defaultLanguage, secondLanguage) { 127 return languages.find( 128 lang => lang !== defaultLanguage && lang !== secondLanguage 129 ); 130 } 131 132 async function getIntlLanguage(browser) { 133 return SpecialPowers.spawn(browser, [], () => { 134 return content.eval(`Intl.DateTimeFormat().resolvedOptions().locale`); 135 }); 136 } 137 138 async function getNavigatorLanguage(browser) { 139 return SpecialPowers.spawn(browser, [], () => { 140 return content.eval(`window.navigator.language`); 141 }); 142 } 143 144 async function getNavigatorLanguages(browser) { 145 return SpecialPowers.spawn(browser, [], () => { 146 return content.eval(`window.navigator.languages`); 147 }); 148 } 149 150 async function assertLanguageOverridden(browser, languageOverride) { 151 is( 152 await getIntlLanguage(browser), 153 languageOverride, 154 "new Intl.DateTimeFormat().resolvedOptions().locale is overridden" 155 ); 156 157 is( 158 await getNavigatorLanguage(browser), 159 languageOverride, 160 "navigator.language is overridden" 161 ); 162 163 const navigatorLanguages = await getNavigatorLanguages(browser); 164 is( 165 navigatorLanguages.includes(languageOverride), 166 true, 167 "navigator.languages is overridden" 168 ); 169 } 170 171 async function assertLanguageIsNotOverridden( 172 browser, 173 defaultLanguage, 174 defaultNavigatorLanguage 175 ) { 176 is( 177 await getIntlLanguage(browser), 178 defaultLanguage, 179 "new Intl.DateTimeFormat().resolvedOptions().locale is not overridden" 180 ); 181 182 is( 183 await getNavigatorLanguage(browser), 184 defaultNavigatorLanguage, 185 "navigator.language is not overridden" 186 ); 187 188 const navigatorLanguages = await getNavigatorLanguages(browser); 189 is( 190 navigatorLanguages.includes(defaultNavigatorLanguage), 191 true, 192 "navigator.languages is not overridden" 193 ); 194 }