Przeglądaj źródła

LibTimeZone: Operate in UTC-only mode when !ENABLE_TIME_ZONE_DATA

Instead of only having dummy functions that don't work with any input,
let's at least support one time zone: 'UTC'. This matches the basic
Temporal implementation for engines without ECMA-262, for example.
Linus Groh 3 lat temu
rodzic
commit
205d63c3f0

+ 20 - 0
Tests/LibTimeZone/TestTimeZone.cpp

@@ -126,4 +126,24 @@ TEST_CASE(get_time_zone_offset)
     EXPECT(!TimeZone::get_time_zone_offset("I don't exist"sv, {}).has_value());
 }
 
+#else
+
+TEST_CASE(time_zone_from_string)
+{
+    EXPECT_EQ(TimeZone::time_zone_from_string("UTC"sv), TimeZone::TimeZone::UTC);
+
+    EXPECT(!TimeZone::time_zone_from_string("Europe/Paris"sv).has_value());
+    EXPECT(!TimeZone::time_zone_from_string("Etc/UTC"sv).has_value());
+    EXPECT(!TimeZone::time_zone_from_string("I don't exist"sv).has_value());
+}
+
+TEST_CASE(get_time_zone_offset)
+{
+    EXPECT_EQ(TimeZone::get_time_zone_offset("UTC", AK::Time::from_seconds(123456)), 0);
+
+    EXPECT(!TimeZone::get_time_zone_offset("Europe/Paris"sv, {}).has_value());
+    EXPECT(!TimeZone::get_time_zone_offset("Etc/UTC"sv, {}).has_value());
+    EXPECT(!TimeZone::get_time_zone_offset("I don't exist"sv, {}).has_value());
+}
+
 #endif

+ 38 - 3
Userland/Libraries/LibTimeZone/TimeZone.cpp

@@ -8,8 +8,35 @@
 
 namespace TimeZone {
 
-Optional<TimeZone> __attribute__((weak)) time_zone_from_string(StringView) { return {}; }
-StringView __attribute__((weak)) time_zone_to_string(TimeZone) { return {}; }
+// NOTE: Without ENABLE_TIME_ZONE_DATA LibTimeZone operates in a UTC-only mode and only recognizes
+//       the 'UTC' time zone, which is slightly more useful than a bunch of dummy functions that
+//       can't do anything. When we build with time zone data, these weakly linked functions are
+//       replaced with their proper counterparts.
+
+#if !ENABLE_TIME_ZONE_DATA
+enum class TimeZone : u16 {
+    UTC,
+};
+#endif
+
+Optional<TimeZone> __attribute__((weak)) time_zone_from_string([[maybe_unused]] StringView time_zone)
+{
+#if !ENABLE_TIME_ZONE_DATA
+    if (time_zone.equals_ignoring_case("UTC"sv))
+        return TimeZone::UTC;
+#endif
+    return {};
+}
+
+StringView __attribute__((weak)) time_zone_to_string([[maybe_unused]] TimeZone time_zone)
+{
+#if !ENABLE_TIME_ZONE_DATA
+    VERIFY(time_zone == TimeZone::UTC);
+    return "UTC"sv;
+#else
+    return {};
+#endif
+}
 
 Optional<StringView> canonicalize_time_zone(StringView time_zone)
 {
@@ -24,7 +51,15 @@ Optional<StringView> canonicalize_time_zone(StringView time_zone)
     return canonical_time_zone;
 }
 
-Optional<i64> __attribute__((weak)) get_time_zone_offset(TimeZone, AK::Time) { return {}; }
+Optional<i64> __attribute__((weak)) get_time_zone_offset([[maybe_unused]] TimeZone time_zone, AK::Time)
+{
+#if !ENABLE_TIME_ZONE_DATA
+    VERIFY(time_zone == TimeZone::UTC);
+    return 0;
+#else
+    return {};
+#endif
+}
 
 Optional<i64> get_time_zone_offset(StringView time_zone, AK::Time time)
 {