Source code

Revision control

Copy as Markdown

Other Tools

/* 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 timezones = [
{
timezoneId: "Europe/London",
dateString: "Mon Sep 09 1974 12:25:15 GMT+0100 (British Summer Time)",
},
{
timezoneId: "America/New_York",
dateString: "Mon Sep 09 1974 07:25:15 GMT-0400 (Eastern Daylight Time)",
},
{
timezoneId: "Pacific/Auckland",
dateString: "Mon Sep 09 1974 23:25:15 GMT+1200 (New Zealand Standard Time)",
},
];
const TEST_TIMESTAMP = 147957915498;
add_task(async function test_set_timezone_override() {
const tab = BrowserTestUtils.addTab(gBrowser, PAGE_URL);
const browser = gBrowser.getBrowserForTab(tab);
await BrowserTestUtils.browserLoaded(browser);
info("Get default timezone");
const defaultTimezone = await getIntlTimezone(browser);
const defaultDateString = await getDateString(browser);
const timezoneOverride = getTimezoneToOverride(defaultTimezone);
info("Set timezone override");
browser.browsingContext.timezoneOverride = timezoneOverride;
await assertTimezoneOverridden(browser, timezoneOverride);
const secondTimezoneOverride = getSecondTimezoneToOverride(defaultTimezone);
info("Set another timezone override again");
browser.browsingContext.timezoneOverride = secondTimezoneOverride;
await assertTimezoneOverridden(browser, secondTimezoneOverride);
info("Reset language override");
browser.browsingContext.timezoneOverride = "";
await assertTimezoneIsNotOverridden(
browser,
defaultTimezone,
defaultDateString
);
BrowserTestUtils.removeTab(tab);
});
add_task(async function test_set_timezone_override_and_navigate() {
const tab = BrowserTestUtils.addTab(gBrowser, PAGE_URL);
const browser = gBrowser.getBrowserForTab(tab);
await BrowserTestUtils.browserLoaded(browser);
info("Get default timezone");
const defaultTimezone = await getIntlTimezone(browser);
const timezoneOverride = getTimezoneToOverride(defaultTimezone);
info("Set timezone override");
browser.browsingContext.timezoneOverride = timezoneOverride;
await assertTimezoneOverridden(browser, timezoneOverride);
info("Navigate browsing context");
const loaded = BrowserTestUtils.browserLoaded(browser, false, url, false);
BrowserTestUtils.startLoadingURIString(browser, url);
await loaded;
await assertTimezoneOverridden(browser, timezoneOverride);
BrowserTestUtils.removeTab(tab);
});
add_task(async function test_set_timezone_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 timezone in the first tab");
const defaultTimezone = await getIntlTimezone(browser1);
const defaultDateString = await getDateString(browser1);
const timezoneOverride = getTimezoneToOverride(defaultTimezone);
info("Set timezone override to the first tab");
browser1.browsingContext.timezoneOverride = timezoneOverride;
await assertTimezoneOverridden(browser1, timezoneOverride);
info("Make sure that in the second tab timezone is not overridden");
await assertTimezoneIsNotOverridden(
browser2,
defaultTimezone,
defaultDateString
);
info("Reset timezone override");
browser1.browsingContext.timezoneOverride = "";
await assertTimezoneIsNotOverridden(
browser1,
defaultTimezone,
defaultDateString
);
BrowserTestUtils.removeTab(tab1);
BrowserTestUtils.removeTab(tab2);
});
add_task(async function test_set_custom_offset_as_timezone_override() {
const tab = BrowserTestUtils.addTab(gBrowser, PAGE_URL);
const browser = gBrowser.getBrowserForTab(tab);
await BrowserTestUtils.browserLoaded(browser);
info("Get default timezone");
const defaultTimezone = await getIntlTimezone(browser);
const defaultDateString = await getDateString(browser);
const timezoneOverride = "GMT+05:00";
info("Set timezone override");
browser.browsingContext.timezoneOverride = timezoneOverride;
const customTimezoneId = "Etc/GMT-5";
is(
await getDateString(browser),
`Mon Sep 09 1974 16:25:15 GMT+0500 (${timezoneOverride})`,
`new Date(${TEST_TIMESTAMP}).toString() is overridden`
);
is(
await getIntlTimezone(browser),
customTimezoneId,
"new Intl.DateTimeFormat().resolvedOptions().timezone is overridden"
);
is(
await getTemporalTimezoneId(browser),
customTimezoneId,
"Temporal.Now.timezoneId is overridden"
);
info("Reset language override");
browser.browsingContext.timezoneOverride = "";
await assertTimezoneIsNotOverridden(
browser,
defaultTimezone,
defaultDateString
);
BrowserTestUtils.removeTab(tab);
});
async function assertTimezoneOverridden(browser, timezoneOverride) {
const timezoneObject = findTimezoneObject(timezoneOverride);
is(
await getDateString(browser),
timezoneObject.dateString,
`new Date(${TEST_TIMESTAMP}).toString() is overridden`
);
is(
await getIntlTimezone(browser),
timezoneOverride,
"new Intl.DateTimeFormat().resolvedOptions().timeZone is overridden"
);
is(
await getTemporalTimezoneId(browser),
timezoneOverride,
"Temporal.Now.timezoneId is overridden"
);
}
async function assertTimezoneIsNotOverridden(
browser,
defaultTimezone,
defaultDateString
) {
is(
await getIntlTimezone(browser),
defaultTimezone,
"new Intl.DateTimeFormat().resolvedOptions().timeZone is not overridden"
);
is(
await getTemporalTimezoneId(browser),
defaultTimezone,
"Temporal.Now.timezoneId is not overridden"
);
is(
await getDateString(browser),
defaultDateString,
`new Date(${TEST_TIMESTAMP}).toString() is not overridden`
);
}
async function getDateString(browser) {
return SpecialPowers.spawn(browser, [TEST_TIMESTAMP], testTimestamp => {
return content.eval(`new Date(${testTimestamp}).toString()`);
});
}
async function getIntlTimezone(browser) {
return SpecialPowers.spawn(browser, [], () => {
return content.eval(`Intl.DateTimeFormat().resolvedOptions().timeZone`);
});
}
async function getTemporalTimezoneId(browser) {
return SpecialPowers.spawn(browser, [], () => {
return content.eval(`Temporal.Now.timeZoneId()`);
});
}
function getTimezoneToOverride(defaultTimezone) {
const timezoneObject = timezones.find(
timezone => timezone.timezoneId !== defaultTimezone
);
return timezoneObject.timezoneId;
}
function getSecondTimezoneToOverride(defaultTimezone, testTimezone) {
const timezoneObject = timezones.find(
timezone =>
timezone.timezoneId !== defaultTimezone &&
timezone.timezoneId !== testTimezone
);
return timezoneObject.timezoneId;
}
function findTimezoneObject(timezoneId) {
return timezones.find(timezone => timezone.timezoneId === timezoneId);
}