script: Use HTMLElement.scrollParent to implement Element.scrollIntoView (#39144)

To find scrolling ancestors, we need to walk up the flat tree and only
consider the elements that are in the chain of containing block
ancestors of an element. `scrollParent` now does this so we can use it
to properly implement `scrollIntoView`.

Testing: There are WPT tests for this change.

---------

Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: Oriol Brufau <obrufau@igalia.com>
This commit is contained in:
Martin Robinson 2025-09-07 14:44:11 -07:00 committed by GitHub
parent 286bbe6cb1
commit 9f4f598f44
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 141 additions and 71 deletions

View file

@ -295,7 +295,11 @@ pub trait Layout {
fn query_client_rect(&self, node: TrustedNodeAddress) -> Rect<i32>;
fn query_element_inner_outer_text(&self, node: TrustedNodeAddress) -> String;
fn query_offset_parent(&self, node: TrustedNodeAddress) -> OffsetParentResponse;
fn query_scroll_parent(&self, node: TrustedNodeAddress) -> Option<ScrollParentResponse>;
fn query_scroll_container(
&self,
node: TrustedNodeAddress,
query_type: ScrollContainerQueryType,
) -> Option<ScrollContainerResponse>;
fn query_resolved_style(
&self,
node: TrustedNodeAddress,
@ -352,9 +356,15 @@ pub struct OffsetParentResponse {
pub rect: Rect<Au>,
}
#[derive(PartialEq)]
pub enum ScrollContainerQueryType {
ForScrollParent,
ForScrollIntoView,
}
#[derive(Clone)]
pub enum ScrollParentResponse {
DocumentScrollingElement,
pub enum ScrollContainerResponse {
Viewport,
Element(UntrustedNodeAddress),
}