diff options
Diffstat (limited to 'chromium/v8/src/objects')
-rw-r--r-- | chromium/v8/src/objects/intl-objects.cc | 44 | ||||
-rw-r--r-- | chromium/v8/src/objects/intl-objects.h | 9 | ||||
-rw-r--r-- | chromium/v8/src/objects/js-date-time-format.cc | 35 | ||||
-rw-r--r-- | chromium/v8/src/objects/js-date-time-format.h | 1 | ||||
-rw-r--r-- | chromium/v8/src/objects/js-temporal-objects.cc | 2 |
5 files changed, 55 insertions, 36 deletions
diff --git a/chromium/v8/src/objects/intl-objects.cc b/chromium/v8/src/objects/intl-objects.cc index 4623dc19c3e..cb033847199 100644 --- a/chromium/v8/src/objects/intl-objects.cc +++ b/chromium/v8/src/objects/intl-objects.cc @@ -2822,37 +2822,21 @@ bool IsUnicodeStringValidTimeZoneName(const icu::UnicodeString& id) { } } // namespace -Handle<String> Intl::CanonicalizeTimeZoneID(Isolate* isolate, - const icu::UnicodeString& id) { +MaybeHandle<String> Intl::CanonicalizeTimeZoneName(Isolate* isolate, + Handle<String> identifier) { UErrorCode status = U_ZERO_ERROR; + std::string time_zone = + JSDateTimeFormat::CanonicalizeTimeZoneID(identifier->ToCString().get()); + icu::UnicodeString time_zone_ustring = + icu::UnicodeString(time_zone.c_str(), -1, US_INV); icu::UnicodeString canonical; - icu::TimeZone::getCanonicalID(id, canonical, status); + icu::TimeZone::getCanonicalID(time_zone_ustring, canonical, status); CHECK(U_SUCCESS(status)); - // In CLDR (http://unicode.org/cldr/trac/ticket/9943), Etc/UTC is made - // a separate timezone ID from Etc/GMT even though they're still the same - // timezone. We have Etc/UTC because 'UTC', 'Etc/Universal', - // 'Etc/Zulu' and others are turned to 'Etc/UTC' by ICU. Etc/GMT comes - // from Etc/GMT0, Etc/GMT+0, Etc/GMT-0, Etc/Greenwich. - // ecma402#sec-canonicalizetimezonename step 3 if (canonical == UNICODE_STRING_SIMPLE("Etc/UTC") || canonical == UNICODE_STRING_SIMPLE("Etc/GMT")) { return isolate->factory()->UTC_string(); } - return Intl::ToString(isolate, canonical).ToHandleChecked(); -} - -Handle<String> Intl::CanonicalizeTimeZoneName(Isolate* isolate, - Handle<String> identifier) { - std::string time_zone = - JSDateTimeFormat::CanonicalizeTimeZoneID(identifier->ToCString().get()); - return CanonicalizeTimeZoneID( - isolate, icu::UnicodeString(time_zone.c_str(), -1, US_INV)); -} - -Handle<String> Intl::TimeZoneId(Isolate* isolate, const icu::TimeZone& tz) { - icu::UnicodeString time_zone; - tz.getID(time_zone); - return Intl::CanonicalizeTimeZoneID(isolate, time_zone); + return Intl::ToString(isolate, canonical); } bool Intl::IsValidTimeZoneName(Isolate* isolate, Handle<String> id) { @@ -2961,8 +2945,16 @@ Handle<String> Intl::SourceString(Isolate* isolate, FormatRangeSource source) { } Handle<String> Intl::DefaultTimeZone(Isolate* isolate) { - std::unique_ptr<icu::TimeZone> tz(icu::TimeZone::createDefault()); - return TimeZoneId(isolate, *tz); + icu::UnicodeString id; + { + std::unique_ptr<icu::TimeZone> tz(icu::TimeZone::createDefault()); + tz->getID(id); + } + UErrorCode status = U_ZERO_ERROR; + icu::UnicodeString canonical; + icu::TimeZone::getCanonicalID(id, canonical, status); + DCHECK(U_SUCCESS(status)); + return Intl::ToString(isolate, canonical).ToHandleChecked(); } namespace { diff --git a/chromium/v8/src/objects/intl-objects.h b/chromium/v8/src/objects/intl-objects.h index 7f4b66b0fa7..0ac4b14096c 100644 --- a/chromium/v8/src/objects/intl-objects.h +++ b/chromium/v8/src/objects/intl-objects.h @@ -390,13 +390,8 @@ class Intl { static std::vector<int64_t> GetTimeZonePossibleOffsetMilliseconds( Isolate* isolate, int32_t time_zone_index, int64_t time_ms); - static Handle<String> CanonicalizeTimeZoneName(Isolate* isolate, - Handle<String> identifier); - - static Handle<String> CanonicalizeTimeZoneID( - Isolate* isolate, const icu::UnicodeString& identifier); - - static Handle<String> TimeZoneId(Isolate* isolate, const icu::TimeZone& tz); + V8_WARN_UNUSED_RESULT static MaybeHandle<String> CanonicalizeTimeZoneName( + Isolate* isolate, Handle<String> identifier); // ecma402/#sec-coerceoptionstoobject V8_WARN_UNUSED_RESULT static MaybeHandle<JSReceiver> CoerceOptionsToObject( diff --git a/chromium/v8/src/objects/js-date-time-format.cc b/chromium/v8/src/objects/js-date-time-format.cc index 82d6d067e2b..a32c2afe54b 100644 --- a/chromium/v8/src/objects/js-date-time-format.cc +++ b/chromium/v8/src/objects/js-date-time-format.cc @@ -495,6 +495,37 @@ int FractionalSecondDigitsFromPattern(const std::string& pattern) { } // namespace +Handle<Object> JSDateTimeFormat::TimeZoneId(Isolate* isolate, + const icu::TimeZone& tz) { + Factory* factory = isolate->factory(); + icu::UnicodeString time_zone; + tz.getID(time_zone); + UErrorCode status = U_ZERO_ERROR; + icu::UnicodeString canonical_time_zone; + icu::TimeZone::getCanonicalID(time_zone, canonical_time_zone, status); + Handle<Object> timezone_value; + if (U_SUCCESS(status)) { + // In CLDR (http://unicode.org/cldr/trac/ticket/9943), Etc/UTC is made + // a separate timezone ID from Etc/GMT even though they're still the same + // timezone. We have Etc/UTC because 'UTC', 'Etc/Universal', + // 'Etc/Zulu' and others are turned to 'Etc/UTC' by ICU. Etc/GMT comes + // from Etc/GMT0, Etc/GMT+0, Etc/GMT-0, Etc/Greenwich. + // ecma402#sec-canonicalizetimezonename step 3 + if (canonical_time_zone == UNICODE_STRING_SIMPLE("Etc/UTC") || + canonical_time_zone == UNICODE_STRING_SIMPLE("Etc/GMT")) { + timezone_value = factory->UTC_string(); + } else { + ASSIGN_RETURN_ON_EXCEPTION_VALUE( + isolate, timezone_value, Intl::ToString(isolate, canonical_time_zone), + Handle<Object>()); + } + } else { + // Somehow on Windows we will reach here. + timezone_value = factory->undefined_value(); + } + return timezone_value; +} + namespace { Handle<String> GetCalendar(Isolate* isolate, const icu::SimpleDateFormat& simple_date_format, @@ -526,8 +557,8 @@ Handle<String> GetCalendar(Isolate* isolate, Handle<Object> GetTimeZone(Isolate* isolate, const icu::SimpleDateFormat& simple_date_format) { - return Intl::TimeZoneId(isolate, - simple_date_format.getCalendar()->getTimeZone()); + return JSDateTimeFormat::TimeZoneId( + isolate, simple_date_format.getCalendar()->getTimeZone()); } } // namespace diff --git a/chromium/v8/src/objects/js-date-time-format.h b/chromium/v8/src/objects/js-date-time-format.h index 44050caf191..88a6b61b50c 100644 --- a/chromium/v8/src/objects/js-date-time-format.h +++ b/chromium/v8/src/objects/js-date-time-format.h @@ -99,6 +99,7 @@ class JSDateTimeFormat V8_EXPORT_PRIVATE static const std::set<std::string>& GetAvailableLocales(); + Handle<Object> static TimeZoneId(Isolate* isolate, const icu::TimeZone& tz); std::unique_ptr<icu::TimeZone> static CreateTimeZone(const char* timezone); V8_EXPORT_PRIVATE static std::string CanonicalizeTimeZoneID( diff --git a/chromium/v8/src/objects/js-temporal-objects.cc b/chromium/v8/src/objects/js-temporal-objects.cc index 976d3f598ed..e0e3274c436 100644 --- a/chromium/v8/src/objects/js-temporal-objects.cc +++ b/chromium/v8/src/objects/js-temporal-objects.cc @@ -4556,7 +4556,7 @@ bool IsValidTimeZoneName(Isolate* isolate, Handle<String> time_zone) { Handle<String> CanonicalizeTimeZoneName(Isolate* isolate, Handle<String> identifier) { - return Intl::CanonicalizeTimeZoneName(isolate, identifier); + return Intl::CanonicalizeTimeZoneName(isolate, identifier).ToHandleChecked(); } #else // V8_INTL_SUPPORT |