| <!DOCTYPE html> | |
| <meta charset="UTF-8"> | |
| <title>CSSOM View —— scrollParent test</title> | |
| <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-htmlelement-scrollparent"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <style> | |
| .scroller { | |
| overflow: scroll; | |
| border: 1px solid blue; | |
| } | |
| .scroller { | |
| height: 150px; | |
| } | |
| .target { | |
| background: repeating-linear-gradient(30deg, white 0px, white 30px, green 30px, green 60px); | |
| height: 1000px; | |
| } | |
| .spacer { | |
| background: repeating-linear-gradient(-30deg, white 0px, white 30px, blue 30px, blue 60px); | |
| height: 1000px; | |
| } | |
| </style> | |
| <script> | |
| var closedShadowRoot = null; | |
| class BaseComponent extends HTMLElement { | |
| constructor(mode = 'open') { | |
| super(); | |
| const shadowRoot = this.attachShadow({ mode }); | |
| shadowRoot.innerHTML = ` | |
| <style> | |
| .shadow-scroller { | |
| overflow: scroll; | |
| height: 50px; | |
| border: 1px solid black; | |
| } | |
| </style> | |
| <div> | |
| <div class="shadow-scroller"> | |
| <slot><p>No description.</p></slot> | |
| </div> | |
| </div> | |
| `; | |
| if (mode == 'closed') { | |
| closedShadowRoot = shadowRoot; | |
| } | |
| } | |
| } | |
| class HiddenComponent extends BaseComponent { | |
| constructor() { super('closed'); } | |
| } | |
| class OpenComponent extends BaseComponent { | |
| constructor() { super('open'); } | |
| } | |
| customElements.define('hidden-component', HiddenComponent); | |
| customElements.define('open-component', OpenComponent); | |
| </script> | |
| <div id="outerScroller" class="scroller"> | |
| <div class="spacer"> | |
| <hidden-component id="shadowComponent"> | |
| <div> | |
| <div id="closedInnerElement" class="target"></div> | |
| </div> | |
| </hidden-component> | |
| <open-component id="openShadowComponent"> | |
| <div> | |
| <div id="openInnerElement" class="target"></div> | |
| </div> | |
| </open-component> | |
| </div> | |
| </div> | |
| <script> | |
| test(() => { | |
| assert_equals(closedInnerElement.scrollParent(), outerScroller); | |
| }, "scrollParent skips intermediate closed shadow tree nodes"); | |
| test(() => { | |
| assert_equals(openInnerElement.scrollParent(), outerScroller); | |
| }, "scrollParent skips intermediate open shadow tree nodes"); | |
| test(() => { | |
| assert_equals(closedShadowRoot.querySelector('div').scrollParent(), outerScroller); | |
| }, "scrollParent from inside closed shadow tree"); | |
| test(() => { | |
| assert_equals(openShadowComponent.shadowRoot.querySelector('div').scrollParent(), outerScroller); | |
| }, "scrollParent from inside open shadow tree"); | |
| </script> | |
| </body> | |
| </html> |