| <!DOCTYPE html> |
| <title>@container: scroll-state(scrolled) user mouse drag scroll</title> |
| <link rel="help" href="https://drafts.csswg.org/css-conditional-5/#scrolled"> |
| <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="/web-animations/testcommon.js"></script> |
| <script src="/dom/events/scrolling/scroll_support.js"></script> |
| <script src="/css/css-conditional/container-queries/support/cq-testcommon.js"></script> |
| <style> |
| #scroller { |
| width: 200px; |
| height: 200px; |
| container-type: scroll-state; |
| overflow: scroll; |
| } |
| #filler { |
| height: 600px; |
| width: 600px; |
| } |
| #target { |
| --none: no; |
| --x: no; |
| --y: no; |
| @container scroll-state(scrolled: none) { |
| --none: yes; |
| } |
| @container scroll-state(scrolled: y) { |
| --y: yes; |
| } |
| @container scroll-state(scrolled: x) { |
| --x: yes; |
| } |
| } |
| </style> |
| <div id="scroller"> |
| <div id="filler"> |
| <div id="target"></div> |
| </div> |
| </div> |
| <script> |
| setup(() => assert_implements_scroll_state_container_queries()); |
| |
| function drag_scrollbar(start_pos, end_pos) { |
| return new test_driver.Actions() |
| .addPointer("TestPointer", "mouse") |
| .pointerMove(Math.round(start_pos.x), Math.round(start_pos.y)) |
| .pointerDown() |
| .addTick(100) |
| .pointerMove(Math.round(end_pos.x), Math.round(end_pos.y)) |
| .pointerUp() |
| .send(); |
| } |
| |
| promise_test(async t => { |
| let scrollEndPromise = waitForScrollEndFallbackToDelayWithoutScrollEvent(scroller); |
| |
| // Skip test on platforms that do not have a visible scrollbar (e.g. |
| // overlay scrollbar). |
| const scrollbar_width = scroller.offsetWidth - scroller.clientWidth; |
| if (scrollbar_width == 0) { |
| return; |
| } |
| assert_equals(scroller.scrollTop, 0); |
| |
| // Vertical scrollbar position top right |
| const start_pos = { |
| x: 200, |
| y: 30, |
| }; |
| const end_pos = { x: 200, y: 200 }; |
| |
| await drag_scrollbar(start_pos, end_pos); |
| await scrollEndPromise; |
| await waitForAnimationFrames(2); |
| |
| assert_not_equals(scroller.scrollTop, 0); |
| assert_equals(getComputedStyle(target).getPropertyValue("--none"), "yes"); |
| assert_equals(getComputedStyle(target).getPropertyValue("--y"), "no"); |
| |
| }, "Vertical scrollbar drag scroll"); |
| |
| promise_test(async t => { |
| let scrollEndPromise = waitForScrollEndFallbackToDelayWithoutScrollEvent(scroller); |
| |
| // Skip test on platforms that do not have a visible scrollbar (e.g. |
| // overlay scrollbar). |
| const scrollbar_height = scroller.offsetHeight - scroller.clientHeight; |
| if (scrollbar_height == 0) { |
| return; |
| } |
| assert_equals(scroller.scrollLeft, 0); |
| |
| // Horizontal scrollbar position bottom left |
| const start_pos = { |
| x: 30, |
| y: 200, |
| }; |
| const end_pos = { x: 200, y: 200 }; |
| |
| await drag_scrollbar(start_pos, end_pos); |
| await scrollEndPromise; |
| await waitForAnimationFrames(2); |
| |
| assert_not_equals(scroller.scrollLeft, 0); |
| assert_equals(getComputedStyle(target).getPropertyValue("--none"), "yes"); |
| assert_equals(getComputedStyle(target).getPropertyValue("--x"), "no"); |
| |
| }, "Horizontal scrollbar drag scroll"); |
| |
| </script> |