tor-browser

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

browser_timezone_override.js (7310B)


      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 timezones = [
     10  {
     11    timezoneId: "Europe/London",
     12    dateString: "Mon Sep 09 1974 12:25:15 GMT+0100 (British Summer Time)",
     13  },
     14  {
     15    timezoneId: "America/New_York",
     16    dateString: "Mon Sep 09 1974 07:25:15 GMT-0400 (Eastern Daylight Time)",
     17  },
     18  {
     19    timezoneId: "Pacific/Auckland",
     20    dateString: "Mon Sep 09 1974 23:25:15 GMT+1200 (New Zealand Standard Time)",
     21  },
     22 ];
     23 
     24 const TEST_TIMESTAMP = 147957915498;
     25 
     26 add_task(async function test_set_timezone_override() {
     27  const tab = BrowserTestUtils.addTab(gBrowser, PAGE_URL);
     28  const browser = gBrowser.getBrowserForTab(tab);
     29 
     30  await BrowserTestUtils.browserLoaded(browser);
     31 
     32  info("Get default timezone");
     33  const defaultTimezone = await getIntlTimezone(browser);
     34  const defaultDateString = await getDateString(browser);
     35 
     36  const timezoneOverride = getTimezoneToOverride(defaultTimezone);
     37 
     38  info("Set timezone override");
     39  browser.browsingContext.timezoneOverride = timezoneOverride;
     40 
     41  await assertTimezoneOverridden(browser, timezoneOverride);
     42 
     43  const secondTimezoneOverride = getSecondTimezoneToOverride(defaultTimezone);
     44 
     45  info("Set another timezone override again");
     46  browser.browsingContext.timezoneOverride = secondTimezoneOverride;
     47 
     48  await assertTimezoneOverridden(browser, secondTimezoneOverride);
     49 
     50  info("Reset language override");
     51  browser.browsingContext.timezoneOverride = "";
     52  await assertTimezoneIsNotOverridden(
     53    browser,
     54    defaultTimezone,
     55    defaultDateString
     56  );
     57 
     58  BrowserTestUtils.removeTab(tab);
     59 });
     60 
     61 add_task(async function test_set_timezone_override_and_navigate() {
     62  const tab = BrowserTestUtils.addTab(gBrowser, PAGE_URL);
     63  const browser = gBrowser.getBrowserForTab(tab);
     64 
     65  await BrowserTestUtils.browserLoaded(browser);
     66 
     67  info("Get default timezone");
     68  const defaultTimezone = await getIntlTimezone(browser);
     69  const timezoneOverride = getTimezoneToOverride(defaultTimezone);
     70 
     71  info("Set timezone override");
     72  browser.browsingContext.timezoneOverride = timezoneOverride;
     73 
     74  await assertTimezoneOverridden(browser, timezoneOverride);
     75 
     76  info("Navigate browsing context");
     77  const url = "https://example.com/chrome/dom/base/test/dummy.html";
     78  const loaded = BrowserTestUtils.browserLoaded(browser, false, url, false);
     79  BrowserTestUtils.startLoadingURIString(browser, url);
     80  await loaded;
     81  await assertTimezoneOverridden(browser, timezoneOverride);
     82 
     83  BrowserTestUtils.removeTab(tab);
     84 });
     85 
     86 add_task(async function test_set_timezone_override_in_different_contexts() {
     87  const tab1 = BrowserTestUtils.addTab(gBrowser, PAGE_URL);
     88  const browser1 = gBrowser.getBrowserForTab(tab1);
     89 
     90  await BrowserTestUtils.browserLoaded(browser1);
     91 
     92  const tab2 = BrowserTestUtils.addTab(gBrowser, PAGE_URL);
     93  const browser2 = gBrowser.getBrowserForTab(tab2);
     94 
     95  await BrowserTestUtils.browserLoaded(browser2);
     96 
     97  info("Get default timezone in the first tab");
     98  const defaultTimezone = await getIntlTimezone(browser1);
     99  const defaultDateString = await getDateString(browser1);
    100 
    101  const timezoneOverride = getTimezoneToOverride(defaultTimezone);
    102 
    103  info("Set timezone override to the first tab");
    104  browser1.browsingContext.timezoneOverride = timezoneOverride;
    105 
    106  await assertTimezoneOverridden(browser1, timezoneOverride);
    107 
    108  info("Make sure that in the second tab timezone is not overridden");
    109  await assertTimezoneIsNotOverridden(
    110    browser2,
    111    defaultTimezone,
    112    defaultDateString
    113  );
    114 
    115  info("Reset timezone override");
    116  browser1.browsingContext.timezoneOverride = "";
    117  await assertTimezoneIsNotOverridden(
    118    browser1,
    119    defaultTimezone,
    120    defaultDateString
    121  );
    122 
    123  BrowserTestUtils.removeTab(tab1);
    124  BrowserTestUtils.removeTab(tab2);
    125 });
    126 
    127 add_task(async function test_set_custom_offset_as_timezone_override() {
    128  const tab = BrowserTestUtils.addTab(gBrowser, PAGE_URL);
    129  const browser = gBrowser.getBrowserForTab(tab);
    130 
    131  await BrowserTestUtils.browserLoaded(browser);
    132 
    133  info("Get default timezone");
    134  const defaultTimezone = await getIntlTimezone(browser);
    135  const defaultDateString = await getDateString(browser);
    136 
    137  const timezoneOverride = "GMT+05:00";
    138 
    139  info("Set timezone override");
    140  browser.browsingContext.timezoneOverride = timezoneOverride;
    141 
    142  const customTimezoneId = "Etc/GMT-5";
    143  is(
    144    await getDateString(browser),
    145    `Mon Sep 09 1974 16:25:15 GMT+0500 (${timezoneOverride})`,
    146    `new Date(${TEST_TIMESTAMP}).toString() is overridden`
    147  );
    148  is(
    149    await getIntlTimezone(browser),
    150    customTimezoneId,
    151    "new Intl.DateTimeFormat().resolvedOptions().timezone is overridden"
    152  );
    153  is(
    154    await getTemporalTimezoneId(browser),
    155    customTimezoneId,
    156    "Temporal.Now.timezoneId is overridden"
    157  );
    158 
    159  info("Reset language override");
    160  browser.browsingContext.timezoneOverride = "";
    161  await assertTimezoneIsNotOverridden(
    162    browser,
    163    defaultTimezone,
    164    defaultDateString
    165  );
    166 
    167  BrowserTestUtils.removeTab(tab);
    168 });
    169 
    170 async function assertTimezoneOverridden(browser, timezoneOverride) {
    171  const timezoneObject = findTimezoneObject(timezoneOverride);
    172  is(
    173    await getDateString(browser),
    174    timezoneObject.dateString,
    175    `new Date(${TEST_TIMESTAMP}).toString() is overridden`
    176  );
    177  is(
    178    await getIntlTimezone(browser),
    179    timezoneOverride,
    180    "new Intl.DateTimeFormat().resolvedOptions().timeZone is overridden"
    181  );
    182  is(
    183    await getTemporalTimezoneId(browser),
    184    timezoneOverride,
    185    "Temporal.Now.timezoneId is overridden"
    186  );
    187 }
    188 
    189 async function assertTimezoneIsNotOverridden(
    190  browser,
    191  defaultTimezone,
    192  defaultDateString
    193 ) {
    194  is(
    195    await getIntlTimezone(browser),
    196    defaultTimezone,
    197    "new Intl.DateTimeFormat().resolvedOptions().timeZone is not overridden"
    198  );
    199  is(
    200    await getTemporalTimezoneId(browser),
    201    defaultTimezone,
    202    "Temporal.Now.timezoneId is not overridden"
    203  );
    204  is(
    205    await getDateString(browser),
    206    defaultDateString,
    207    `new Date(${TEST_TIMESTAMP}).toString() is not overridden`
    208  );
    209 }
    210 
    211 async function getDateString(browser) {
    212  return SpecialPowers.spawn(browser, [TEST_TIMESTAMP], testTimestamp => {
    213    return content.eval(`new Date(${testTimestamp}).toString()`);
    214  });
    215 }
    216 
    217 async function getIntlTimezone(browser) {
    218  return SpecialPowers.spawn(browser, [], () => {
    219    return content.eval(`Intl.DateTimeFormat().resolvedOptions().timeZone`);
    220  });
    221 }
    222 
    223 async function getTemporalTimezoneId(browser) {
    224  return SpecialPowers.spawn(browser, [], () => {
    225    return content.eval(`Temporal.Now.timeZoneId()`);
    226  });
    227 }
    228 
    229 function getTimezoneToOverride(defaultTimezone) {
    230  const timezoneObject = timezones.find(
    231    timezone => timezone.timezoneId !== defaultTimezone
    232  );
    233  return timezoneObject.timezoneId;
    234 }
    235 
    236 function getSecondTimezoneToOverride(defaultTimezone, testTimezone) {
    237  const timezoneObject = timezones.find(
    238    timezone =>
    239      timezone.timezoneId !== defaultTimezone &&
    240      timezone.timezoneId !== testTimezone
    241  );
    242  return timezoneObject.timezoneId;
    243 }
    244 
    245 function findTimezoneObject(timezoneId) {
    246  return timezones.find(timezone => timezone.timezoneId === timezoneId);
    247 }