From d0be5a0cdfdd1e8490fe3ee1aef5578e89a7e3e0 Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Wed, 19 Mar 2025 16:48:33 +0000 Subject: [PATCH] LibWeb: Preserve unit when serializing time values Previously, when serializing a time value, we would always convert it to seconds. We now canonicalize the time value only when serializing its computed value. --- .../LibWeb/CSS/StyleValues/TimeStyleValue.h | 7 ++++++- Libraries/LibWeb/CSS/Time.cpp | 2 +- .../parsing/transition-duration-valid.txt | 9 +++++++++ .../parsing/transition-duration-valid.html | 19 +++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 Tests/LibWeb/Text/expected/wpt-import/css/css-transitions/parsing/transition-duration-valid.txt create mode 100644 Tests/LibWeb/Text/input/wpt-import/css/css-transitions/parsing/transition-duration-valid.html diff --git a/Libraries/LibWeb/CSS/StyleValues/TimeStyleValue.h b/Libraries/LibWeb/CSS/StyleValues/TimeStyleValue.h index 580e8ca3fb3..2b3e37880fe 100644 --- a/Libraries/LibWeb/CSS/StyleValues/TimeStyleValue.h +++ b/Libraries/LibWeb/CSS/StyleValues/TimeStyleValue.h @@ -26,7 +26,12 @@ public: virtual double value() const override { return m_time.raw_value(); } virtual StringView unit() const override { return m_time.unit_name(); } - virtual String to_string(SerializationMode) const override { return m_time.to_string(); } + virtual String to_string(SerializationMode serialization_mode) const override + { + if (serialization_mode == SerializationMode::ResolvedValue) + return MUST(String::formatted("{}s", m_time.to_seconds())); + return m_time.to_string(); + } bool equals(CSSStyleValue const& other) const override { diff --git a/Libraries/LibWeb/CSS/Time.cpp b/Libraries/LibWeb/CSS/Time.cpp index ce8b3e4f33b..a9e7c70727b 100644 --- a/Libraries/LibWeb/CSS/Time.cpp +++ b/Libraries/LibWeb/CSS/Time.cpp @@ -28,7 +28,7 @@ Time Time::percentage_of(Percentage const& percentage) const String Time::to_string() const { - return MUST(String::formatted("{}s", to_seconds())); + return MUST(String::formatted("{}{}", raw_value(), unit_name())); } double Time::to_seconds() const diff --git a/Tests/LibWeb/Text/expected/wpt-import/css/css-transitions/parsing/transition-duration-valid.txt b/Tests/LibWeb/Text/expected/wpt-import/css/css-transitions/parsing/transition-duration-valid.txt new file mode 100644 index 00000000000..81a7da6559c --- /dev/null +++ b/Tests/LibWeb/Text/expected/wpt-import/css/css-transitions/parsing/transition-duration-valid.txt @@ -0,0 +1,9 @@ +Harness status: OK + +Found 3 tests + +2 Pass +1 Fail +Pass e.style['transition-duration'] = "0s" should set the property value +Pass e.style['transition-duration'] = "500ms" should set the property value +Fail e.style['transition-duration'] = "1s, 2s" should set the property value \ No newline at end of file diff --git a/Tests/LibWeb/Text/input/wpt-import/css/css-transitions/parsing/transition-duration-valid.html b/Tests/LibWeb/Text/input/wpt-import/css/css-transitions/parsing/transition-duration-valid.html new file mode 100644 index 00000000000..fbd43064992 --- /dev/null +++ b/Tests/LibWeb/Text/input/wpt-import/css/css-transitions/parsing/transition-duration-valid.html @@ -0,0 +1,19 @@ + + + + +CSS Transitions: parsing transition-duration with valid values + + + + + + + + + +