From e5d03e382e077c2de0950655c8896100c2d8f444 Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Sat, 4 May 2024 12:39:45 +1200 Subject: [PATCH] LibWeb: Add AO for "normalize non-finite values" We had implemented this in two different ways. Add an AO to to align the implementations. --- Userland/Libraries/LibWeb/DOM/Element.cpp | 6 ++---- .../Libraries/LibWeb/HTML/ScrollOptions.h | 19 +++++++++++++++++++ Userland/Libraries/LibWeb/HTML/Window.cpp | 14 ++++++-------- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp index f50bb78476d..f1d20ced501 100644 --- a/Userland/Libraries/LibWeb/DOM/Element.cpp +++ b/Userland/Libraries/LibWeb/DOM/Element.cpp @@ -1208,8 +1208,7 @@ void Element::set_scroll_left(double x) // 1. Let x be the given value. // 2. Normalize non-finite values for x. - if (!isfinite(x)) - x = 0.0; + x = HTML::normalize_non_finite_values(x); // 3. Let document be the element’s node document. auto& document = this->document(); @@ -1265,8 +1264,7 @@ void Element::set_scroll_top(double y) // 1. Let y be the given value. // 2. Normalize non-finite values for y. - if (!isfinite(y)) - y = 0.0; + y = HTML::normalize_non_finite_values(y); // 3. Let document be the element’s node document. auto& document = this->document(); diff --git a/Userland/Libraries/LibWeb/HTML/ScrollOptions.h b/Userland/Libraries/LibWeb/HTML/ScrollOptions.h index 288659f4fde..7a7249831ae 100644 --- a/Userland/Libraries/LibWeb/HTML/ScrollOptions.h +++ b/Userland/Libraries/LibWeb/HTML/ScrollOptions.h @@ -15,4 +15,23 @@ struct ScrollOptions { Bindings::ScrollBehavior behavior { Bindings::ScrollBehavior::Auto }; }; +// https://drafts.csswg.org/cssom-view/#normalize-non-finite-values +[[nodiscard]] inline double normalize_non_finite_values(double value) +{ + // When asked to normalize non-finite values for a value x, if x is one of the three special floating point + // literal values (Infinity, -Infinity or NaN), then x must be changed to the value 0. [WEBIDL] + if (isinf(value) || isnan(value)) + return 0; + + return value; +} + +// https://drafts.csswg.org/cssom-view/#normalize-non-finite-values +[[nodiscard]] inline double normalize_non_finite_values(Optional const& value) +{ + if (!value.has_value()) + return 0; + return normalize_non_finite_values(value.value()); +} + } diff --git a/Userland/Libraries/LibWeb/HTML/Window.cpp b/Userland/Libraries/LibWeb/HTML/Window.cpp index 89b059d6b7b..ade57e9c210 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.cpp +++ b/Userland/Libraries/LibWeb/HTML/Window.cpp @@ -1368,8 +1368,8 @@ void Window::scroll(ScrollToOptions const& options) auto y = options.top.value_or(viewport_rect.y()); // 3. Normalize non-finite values for x and y. - x = JS::Value(x).is_finite_number() ? x : 0; - y = JS::Value(y).is_finite_number() ? y : 0; + x = HTML::normalize_non_finite_values(x); + y = HTML::normalize_non_finite_values(y); // 5. Let viewport width be the width of the viewport excluding the width of the scroll bar, if any. auto viewport_width = viewport_rect.width(); @@ -1438,16 +1438,14 @@ void Window::scroll(double x, double y) void Window::scroll_by(ScrollToOptions options) { // 2. Normalize non-finite values for the left and top dictionary members of options. - auto x = options.left.value_or(0); - auto y = options.top.value_or(0); - x = JS::Value(x).is_finite_number() ? x : 0; - y = JS::Value(y).is_finite_number() ? y : 0; + auto left = HTML::normalize_non_finite_values(options.left); + auto top = HTML::normalize_non_finite_values(options.top); // 3. Add the value of scrollX to the left dictionary member. - options.left = x + scroll_x(); + options.left = left + scroll_x(); // 4. Add the value of scrollY to the top dictionary member. - options.top = y + scroll_y(); + options.top = top + scroll_y(); // 5. Act as if the scroll() method was invoked with options as the only argument. scroll(options);