150 lines
4.7 KiB
JavaScript
150 lines
4.7 KiB
JavaScript
|
|
async function test_scrollend_on_touch_drag(t, target_div) {
|
|
// Skip the test on a Mac as they do not support touch screens.
|
|
const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;
|
|
if (isMac)
|
|
return;
|
|
|
|
await resetTargetScrollState(t, target_div);
|
|
await waitForCompositorReady();
|
|
|
|
const targetScrollendPromise = waitForScrollendEventNoTimeout(target_div);
|
|
verifyNoScrollendOnDocument(t);
|
|
|
|
let scrollend_count = 0;
|
|
const scrollend_listener = () => {
|
|
scrollend_count += 1;
|
|
};
|
|
target_div.addEventListener("scrollend", scrollend_listener);
|
|
t.add_cleanup(() => {
|
|
target_div.removeEventListener('scrollend', scrollend_listener);
|
|
});
|
|
|
|
// Perform a touch drag on target div and wait for target_div to get
|
|
// a scrollend event.
|
|
await new test_driver.Actions()
|
|
.addPointer('TestPointer', 'touch')
|
|
.pointerMove(0, 0, { origin: target_div }) // 0, 0 is center of element.
|
|
.pointerDown()
|
|
.addTick()
|
|
.pointerMove(0, -40, { origin: target_div }) // Drag up to move down.
|
|
.addTick()
|
|
.pause(200) // Prevent inertial scroll.
|
|
.pointerMove(0, -60, { origin: target_div })
|
|
.addTick()
|
|
.pause(200) // Prevent inertial scroll.
|
|
.pointerUp()
|
|
.send();
|
|
|
|
await targetScrollendPromise;
|
|
|
|
assert_true(target_div.scrollTop > 0);
|
|
await verifyScrollStopped(t, target_div);
|
|
assert_equals(scrollend_count, 1);
|
|
}
|
|
|
|
async function test_scrollend_on_scrollbar_gutter_click(t, target_div) {
|
|
// Skip test on platforms that do not have a visible scrollbar (e.g.
|
|
// overlay scrollbar).
|
|
const scrollbar_width = target_div.offsetWidth - target_div.clientWidth;
|
|
if (scrollbar_width == 0)
|
|
return;
|
|
|
|
await resetTargetScrollState(t, target_div);
|
|
await waitForCompositorReady();
|
|
|
|
const targetScrollendPromise = waitForScrollendEventNoTimeout(target_div);
|
|
verifyNoScrollendOnDocument(t);
|
|
|
|
const bounds = target_div.getBoundingClientRect();
|
|
// Some versions of webdriver have been known to frown at non-int arguments
|
|
// to pointerMove.
|
|
const x = Math.round(bounds.right - scrollbar_width / 2);
|
|
const y = Math.round(bounds.bottom - 20);
|
|
await new test_driver.Actions()
|
|
.addPointer('TestPointer', 'mouse')
|
|
.pointerMove(x, y, { origin: 'viewport' })
|
|
.pointerDown()
|
|
.addTick()
|
|
.pointerUp()
|
|
.send();
|
|
|
|
await targetScrollendPromise;
|
|
assert_true(target_div.scrollTop > 0);
|
|
await verifyScrollStopped(t, target_div);
|
|
}
|
|
|
|
// Same issue as previous test.
|
|
async function test_scrollend_on_scrollbar_thumb_drag(t, target_div) {
|
|
// Skip test on platforms that do not have a visible scrollbar (e.g.
|
|
// overlay scrollbar).
|
|
const scrollbar_width = target_div.offsetWidth - target_div.clientWidth;
|
|
if (scrollbar_width == 0)
|
|
return;
|
|
|
|
await resetTargetScrollState(t, target_div);
|
|
await waitForCompositorReady();
|
|
|
|
const targetScrollendPromise = waitForScrollendEventNoTimeout(target_div);
|
|
verifyNoScrollendOnDocument(t);
|
|
|
|
const bounds = target_div.getBoundingClientRect();
|
|
// Some versions of webdriver have been known to frown at non-int arguments
|
|
// to pointerMove.
|
|
const x = Math.round(bounds.right - scrollbar_width / 2);
|
|
const y = Math.round(bounds.top + 30);
|
|
const dy = 30;
|
|
await new test_driver.Actions()
|
|
.addPointer('TestPointer', 'mouse')
|
|
.pointerMove(x, y, { origin: 'viewport' })
|
|
.pointerDown()
|
|
.pointerMove(x, y + dy, { origin: 'viewport' })
|
|
.addTick()
|
|
.pointerUp()
|
|
.send();
|
|
|
|
await targetScrollendPromise;
|
|
assert_true(target_div.scrollTop > 0);
|
|
await verifyScrollStopped(t, target_div);
|
|
}
|
|
|
|
async function test_scrollend_on_mousewheel_scroll(t, target_div, frame) {
|
|
await resetTargetScrollState(t, target_div);
|
|
await waitForCompositorReady();
|
|
|
|
const targetScrollendPromise = waitForScrollendEventNoTimeout(target_div);
|
|
verifyNoScrollendOnDocument(t);
|
|
|
|
let scroll_origin = target_div;
|
|
if (frame) {
|
|
// chromedriver doesn't support passing { origin: element }
|
|
// for an element within a subframe. Use the frame element itself.
|
|
scroll_origin = frame;
|
|
}
|
|
const x = 0;
|
|
const y = 0;
|
|
const dx = 0;
|
|
const dy = 40;
|
|
await new test_driver.Actions()
|
|
.scroll(x, y, dx, dy, { origin: scroll_origin })
|
|
.send();
|
|
|
|
await targetScrollendPromise;
|
|
assert_true(target_div.scrollTop > 0);
|
|
await verifyScrollStopped(t, target_div);
|
|
}
|
|
|
|
async function test_scrollend_on_keyboard_scroll(t, target_div) {
|
|
await resetTargetScrollState(t, target_div);
|
|
await waitForCompositorReady();
|
|
|
|
verifyNoScrollendOnDocument(t);
|
|
const targetScrollendPromise = waitForScrollendEventNoTimeout(target_div);
|
|
|
|
target_div.focus();
|
|
window.test_driver.send_keys(target_div, '\ue015');
|
|
|
|
await targetScrollendPromise;
|
|
assert_true(target_div.scrollTop > 0);
|
|
await verifyScrollStopped(t, target_div);
|
|
}
|