From dd73cccf8f372bc41cb56fb5fecb9d3640ea0c32 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Mon, 22 Apr 2024 18:16:14 +0200 Subject: [PATCH] LibWeb: Fire "scroll" events on DOM elements Before this change "scroll" events were only fired on document but now it happens for all elements with scrollable overflow. --- .../Text/expected/element-scroll-event.txt | 1 + .../Text/input/element-scroll-event.html | 29 +++++++++++++++++++ .../LibWeb/Painting/PaintableBox.cpp | 20 +++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 Tests/LibWeb/Text/expected/element-scroll-event.txt create mode 100644 Tests/LibWeb/Text/input/element-scroll-event.html diff --git a/Tests/LibWeb/Text/expected/element-scroll-event.txt b/Tests/LibWeb/Text/expected/element-scroll-event.txt new file mode 100644 index 0000000000..53487ffc1c --- /dev/null +++ b/Tests/LibWeb/Text/expected/element-scroll-event.txt @@ -0,0 +1 @@ + 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=100 diff --git a/Tests/LibWeb/Text/input/element-scroll-event.html b/Tests/LibWeb/Text/input/element-scroll-event.html new file mode 100644 index 0000000000..6a1f6a0c0a --- /dev/null +++ b/Tests/LibWeb/Text/input/element-scroll-event.html @@ -0,0 +1,29 @@ + + + +
+ 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/Painting/PaintableBox.cpp b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp index e9d3a02c9d..09ee1f2a6c 100644 --- a/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp +++ b/Userland/Libraries/LibWeb/Painting/PaintableBox.cpp @@ -91,6 +91,26 @@ void PaintableBox::set_scroll_offset(CSSPixelPoint offset) return; } + // https://drafts.csswg.org/cssom-view-1/#scrolling-events + // Whenever an element gets scrolled (whether in response to user interaction or by an API), + // the user agent must run these steps: + + // 1. Let doc be the element’s node document. + auto& document = layout_box().document(); + + // FIXME: 2. If the element is a snap container, run the steps to update snapchanging targets for the element with + // the element’s eventual snap target in the block axis as newBlockTarget and the element’s eventual snap + // target in the inline axis as newInlineTarget. + + JS::NonnullGCPtr const event_target = *dom_node(); + + // 3. If the element is already in doc’s pending scroll event targets, abort these steps. + if (document.pending_scroll_event_targets().contains_slow(event_target)) + return; + + // 4. Append the element to doc’s pending scroll event targets. + document.pending_scroll_event_targets().append(*layout_box().dom_node()); + set_needs_display(); }