tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }