| <!DOCTYPE html> <!-- webkit-test-runner [ AsyncOverflowScrollingEnabled=true ] --> |
| <html> |
| <head> |
| <style> |
| body { |
| height: 2000px; |
| } |
| select { |
| margin-top: 100px; |
| font-size: 12pt; |
| } |
| </style> |
| <script src="../../../resources/js-test-pre.js"></script> |
| <script src="../../../resources/ui-helper.js"></script> |
| <script> |
| jsTestIsAsync = true; |
| |
| let selectScrollCount = 0; |
| let pageScrollCount = 0; |
| |
| async function scrollTest() |
| { |
| let select = document.getElementsByTagName('select')[0]; |
| select.addEventListener('scroll', () => { |
| ++selectScrollCount; |
| }); |
| |
| window.addEventListener('scroll', () => { |
| ++pageScrollCount; |
| }); |
| |
| debug('Checking wheel event over the select'); |
| await UIHelper.mouseWheelScrollAt(50, 200); |
| |
| shouldBeTrue('selectScrollCount > 0'); |
| shouldBeTrue('pageScrollCount == 0'); |
| |
| selectScrollCount = 0; |
| |
| debug('Triggering main page latch; scrolling down'); |
| await UIHelper.mouseWheelScrollAt(400, 200); |
| |
| await UIHelper.animationFrame(); |
| |
| debug('Triggering main page latch; scrolling up'); |
| |
| eventSender.mouseMoveTo(400, 200); |
| eventSender.monitorWheelEvents({ resetLatching: false }); |
| eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 2, 'began', 'none'); |
| eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 11, 'changed', 'none'); |
| eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, 'ended', 'none'); |
| await UIHelper.waitForScrollCompletion(); |
| |
| shouldBeTrue('selectScrollCount == 0'); |
| shouldBeTrue('pageScrollCount > 0'); |
| |
| shouldBeTrue('document.scrollingElement.scrollTop == 0'); |
| |
| // Stupid hack to reset the select back to the top (webkit.org/b/215898). |
| pageScrollCount = 0; |
| select.style.display = 'none'; |
| document.body.offsetWidth; |
| select.style.display = 'inline'; |
| |
| // Delay for longer than resetLatchedStateTimeout. |
| await UIHelper.delayFor(150); |
| |
| debug('Checking wheel event over the select again'); |
| eventSender.mouseMoveTo(50, 200); |
| eventSender.monitorWheelEvents({ resetLatching: false }); |
| eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -1, 'began', 'none'); |
| eventSender.mouseScrollByWithWheelAndMomentumPhases(0, -5, 'changed', 'none'); |
| eventSender.mouseScrollByWithWheelAndMomentumPhases(0, 0, 'ended', 'none'); |
| await UIHelper.waitForScrollCompletion(); |
| |
| shouldBeTrue('selectScrollCount > 0'); |
| shouldBeTrue('pageScrollCount == 0'); |
| |
| finishJSTest(); |
| } |
| |
| window.addEventListener('load', () => { |
| description("Tests that scrolling doesn't get wrongly latched to the main page."); |
| setTimeout(scrollTest, 0); |
| }, false); |
| </script> |
| </head> |
| <body> |
| <select size="10"> |
| <option>first first first</option> |
| <option>two two two two</option> |
| <option>one one one one</option> |
| <option>two two two two</option> |
| <option>one one one one</option> |
| <option>two two two two</option> |
| <option>one one one one</option> |
| <option>two two two two</option> |
| <option>one one one one</option> |
| <option>two two two two</option> |
| <option>one one one one</option> |
| <option>two two two two</option> |
| <option>one one one one</option> |
| <option>two two two two</option> |
| <option>one one one one</option> |
| <option>two two two two</option> |
| <option>last last last</option> |
| </select> |
| <div id="console"></div> |
| <script src="../../../resources/js-test-post.js"></script> |
| </body> |
| </html> |