| <!DOCTYPE html> |
| <title>CSSOM View - GeometryUtils in shadow trees</title> |
| <link rel="help" href="https://drafts.csswg.org/cssom-view/#the-geometryutils-interface"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="resources/geometry-utils.js"></script> |
| <style> |
| html, body { margin: 0; } |
| x-geometry-host { |
| position: absolute; |
| left: 250px; |
| top: 35px; |
| width: 230px; |
| height: 150px; |
| border: 5px solid gray; |
| padding: 10px; |
| transform: rotate(8deg); |
| transform-origin: left top; |
| display: block; |
| } |
| #slotted { |
| width: 80px; |
| height: 45px; |
| border: 3px solid black; |
| transform: translate(18px, 12px) rotate(-16deg); |
| background: gold; |
| } |
| </style> |
| <x-geometry-host> |
| <div id="slotted" slot="content"></div> |
| </x-geometry-host> |
| <script> |
| customElements.define("x-geometry-host", class extends HTMLElement { |
| constructor() { |
| super(); |
| const shadow = this.attachShadow({mode: "open"}); |
| shadow.innerHTML = ` |
| <style> |
| #shadow-target { |
| position: absolute; |
| left: 95px; |
| top: 65px; |
| width: 70px; |
| height: 35px; |
| border: 4px solid blue; |
| transform: rotate(21deg) scale(1.15); |
| transform-origin: center; |
| } |
| slot { |
| position: absolute; |
| left: 20px; |
| top: 18px; |
| display: block; |
| } |
| </style> |
| <slot name="content"></slot> |
| <div id="shadow-target"></div> |
| `; |
| } |
| }); |
| |
| test(() => { |
| const host = document.querySelector("x-geometry-host"); |
| const shadowTarget = host.shadowRoot.getElementById("shadow-target"); |
| assert_quad_bounds_match_bounding_rect(shadowTarget, {}, |
| "shadow tree element bounds"); |
| |
| const relativeQuad = shadowTarget.getBoxQuads({relativeTo: host})[0]; |
| const convertedQuad = host.convertQuadFromNode( |
| shadowTarget.getBoxQuads({relativeTo: shadowTarget})[0], |
| shadowTarget |
| ); |
| assert_quad_approx_equals(relativeQuad, convertedQuad, |
| "shadow tree element relative to host"); |
| }, "GeometryUtils follows shadow tree ancestry"); |
| |
| test(() => { |
| const host = document.querySelector("x-geometry-host"); |
| const slotted = document.getElementById("slotted"); |
| assert_quad_bounds_match_bounding_rect(slotted, {}, |
| "slotted light DOM element bounds"); |
| |
| const relativeQuad = slotted.getBoxQuads({relativeTo: host})[0]; |
| const convertedQuad = host.convertQuadFromNode( |
| slotted.getBoxQuads({relativeTo: slotted})[0], |
| slotted |
| ); |
| assert_quad_approx_equals(relativeQuad, convertedQuad, |
| "slotted element relative to host"); |
| }, "GeometryUtils follows flat-tree slot assignment"); |
| </script> |