| |
| 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); |
| } |