blob: 30f16571cd83201e039fd9e682e0cca6b8569d76 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<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="scroll_support.js"></script>
<style>
#targetDiv {
width: 200px;
height: 200px;
overflow: scroll;
}
#innerDiv {
width: 400px;
height: 400px;
}
</style>
</head>
<body style="margin:0" onload=runTest()>
<div id="targetDiv">
<div id="innerDiv">
</div>
</div>
</body>
<script>
var target_div = document.getElementById('targetDiv');
var scrollend_arrived = false;
function onScrollEnd(event) {
assert_false(event.cancelable);
assert_false(event.bubbles);
scrollend_arrived = true;
}
function resetTargetScrollState() {
target_div.scrollTop = 0;
target_div.scrollLeft = 0;
}
function checkFinalPosition(target, position, pause_time_in_ms) {
return new Promise((resolve, reject) => {
step_timeout(() => {
resolve();
assert_equals(position.x, target.scrollLeft);
assert_equals(position.y, target.scrollTop);
}, pause_time_in_ms);
});
}
target_div.addEventListener("scrollend", onScrollEnd);
function runTest() {
promise_test(async (t) => {
// Make sure that no scrollend event is sent to window.
window.addEventListener("scrollend",
t.unreached_func("window got unexpected scrollend event."));
await waitForCompositorCommit();
scrollend_arrived = false;
// Perform drag action on target div and wait for target_div to get scrollend event.
var origin = { x: target_div.offsetWidth / 2, y: target_div.offsetHeight - 50 };
var delta = { x: 0, y: 40 };
await mouseActionsInTarget(target_div, origin, delta, 300);
await waitFor(() => { return scrollend_arrived; },
'target_div did not receive scrollend event after dragging scroll on target.');
assert_true(target_div.scrollTop > 0);
await checkFinalPosition(target_div, {x: target_div.scrollLeft, y: target_div.scrollTop}, 300);
}, 'Tests that the target_div gets scrollend event when dragging scroll on target.');
promise_test(async (t) => {
resetTargetScrollState();
// Make sure that no scrollend event is sent to window.
window.addEventListener("scrollend",
t.unreached_func("window got unexpected scrollend event."));
await waitForCompositorCommit();
scrollend_arrived = false;
// Hit the scrollbar of target div and wait for target_div to get scrollend event.
var scrollbar_width = target_div.offsetWidth - target_div.clientWidth;
assert_true(scrollbar_width > 0, "This test requires scrollbar.");
var origin = {x: target_div.offsetWidth - scrollbar_width / 2, y: target_div.offsetHeight - 50};
var delta = {x: 0, y: 0};
await mouseActionsInTarget(target_div, origin, delta, 100);
await waitFor(() => { return scrollend_arrived; },
'target_div did not receive scrollend event after clicking scrollbar on target.');
assert_true(target_div.scrollTop > 0);
await checkFinalPosition(target_div, { x: target_div.scrollLeft, y: target_div.scrollTop }, 300);
}, 'Tests that the target_div gets scrollend event when click scrollbar on target.');
promise_test(async (t) => {
resetTargetScrollState();
// Make sure that no scrollend event is sent to window.
window.addEventListener("scrollend",
t.unreached_func("window got unexpected scrollend event."));
await waitForCompositorCommit();
scrollend_arrived = false;
// Drag the thumb of target div.
var scrollbar_width = target_div.offsetWidth - target_div.clientWidth;
assert_true(scrollbar_width > 0, "This test requires scrollbar.");
var origin = { x: target_div.offsetWidth - scrollbar_width / 2, y: 50 };
var delta = { x: 0, y: 20 };
await mouseActionsInTarget(target_div, origin, delta, 100);
await waitFor(() => { return scrollend_arrived; },
'target_div did not receive scrollend event after dragging the thumb of target.');
assert_true(target_div.scrollTop > 0);
await checkFinalPosition(target_div, { x: target_div.scrollLeft, y: target_div.scrollTop }, 300);
}, 'Tests that the target_div gets scrollend event when drag the thumb of target.');
promise_test(async (t) => {
resetTargetScrollState();
// Make sure that no scrollend event is sent to window.
window.addEventListener("scrollend",
t.unreached_func("window got unexpected scrollend event."));
await waitForCompositorCommit();
scrollend_arrived = false;
// Hit and active the target div.
var origin = { x: target_div.offsetWidth / 2, y: target_div.offsetHeight / 2};
var delta = { x: 0, y: 0 };
await mouseActionsInTarget(target_div, origin, delta, 100);
// Send DOWN key to the target div.
window.test_driver.send_keys(target_div, '\ue015');
await waitFor(() => { return scrollend_arrived; },
'target_div did not receive scrollend event after sending DOWN key to target.');
assert_true(target_div.scrollTop > 0);
await checkFinalPosition(target_div, { x: target_div.scrollLeft, y: target_div.scrollTop }, 300);
}, 'Tests that the target_div gets scrollend event when send DOWN key to target.');
}
</script>
</html>