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; 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)]) .with_base_flat(|base| vec![(base.style.clone(), base.base_fragment_info.flags)])
.first() .first()
.cloned()?; .cloned()
else {
continue;
};
let is_containing_block = match current_position_value { let is_containing_block = match current_position_value {
Position::Static | Position::Relative | Position::Sticky => { Position::Static | Position::Relative | Position::Sticky => {

View file

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

View file

@ -57,6 +57,10 @@
<div id="hidden" class="hidden"> <div id="hidden" class="hidden">
<div id="childOfHidden"></div> <div id="childOfHidden"></div>
</div> </div>
<!-- No box with `display: contents` -->
<div style="display: contents">
<div id="childOfDisplayContents"></div>
</div>
</div> </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."); "scrollParent of fixed element contained within root is document scrolling element.");
test(() => { assert_equals(document.body.scrollParent, null); }, test(() => { assert_equals(document.body.scrollParent, null); },
"scrollParent of body is 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> </script>
</html> </html>