diff --git a/Tests/LibWeb/Text/expected/element-scrollby-event.txt b/Tests/LibWeb/Text/expected/element-scrollby-event.txt
new file mode 100644
index 00000000000..c85997941d1
--- /dev/null
+++ b/Tests/LibWeb/Text/expected/element-scrollby-event.txt
@@ -0,0 +1,7 @@
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed
+ cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis
+ ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum
+ lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
+ inceptos himenaeos.
+ scroll event fired y=151 x=25
diff --git a/Tests/LibWeb/Text/input/element-scrollby-event.html b/Tests/LibWeb/Text/input/element-scrollby-event.html
new file mode 100644
index 00000000000..1c0019e63f6
--- /dev/null
+++ b/Tests/LibWeb/Text/input/element-scrollby-event.html
@@ -0,0 +1,36 @@
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed
+ cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis
+ ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum
+ lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
+ inceptos himenaeos.
+
+
diff --git a/Userland/Libraries/LibWeb/DOM/Element.cpp b/Userland/Libraries/LibWeb/DOM/Element.cpp
index b4bccb20116..407f49acc8a 100644
--- a/Userland/Libraries/LibWeb/DOM/Element.cpp
+++ b/Userland/Libraries/LibWeb/DOM/Element.cpp
@@ -2201,9 +2201,17 @@ void Element::scroll(double x, double y)
}
// https://drafts.csswg.org/cssom-view/#dom-element-scroll
-void Element::scroll(HTML::ScrollToOptions const&)
+void Element::scroll(HTML::ScrollToOptions options)
{
- dbgln("FIXME: Implement Element::scroll(ScrollToOptions)");
+ // 1. If invoked with one argument, follow these substeps:
+ // 1. Let options be the argument.
+ // 2. Normalize non-finite values for left and top dictionary members of options, if present.
+ // 3. Let x be the value of the left dictionary member of options, if present, or the element’s current scroll position on the x axis otherwise.
+ // 4. Let y be the value of the top dictionary member of options, if present, or the element’s current scroll position on the y axis otherwise.
+ // NOTE: remaining steps performed by Element::scroll(double x, double y)
+ auto x = options.left.has_value() ? HTML::normalize_non_finite_values(options.left.value()) : scroll_left();
+ auto y = options.top.has_value() ? HTML::normalize_non_finite_values(options.top.value()) : scroll_top();
+ scroll(x, y);
}
// https://drafts.csswg.org/cssom-view/#dom-element-scrollby
diff --git a/Userland/Libraries/LibWeb/DOM/Element.h b/Userland/Libraries/LibWeb/DOM/Element.h
index b1b9a00b343..8f2b56edf3e 100644
--- a/Userland/Libraries/LibWeb/DOM/Element.h
+++ b/Userland/Libraries/LibWeb/DOM/Element.h
@@ -335,7 +335,7 @@ public:
void set_custom_element_state(CustomElementState value) { m_custom_element_state = value; }
void setup_custom_element_from_constructor(HTML::CustomElementDefinition& custom_element_definition, Optional const& is_value);
- void scroll(HTML::ScrollToOptions const&);
+ void scroll(HTML::ScrollToOptions);
void scroll(double x, double y);
void scroll_by(HTML::ScrollToOptions);
void scroll_by(double x, double y);