1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title> CSS Scroll Snap 2 Test: scrollsnapchange events</title>
<link rel="help" href="https://drafts.csswg.org/css-scroll-snap-2/#snap-events">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/css/css-scroll-snap/snap-events/resources/common.js"></script>
<script src="/css/css-scroll-snap/snap-events/resources/user-scroll-common.js"></script>
<script src="/dom/events/scrolling/scroll_support.js"></script>
<script src="/web-animations/testcommon.js"></script>
</head>
<body>
<style type='text/css'>
:root {
margin: 0px;
padding: 0px;
scroll-snap-type: both mandatory;
}
div {
position: absolute;
margin: 0px;
}
#spacer {
width: 200vw;
height: 200vh;
}
.snap_point {
width: 40vw;
height: 40vh;
scroll-snap-align: start;
}
#snap_point_1 {
left: 0px;
top: 0px;
background-color: red;
}
#snap_point_2 {
top: 35vh;
left: 35vw;
background-color: orange;
}
#snap_point_3 {
left: 70vw;
top: 70vh;
background-color: blue;
}
</style>
<div id="spacer"></div>
<div id="snap_point_1" class="snap_point"></div>
<div id="snap_point_2" class="snap_point"></div>
<div id="snap_point_3" class="snap_point"></div>
<script>
const scroller = document.scrollingElement;
const snap_point_2 = document.getElementById("snap_point_2");
const snap_point_1 = document.getElementById("snap_point_1");
const offset_to_snap_point_2 = {
x: snap_point_2.offsetLeft,
y: snap_point_2.offsetTop
};
// Touch scroll test.
promise_test(async (t) => {
await waitForCompositorCommit();
const start_pos = {
x: scroller.clientWidth / 2,
y: scroller.clientHeight / 2,
};
const end_pos = { x: 0, y: 0 };
const test_data = {
scroller: scroller,
scrolling_function: async () => {
await snap_event_touch_scroll_helper(start_pos, end_pos);
},
expected_snap_targets: { block: snap_point_2, inline: snap_point_2 },
expected_scroll_offsets: {
x: offset_to_snap_point_2.x,
y: offset_to_snap_point_2.y,
}
};
await test_scrollsnapchange(t, test_data);
}, "scrollsnapchange event fires after snap target changes on touch scroll");
// Wheel scroll test.
promise_test(async (t) => {
await waitForCompositorCommit();
const test_data = {
scroller: scroller,
scrolling_function: async () => {
await new test_driver.Actions().scroll(0, 0,
offset_to_snap_point_2.x,
offset_to_snap_point_2.y,
{ origin: scroller }).send();
},
expected_snap_targets: { block: snap_point_2, inline: snap_point_2 },
expected_scroll_offsets: {
x: offset_to_snap_point_2.x,
y: offset_to_snap_point_2.y,
}
};
await test_scrollsnapchange(t, test_data);
}, "scrollsnapchange event fires after snap target changes on wheel scroll");
// Scrollbar drag test.
promise_test(async (t) => {
await waitForCompositorCommit();
// Skip test on platforms that do not have a visible scrollbar (e.g.
// overlay scrollbar).
const scrollbar_width = window.innerWidth -
document.documentElement.clientWidth;
if (scrollbar_width == 0) {
return;
}
const test_data = {
scroller: scroller,
scrolling_function: async () => {
const scrollbar_to_scroller_ratio =
getScrollbarToScrollerRatio(document.documentElement);
// Scroll by just over half of the top box's height.
const drag_amt = (offset_to_snap_point_2.y / 2 + 1) *
scrollbar_to_scroller_ratio;
await snap_event_scrollbar_drag_helper(scroller, scrollbar_width,
drag_amt);
},
expected_snap_targets: { block: snap_point_2, inline: snap_point_1 },
expected_scroll_offsets: {
x: 0,
y: offset_to_snap_point_2.y,
}
};
await test_scrollsnapchange(t, test_data);
}, "scrollsnapchange event fires after snap target changes on scrollbar drag");
// Keyboard test.
promise_test(async (t) => {
const test_data = {
scroller: scroller,
scrolling_function: async () => {
scroller.focus();
window.test_driver.send_keys(document.documentElement,
'\ue015'/*ArrowDown*/);
},
expected_snap_targets: { block: snap_point_2, inline: snap_point_1 },
expected_scroll_offsets: {
x: 0,
y: offset_to_snap_point_2.y,
}
};
await test_scrollsnapchange(t, test_data);
}, "scrollsnapchange event fires after snap target changes on keydown press");
// Touch scroll test (onscrollsnapchange variant).
promise_test(async (t) => {
await waitForCompositorCommit();
const start_pos = {
x: scroller.clientWidth / 2,
y: scroller.clientHeight / 2,
};
const end_pos = { x: 0, y: 0 };
const test_data = {
scroller: scroller,
scrolling_function: async () => {
await snap_event_touch_scroll_helper(start_pos, end_pos);
},
expected_snap_targets: { block: snap_point_2, inline: snap_point_2 },
expected_scroll_offsets: {
x: offset_to_snap_point_2.x,
y: offset_to_snap_point_2.y,
}
};
await test_scrollsnapchange(t, test_data, /*use_onsnap_memeber*/true);
}, "Document.scrollsnapchange event fires after snap target changes on touch " +
"scroll");
promise_test(async (t) => {
await test_no_scrollsnapchange(t, scroller, /*delta*/10);
}, "scrollsnapchange is not fired if snap target doesn't change on user scroll");
</script>
</body>
|