Files
sousa-gecko/testing/web-platform/tests/css/cssom-view/scrollParent.html
T
Sanfeng Liao 5d57f3deb6 Bug 2024168 [wpt PR 58421] - Fix scrollParent for body when body is not the scrolling element, a=testonly
Automatic update from web-platform-tests
Fix scrollParent for body when body is not the scrolling element

CSSWG resolved that scrollParent of root should be null, and
scrollParent of body should be null iff body is the scrollingElement.
See: https://github.com/w3c/csswg-drafts/issues/12723#issuecomment-3998966905

Previously Blink returned null for body unconditionally. This CL
updates the logic so that body returns null only when it is the
document's scrolling element, and returns the scrolling element
otherwise. The WPT expectation is updated accordingly.

Bug: 489746731
Change-Id: I59c3d2e27defffa80d6e5c7335d208b161d8f904
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7637954
Reviewed-by: Fredrik Söderquist <fs@opera.com>
Commit-Queue: Fredrik Söderquist <fs@opera.com>
Reviewed-by: Robert Flack <flackr@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1600518}

--

wpt-commits: c2cc9b77b02a270882baca3d4b7857fad9a82242
wpt-pr: 58421
2026-03-30 08:03:20 +00:00

99 lines
3.4 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>CSSOM View —— scrollParent test</title>
<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-htmlelement-scrollparent">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
.scroller {
overflow: scroll;
height: 100px;
}
.hidden {
overflow: hidden;
}
.clip {
overflow: clip;
}
.relpos {
position: relative;
}
.abspos {
position: absolute;
}
.fixedpos {
position: fixed;
}
#noBox {
display: none;
}
.contains-fixed {
transform: scale(1);
contain: paint;
}
</style>
</head>
<body>
<div id="childOfRoot"></div>
<div class="contains-fixed">
<div id="fixedContainedByRoot" class="fixedpos"></div>
</div>
<div id="scroller3" class="scroller">
<div id="fixedToRoot" class="fixedpos"></div>
<!-- Contains the fixed positioned descendant. -->
<div class="contains-fixed">
<div id="scroller2" class="scroller">
<!-- Contains the absolute positioned descendant. -->
<div class="relpos">
<div id="scroller1" class="scroller">
<div>
<div id="normalChild"></div>
<div id="noBox"></div>
<div id="absPosChild" class="abspos"></div>
<div id="fixedPosChild" class="fixedpos"></div>
</div>
<!-- Overflow: hidden is also a scroll container. -->
<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>
</div>
</div>
</body>
<script>
test(() => { assert_equals(normalChild.scrollParent(), scroller1); },
"scrollParent returns the nearest scroll container.");
test(() => { assert_equals(childOfHidden.scrollParent(), hidden); },
"hidden element is a scroll container.");
test(() => { assert_equals(noBox.scrollParent(), null); },
"Element with no box has null scrollParent.");
test(() => { assert_equals(absPosChild.scrollParent(), scroller2); },
"scrollParent follows absolute positioned containing block chain.");
test(() => { assert_equals(fixedPosChild.scrollParent(), scroller3); },
"scrollParent follows fixed positioned containing block chain.");
test(() => { assert_equals(fixedToRoot.scrollParent(), null); },
"scrollParent of element fixed to root is null.");
test(() => { assert_equals(childOfRoot.scrollParent(), document.scrollingElement); },
"scrollParent of child in root viewport returns document scrolling element.");
test(() => { assert_equals(fixedContainedByRoot.scrollParent(), document.scrollingElement); },
"scrollParent of fixed element contained within root is document scrolling element.");
test(() => {
assert_not_equals(document.body, document.scrollingElement);
assert_equals(document.body.scrollParent(), document.scrollingElement);
}, "scrollParent of body is document scrolling element when body is not document scrolling element.");
test(() => { assert_equals(document.documentElement.scrollParent(), null); },
"scrollParent of root is null.");
test(() => { assert_equals(childOfDisplayContents.scrollParent(), scroller1); },
"scrollParent skips ancestors with `display: contents`.");
test(() => { assert_equals(document.scrollingElement.scrollParent(), null); },
"scrollParent of scrolling element is null.");
</script>
</html>