Skip to content

Commit e0e0943

Browse files
committed
Bug 1930466 - Part 1: Use zone.tab to guide time zone canonicalisation. r=dminor
Implement the changes from <tc39/ecma402#877> to reduce differences in time zone canonicalisation when compared to V8 and JSC (which both use CLDR time zone data instead of IANA time zone data). Implementing the `AvailableNamedTimeZoneIdentifiers` spec operation requires to link time zone identifiers to region codes. When the time zone is listed in the "zone.tab" file, we can get the region code from "zone.tab". In all other cases we need to manually map the time zone to a matching region, because CLDR doesn't have "public" data for this [1]. This is implemented using the new file "intl/TimeZoneMapping.yaml". ICU 74 added `ucal_getIanaTimeZoneID` to get the canonical IANA time zone id. Internally `ucal_getIanaTimeZoneID` first calls `ucal_getCanonicalTimeZoneID` and then loads a resource bundle to check if there are any time zone ids which need to be replaced with other ids for compatibility with IANA data. Unfortunately the resource bundle is not cached, so calling `ucal_getIanaTimeZoneID` instead of `ucal_getIanaTimeZoneID` adds a considerable performance overhead. To avoid any performance regressions, we keep our own time zone rewriting code for the time being. Using our own code also means we don't have to add a workaround for this CLDR bug: <https://unicode-org.atlassian.net/browse/CLDR-16439>. Also remove "Factory" from the list of supported time zone identifiers, because supporting it was always a bit questionable and latest V8 also doesn't support it anymore, so we shouldn't run into web-compat issues. Remove the old generated tests and add "timeZone_links.js" to ensure time zone links are correctly resolved. [1] Neither of these two files look like "public" data to me: - https://github.com/unicode-org/cldr/blob/main/tools/cldr-code/src/main/resources/org/unicode/cldr/util/data/TZID.txt - https://github.com/unicode-org/cldr/blob/main/tools/cldr-code/src/main/resources/org/unicode/cldr/icu/idList.txt Differential Revision: https://phabricator.services.mozilla.com/D228584
1 parent d2334e2 commit e0e0943

File tree

11 files changed

+445
-604
lines changed

11 files changed

+445
-604
lines changed

browser/components/resistfingerprinting/test/browser/browser_timezone.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
async function verifySpoofed() {
88
ok(true, "Running on " + content.location.origin);
99

10-
SpecialPowers.Cu.getJSTestingFunctions().setTimeZone("PST8PDT");
10+
SpecialPowers.Cu.getJSTestingFunctions().setTimeZone("America/Los_Angeles");
1111
is(
1212
Intl.DateTimeFormat("en-US").resolvedOptions().timeZone,
13-
"PST8PDT",
13+
"America/Los_Angeles",
1414
"Default time zone should have changed"
1515
);
1616

@@ -113,10 +113,10 @@ add_task(async function test_timezone_exempt() {
113113
});
114114

115115
await SpecialPowers.spawn(tab.linkedBrowser, [], async function () {
116-
SpecialPowers.Cu.getJSTestingFunctions().setTimeZone("PST8PDT");
116+
SpecialPowers.Cu.getJSTestingFunctions().setTimeZone("America/Los_Angeles");
117117
is(
118118
Intl.DateTimeFormat("en-US").resolvedOptions().timeZone,
119-
"PST8PDT",
119+
"America/Los_Angeles",
120120
"Default time zone should have changed"
121121
);
122122

@@ -129,7 +129,7 @@ add_task(async function test_timezone_exempt() {
129129

130130
is(
131131
Intl.DateTimeFormat("en-US").resolvedOptions().timeZone,
132-
"PST8PDT",
132+
"America/Los_Angeles",
133133
"Content should use default time zone"
134134
);
135135
}
@@ -169,10 +169,10 @@ add_task(async function test_timezone_exempt_wrong_domain() {
169169
});
170170

171171
add_task(async function test_timezone_exmpt_browser() {
172-
SpecialPowers.Cu.getJSTestingFunctions().setTimeZone("PST8PDT");
172+
SpecialPowers.Cu.getJSTestingFunctions().setTimeZone("America/Los_Angeles");
173173
is(
174174
Intl.DateTimeFormat("en-US").resolvedOptions().timeZone,
175-
"PST8PDT",
175+
"America/Los_Angeles",
176176
"Default time zone should have changed"
177177
);
178178

@@ -182,7 +182,7 @@ add_task(async function test_timezone_exmpt_browser() {
182182

183183
is(
184184
Intl.DateTimeFormat("en-US").resolvedOptions().timeZone,
185-
"PST8PDT",
185+
"America/Los_Angeles",
186186
"Timezone in chrome should be unaffected by resistFingerprinting"
187187
);
188188

@@ -196,7 +196,7 @@ add_task(async function test_timezone_exmpt_browser() {
196196

197197
is(
198198
newWindow.Intl.DateTimeFormat("en-US").resolvedOptions().timeZone,
199-
"PST8PDT",
199+
"America/Los_Angeles",
200200
"Timezone in new chrome window should be unaffected by resistFingerprinting"
201201
);
202202

js/src/builtin/intl/TimeZoneDataGenerated.h

Lines changed: 29 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -10,58 +10,26 @@ namespace timezone {
1010
// Format:
1111
// "ZoneName" // ICU-Name [time zone file]
1212
const char* const ianaZonesTreatedAsLinksByICU[] = {
13-
"Africa/Asmara", // Africa/Asmera [backzone]
14-
"Africa/Timbuktu", // Africa/Bamako [backzone]
13+
"Africa/Asmara", // Africa/Asmera [backward]
1514
"America/Argentina/Buenos_Aires", // America/Buenos_Aires [southamerica]
1615
"America/Argentina/Catamarca", // America/Catamarca [southamerica]
17-
"America/Argentina/ComodRivadavia", // America/Catamarca [backzone]
1816
"America/Argentina/Cordoba", // America/Cordoba [southamerica]
1917
"America/Argentina/Jujuy", // America/Jujuy [southamerica]
2018
"America/Argentina/Mendoza", // America/Mendoza [southamerica]
21-
"America/Atikokan", // America/Coral_Harbour [backzone]
22-
"America/Ensenada", // America/Tijuana [backzone]
19+
"America/Atikokan", // America/Coral_Harbour [backward]
2320
"America/Indiana/Indianapolis", // America/Indianapolis [northamerica]
2421
"America/Kentucky/Louisville", // America/Louisville [northamerica]
25-
"America/Montreal", // America/Toronto [backzone]
26-
"America/Nipigon", // America/Toronto [backzone]
2722
"America/Nuuk", // America/Godthab [europe]
28-
"America/Pangnirtung", // America/Iqaluit [backzone]
29-
"America/Rainy_River", // America/Winnipeg [backzone]
30-
"America/Rosario", // America/Cordoba [backzone]
31-
"America/Thunder_Bay", // America/Toronto [backzone]
32-
"America/Yellowknife", // America/Edmonton [backzone]
33-
"Asia/Chongqing", // Asia/Shanghai [backzone]
34-
"Asia/Harbin", // Asia/Shanghai [backzone]
3523
"Asia/Ho_Chi_Minh", // Asia/Saigon [asia]
36-
"Asia/Kashgar", // Asia/Urumqi [backzone]
3724
"Asia/Kathmandu", // Asia/Katmandu [asia]
3825
"Asia/Kolkata", // Asia/Calcutta [asia]
39-
"Asia/Tel_Aviv", // Asia/Jerusalem [backzone]
4026
"Asia/Yangon", // Asia/Rangoon [asia]
4127
"Atlantic/Faroe", // Atlantic/Faeroe [europe]
42-
"Atlantic/Jan_Mayen", // Arctic/Longyearbyen [backzone]
43-
"Australia/Currie", // Australia/Hobart [backzone]
44-
"CET", // Europe/Brussels [backzone]
45-
"CST6CDT", // America/Chicago [backzone]
46-
"EET", // Europe/Athens [backzone]
47-
"EST", // America/Panama [backzone]
48-
"EST5EDT", // America/New_York [backzone]
49-
"Europe/Belfast", // Europe/London [backzone]
5028
"Europe/Kyiv", // Europe/Kiev [europe]
51-
"Europe/Tiraspol", // Europe/Chisinau [backzone]
52-
"Europe/Uzhgorod", // Europe/Kiev [backzone]
53-
"Europe/Zaporozhye", // Europe/Kiev [backzone]
54-
"Factory", // Etc/Unknown [factory]
55-
"HST", // Pacific/Honolulu [backzone]
56-
"MET", // Europe/Brussels [backzone]
57-
"MST", // America/Phoenix [backzone]
58-
"MST7MDT", // America/Denver [backzone]
59-
"PST8PDT", // America/Los_Angeles [backzone]
60-
"Pacific/Chuuk", // Pacific/Truk [backzone]
61-
"Pacific/Johnston", // Pacific/Honolulu [backzone]
29+
"Pacific/Chuuk", // Pacific/Truk [backward]
6230
"Pacific/Kanton", // Pacific/Enderbury [australasia]
63-
"Pacific/Pohnpei", // Pacific/Ponape [backzone]
64-
"WET", // Europe/Lisbon [backzone]
31+
"Pacific/Pohnpei", // Pacific/Ponape [backward]
32+
"UTC", // Etc/UTC [backward]
6533
};
6634

6735
// Format:
@@ -74,38 +42,49 @@ struct LinkAndTarget
7442

7543
const LinkAndTarget ianaLinksCanonicalizedDifferentlyByICU[] = {
7644
{ "Africa/Asmera", "Africa/Asmara" }, // Africa/Asmera [backward]
45+
{ "America/Argentina/ComodRivadavia", "America/Argentina/Catamarca" }, // America/Catamarca [backward]
7746
{ "America/Buenos_Aires", "America/Argentina/Buenos_Aires" }, // America/Buenos_Aires [backward]
7847
{ "America/Catamarca", "America/Argentina/Catamarca" }, // America/Catamarca [backward]
48+
{ "America/Coral_Harbour", "America/Atikokan" }, // America/Coral_Harbour [backward]
7949
{ "America/Cordoba", "America/Argentina/Cordoba" }, // America/Cordoba [backward]
8050
{ "America/Fort_Wayne", "America/Indiana/Indianapolis" }, // America/Indianapolis [backward]
8151
{ "America/Godthab", "America/Nuuk" }, // America/Godthab [backward]
8252
{ "America/Indianapolis", "America/Indiana/Indianapolis" }, // America/Indianapolis [backward]
8353
{ "America/Jujuy", "America/Argentina/Jujuy" }, // America/Jujuy [backward]
84-
{ "America/Kralendijk", "America/Curacao" }, // America/Kralendijk [backward]
8554
{ "America/Louisville", "America/Kentucky/Louisville" }, // America/Louisville [backward]
86-
{ "America/Lower_Princes", "America/Curacao" }, // America/Lower_Princes [backward]
87-
{ "America/Marigot", "America/Port_of_Spain" }, // America/Marigot [backward]
8855
{ "America/Mendoza", "America/Argentina/Mendoza" }, // America/Mendoza [backward]
89-
{ "America/St_Barthelemy", "America/Port_of_Spain" }, // America/St_Barthelemy [backward]
56+
{ "America/Rosario", "America/Argentina/Cordoba" }, // America/Cordoba [backward]
9057
{ "Antarctica/South_Pole", "Antarctica/McMurdo" }, // Pacific/Auckland [backward]
91-
{ "Arctic/Longyearbyen", "Europe/Oslo" }, // Arctic/Longyearbyen [backward]
9258
{ "Asia/Calcutta", "Asia/Kolkata" }, // Asia/Calcutta [backward]
93-
{ "Asia/Chungking", "Asia/Chongqing" }, // Asia/Shanghai [backward]
9459
{ "Asia/Katmandu", "Asia/Kathmandu" }, // Asia/Katmandu [backward]
9560
{ "Asia/Rangoon", "Asia/Yangon" }, // Asia/Rangoon [backward]
9661
{ "Asia/Saigon", "Asia/Ho_Chi_Minh" }, // Asia/Saigon [backward]
9762
{ "Atlantic/Faeroe", "Atlantic/Faroe" }, // Atlantic/Faeroe [backward]
98-
{ "Europe/Bratislava", "Europe/Prague" }, // Europe/Bratislava [backward]
99-
{ "Europe/Busingen", "Europe/Zurich" }, // Europe/Busingen [backward]
63+
{ "Etc/GMT", "UTC" }, // Etc/GMT [etcetera]
64+
{ "Etc/GMT+0", "UTC" }, // Etc/GMT [backward]
65+
{ "Etc/GMT-0", "UTC" }, // Etc/GMT [backward]
66+
{ "Etc/GMT0", "UTC" }, // Etc/GMT [backward]
67+
{ "Etc/Greenwich", "UTC" }, // Etc/GMT [backward]
68+
{ "Etc/UCT", "UTC" }, // Etc/UTC [backward]
69+
{ "Etc/UTC", "UTC" }, // Etc/UTC [etcetera]
70+
{ "Etc/Universal", "UTC" }, // Etc/UTC [backward]
71+
{ "Etc/Zulu", "UTC" }, // Etc/UTC [backward]
10072
{ "Europe/Kiev", "Europe/Kyiv" }, // Europe/Kiev [backward]
101-
{ "Europe/Mariehamn", "Europe/Helsinki" }, // Europe/Mariehamn [backward]
102-
{ "Europe/Podgorica", "Europe/Belgrade" }, // Europe/Podgorica [backward]
103-
{ "Europe/San_Marino", "Europe/Rome" }, // Europe/San_Marino [backward]
104-
{ "Europe/Vatican", "Europe/Rome" }, // Europe/Vatican [backward]
73+
{ "Europe/Uzhgorod", "Europe/Kyiv" }, // Europe/Kiev [backward]
74+
{ "Europe/Zaporozhye", "Europe/Kyiv" }, // Europe/Kiev [backward]
75+
{ "GMT", "UTC" }, // Etc/GMT [etcetera]
76+
{ "GMT+0", "UTC" }, // Etc/GMT [backward]
77+
{ "GMT-0", "UTC" }, // Etc/GMT [backward]
78+
{ "GMT0", "UTC" }, // Etc/GMT [backward]
79+
{ "Greenwich", "UTC" }, // Etc/GMT [backward]
80+
{ "Pacific/Enderbury", "Pacific/Kanton" }, // Pacific/Enderbury [backward]
10581
{ "Pacific/Ponape", "Pacific/Pohnpei" }, // Pacific/Ponape [backward]
10682
{ "Pacific/Truk", "Pacific/Chuuk" }, // Pacific/Truk [backward]
10783
{ "Pacific/Yap", "Pacific/Chuuk" }, // Pacific/Truk [backward]
84+
{ "UCT", "UTC" }, // Etc/UTC [backward]
10885
{ "US/East-Indiana", "America/Indiana/Indianapolis" }, // America/Indianapolis [backward]
86+
{ "Universal", "UTC" }, // Etc/UTC [backward]
87+
{ "Zulu", "UTC" }, // Etc/UTC [backward]
10988
};
11089

11190
// Legacy ICU time zones, these are not valid IANA time zone names. We also
@@ -139,6 +118,7 @@ const char* const legacyICUTimeZones[] = {
139118
"SST",
140119
"US/Pacific-New",
141120
"VST",
121+
"Factory",
142122
"SystemV/AST4",
143123
"SystemV/AST4ADT",
144124
"SystemV/CST6",
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
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+
# Provide mapping from time zone identifiers to region codes for time zones
6+
# which aren't listed in tzdata's zone.tab file.
7+
8+
Africa/Timbuktu: ML
9+
Africa/Asmera: ER
10+
11+
America/Argentina/ComodRivadavia: AR
12+
America/Atka: US
13+
America/Buenos_Aires: AR
14+
America/Catamarca: AR
15+
America/Coral_Harbour: CA
16+
America/Cordoba: AR
17+
America/Ensenada: MX
18+
America/Fort_Wayne: US
19+
America/Godthab: GL
20+
America/Indianapolis: US
21+
America/Jujuy: AR
22+
America/Knox_IN: US
23+
America/Louisville: US
24+
America/Mendoza: AR
25+
America/Montreal: CA
26+
America/Nipigon: CA
27+
America/Pangnirtung: CA
28+
America/Porto_Acre: BR
29+
America/Rainy_River: CA
30+
America/Rosario: AR
31+
America/Santa_Isabel: MX
32+
America/Shiprock: US
33+
America/Thunder_Bay: CA
34+
America/Virgin: VI
35+
America/Yellowknife: CA
36+
37+
Antarctica/South_Pole: AQ
38+
39+
Asia/Choibalsan: MN
40+
Asia/Chongqing: CN
41+
Asia/Harbin: CN
42+
Asia/Kashgar: CN
43+
Asia/Tel_Aviv: IL
44+
Asia/Ashkhabad: TM
45+
Asia/Calcutta: IN
46+
Asia/Chungking: CN
47+
Asia/Dacca: BD
48+
Asia/Istanbul: TR
49+
Asia/Katmandu: NP
50+
Asia/Macao: MO
51+
Asia/Rangoon: MM
52+
Asia/Saigon: VN
53+
Asia/Thimbu: BT
54+
Asia/Ujung_Pandang: ID
55+
Asia/Ulan_Bator: MN
56+
57+
Atlantic/Jan_Mayen: SJ
58+
Atlantic/Faeroe: FO
59+
60+
Australia/ACT: AU
61+
Australia/LHI: AU
62+
Australia/NSW: AU
63+
Australia/Canberra: AU
64+
Australia/Currie: AU
65+
Australia/North: AU
66+
Australia/Queensland: AU
67+
Australia/South: AU
68+
Australia/Tasmania: AU
69+
Australia/Victoria: AU
70+
Australia/West: AU
71+
Australia/Yancowinna: AU
72+
73+
Europe/Belfast: GB
74+
Europe/Tiraspol: MD
75+
Europe/Uzhgorod: UA
76+
Europe/Zaporozhye: UA
77+
Europe/Kiev: UA
78+
Europe/Nicosia: CY
79+
80+
Pacific/Samoa: AS
81+
Pacific/Enderbury: KI
82+
Pacific/Johnston: US
83+
Pacific/Yap: FM
84+
Pacific/Ponape: FM
85+
Pacific/Truk: FM
86+
87+
Brazil/Acre: BR
88+
Brazil/DeNoronha: BR
89+
Brazil/East: BR
90+
Brazil/West: BR
91+
92+
Canada/Atlantic: CA
93+
Canada/Central: CA
94+
Canada/Eastern: CA
95+
Canada/Mountain: CA
96+
Canada/Newfoundland: CA
97+
Canada/Pacific: CA
98+
Canada/Saskatchewan: CA
99+
Canada/Yukon: CA
100+
101+
Chile/Continental: CL
102+
Chile/EasterIsland: CL
103+
104+
Mexico/BajaNorte: MX
105+
Mexico/BajaSur: MX
106+
Mexico/General: MX
107+
108+
US/Alaska: US
109+
US/Aleutian: US
110+
US/Arizona: US
111+
US/Central: US
112+
US/East-Indiana: US
113+
US/Eastern: US
114+
US/Hawaii: US
115+
US/Indiana-Starke: US
116+
US/Michigan: US
117+
US/Mountain: US
118+
US/Pacific: US
119+
US/Samoa: AS
120+
121+
CET: BE
122+
EET: GR
123+
MET: BE
124+
WET: PT
125+
126+
CST6CDT: US
127+
EST5EDT: US
128+
EST: PA
129+
HST: US
130+
MST7MDT: US
131+
MST: US
132+
PST8PDT: US
133+
134+
Cuba: CU
135+
Egypt: EG
136+
Eire: IE
137+
GB: GB
138+
GB-Eire: GB
139+
Hongkong: HK
140+
Iceland: IS
141+
Iran: IR
142+
Israel: IL
143+
Jamaica: JM
144+
Japan: JP
145+
Kwajalein: MH
146+
Libya: LY
147+
NZ: NZ
148+
NZ-CHAT: NZ
149+
Navajo: US
150+
PRC: CN
151+
Poland: PL
152+
Portugal: PT
153+
ROC: TW
154+
ROK: KR
155+
Singapore: SG
156+
Turkey: TR
157+
W-SU: RU

0 commit comments

Comments
 (0)