LibWeb: Add AO for "normalize non-finite values"

We had implemented this in two different ways. Add an AO to to align the
implementations.
This commit is contained in:
Shannon Booth 2024-05-04 12:39:45 +12:00 committed by Andrew Kaster
parent 897b5dfe8b
commit e5d03e382e
Notes: sideshowbarker 2024-07-17 08:38:37 +09:00
3 changed files with 27 additions and 12 deletions

View file

@ -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 elements 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 elements node document.
auto& document = this->document();

View file

@ -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<double> const& value)
{
if (!value.has_value())
return 0;
return normalize_non_finite_values(value.value());
}
}

View file

@ -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);