Files
sousa-gecko/layout/generic/test/test_selection_underline.html
T
Lee Salzman c94f5fca4f Bug 1996104 - Remove Feature::DIRECT2D and related queries. r=aosmond,geckoview-reviewers,media-playback-reviewers,win-reviewers,webcompat-reviewers,toolkit-telemetry-reviewers,layout-reviewers,gstoll,twisniewski,emilio,m_kato
Now that Direct2D is no longer supported, we can start removing the associated Feature
and queries of it.

This patch does the awkward work of removing Direct2D feature testing throughout Gecko.

Differential Revision: https://phabricator.services.mozilla.com/D269855
2025-10-24 20:01:47 +00:00

229 lines
7.4 KiB
HTML

<html>
<head>
<title>Test for selection underline</title>
<script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<script src="chrome://mochikit/content/tests/SimpleTest/WindowSnapshot.js"></script>
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
<script type="text/javascript">
// Canvas related code stolen from layout/base/tests/bidi_numeral_test.js which
// stole from http://developer.mozilla.org/en/docs/Code_snippets:Canvas
var RemoteCanvas = function(aIFrame, aTest) {
this.iframe = aIFrame;
this.test = aTest;
this.snapshot = null;
};
RemoteCanvas.CANVAS_WIDTH = 200;
RemoteCanvas.CANVAS_HEIGHT = 100;
RemoteCanvas.prototype.isReference = function() {
return this.iframe && (this.iframe.id == "reference");
}
RemoteCanvas.prototype.load = function(callback) {
this.iframe.contentWindow.wrappedJSObject.init(this.test);
var me = this;
setTimeout(function () { me.remotePagePrepared(callback) }, 100);
}
RemoteCanvas.prototype.remotePagePrepared = function(callback) {
this.snapshot = snapshotWindow(this.iframe.contentWindow);
callback(this);
}
var gPrefs = [
[ "ui.SpellCheckerUnderline", "#ff0000" ],
[ "ui.IMERawInputBackground", "transparent" ],
[ "ui.IMERawInputForeground", "#000000" ],
[ "ui.IMERawInputUnderline", "#00ff00" ],
[ "ui.IMESelectedRawTextBackground", "transparent" ],
[ "ui.IMESelectedRawTextForeground", "#000000" ],
[ "ui.IMESelectedRawTextUnderline", "#0000ff" ],
[ "ui.IMEConvertedTextBackground", "transparent" ],
[ "ui.IMEConvertedTextForeground", "#000000" ],
[ "ui.IMEConvertedTextUnderline", "#ffff00" ],
[ "ui.IMESelectedConvertedTextBackground", "transparent" ],
[ "ui.IMESelectedConvertedTextForeground", "#000000" ],
[ "ui.IMESelectedConvertedTextUnderline", "#00ffff" ],
[ "ui.SpellCheckerUnderlineStyle", 0 ],
[ "ui.IMERawInputUnderlineStyle", 0 ],
[ "ui.IMESelectedRawTextUnderlineStyle", 0 ],
[ "ui.IMEConvertedTextUnderlineStyle", 0 ],
[ "ui.IMESelectedConvertedTextUnderlineStyle", 0 ],
[ "ui.SpellCheckerUnderlineRelativeSize", 1.0 ],
[ "ui.IMEUnderlineRelativeSize", 1.0 ]
];
const nsISelectionController = Ci.nsISelectionController;
var gSelectionIndex = -1;
const kSelections = [
{ type: nsISelectionController.SELECTION_SPELLCHECK,
typeName: "SpellCheck", isIME: false,
decorationColor: "#ff0000" },
{ type: nsISelectionController.SELECTION_IME_RAWINPUT,
typeName: "IME-RawInput", isIME: true,
decorationColor: "#00ff00" },
{ type: nsISelectionController.SELECTION_IME_SELECTEDRAWTEXT,
typeName: "IME-SelectedRawText", isIME: true,
decorationColor: "#0000ff" },
{ type: nsISelectionController.SELECTION_IME_CONVERTEDTEXT,
typeName: "IME-ConvertedText", isIME: true,
decorationColor: "#ffff00" },
{ type: nsISelectionController.SELECTION_IME_SELECTEDCONVERTEDTEXT,
typeName: "IME-SelectedConvertedText", isIME: true,
decorationColor: "#00ffff" },
];
const kFontName_Ahem = "AhemTest";
const kFontName_MPlus = "mplusTest";
var gFontIndex = 0;
const kFonts = [
{ family: kFontName_Ahem, defaultSize: 16 },
{ family: kFontName_Ahem, defaultSize: 20 },
{ family: kFontName_Ahem, defaultSize: 32 },
{ family: kFontName_Ahem, defaultSize: 52 },
{ family: kFontName_MPlus, defaultSize: 16 },
{ family: kFontName_MPlus, defaultSize: 20 },
{ family: kFontName_MPlus, defaultSize: 32 },
{ family: kFontName_MPlus, defaultSize: 52 },
];
const kDecorationStyleNone = 0;
const kDecorationStyleDotted = 1;
const kDecorationStyleDashed = 2;
const kDecorationStyleSolid = 3;
const kDecorationStyleDouble = 4;
const kDecorationStyleWavy = 5;
var gDecorationIndex = 0;
const kDecorations = [
{ relativeSize: 1.0, style: kDecorationStyleNone, styleName: "-moz-none" },
{ relativeSize: 1.0, style: kDecorationStyleSolid, styleName: "solid" },
{ relativeSize: 1.0, style: kDecorationStyleDotted, styleName: "dotted" },
{ relativeSize: 1.0, style: kDecorationStyleDashed, styleName: "dashed" },
{ relativeSize: 1.0, style: kDecorationStyleDouble, styleName: "double" },
{ relativeSize: 1.0, style: kDecorationStyleWavy, styleName: "wavy" },
// XXX relativeSize 2.0 cannot be tested by CSS3 text-decoration
];
function getFuzz(test) {
return null;
}
async function run()
{
let prefs = [];
if (++gSelectionIndex == kSelections.length) {
if (++gFontIndex == kFonts.length) {
if (++gDecorationIndex == kDecorations.length) {
SimpleTest.finish();
return;
}
gFontIndex = 0;
}
gSelectionIndex = 0;
prefs.push([ "font.size.variable.x-western", kFonts[gFontIndex].defaultSize ]);
}
var test = {
font: kFonts[gFontIndex],
decoration: kDecorations[gDecorationIndex],
selection: kSelections[gSelectionIndex],
};
prefs.push(
["ui.SpellCheckerUnderlineRelativeSize", test.decoration.relativeSize * 100],
["ui.IMEUnderlineRelativeSize", test.decoration.relativeSize * 100],
["ui.SpellCheckerUnderlineStyle", test.decoration.style],
["ui.IMERawInputUnderlineStyle", test.decoration.style],
["ui.IMESelectedRawTextUnderlineStyle", test.decoration.style],
["ui.IMEConvertedTextUnderlineStyle", test.decoration.style],
["ui.IMESelectedConvertedTextUnderlineStyle", test.decoration.style],
);
await SpecialPowers.pushPrefEnv({ set: prefs });
doTest(test);
}
function doTest(aTest)
{
var canvases = [];
function callbackTestCanvas(canvas)
{
canvases.push(canvas);
if (canvases.length != 2)
return;
var result = !canvases[0].isReference() ? canvases[0] : canvases[1];
var reference = canvases[0].isReference() ? canvases[0] : canvases[1];
var description = "(selection: " + aTest.selection.typeName +
", style: " + aTest.decoration.styleName +
", relativeSize: " + aTest.decoration.relativeSize +
", font: " + aTest.font.family +
", default font size: " + aTest.font.defaultSize + ")";
// If the decoration line is thick and the descender of the text isn't
// enough for containing it, selection underline may be painted lower
// if it's possible. Then, we cannot test it with CSS3 text-decoration.
if (aTest.decoration.style == kDecorationStyleDouble ||
aTest.decoration.style == kDecorationStyleWavy) {
todo(false, "Rendering of" + description);
} else {
assertSnapshots(result.snapshot, reference.snapshot, true,
getFuzz(aTest), description, "");
}
canvases = [];
run();
}
var testCanvas = new RemoteCanvas(document.getElementById("result"), aTest);
testCanvas.load(callbackTestCanvas);
var refCanvas = new RemoteCanvas(document.getElementById("reference"), aTest);
refCanvas.load(callbackTestCanvas);
}
async function onLoad()
{
await SpecialPowers.pushPrefEnv({ set: gPrefs });
var iframe = document.getElementById("result");
iframe.width = RemoteCanvas.CANVAS_WIDTH + "px";
iframe.height = RemoteCanvas.CANVAS_HEIGHT + "px";
iframe = document.getElementById("reference");
iframe.width = RemoteCanvas.CANVAS_WIDTH + "px";
iframe.height = RemoteCanvas.CANVAS_HEIGHT + "px";
run();
}
SimpleTest.waitForExplicitFinish();
SimpleTest.waitForFocus(onLoad, window);
</script>
</head>
<body>
<iframe src="frame_selection_underline.xhtml" id="result"></iframe>
<iframe src="frame_selection_underline-ref.xhtml" id="reference"></iframe>
<pre id="test">
</pre>
</body>
</html>