mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-09 18:16:09 +03:00
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:
parent
897b5dfe8b
commit
e5d03e382e
Notes:
sideshowbarker
2024-07-17 08:38:37 +09:00
Author: https://github.com/shannonbooth Commit: https://github.com/SerenityOS/serenity/commit/e5d03e382e Pull-request: https://github.com/SerenityOS/serenity/pull/24200 Reviewed-by: https://github.com/ADKaster ✅ Reviewed-by: https://github.com/awesomekling
@ -1208,8 +1208,7 @@ void Element::set_scroll_left(double x)
|
|||||||
// 1. Let x be the given value.
|
// 1. Let x be the given value.
|
||||||
|
|
||||||
// 2. Normalize non-finite values for x.
|
// 2. Normalize non-finite values for x.
|
||||||
if (!isfinite(x))
|
x = HTML::normalize_non_finite_values(x);
|
||||||
x = 0.0;
|
|
||||||
|
|
||||||
// 3. Let document be the element’s node document.
|
// 3. Let document be the element’s node document.
|
||||||
auto& document = this->document();
|
auto& document = this->document();
|
||||||
@ -1265,8 +1264,7 @@ void Element::set_scroll_top(double y)
|
|||||||
// 1. Let y be the given value.
|
// 1. Let y be the given value.
|
||||||
|
|
||||||
// 2. Normalize non-finite values for y.
|
// 2. Normalize non-finite values for y.
|
||||||
if (!isfinite(y))
|
y = HTML::normalize_non_finite_values(y);
|
||||||
y = 0.0;
|
|
||||||
|
|
||||||
// 3. Let document be the element’s node document.
|
// 3. Let document be the element’s node document.
|
||||||
auto& document = this->document();
|
auto& document = this->document();
|
||||||
|
@ -15,4 +15,23 @@ struct ScrollOptions {
|
|||||||
Bindings::ScrollBehavior behavior { Bindings::ScrollBehavior::Auto };
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1368,8 +1368,8 @@ void Window::scroll(ScrollToOptions const& options)
|
|||||||
auto y = options.top.value_or(viewport_rect.y());
|
auto y = options.top.value_or(viewport_rect.y());
|
||||||
|
|
||||||
// 3. Normalize non-finite values for x and y.
|
// 3. Normalize non-finite values for x and y.
|
||||||
x = JS::Value(x).is_finite_number() ? x : 0;
|
x = HTML::normalize_non_finite_values(x);
|
||||||
y = JS::Value(y).is_finite_number() ? y : 0;
|
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.
|
// 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();
|
auto viewport_width = viewport_rect.width();
|
||||||
@ -1438,16 +1438,14 @@ void Window::scroll(double x, double y)
|
|||||||
void Window::scroll_by(ScrollToOptions options)
|
void Window::scroll_by(ScrollToOptions options)
|
||||||
{
|
{
|
||||||
// 2. Normalize non-finite values for the left and top dictionary members of options.
|
// 2. Normalize non-finite values for the left and top dictionary members of options.
|
||||||
auto x = options.left.value_or(0);
|
auto left = HTML::normalize_non_finite_values(options.left);
|
||||||
auto y = options.top.value_or(0);
|
auto top = HTML::normalize_non_finite_values(options.top);
|
||||||
x = JS::Value(x).is_finite_number() ? x : 0;
|
|
||||||
y = JS::Value(y).is_finite_number() ? y : 0;
|
|
||||||
|
|
||||||
// 3. Add the value of scrollX to the left dictionary member.
|
// 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.
|
// 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.
|
// 5. Act as if the scroll() method was invoked with options as the only argument.
|
||||||
scroll(options);
|
scroll(options);
|
||||||
|
Loading…
Reference in New Issue
Block a user