Files
sousa-gecko/testing/web-platform/tests/css/css-highlight-api/highlight-text-across-elements.html
T
Daniel Holbert 47014eccd5 Bug 2003604: Use a monospace font in some css-highlight-api WPTs, to avoid spurious failures from one glyph overlapping the background of the next glyph. r=layout-reviewers,dshin,jfkthame
The paint ordering in these tests (of the highlight-background vs. ink of
adjacent glyphs) is different in the testcase and reference case, at least in
Gecko and WebKit (though not in Chromium[1]).  This creates the potential for
spurious failures in Gecko and WebKit, if the chosen font happens to have
glyphs that draw close together (such that one glyph might have a piece that
protrudes to overlap the bounding-box of the next glyph).

This patch avoids these spurious failures by explicitly using a monospace font;
this reduces the likelihood of glyphs drawing close together and experiencing
the sort of overlap that would reveal the paint-order differences between
the testcase & reference case.

This patch also adds some letter-spacing to one of the testscases; this is
needed to fully avoid overlap in the case of an "O" glyph that's adjacent to a
highlight and is wide enough in the Windows monospace font to still trigger
this problematic overlap (if it weren't for this added letter-spacing).

[1] https://issues.chromium.org/issues/465531995

Differential Revision: https://phabricator.services.mozilla.com/D274954
2025-12-03 19:08:31 +00:00

57 lines
2.5 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Custom highlight pseudo elements across elements.</title>
<link rel="help" href="https://drafts.csswg.org/css-highlight-api-1/#painting">
<link rel="match" href="highlight-text-across-elements-ref.html">
<meta name="assert" content="Highlights should be able to be specified across elements.">
<style>
:root {
/* This reduces the likelihood that a highlight background-area
will overlap with the previous glyph. That overlap is worth
avoiding, because the previous glyph's overlapping part will get
clipped in the reference case, but might not in the testcase. */
font-family: monospace;
}
::highlight(example-highlight1) {
background-color: yellow;
color:green;
}
::highlight(example-highlight2) {
background-color: blue;
color:red;
}
::highlight(example-highlight3) {
background-color: purple;
color:pink;
}
</style>
</head>
<body>
<span id="text1">One two three</span>
<span id="text2">four five six</span>
<span id="text3">seven eight nine</span>
<span id="text4">ten eleven twelve</span>
<span id="text5">thirteen fourteen fifteen</span>
<script>
let textElement1 = document.getElementById('text1');
let textElement2 = document.getElementById('text2');
let textElement3 = document.getElementById('text3');
let textElement4 = document.getElementById('text4');
let textElement5 = document.getElementById('text5');
let highlight1 = new Highlight(new StaticRange({startContainer: textElement1.childNodes[0], startOffset: 4, endContainer: textElement1.childNodes[0], endOffset: 7}));
let highlight2 = new Highlight(new StaticRange({startContainer: textElement1.childNodes[0], startOffset: 10, endContainer: textElement2.childNodes[0], endOffset: 4}));
highlight2.add(new StaticRange({startContainer: textElement2.childNodes[0], startOffset: 10, endContainer: textElement3.childNodes[0], endOffset: 5}));
let highlight3 = new Highlight(new StaticRange({startContainer: textElement3.childNodes[0], startOffset: 10, endContainer: textElement5.childNodes[0], endOffset: 12}));
CSS.highlights.set("example-highlight1", highlight1);
CSS.highlights.set("example-highlight2", highlight2);
CSS.highlights.set("example-highlight3", highlight3);
</script>
</body>
</html>