layout: Fix scrollParent to skip ancestors with display: contents (#39153)

When encountering such an ancestor, we were returning null instead of
skipping it.

Testing: Adding new subtest for this. And while I'm at it, another one
for the root element, unrelated to this fix.

Signed-off-by: Oriol Brufau <obrufau@igalia.com>
This commit is contained in:
Oriol Brufau 2025-09-05 16:49:21 +02:00 committed by GitHub
parent cf1f64e73f
commit 0f9f507b46
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 14 additions and 4 deletions

View file

@ -701,10 +701,13 @@ pub(crate) fn process_scroll_parent_query(
continue;
};
let (ancestor_style, ancestor_flags) = ancestor_layout_box
let Some((ancestor_style, ancestor_flags)) = ancestor_layout_box
.with_base_flat(|base| vec![(base.style.clone(), base.base_fragment_info.flags)])
.first()
.cloned()?;
.cloned()
else {
continue;
};
let is_containing_block = match current_position_value {
Position::Static | Position::Relative | Position::Sticky => {

View file

@ -630047,7 +630047,7 @@
]
],
"scrollParent.html": [
"344ee522ef2664e0b963e79812074f08f343f5bf",
"b1c6898af349691d357a3d39cc8fd8e578612d94",
[
null,
{}

View file

@ -57,6 +57,10 @@
<div id="hidden" class="hidden">
<div id="childOfHidden"></div>
</div>
<!-- No box with `display: contents` -->
<div style="display: contents">
<div id="childOfDisplayContents"></div>
</div>
</div>
</div>
</div>
@ -82,6 +86,9 @@ test(() => { assert_equals(fixedContainedByRoot.scrollParent, document.scrolling
"scrollParent of fixed element contained within root is document scrolling element.");
test(() => { assert_equals(document.body.scrollParent, null); },
"scrollParent of body is null.");
test(() => { assert_equals(document.documentElement.scrollParent, null); },
"scrollParent of root is null.");
test(() => { assert_equals(childOfDisplayContents.scrollParent, scroller1); },
"scrollParent skips ancestors with `display: contents`.");
</script>
</html>