diff --git a/Libraries/LibWeb/DOM/Element.cpp b/Libraries/LibWeb/DOM/Element.cpp index 019dee2516e..42574a549fb 100644 --- a/Libraries/LibWeb/DOM/Element.cpp +++ b/Libraries/LibWeb/DOM/Element.cpp @@ -3031,7 +3031,7 @@ void Element::scroll(double x, double y) // as the element is not eligible to be the Document.scrollingElement. if (x == 0 && y == 0 - && scroll_offset(ScrollOffsetFor::Self).is_zero() + && scroll_offset({}).is_zero() && this != document.body() && this != document.document_element()) { return; @@ -3397,6 +3397,25 @@ IntersectionObserver::IntersectionObserverRegistration& Element::get_intersectio return *registration_iterator; } +CSSPixelPoint Element::scroll_offset(Optional pseudo_element_type) const +{ + if (pseudo_element_type.has_value()) { + if (auto pseudo_element = get_pseudo_element(*pseudo_element_type); pseudo_element.has_value()) + return pseudo_element->scroll_offset(); + return {}; + } + return m_scroll_offset; +} + +void Element::set_scroll_offset(Optional pseudo_element_type, CSSPixelPoint offset) +{ + if (pseudo_element_type.has_value()) { + if (auto pseudo_element = get_pseudo_element(*pseudo_element_type); pseudo_element.has_value()) + pseudo_element->set_scroll_offset(offset); + } + m_scroll_offset = offset; +} + // https://html.spec.whatwg.org/multipage/dom.html#translation-mode Element::TranslationMode Element::translation_mode() const { diff --git a/Libraries/LibWeb/DOM/Element.h b/Libraries/LibWeb/DOM/Element.h index 2451bbc183e..291623bbdc7 100644 --- a/Libraries/LibWeb/DOM/Element.h +++ b/Libraries/LibWeb/DOM/Element.h @@ -373,13 +373,8 @@ public: void unregister_intersection_observer(Badge, GC::Ref); IntersectionObserver::IntersectionObserverRegistration& get_intersection_observer_registration(Badge, IntersectionObserver::IntersectionObserver const&); - enum class ScrollOffsetFor { - Self, - PseudoBefore, - PseudoAfter - }; - CSSPixelPoint scroll_offset(ScrollOffsetFor type) const { return m_scroll_offset[to_underlying(type)]; } - void set_scroll_offset(ScrollOffsetFor type, CSSPixelPoint offset) { m_scroll_offset[to_underlying(type)] = offset; } + CSSPixelPoint scroll_offset(Optional type) const; + void set_scroll_offset(Optional type, CSSPixelPoint offset); enum class TranslationMode { TranslateEnabled, @@ -595,7 +590,7 @@ private: // Element objects have an internal [[RegisteredIntersectionObservers]] slot, which is initialized to an empty list. OwnPtr> m_registered_intersection_observers; - Array m_scroll_offset; + CSSPixelPoint m_scroll_offset; bool m_in_top_layer : 1 { false }; bool m_rendered_in_top_layer : 1 { false }; diff --git a/Libraries/LibWeb/DOM/PseudoElement.h b/Libraries/LibWeb/DOM/PseudoElement.h index c21a063f797..8449a165740 100644 --- a/Libraries/LibWeb/DOM/PseudoElement.h +++ b/Libraries/LibWeb/DOM/PseudoElement.h @@ -35,6 +35,9 @@ class PseudoElement : public JS::Cell { CSS::CountersSet& ensure_counters_set(); void set_counters_set(OwnPtr&&); + CSSPixelPoint scroll_offset() const { return m_scroll_offset; } + void set_scroll_offset(CSSPixelPoint value) { m_scroll_offset = value; } + virtual void visit_edges(JS::Cell::Visitor&) override; private: @@ -43,6 +46,7 @@ private: GC::Ptr m_computed_properties; HashMap m_custom_properties; OwnPtr m_counters_set; + CSSPixelPoint m_scroll_offset {}; }; // https://drafts.csswg.org/css-view-transitions/#pseudo-element-tree diff --git a/Libraries/LibWeb/Painting/PaintableBox.cpp b/Libraries/LibWeb/Painting/PaintableBox.cpp index f618ad3d870..1a3ac5e8667 100644 --- a/Libraries/LibWeb/Painting/PaintableBox.cpp +++ b/Libraries/LibWeb/Painting/PaintableBox.cpp @@ -96,15 +96,13 @@ CSSPixelPoint PaintableBox::scroll_offset() const } auto const& node = layout_node(); - if (node.is_generated_for_before_pseudo_element()) - return node.pseudo_element_generator()->scroll_offset(DOM::Element::ScrollOffsetFor::PseudoBefore); - if (node.is_generated_for_after_pseudo_element()) - return node.pseudo_element_generator()->scroll_offset(DOM::Element::ScrollOffsetFor::PseudoAfter); + if (auto pseudo_element = node.generated_for_pseudo_element(); pseudo_element.has_value()) + return node.pseudo_element_generator()->scroll_offset(*pseudo_element); if (!(dom_node() && is(*dom_node()))) return {}; - return static_cast(dom_node())->scroll_offset(DOM::Element::ScrollOffsetFor::Self); + return static_cast(dom_node())->scroll_offset({}); } void PaintableBox::set_scroll_offset(CSSPixelPoint offset) @@ -127,12 +125,10 @@ void PaintableBox::set_scroll_offset(CSSPixelPoint offset) return; auto& node = layout_node(); - if (node.is_generated_for_before_pseudo_element()) { - node.pseudo_element_generator()->set_scroll_offset(DOM::Element::ScrollOffsetFor::PseudoBefore, offset); - } else if (node.is_generated_for_after_pseudo_element()) { - node.pseudo_element_generator()->set_scroll_offset(DOM::Element::ScrollOffsetFor::PseudoAfter, offset); + if (auto pseudo_element = node.generated_for_pseudo_element(); pseudo_element.has_value()) { + node.pseudo_element_generator()->set_scroll_offset(*pseudo_element, offset); } else if (is(*dom_node())) { - static_cast(dom_node())->set_scroll_offset(DOM::Element::ScrollOffsetFor::Self, offset); + static_cast(dom_node())->set_scroll_offset({}, offset); } else { return; }