| <!DOCTYPE html> | |
| <title>Smooth scrolling of overflow: hidden should be interruptible</title> | |
| <link rel="help" href="https://drafts.csswg.org/cssom-view/#concept-smooth-scroll"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="/dom/events/scrolling/scroll_support.js"></script> | |
| <style> | |
| #scroller { | |
| overflow-y: hidden; | |
| width: 100px; | |
| height: 100px; | |
| scroll-behavior: smooth; | |
| } | |
| .green { | |
| width: 100px; | |
| height: 100px; | |
| background: green; | |
| } | |
| .red { | |
| width: 100px; | |
| height: 100px; | |
| background: red; | |
| } | |
| </style> | |
| <div id="scroller"> | |
| <div class="green"></div> | |
| <div class="red"></div> | |
| <div class="green"></div> | |
| </div> | |
| <script> | |
| promise_test(async () => { | |
| await waitForCompositorReady(); | |
| }, 'Make sure the page is ready for animation.'); | |
| let interrupted = false; | |
| promise_test(() => { | |
| return new Promise(function(resolve, reject) { | |
| scroller.onscrollend = (event) => { | |
| try { | |
| if (interrupted) { | |
| assert_equals(scroller.scrollTop, 1, | |
| 'Scroll should end at 1 when interrupted'); | |
| } else { | |
| // If the testing environment doesn't support smooth scrolling, this | |
| // test will not interrupt the scroll, and we can simply assert that | |
| // the scroll ended at 200. | |
| assert_equals(scroller.scrollTop, 200, | |
| 'Scroll should end at 200 if not interrupted'); | |
| } | |
| resolve(); | |
| } catch(e) { | |
| reject(e); | |
| } | |
| }; | |
| scroller.onscroll = (event) => { | |
| if (scroller.scrollTop > 1 && scroller.scrollTop < 200) { | |
| // Interrupt the smooth scroll. | |
| scroller.scrollTop = 1; | |
| interrupted = true; | |
| } | |
| }; | |
| scroller.scrollTop = 200; | |
| }); | |
| }, 'scrollTop should be updated after a mid-scroll scrollTop change'); | |
| </script> |