| 
Commits:
4 changed files:
Changes:
browser/components/resistfingerprinting/test/browser/browser_timezone.js
 
| 1 | 1 |  /**
 |  
| 2 | 2 |   * Bug 1330890 - A test case for verifying Date() object of _javascript_ will use
 |  
| 3 |  | - *               UTC timezone after fingerprinting resistance is enabled.
 |  
|  | 3 | + *               Atlantic/Reykjavik timezone (GMT and "real" equivalent to UTC)
 |  
|  | 4 | + *               after fingerprinting resistance is enabled.
 |  
| 4 | 5 |   */
 |  
| 5 | 6 |  
 |  
| 6 | 7 |  async function verifySpoofed() {
 |  
| ... | ... | @@ -16,13 +17,15 @@ async function verifySpoofed() { |  
| 16 | 17 |    // Running in content:
 |  
| 17 | 18 |    function test() {
 |  
| 18 | 19 |      let date = new Date();
 |  
|  | 20 | +    const TZ_NAME = "Atlantic/Reykjavik";
 |  
|  | 21 | +    const TZ_SUFFIX = "(Greenwich Mean Time)";
 |  
| 19 | 22 |      ok(
 |  
| 20 |  | -      date.toString().endsWith("(Coordinated Universal Time)"),
 |  
| 21 |  | -      "The date toString() is in UTC timezone."
 |  
|  | 23 | +      date.toString().endsWith(TZ_SUFFIX),
 |  
|  | 24 | +      `The date toString() is in ${TZ_NAME} timezone.`
 |  
| 22 | 25 |      );
 |  
| 23 | 26 |      ok(
 |  
| 24 |  | -      date.toTimeString().endsWith("(Coordinated Universal Time)"),
 |  
| 25 |  | -      "The date toTimeString() is in UTC timezone."
 |  
|  | 27 | +      date.toTimeString().endsWith(TZ_SUFFIX),
 |  
|  | 28 | +      `The date toTimeString() is in ${TZ_NAME} timezone.`
 |  
| 26 | 29 |      );
 |  
| 27 | 30 |      let dateTimeFormat = Intl.DateTimeFormat("en-US", {
 |  
| 28 | 31 |        dateStyle: "full",
 |  
| ... | ... | @@ -30,12 +33,12 @@ async function verifySpoofed() { |  
| 30 | 33 |      });
 |  
| 31 | 34 |      is(
 |  
| 32 | 35 |        dateTimeFormat.resolvedOptions().timeZone,
 |  
| 33 |  | -      "UTC",
 |  
| 34 |  | -      "The Intl.DateTimeFormat is in UTC timezone."
 |  
|  | 36 | +      TZ_NAME,
 |  
|  | 37 | +      `The Intl.DateTimeFormat is in ${TZ_NAME} timezone.`
 |  
| 35 | 38 |      );
 |  
| 36 | 39 |      ok(
 |  
| 37 |  | -      dateTimeFormat.format(date).endsWith("Coordinated Universal Time"),
 |  
| 38 |  | -      "The Intl.DateTimeFormat is formatting with the UTC timezone."
 |  
|  | 40 | +      dateTimeFormat.format(date).endsWith(TZ_SUFFIX),
 |  
|  | 41 | +      `The Intl.DateTimeFormat is formatting with the ${TZ_NAME} timezone.`
 |  
| 39 | 42 |      );
 |  
| 40 | 43 |      is(
 |  
| 41 | 44 |        date.getFullYear(),
 |  js/src/jit-test/tests/resist-fingerprinting/timezone.js
 
 
| ... | ... | @@ -2,7 +2,10 @@ |  
| 2 | 2 |  
 |  
| 3 | 3 |  let tzRE = /\(([^\)]+)\)/;
 |  
| 4 | 4 |  
 |  
| 5 |  | -// Make sure we aren't already running with UTC
 |  
|  | 5 | +const SPOOFED_TZ_NAME = "Atlantic/Reykjavik";
 |  
|  | 6 | +const SPOOFED_TZ_GENERIC = "Greenwich Mean Time";
 |  
|  | 7 | +
 |  
|  | 8 | +// Make sure we aren't already running with spoofed TZ
 |  
| 6 | 9 |  let original = new Date(0);
 |  
| 7 | 10 |  assertEq(tzRE.exec(original.toString())[1], "Pacific Standard Time");
 |  
| 8 | 11 |  
 |  
| ... | ... | @@ -16,8 +19,8 @@ assertEq(originalDT.resolvedOptions().timeZone, "PST8PDT"); |  
| 16 | 19 |  let global = newGlobal({shouldResistFingerprinting: true});
 |  
| 17 | 20 |  
 |  
| 18 | 21 |  let date = new global.Date();
 |  
| 19 |  | -assertEq(tzRE.exec(date.toString())[1], "Coordinated Universal Time");
 |  
| 20 |  | -assertEq(tzRE.exec(date.toTimeString())[1], "Coordinated Universal Time");
 |  
|  | 22 | +assertEq(tzRE.exec(date.toString())[1], SPOOFED_TZ_GENERIC);
 |  
|  | 23 | +assertEq(tzRE.exec(date.toTimeString())[1], SPOOFED_TZ_GENERIC);
 |  
| 21 | 24 |  assertEq(date.getFullYear(), date.getUTCFullYear());
 |  
| 22 | 25 |  assertEq(date.getMonth(), date.getUTCMonth());
 |  
| 23 | 26 |  assertEq(date.getDate(), date.getUTCDate());
 |  
| ... | ... | @@ -29,5 +32,5 @@ let dt = global.Intl.DateTimeFormat("en-US", { |  
| 29 | 32 |    dateStyle: "full",
 |  
| 30 | 33 |    timeStyle: "full",
 |  
| 31 | 34 |  });
 |  
| 32 |  | -assertEq(dt.format(date).endsWith("Coordinated Universal Time"), true);
 |  
| 33 |  | -assertEq(dt.resolvedOptions().timeZone, "UTC"); |  
|  | 35 | +assertEq(dt.format(date).endsWith(SPOOFED_TZ_GENERIC), true);
 |  
|  | 36 | +assertEq(dt.resolvedOptions().timeZone, SPOOFED_TZ_NAME); |  js/src/vm/DateTime.cpp
 
 
| ... | ... | @@ -484,10 +484,11 @@ bool js::DateTimeInfo::internalTimeZoneDisplayName(char16_t* buf, size_t buflen, |  
| 484 | 484 |  
 |  
| 485 | 485 |  mozilla::intl::TimeZone* js::DateTimeInfo::timeZone() {
 |  
| 486 | 486 |    if (!timeZone_) {
 |  
| 487 |  | -    // For resist finger printing mode we always use the UTC time zone.
 |  
|  | 487 | +    // For resist finger printing mode we always use the Atlantic/Reykjavik time zone
 |  
|  | 488 | +    // as a "real world" UTC equivalent.
 |  
| 488 | 489 |      mozilla::Maybe<mozilla::Span<const char16_t>> timeZoneOverride;
 |  
| 489 | 490 |      if (shouldResistFingerprinting_) {
 |  
| 490 |  | -      timeZoneOverride = mozilla::Some(mozilla::MakeStringSpan(u"UTC"));
 |  
|  | 491 | +      timeZoneOverride = mozilla::Some(mozilla::MakeStringSpan(u"Atlantic/Reykjavik"));
 |  
| 491 | 492 |      }
 |  
| 492 | 493 |  
 |  
| 493 | 494 |      auto timeZone = mozilla::intl::TimeZone::TryCreate(timeZoneOverride);
 |  toolkit/components/resistfingerprinting/nsRFPService.cpp
 
 
| ... | ... | @@ -227,7 +227,7 @@ void nsRFPService::UpdateRFPPref() { |  
| 227 | 227 |    }
 |  
| 228 | 228 |  
 |  
| 229 | 229 |    if (resistFingerprinting) {
 |  
| 230 |  | -    PR_SetEnv("TZ=UTC");
 |  
|  | 230 | +    PR_SetEnv("TZ=Atlantic/Reykjavik");
 |  
| 231 | 231 |    } else if (sInitialized) {
 |  
| 232 | 232 |      // We will not touch the TZ value if 'privacy.resistFingerprinting' is false
 |  
| 233 | 233 |      // during the time of initialization.
 |  
 |