Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test has a WPT meta file that expects 2 subtest issues.
- This WPT test may be referenced by the following Test IDs:
- /css/css-scroll-snap-2/scrollsnapchange/scrollsnapchange-same-targets-after-layout-changed.html - WPT Dashboard Interop Dashboard
<!DOCTYPE html>
<html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/dom/events/scrolling/scroll_support.js"></script>
<script src="/css/css-scroll-snap-2/resources/common.js"></script>
<style>
#scroller {
overflow-y: scroll;
scroll-snap-type: y mandatory;
width: 500px;
height: 500px;
background-color: white;
position: relative;
}
.large_space {
position: absolute;
height: 100vh;
width: 100vw;
}
.space_filler {
display: inline-block;
width: 40%;
height: 30%;
background-color: green;
}
.snap_area {
scroll-snap-align: start;
background-color: yellow;
position: absolute;
width: 40%;
height: 30%;
top: 500px;
}
.left {
left: 1px;
}
.right {
left: 41%;
}
</style>
</head>
<body>
<div id="scroller">
<div class="large_space"></div>
<div class="space_filler"></div>
<div class="space_filler"></div>
<div class="space_filler"></div>
<div class="space_filler"></div>
<div class="space_filler"></div>
<div class="space_filler"></div>
<div class="space_filler"></div>
<div class="space_filler"></div>
<div id="left" class="snap_area left"><h1>1</h1></div>
<div id="right" class="snap_area right"><h1>2</h1></div>
</div>
<script>
let unreached_func = null;
promise_test(async (t) => {
checkSnapEventSupport("scrollsnapchange");
await waitForCompositorCommit();
unreached_func = t.unreached_func("scrollsnapchange shouldn't fire " +
"since the scroller is snapped to the same elements.");
scroller.addEventListener("scrollsnapchange", unreached_func);
t.add_cleanup(() => {
scroller.removeEventListener("scrollsnapchange", unreached_func);
});
assert_greater_than(right.offsetLeft, left.offsetLeft,
"boxes have switched positions.");
// Switch the boxes' horizontal positions.
right.style.left = "1px";
left.style.left = "41%";
await waitForCompositorCommit();
assert_less_than(right.offsetLeft, left.offsetLeft,
"boxes have switched positions.");
await waitForCompositorCommit();
}, "scrollsnapchange doesn't fire after layout change if snapped to the same " +
"elements");
promise_test(async (t) => {
checkSnapEventSupport("scrollsnapchange");
await waitForCompositorCommit();
unreached_func = t.unreached_func("scrollsnapchange shouldn't fire " +
"since the scroller is snapped to the same elements.");
scroller.addEventListener("scrollsnapchange", unreached_func);
t.add_cleanup(() => {
scroller.removeEventListener("scrollsnapchange", unreached_func);
});
const scrollend_promise = waitForScrollendEventNoTimeout(scroller);
// Move the boxes to the same vertical level. Both boxes should still be
// considered snapped to so scrollsnapchange should not be triggerred.
right.style.top = `0px`;
left.style.top = `0px`;
await scrollend_promise;
assert_equals(scroller.scrollTop, 0);
await waitForCompositorCommit();
}, "scrollsnapchange doesn't fire after snap to the same targets after scroll. " +
"elements");
</script>
</body>
</html>