blob: 69df9ed2a09b7c1722e665a4f46ce30ca626259d [file] [log] [blame]
<!DOCTYPE html>
<script src='../../resources/testharness.js'></script>
<script src='../../resources/testharnessreport.js'></script>
<script src='../../resources/gesture-util.js'></script>
<style>
body, html {
margin: 0;
}
#sticky {
position: sticky;
width: 80%;
height: 400px;
top: 5px;
left: 10%;
padding: 20px;
box-sizing: border-box;
background-color: PaleTurquoise;
}
#instructions {
width: 100%;
text-align: center;
}
#scroller {
position: absolute;
border: 5px solid salmon;
clip: rect(0px, 1000px, 500px, 0px);
width: 90%;
height: 150px;
overflow-y: scroll;
}
.spacer {
height: 400%;
background:repeating-linear-gradient(#FFF 0%, #FFF 10%, #000 10%, #000 20%);
}
</style>
<div style="height:300px"></div>
<div id="sticky">
<div id="instructions">
<p>
This turquoise box is a position: sticky box. The black-and-white scroller
beelow has a clip region so should be non-composited. The document has
scrolling of its own.
</p>
<p>
Scroll the document down so the turquoise box is not quite aligned with
the viewport top but enough that the scroller below no longer overlaps
its original position. Now attempt to scroll over the black-and-white
scroller with wheel or touch. If box must scroll; the document must not
scroll.
</p>
<p>
Continue to scroll the document down so the turquoise box becomes fixed
to the viewport top. Now attempt to scroll over the black-and-white
scroller with wheel or touch. It should scroll as before, the document
must not scroll.
</p>
</div>
<div id="scroller">
<div class="spacer"></div>
</div>
</div>
<div style="height:1000px"></div>
<script>
window.onload = async () => {
await waitForCompositorCommit();
const scroller = document.getElementById('scroller');
promise_test(async () => {
assert_equals(scroller.scrollTop, 0, "Scroller starts off unscrolled.");
assert_equals(window.scrollY, 0, "Window starts off unscrolled.");
// Scroll over the document so that the page gets scrolled down. Scroll
// far enough that the scroller no longer overlaps its original position,
// but not so far that the sticky box has become fixed.
{
const delta = scroller.clientHeight * 1.5;
const location = { x: 5, y: 5 };
await smoothScroll(delta,
location.x,
location.y,
GestureSourceType.TOUCH_INPUT,
'down',
SPEED_INSTANT);
// Ensure we've scrolled more than the scroller height to ensure a
// NonFastScrollableRect bug related to scroll would be reproducible
// over the entire scroller.
assert_greater_than(window.scrollY, scroller.clientHeight,
"Document should have been scrolled.");
}
// Now perform a scroll over the scroller rect. Ensure we targetted the
// correct scroller.
{
const delta = 100;
const location = elementCenter(scroller);
await smoothScroll(delta,
location.x,
location.y,
GestureSourceType.TOUCH_INPUT,
'down',
SPEED_INSTANT);
assert_greater_than(scroller.scrollTop, 0,
"Scroller should be scrolled while sticky box is " +
"unfixed.");
}
// Scroll the document down now until the sticky box becomes fixed.
{
const delta = scroller.clientHeight * 2;
const location = { x: 5, y: 5 };
await smoothScroll(delta,
location.x,
location.y,
GestureSourceType.TOUCH_INPUT,
'down',
SPEED_INSTANT);
// Ensure we've scrolled more than the scroller height to ensure a
// NonFastScrollableRect bug related to scroll would be reproducible
// over the entire scroller.
assert_greater_than(window.scrollY, 300,
"Document should have been scrolled until sticky " +
"box is fixed.");
}
// Again perform a scroll over the scroller rect. Ensure we targetted the
// correct scroller.
{
const delta = 1000;
const location = elementCenter(scroller);
await smoothScroll(delta,
location.x,
location.y,
GestureSourceType.TOUCH_INPUT,
'up',
SPEED_INSTANT);
assert_equals(scroller.scrollTop, 0,
"Scroller should be scrolled when sticky box is fixed.");
}
}, 'Scrolling over an uncomposited scroller inside a composited position' +
': sticky element.');
}
</script>