Files
sousa-gecko/testing/web-platform/tests/svg/text/scripted/getstartpositionofchar.html
T
longsonr 35d0a69a19 Bug 2038740 - Check for continuations in subtree and correct range checking r=jfkthame
- continuations should still count as being within a TextFrame iterator subtree
- store the subtree continuations in a set to avoid virtual function calls when iterating
- add missing range checks to some dom methods so that methods on tspans cannot overflow

Differential Revision: https://phabricator.services.mozilla.com/D300527
2026-05-15 17:23:31 +00:00

93 lines
3.5 KiB
HTML

<!DOCTYPE html>
<title>SVGTextContentElement.getStartPositionOfChar and getEndPositionOfChar</title>
<link rel="help" href="https://w3c.github.io/svgwg/svg2-draft/text.html#__svg__SVGTextContentElement__getStartPositionOfChar">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="stylesheet" href="/fonts/ahem.css">
<style>
text {
font: 10px/1 Ahem;
}
#vrl {
writing-mode: vertical-rl;
}
#vlr {
writing-mode: vertical-lr;
}
#srl {
writing-mode: sideways-rl;
}
#slr {
writing-mode: sideways-lr;
}
</style>
<svg>
<text id="vrl" x="100" y="100">ABC</text>
<text id="vlr" x="100" y="100">ABC</text>
<text id="srl" x="100" y="100">ABC</text>
<text id="slr" x="100" y="100">ABC</text>
<text x="100" y="100">A<tspan id="tsp">B</tspan>C</text>
</svg>
<script>
const FONT_SIZE = 10;
function $(sel) { return document.querySelector(sel); }
setup({ explicit_done: true });
document.fonts.ready.then(() => {
test(() => {
const target = $('#vrl');
const base = target.getStartPositionOfChar(0).y;
assert_equals(target.getEndPositionOfChar(0).y, base + FONT_SIZE);
assert_equals(target.getStartPositionOfChar(1).y, base + FONT_SIZE);
assert_equals(target.getEndPositionOfChar(1).y, base + FONT_SIZE * 2);
assert_equals(target.getStartPositionOfChar(2).y, base + FONT_SIZE * 2);
assert_equals(target.getEndPositionOfChar(2).y, base + FONT_SIZE * 3);
assert_throws_dom("IndexSizeError", () => target.getStartPositionOfChar(3));
assert_throws_dom("IndexSizeError", () => target.getEndPositionOfChar(3));
}, 'vertical-rl');
test(() => {
const target = $('#vlr');
const base = target.getStartPositionOfChar(0).y;
assert_equals(target.getEndPositionOfChar(0).y, base + FONT_SIZE);
assert_equals(target.getStartPositionOfChar(1).y, base + FONT_SIZE);
assert_equals(target.getEndPositionOfChar(1).y, base + FONT_SIZE * 2);
assert_equals(target.getStartPositionOfChar(2).y, base + FONT_SIZE * 2);
assert_equals(target.getEndPositionOfChar(2).y, base + FONT_SIZE * 3);
}, 'vertical-lr');
test(() => {
const target = $('#srl');
const base = target.getStartPositionOfChar(0).y;
assert_equals(target.getEndPositionOfChar(0).y, base + FONT_SIZE);
assert_equals(target.getStartPositionOfChar(1).y, base + FONT_SIZE);
assert_equals(target.getEndPositionOfChar(1).y, base + FONT_SIZE * 2);
assert_equals(target.getStartPositionOfChar(2).y, base + FONT_SIZE * 2);
assert_equals(target.getEndPositionOfChar(2).y, base + FONT_SIZE * 3);
}, 'sideways-rl');
test(() => {
const target = $('#slr');
const base = target.getStartPositionOfChar(0).y;
assert_equals(target.getEndPositionOfChar(0).y, base - FONT_SIZE);
assert_equals(target.getStartPositionOfChar(1).y, base - FONT_SIZE);
assert_equals(target.getEndPositionOfChar(1).y, base - FONT_SIZE * 2);
assert_equals(target.getStartPositionOfChar(2).y, base - FONT_SIZE * 2);
assert_equals(target.getEndPositionOfChar(2).y, base - FONT_SIZE * 3);
}, 'sideways-lr');
test(() => {
const target = $('#tsp');
const base = target.parentElement.getStartPositionOfChar(0).y;
assert_equals(target.getStartPositionOfChar(0).x, base + FONT_SIZE);
assert_equals(target.getEndPositionOfChar(0).x, base + FONT_SIZE * 2);
assert_throws_dom("IndexSizeError", () => target.getStartPositionOfChar(1));
assert_throws_dom("IndexSizeError", () => target.getEndPositionOfChar(1));
}, 'tspan');
done();
});
</script>