| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>Test that scroll-padding correctly adjust page sroll operations</title> |
| |
| <style> |
| :root { |
| --test-size: 200px; |
| } |
| |
| section { |
| /* put them side-by-side */ |
| display: flex; |
| flex-direction: row; |
| border: 1px solid black; |
| padding: 2px; |
| } |
| |
| section#top { |
| --sp-left : 0px; |
| --sp-right : 0px; |
| --sp-top: 30px; |
| --sp-bottom: 0px; |
| } |
| |
| section#bottom { |
| --sp-left : 0px; |
| --sp-right : 0px; |
| --sp-top: 0px; |
| --sp-bottom: 20px; |
| } |
| |
| section#vertical { |
| --sp-left : 0px; |
| --sp-right : 0px; |
| --sp-top: 30px; |
| --sp-bottom: 20px; |
| } |
| |
| section#horizontal { |
| --sp-left : 20px; |
| --sp-right : 10px; |
| --sp-top: 0px; |
| --sp-bottom: 0px; |
| } |
| |
| .actual { |
| height: var(--test-size); |
| width: var(--test-size); |
| scroll-padding-left: var(--sp-left); |
| scroll-padding-right: var(--sp-right); |
| scroll-padding-top: var(--sp-top); |
| scroll-padding-bottom: var(--sp-bottom); |
| |
| } |
| |
| .reference { |
| height: calc(var(--test-size) - var(--sp-top) - var(--sp-bottom)); |
| width: calc(var(--test-size) - var(--sp-left) - var(--sp-right)); |
| } |
| |
| .actual, .reference { |
| overflow: scroll; |
| } |
| |
| .actual > div,.reference > div { |
| height: 1200px; |
| width: 1200px; |
| background-image: |
| linear-gradient( |
| to bottom, |
| #fffdc2, |
| #fffdc2 calc(var(--test-size) - 20px), |
| #d7f0a2 calc(var(--test-size) - 20px), |
| #d7f0a2 |
| ); |
| } |
| </style> |
| |
| PageDown: |
| <section id="top" data-scroll-action="PageDown"> |
| <div class="actual" tabindex="0"> |
| <div>With scroll-padding</div> |
| </div> |
| <div class="reference" tabindex="0"> |
| <div>Without scroll-padding</div> |
| </div> |
| </section> |
| |
| PageDown: |
| <section id="bottom" data-scroll-action="PageDown"> |
| <div class="actual" tabindex="0"> |
| <div>With scroll-padding</div> |
| </div> |
| <div class="reference" tabindex="0"> |
| <div>Without scroll-padding</div> |
| </div> |
| </section> |
| |
| PageDown: |
| <section id="vertical" data-scroll-action="PageDown"> |
| <div class="actual" tabindex="0"> |
| <div>With scroll-padding</div> |
| </div> |
| <div class="reference" tabindex="0"> |
| <div>Without scroll-padding</div> |
| </div> |
| </section> |
| |
| PageRight: |
| <section id="horizontal" data-scroll-action="PageRight"> |
| <div class="actual" tabindex="0"> |
| <div>With scroll-padding</div> |
| </div> |
| <div class="reference" tabindex="0"> |
| <div>Without scroll-padding</div> |
| </div> |
| </section> |
| |
| <script src="../../resources/testharness.js"></script> |
| <script src="../../resources/testharnessreport.js"></script> |
| |
| <script> |
| // Disable scroll animations to have immediate results. |
| if (window.internals) |
| internals.settings.setScrollAnimatorEnabled(false); |
| |
| function pageScroll(target, action){ |
| if (!window.eventSender) |
| throw "This test requires eventSender"; |
| |
| target.focus(); |
| |
| switch (action) { |
| case "PageDown": |
| eventSender.keyDown("PageDown"); break; |
| case "PageRight": |
| // TODO(majidvp): This actually does not scroll horizontally. Find a way that works. |
| eventSender.keyDown("PageDown", ["shiftKey"]); break; |
| default: |
| throw "Unsupported scroll action"; |
| } |
| } |
| |
| [].forEach.call(document.querySelectorAll('section'), function(testCase) { |
| const scrollAction = testCase.dataset.scrollAction; |
| const actual = testCase.querySelector('.actual'); |
| const reference = testCase.querySelector('.reference'); |
| |
| const description = 'scrollPadding: ' + getComputedStyle(actual).scrollPadding; |
| |
| test(function(){ |
| pageScroll(actual, scrollAction); |
| pageScroll(reference, scrollAction); |
| assert_equals(actual.scrollTop, reference.scrollTop); |
| assert_equals(actual.scrollLeft, reference.scrollLeft); |
| }, 'Page scroll operation ' + scrollAction + ' correctly uses scroll snapport with ' + description); |
| }); |
| </script> |