瀏覽代碼

LibWeb: Implement Element::scroll(HTML::ScrollToOptions)

Shannon Booth 1 年之前
父節點
當前提交
71819153cb

+ 7 - 0
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

+ 36 - 0
Tests/LibWeb/Text/input/element-scrollby-event.html

@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<style>
+    #scrollable-div {
+        width: 300px;
+        height: 50px;
+        overflow: auto;
+        white-space: pre;
+        border: 1px solid black;
+        padding: 10px;
+        font-size: 50px;
+    }
+</style>
+<script src="include.js"></script>
+<div id="scrollable-div">
+    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.
+</div>
+<script>
+    asyncTest(done => {
+        const scrollable = document.getElementById("scrollable-div");
+
+        scrollable.addEventListener("scroll", event => {
+            println(`scroll event fired y=${scrollable.scrollTop} x=${scrollable.scrollLeft}`);
+            done();
+        });
+
+        scrollable.scrollBy({
+           top: 151,
+           left: 25,
+           behaviour: 'smooth'
+        })
+    });
+</script>

+ 10 - 2
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

+ 1 - 1
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<String> 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);