<!DOCTYPE html>
<html>
<head>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../resources/gesture-util.js"></script>
<style>
#scroller {
position: absolute;
overflow: auto;
left: 20px;
top: 20px;
width: 600px;
height: 400px;
}
#scroller::-webkit-scrollbar {
width: 20px;
height: 20px;
background: #abc;
}
#scroller::-webkit-scrollbar-thumb {
background: black;
border-radius: 10px;
}
.space {
height: 2000px;
position: absolute;
}
#text {
font: 20px monospace;
padding: 20px;
}
</style>
</head>
<body>
<div id=scroller>
<div class=space>
<div id=text>
x
</div>
</div>
</div>
<script>
churnLayout = () => {
text.innerText += " x";
requestAnimationFrame(churnLayout);
};
churnLayout();
var STATES = [0, 1, 2, 3, 4, 3, 2, 1, 0, 3, 1, 2, 4, 0];
var thumb_x = 610;
var thumb_y = state => 30 + state * 80;
var expected_y = state => state * 400;
var steps = new Promise((resolve, reject) => {
var cur = 0;
scroller.onscroll = () => {
var y = scroller.scrollTop;
text.style.marginTop = Math.min(1900, y) + "px";
++cur;
var next = cur + 1;
try {
assert_equals(y, expected_y(STATES[cur]));
} catch (e) {
reject(e);
}
if (next == STATES.length)
resolve();
else
mouseMoveTo(thumb_x, thumb_y(STATES[next]), Buttons.LEFT);
};
});
promise_test(async (t) => {
await mouseMoveTo(thumb_x, thumb_y(STATES[0]));
await mouseDownAt(thumb_x, thumb_y(STATES[0]));
await mouseMoveTo(thumb_x, thumb_y(STATES[1]), Buttons.LEFT);
await steps;
}, "Scroll offset responds correctly to thumb drags.");
</script>
</body>
</html>