script: Get scroll offsets from layout (#37509)

No longer store scroll offsets for elements in the DOM. Instead
consistently get and set these in layout's `ScrollTree`. This more
consistently requires layout to run when querying scroll offsets, which
ensures that they are up-to-date and properly bounded by scrollable
overflow area.

Testing: This causes several WPT tests to start passing, and one to
start
failing. In the case of
`/shadow-dom/scroll-to-the-fragment-in-shadow-tree.html`, I believe the
issue
is that we don't properly handle scrolling and shadow DOM elements.
Before, the
faulty scrolling was hiding this issue.

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
Martin Robinson 2025-06-20 11:39:12 +02:00 committed by GitHub
parent 518729a4f5
commit 3774ef00d4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 116 additions and 117 deletions

View file

@ -424,6 +424,15 @@ impl ScrollTree {
_ => None,
}))
}
/// Get the scroll offset for the given [`ExternalScrollId`] or `None` if that node cannot
/// be found in the tree.
pub fn scroll_offset(&self, id: ExternalScrollId) -> Option<LayoutVector2D> {
self.nodes.iter().find_map(|node| match node.info {
SpatialTreeNodeInfo::Scroll(ref info) if info.external_id == id => Some(info.offset),
_ => None,
})
}
}
/// In order to pretty print the [ScrollTree] structure, we are converting

View file

@ -251,6 +251,10 @@ pub trait Layout {
scroll_states: &HashMap<ExternalScrollId, LayoutVector2D>,
);
/// Get the scroll offset of the given scroll node with id of [`ExternalScrollId`] or `None` if it does
/// not exist in the tree.
fn scroll_offset(&self, id: ExternalScrollId) -> Option<LayoutVector2D>;
fn query_content_box(&self, node: TrustedNodeAddress) -> Option<Rect<Au>>;
fn query_content_boxes(&self, node: TrustedNodeAddress) -> Vec<Rect<Au>>;
fn query_client_rect(&self, node: TrustedNodeAddress) -> Rect<i32>;
@ -309,7 +313,7 @@ pub enum QueryMsg {
ContentBox,
ContentBoxes,
ClientRectQuery,
ScrollingAreaQuery,
ScrollingAreaOrOffsetQuery,
OffsetParentQuery,
TextIndexQuery,
NodesFromPointQuery,
@ -351,13 +355,13 @@ impl ReflowGoal {
QueryMsg::InnerWindowDimensionsQuery |
QueryMsg::NodesFromPointQuery |
QueryMsg::ResolvedStyleQuery |
QueryMsg::ScrollingAreaOrOffsetQuery |
QueryMsg::TextIndexQuery => true,
QueryMsg::ClientRectQuery |
QueryMsg::ContentBox |
QueryMsg::ContentBoxes |
QueryMsg::OffsetParentQuery |
QueryMsg::ResolvedFontStyleQuery |
QueryMsg::ScrollingAreaQuery |
QueryMsg::StyleQuery => false,
},
}
@ -375,7 +379,7 @@ impl ReflowGoal {
QueryMsg::ContentBox |
QueryMsg::ContentBoxes |
QueryMsg::ClientRectQuery |
QueryMsg::ScrollingAreaQuery |
QueryMsg::ScrollingAreaOrOffsetQuery |
QueryMsg::ResolvedStyleQuery |
QueryMsg::ResolvedFontStyleQuery |
QueryMsg::OffsetParentQuery |