diff options
Diffstat (limited to 'layout/generic/test/test_selection_underline.html')
-rw-r--r-- | layout/generic/test/test_selection_underline.html | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/layout/generic/test/test_selection_underline.html b/layout/generic/test/test_selection_underline.html new file mode 100644 index 0000000000..042c75cd29 --- /dev/null +++ b/layout/generic/test/test_selection_underline.html @@ -0,0 +1,246 @@ +<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 IsD2DEnabled() { + var enabled = false; + + try { + enabled = Cc["@mozilla.org/gfx/info;1"].getService(Ci.nsIGfxInfo).D2DEnabled; + } catch(e) {} + + return enabled; +} + +function getFuzz(test) { + // Only failing on Windows with Direct2D enabled, and only for 16 permutations. + if (IsD2DEnabled() && + test.decoration.styleName == "solid" && + test.decoration.relativeSize == "1" && + test.font.family == "mplusTest" && + test.selection.typeName != "SpellCheck") { + return { numDifferentPixels: 194, maxDifference: 1 }; + } + 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> |