Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 <html>
3 <head>
4 <title>Test for selection underline</title>
5 <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
6 <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/WindowSnapshot.js"></script>
7 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
9 <script type="text/javascript">
11 // Canvas related code stolen from layout/base/tests/bidi_numeral_test.js which
12 // stole from http://developer.mozilla.org/en/docs/Code_snippets:Canvas
14 var RemoteCanvas = function(aIFrame, aTest) {
15 this.iframe = aIFrame;
16 this.test = aTest;
17 this.snapshot = null;
18 };
20 RemoteCanvas.CANVAS_WIDTH = 200;
21 RemoteCanvas.CANVAS_HEIGHT = 100;
23 RemoteCanvas.prototype.compare = function(otherCanvas, expected) {
24 var ret = compareSnapshots(this.snapshot, otherCanvas.snapshot, expected);
25 this.snapshotDataURL = ret[1];
26 otherCanvas.snapshotDataURL = ret[2];
27 return ret[0];
28 }
30 RemoteCanvas.prototype.isReference = function() {
31 return this.iframe && (this.iframe.id == "reference");
32 }
34 RemoteCanvas.prototype.load = function(callback) {
35 this.iframe.contentWindow.wrappedJSObject.init(this.test);
36 var me = this;
37 setTimeout(function () { me.remotePagePrepared(callback) }, 100);
38 }
40 RemoteCanvas.prototype.remotePagePrepared = function(callback) {
41 this.snapshot = snapshotWindow(this.iframe.contentWindow);
42 callback(this);
43 }
45 var gPrefs = [
46 {
47 name: "ui.SpellCheckerUnderline",
48 type: "char",
49 newValue: "#ff0000"
50 },
51 {
52 name: "ui.IMERawInputBackground",
53 type: "char",
54 newValue: "transparent"
55 },
56 {
57 name: "ui.IMERawInputForeground",
58 type: "char",
59 newValue: "#000000"
60 },
61 {
62 name: "ui.IMERawInputUnderline",
63 type: "char",
64 newValue: "#00ff00"
65 },
66 {
67 name: "ui.IMESelectedRawTextBackground",
68 type: "char",
69 newValue: "transparent"
70 },
71 {
72 name: "ui.IMESelectedRawTextForeground",
73 type: "char",
74 newValue: "#000000"
75 },
76 {
77 name: "ui.IMESelectedRawTextUnderline",
78 type: "char",
79 newValue: "#0000ff"
80 },
81 {
82 name: "ui.IMEConvertedTextBackground",
83 type: "char",
84 newValue: "transparent"
85 },
86 {
87 name: "ui.IMEConvertedTextForeground",
88 type: "char",
89 newValue: "#000000"
90 },
91 {
92 name: "ui.IMEConvertedTextUnderline",
93 type: "char",
94 newValue: "#ffff00"
95 },
96 {
97 name: "ui.IMESelectedConvertedTextBackground",
98 type: "char",
99 newValue: "transparent"
100 },
101 {
102 name: "ui.IMESelectedConvertedTextForeground",
103 type: "char",
104 newValue: "#000000"
105 },
106 {
107 name: "ui.IMESelectedConvertedTextUnderline",
108 type: "char",
109 newValue: "#00ffff"
110 },
111 {
112 name: "ui.SpellCheckerUnderlineStyle",
113 type: "int",
114 newValue: 0
115 },
116 {
117 name: "ui.IMERawInputUnderlineStyle",
118 type: "int",
119 newValue: 0
120 },
121 {
122 name: "ui.IMESelectedRawTextUnderlineStyle",
123 type: "int",
124 newValue: 0
125 },
126 {
127 name: "ui.IMEConvertedTextUnderlineStyle",
128 type: "int",
129 newValue: 0
130 },
131 {
132 name: "ui.IMESelectedConvertedTextUnderlineStyle",
133 type: "int",
134 newValue: 0
135 },
136 {
137 name: "ui.SpellCheckerUnderlineRelativeSize",
138 type: "float",
139 newValue: 1.0
140 },
141 {
142 name: "ui.IMEUnderlineRelativeSize",
143 type: "float",
144 newValue: 1.0
145 }
146 ];
148 const nsISelectionController = Components.interfaces.nsISelectionController;
150 var gSelectionIndex = -1;
151 const kSelections = [
152 { type: nsISelectionController.SELECTION_SPELLCHECK,
153 typeName: "SpellCheck", isIME: false,
154 decorationColor: "#ff0000" },
155 { type: nsISelectionController.SELECTION_IME_RAWINPUT,
156 typeName: "IME-RawInput", isIME: true,
157 decorationColor: "#00ff00" },
158 { type: nsISelectionController.SELECTION_IME_SELECTEDRAWTEXT,
159 typeName: "IME-SelectedRawText", isIME: true,
160 decorationColor: "#0000ff" },
161 { type: nsISelectionController.SELECTION_IME_CONVERTEDTEXT,
162 typeName: "IME-ConvertedText", isIME: true,
163 decorationColor: "#ffff00" },
164 { type: nsISelectionController.SELECTION_IME_SELECTEDCONVERTEDTEXT,
165 typeName: "IME-SelectedConvertedText", isIME: true,
166 decorationColor: "#00ffff" },
167 ];
169 const kFontName_Ahem = "AhemTest";
170 const kFontName_MPlus = "mplusTest";
172 var gFontIndex = 0;
173 const kFonts = [
174 { family: kFontName_Ahem, defaultSize: 16 },
175 { family: kFontName_Ahem, defaultSize: 20 },
176 { family: kFontName_Ahem, defaultSize: 32 },
177 { family: kFontName_Ahem, defaultSize: 52 },
179 { family: kFontName_MPlus, defaultSize: 16 },
180 { family: kFontName_MPlus, defaultSize: 20 },
181 { family: kFontName_MPlus, defaultSize: 32 },
182 { family: kFontName_MPlus, defaultSize: 52 },
183 ];
185 const kDecorationStyleNone = 0;
186 const kDecorationStyleDotted = 1;
187 const kDecorationStyleDashed = 2;
188 const kDecorationStyleSolid = 3;
189 const kDecorationStyleDouble = 4;
190 const kDecorationStyleWavy = 5;
192 var gDecorationIndex = 0;
193 const kDecorations = [
194 { relativeSize: 1.0, style: kDecorationStyleNone, styleName: "-moz-none" },
195 { relativeSize: 1.0, style: kDecorationStyleSolid, styleName: "solid" },
196 { relativeSize: 1.0, style: kDecorationStyleDotted, styleName: "dotted" },
197 { relativeSize: 1.0, style: kDecorationStyleDashed, styleName: "dashed" },
198 { relativeSize: 1.0, style: kDecorationStyleDouble, styleName: "double" },
199 { relativeSize: 1.0, style: kDecorationStyleWavy, styleName: "wavy" },
201 // XXX relativeSize 2.0 cannot be tested by CSS3 text-decoration
203 ];
205 function run()
206 {
207 if (++gSelectionIndex == kSelections.length) {
208 if (++gFontIndex == kFonts.length) {
209 if (++gDecorationIndex == kDecorations.length) {
210 SimpleTest.finish();
211 cleanup();
212 return;
213 }
214 gFontIndex = 0;
215 }
216 gSelectionIndex = 0;
217 SpecialPowers.setIntPref("font.size.variable.x-western",
218 kFonts[gFontIndex].defaultSize);
219 }
221 var test = {
222 font: kFonts[gFontIndex],
223 decoration: kDecorations[gDecorationIndex],
224 selection: kSelections[gSelectionIndex],
225 };
227 SpecialPowers.setIntPref("ui.SpellCheckerUnderlineRelativeSize",
228 test.decoration.relativeSize * 100);
229 SpecialPowers.setIntPref("ui.IMEUnderlineRelativeSize",
230 test.decoration.relativeSize * 100);
231 SpecialPowers.setIntPref("ui.SpellCheckerUnderlineStyle",
232 test.decoration.style);
233 SpecialPowers.setIntPref("ui.IMERawInputUnderlineStyle",
234 test.decoration.style);
235 SpecialPowers.setIntPref("ui.IMESelectedRawTextUnderlineStyle",
236 test.decoration.style);
237 SpecialPowers.setIntPref("ui.IMEConvertedTextUnderlineStyle",
238 test.decoration.style);
239 SpecialPowers.setIntPref("ui.IMESelectedConvertedTextUnderlineStyle",
240 test.decoration.style);
242 SimpleTest.executeSoon(function () { doTest(test); });
243 }
245 function doTest(aTest)
246 {
248 var canvases = [];
249 function callbackTestCanvas(canvas)
250 {
251 canvases.push(canvas);
253 if (canvases.length != 2)
254 return;
256 var result = !canvases[0].isReference() ? canvases[0] : canvases[1];
257 var reference = canvases[0].isReference() ? canvases[0] : canvases[1];
259 var description = "Rendering of reftest (" +
260 "selection: " + aTest.selection.typeName +
261 ", style: " + aTest.decoration.styleName +
262 ", relativeSize: " + aTest.decoration.relativeSize +
263 ", font: " + aTest.font.family +
264 ", default font size: " + aTest.font.defaultSize +
265 ") is different\n" +
266 "RESULT=" + result.snapshotDataURL + "\n" +
267 "REFERENCE=" + reference.snapshotDataURL + "\n";
269 if (result.compare(reference, true)) {
270 ok(true, description);
271 // If the decoration line is thick and the descender of the text isn't
272 // enough for containing it, selection underline may be painted lower
273 // if it's possible. Then, we cannot test it with CSS3 text-decoration.
274 } else if (aTest.decoration.style == kDecorationStyleDouble ||
275 aTest.decoration.style == kDecorationStyleWavy) {
276 todo(false, description);
277 } else {
278 ok(false, description);
279 }
281 canvases = [];
283 run();
284 }
286 var testCanvas = new RemoteCanvas(document.getElementById("result"), aTest);
287 testCanvas.load(callbackTestCanvas);
289 var refCanvas = new RemoteCanvas(document.getElementById("reference"), aTest);
290 refCanvas.load(callbackTestCanvas);
291 }
293 function onLoad()
294 {
295 for (var i = 0; i < gPrefs.length; i++) {
296 if (gPrefs[i].type == "char") {
297 SpecialPowers.setCharPref(gPrefs[i].name, gPrefs[i].newValue);
298 } else if (gPrefs[i].type == "int") {
299 SpecialPowers.setIntPref(gPrefs[i].name, gPrefs[i].newValue);
300 } else if (gPrefs[i].type == "float") {
301 SpecialPowers.setIntPref(gPrefs[i].name, gPrefs[i].newValue * 100);
302 }
303 }
305 var iframe = document.getElementById("result");
306 iframe.width = RemoteCanvas.CANVAS_WIDTH + "px";
307 iframe.height = RemoteCanvas.CANVAS_HEIGHT + "px";
308 iframe = document.getElementById("reference");
309 iframe.width = RemoteCanvas.CANVAS_WIDTH + "px";
310 iframe.height = RemoteCanvas.CANVAS_HEIGHT + "px";
312 run();
313 }
315 function cleanup()
316 {
317 SpecialPowers.clearUserPref("font.size.variable.x-western");
318 for (var i = 0; i < gPrefs.length; i++) {
319 SpecialPowers.clearUserPref(gPrefs[i].name);
320 }
321 }
323 SimpleTest.waitForExplicitFinish();
324 SimpleTest.waitForFocus(onLoad, window);
326 </script>
328 </head>
329 <body>
331 <iframe src="frame_selection_underline.xhtml" id="result"></iframe>
332 <iframe src="frame_selection_underline-ref.xhtml" id="reference"></iframe>
333 <pre id="test">
334 </pre>
336 </body>
337 </html>