blob: b8bf650c6a436e7afc2c76c04909e8311a18d323 [file] [log] [blame]
<!DOCTYPE html>
<title>The width of text element is similar to the sum of the width of all characters.</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<svg style="position: absolute; top: 10px; left: 10px; width: 500px; height: 300px;">
<g>
<text id="test" x="0" y="50" font-size="25" fill="#000" text-rendering="geometricPrecision">Sphinx of black quartz, judge my vow.</text>
</g>
<g>
<text id="measure" x="0" y="150" fill="#000" text-rendering="geometricPrecision" xml:space="preserve">&nbsp;</text>
</g>
</svg>
<script>
function measureText(testElement) {
var measureElement = document.getElementById('measure');
measureElement.setAttribute('font-size', testElement.getAttribute('font-size'));
var str = testElement.firstChild.nodeValue;
var characterWidths = {};
var width = 0;
for (var i = 0; i < str.length; i++) {
var c = str[i];
var w = characterWidths[c];
if (!w) {
measureElement.firstChild.nodeValue = c;
w = measureElement.getBoundingClientRect().width;
characterWidths[c] = w;
}
width += w;
}
return width;
}
test(function() {
var element = document.getElementById('test');
var elementWidth = element.getBoundingClientRect().width;
var textWidth = measureText(element);
// This tolerance value is made up but our goal is to ensure that the
// sum of individual glyph widths is roughly similar to the total element
// width.
var glyphOverflowTolerance = Math.min(elementWidth, textWidth) / 2;
// The sum of individual character widths will include the glyph
// overflow of each character separately and therefore the total element
// width should be smaller.
assert_less_than_equal(elementWidth, textWidth);
assert_less_than_equal(Math.abs(elementWidth - textWidth), glyphOverflowTolerance);
});
</script>