| <!DOCTYPE html> | |
| <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-getboundingclientrect"> | |
| <link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-range-getboundingclientrect"> | |
| <link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <style> | |
| text { | |
| font-family: Ahem; | |
| font-size: 10px; | |
| line-height: 1; | |
| width: 10ch; | |
| } | |
| </style> | |
| <body> | |
| <svg width="800" height="100"> | |
| <text x="20" y="20" id="text-1">An SVG text element with no "transform" attribute</text> | |
| <text x="20" y="50" id="text-2" transform="matrix(2,0,0,2,0,0)">An SVG with a "transform" attribute</text> | |
| <text x="20" y="80" id="text-3" rotate="45">An SVG with a "rotate" attribute</text> | |
| </svg> | |
| <script> | |
| function getBoundingClientRect(node, start, end) { | |
| const range = document.createRange(); | |
| range.setStart(node, start); | |
| range.setEnd(node, end); | |
| const rect = range.getBoundingClientRect(); | |
| return rect; | |
| } | |
| setup({ explicit_done: true }); | |
| // When comparing element and range rect sizes, permit a 2% or 3px variability, | |
| // to account for the differences between the element bounding box and the | |
| // glyphs it contains. | |
| function tolerance(expected) { | |
| return Math.max(3, 0.02 * Math.abs(expected)); | |
| } | |
| document.fonts.ready.then(() => { | |
| test(() => { | |
| const element = document.querySelector('#text-1'); | |
| const elementRect = element.getBoundingClientRect(); | |
| const rangeRect = getBoundingClientRect(element.firstChild, 0, element.firstChild.length); | |
| assert_approx_equals(elementRect.x, rangeRect.x, tolerance(rangeRect.x), "x"); | |
| assert_approx_equals(elementRect.y, rangeRect.y, tolerance(rangeRect.y), "y"); | |
| assert_approx_equals(elementRect.width, rangeRect.width, tolerance(rangeRect.width), "width"); | |
| assert_approx_equals(elementRect.height, rangeRect.height, tolerance(rangeRect.height), "height"); | |
| }, 'Element.getBoundingClientRect() and Range.getBoundingClientRect() should match for an SVG <text>'); | |
| test(() => { | |
| const element = document.querySelector('#text-2'); | |
| const elementRect = element.getBoundingClientRect(); | |
| const rangeRect = getBoundingClientRect(element.firstChild, 0, element.firstChild.length); | |
| assert_approx_equals(elementRect.x, rangeRect.x, tolerance(rangeRect.x), "x"); | |
| assert_approx_equals(elementRect.y, rangeRect.y, tolerance(rangeRect.y), "y"); | |
| assert_approx_equals(elementRect.width, rangeRect.width, tolerance(rangeRect.width), "width"); | |
| assert_approx_equals(elementRect.height, rangeRect.height, tolerance(rangeRect.height), "height"); | |
| }, 'Element.getBoundingClientRect() and Range.getBoundingClientRect() should match for an SVG <text> with a transform'); | |
| test(() => { | |
| const element = document.querySelector('#text-3'); | |
| const elementRect = element.getBoundingClientRect(); | |
| const rangeRect = getBoundingClientRect(element.firstChild, 0, element.firstChild.length); | |
| assert_approx_equals(elementRect.x, rangeRect.x, tolerance(rangeRect.x), "x"); | |
| assert_approx_equals(elementRect.y, rangeRect.y, tolerance(rangeRect.y), "y"); | |
| assert_approx_equals(elementRect.width, rangeRect.width, tolerance(rangeRect.width), "width"); | |
| assert_approx_equals(elementRect.height, rangeRect.height, tolerance(rangeRect.height), "height"); | |
| }, 'Element.getBoundingClientRect() and Range.getBoundingClientRect() should match for an SVG <text> with a rotate'); | |
| done(); | |
| }); | |
| </script> | |
| </body> |