blob: 48f4d077e52ab47fbe7281e068f8a7a0244b7c95 [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;
width: 100%;
height: 100%;
}
#fixed {
position: fixed;
width: 80%;
height: 80%;
top: 10%;
left: 10%;
padding: 20px;
box-sizing: border-box;
background-color: PaleTurquoise;
overflow-y: scroll;
}
#instructions {
width: 100%;
height: 100px;
text-align: center;
}
#scroller {
position: absolute;
border: 5px solid salmon;
clip: rect(0px, 1000px, 500px, 0px);
width: 90%;
height: 300px;
overflow-y: scroll;
}
.box {
position: fixed;
width: 200px;
height: 200px;
border: 2px solid black;
background-color: lightgrey;
}
.subbox {
width: 100%;
height: 80%;
}
.composited {
will-change: transform;
}
.scrolls {
overflow: auto;
}
.spacer {
height: 400%;
width: 100%;
background:repeating-linear-gradient(#FFF 0%, #FFF 10%, #000 10%, #000 20%);
}
</style>
<div id="fixedScroller" class="box scrolls" style="left: 20px; top: 20px">
<div class="spacer"></div>
position: fixed scroller
</div>
<div id="childScroller" class="box" style="right: 20px; top: 20px">
Scroller child of position: fixed non-scroller
<div class="scrolls subbox">
<div class="spacer"></div>
</div>
</div>
<div id="childScrollerFixedScroller" class="box scrolls"
style="left: 20px; bottom: 20px">
<div class="spacer"></div>
Scroller child of position: fixed scroller
<div class="scrolls subbox">
<div class="spacer"></div>
</div>
</div>
<div id="fixedScrollerInFixedTransform" class="box"
style="right: 20px; bottom: 20px; will-change: transform;">
position: fixed scroller child in position: fixed non-scroller
<div class="scrolls subbox" style="position: fixed; top: 40px">
<div class="spacer"></div>
</div>
</div>
<div class="spacer"></div>
<script>
async function scrollBox(box) {
const delta = 100;
// This relies on the fact that the center point of each box is in the
// scroller.
const location = elementCenter(box);
await smoothScroll(delta,
location.x,
location.y,
GestureSourceType.TOUCH_INPUT,
'down',
SPEED_INSTANT);
}
function reset() {
window.scrollTo(0, 0);
}
window.onload = async () => {
// Start with all the scrollers scrolled to their maximal extent. That way
// new scrolls should chain.
const scrollers = document.querySelectorAll('.scrolls');
for(let scroller of scrollers)
scroller.scrollTop = 10000;
promise_test(async () => {
reset();
await waitForCompositorCommit();
assert_equals(window.scrollY, 0, 'Main window starts off unscrolled.');
await scrollBox(document.getElementById('fixedScroller'));
assert_greater_than(window.scrollY, 0,
'Scroll should chained to main window.');
}, 'Position: fixed scroller');
promise_test(async () => {
reset();
await waitForCompositorCommit();
assert_equals(window.scrollY, 0, 'Main window starts off unscrolled.');
await scrollBox(document.getElementById('childScroller'));
assert_greater_than(window.scrollY, 0,
'Scroll should chained to main window.');
}, 'Child scroller of position:fixed layer');
promise_test(async () => {
reset();
await waitForCompositorCommit();
assert_equals(window.scrollY, 0, 'Main window starts off unscrolled.');
await scrollBox(document.getElementById('childScrollerFixedScroller'));
assert_greater_than(window.scrollY, 0,
'Scroll should chained to main window.');
}, 'Child scroller of position:fixed scroller');
promise_test(async () => {
reset();
await waitForCompositorCommit();
assert_equals(window.scrollY, 0, 'Main window starts off unscrolled.');
await scrollBox(document.getElementById('fixedScrollerInFixedTransform'));
assert_greater_than(window.scrollY, 0,
'Scroll should chained to main window.');
}, 'Child position:fixed scroller in fixed and transformed layer');
}
</script>