blob: 026b2e7673c8b863dc27072a9a4b06664f46d051 [file] [log] [blame]
<!DOCTYPE html>
<meta charset="utf-8">
<title>ScrollTimeline current time algorithm</title>
<link rel="help" href="https://wicg.github.io/scroll-animations/#current-time-algorithm">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/web-animations/testcommon.js"></script>
<script src="./resources/scrolltimeline-utils.js"></script>
<body></body>
<script>
'use strict';
promise_test(async t => {
const scroller = setupScrollTimelineTest();
const scrollerSize = scroller.scrollHeight - scroller.clientHeight;
const scrollTimeline = new ScrollTimeline({
scrollSource: scroller,
timeRange: scrollerSize,
orientation: 'block',
scrollOffsets: [CSS.px(10), CSS.px(20), CSS.px(40), CSS.px(70), CSS.px(90)],
});
var offset = 0;
var w = 1 / 4; // offset weight
var p = 0; // progress within the offset
scroller.scrollTop = 10;
assert_times_equal(
scrollTimeline.currentTime, (offset + p) * w * scrollerSize,
"current time calculation when scroll = " + scroller.scrollTop);
p = (12 - 10) / (20 - 10);
scroller.scrollTop = 12;
await waitForNextFrame();
assert_times_equal(
scrollTimeline.currentTime, (offset + p) * w * scrollerSize,
"current time calculation when scroll = " + scroller.scrollTop);
offset = 1;
p = 0;
scroller.scrollTop = 20;
await waitForNextFrame();
assert_times_equal(
scrollTimeline.currentTime, (offset + p) * w * scrollerSize,
"current time calculation when scroll = " + scroller.scrollTop);
p = (35 - 20) / (40 - 20);
scroller.scrollTop = 35;
await waitForNextFrame();
assert_times_equal(
scrollTimeline.currentTime, (offset + p) * w * scrollerSize,
"current time calculation when scroll = " + scroller.scrollTop);
offset = 2;
p = 0;
scroller.scrollTop = 40;
await waitForNextFrame();
assert_times_equal(
scrollTimeline.currentTime, (offset + p) * w * scrollerSize,
"current time calculation when scroll = " + scroller.scrollTop);
p = (60 - 40) / (70 - 40);
scroller.scrollTop = 60;
await waitForNextFrame();
assert_times_equal(
scrollTimeline.currentTime, (offset + p) * w * scrollerSize,
"current time calculation when scroll = " + scroller.scrollTop);
offset = 3;
p = 0;
scroller.scrollTop = 70;
await waitForNextFrame();
assert_times_equal(
scrollTimeline.currentTime, (offset + p) * w * scrollerSize,
"current time calculation when scroll = " + scroller.scrollTop);
p = (80 - 70) / (90 - 70);
scroller.scrollTop = 80;
await waitForNextFrame();
assert_times_equal(
scrollTimeline.currentTime, (offset + p) * w * scrollerSize,
"current time calculation when scroll = " + scroller.scrollTop);
scroller.scrollTop = 90;
await waitForNextFrame();
assert_times_equal(
scrollTimeline.currentTime, scrollerSize,
"current time calculation when scroll = " + scroller.scrollTop);
}, 'currentTime calculations when multiple scroll offsets are specified');
promise_test(async t => {
const scroller = setupScrollTimelineTest();
const scrollerSize = scroller.scrollHeight - scroller.clientHeight;
var scrollTimeline = new ScrollTimeline({
scrollSource: scroller,
timeRange: scrollerSize,
orientation: 'block',
scrollOffsets: [CSS.px(300), CSS.px(200), CSS.px(10)],
});
scroller.scrollTop = 250;
await waitForNextFrame();
assert_times_equal(
scrollTimeline.currentTime, 0,
"current time calculation when scroll = " + scroller.scrollTop);
scroller.scrollTop = 400;
await waitForNextFrame();
assert_times_equal(
scrollTimeline.currentTime, scrollerSize,
"current time calculation when scroll = " + scroller.scrollTop);
scrollTimeline = new ScrollTimeline({
scrollSource: scroller,
timeRange: scrollerSize,
orientation: 'block',
scrollOffsets: [CSS.px(0), CSS.px(400), CSS.px(200)],
});
scroller.scrollTop = 100;
await waitForNextFrame();
assert_times_equal(
scrollTimeline.currentTime, 0.25 * 0.5 * scrollerSize,
"current time calculation when scroll = " + scroller.scrollTop);
scrollTimeline = new ScrollTimeline({
scrollSource: scroller,
timeRange: scrollerSize,
orientation: 'block',
scrollOffsets: [CSS.px(200), CSS.px(0), CSS.px(400)],
});
scroller.scrollTop = 200;
await waitForNextFrame();
assert_times_equal(
scrollTimeline.currentTime, 0.5 * scrollerSize + 0.5 * 0.5 * scrollerSize,
"current time calculation when scroll = " + scroller.scrollTop);
}, 'currentTime calculations when overlapping scroll offsets are specified');
</script>