From e640a687330c4d8d8d6c96e0b121167d9d582e1a Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Sat, 4 May 2024 13:14:16 +1200 Subject: [PATCH] LibWeb: Implement Element::scroll_by(HTML::ScrollToOptions) --- Userland/Libraries/LibWeb/DOM/Element.cpp | 18 +++++++++++++++--- Userland/Libraries/LibWeb/DOM/Element.h | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp index f1d20ced50..f98774e4b2 100644 --- a/Userland/Libraries/LibWeb/DOM/Element.cpp +++ b/Userland/Libraries/LibWeb/DOM/Element.cpp @@ -2159,10 +2159,22 @@ void Element::scroll_by(double x, double y) dbgln("FIXME: Implement Element::scroll_by({}, {})", x, y); } -// https://drafts.csswg.org/cssom-view/#dom-window-scrollby -void Element::scroll_by(HTML::ScrollToOptions const&) +// https://drafts.csswg.org/cssom-view/#dom-element-scrollby +void Element::scroll_by(HTML::ScrollToOptions options) { - dbgln("FIXME: Implement Element::scroll_by(ScrollToOptions)"); + // 1. Let options be the argument. + // 2. Normalize non-finite values for left and top dictionary members of options, if present. + auto left = HTML::normalize_non_finite_values(options.left); + auto top = HTML::normalize_non_finite_values(options.top); + + // 3. Add the value of scrollLeft to the left dictionary member. + options.left = scroll_left() + left; + + // 4. Add the value of scrollTop to the top dictionary member. + options.top = scroll_top() + top; + + // 5. Act as if the scroll() method was invoked with options as the only argument. + scroll(options); } bool Element::id_reference_exists(String const& id_reference) const diff --git a/Userland/Libraries/LibWeb/DOM/Element.h b/Userland/Libraries/LibWeb/DOM/Element.h index 141f8172bf..b1b9a00b34 100644 --- a/Userland/Libraries/LibWeb/DOM/Element.h +++ b/Userland/Libraries/LibWeb/DOM/Element.h @@ -337,7 +337,7 @@ public: void scroll(HTML::ScrollToOptions const&); void scroll(double x, double y); - void scroll_by(HTML::ScrollToOptions const&); + void scroll_by(HTML::ScrollToOptions); void scroll_by(double x, double y); void register_intersection_observer(Badge, IntersectionObserver::IntersectionObserverRegistration);