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 }