2 <html xmlns=
"http://www.w3.org/1999/xhtml">
4 https://bugzilla.mozilla.org/show_bug.cgi?id=392233
7 <title>Test for Bug
392233</title>
8 <script src=
"/tests/SimpleTest/SimpleTest.js"></script>
9 <link rel=
"stylesheet" type=
"text/css" href=
"/tests/SimpleTest/test.css" />
12 <a target=
"_blank" href=
"https://bugzilla.mozilla.org/show_bug.cgi?id=392233">Mozilla Bug
392233</a>
14 <div id=
"content" style=
"display: none"></div>
16 <iframe id=
"svg" src=
"text-helper.svg"></iframe>
19 <script class=
"testbody" type=
"application/javascript">
20 SimpleTest.waitForExplicitFinish();
23 var doc = $(
"svg").contentWindow.document;
24 var text1 = doc.getElementById(
"text1");
25 var text2 = doc.getElementById(
"text2");
26 var text3 = doc.getElementById(
"text3");
27 var text4 = doc.getElementById(
"text4");
29 var charWidth = text1.getSubStringLength(
0,
1);
31 function isPoint(pt1, x, y, str) {
32 is(pt1.x, x, str +
" x");
33 is(pt1.y, y, str +
" y");
36 function isPointFuzzy(pt1, x, y, str) {
37 isfuzzy(pt1.x, x,
0.05, str +
" x");
38 isfuzzy(pt1.y, y,
0.05, str +
" y");
42 return r.y + r.height;
49 var p = text1.getStartPositionOfChar(
0);
51 // Simple horizontal string
53 is(text1.getNumberOfChars(),
3,
"text1 length");
54 ok(text1.getComputedTextLength()
> 0,
"text1 measured length");
55 is(text1.getComputedTextLength(), text1.getSubStringLength(
0,
3),
"text1 substring length");
56 isPoint(text1.getStartPositionOfChar(
0),
5,
25,
"text1 char 0 start offset");
57 isPointFuzzy(text1.getStartPositionOfChar(
1),
5 + charWidth,
25,
"text1 char 1 start offset");
58 isPointFuzzy(text1.getStartPositionOfChar(
2),
5 +
2 * charWidth,
25,
"text1 char 2 start offset");
59 isPointFuzzy(text1.getEndPositionOfChar(
0),
5 + charWidth,
25,
"text1 char 0 end offset");
60 isPointFuzzy(text1.getEndPositionOfChar(
1),
5 +
2 * charWidth,
25,
"text1 char 1 end offset");
61 isPointFuzzy(text1.getEndPositionOfChar(
2),
5 +
3 * charWidth,
25,
"text1 char 2 end offset");
62 isfuzzy(text1.getExtentOfChar(
0).x,
5,
0.01,
"text1 char 0 extent x");
63 is(text1.getExtentOfChar(
0).width, text1.getSubStringLength(
0,
1),
"text1 char 0 extent width");
64 ok(text1.getExtentOfChar(
0).y <
25,
"text1 char 0 extent y");
65 ok(ymost(text1.getExtentOfChar(
0))
> 25,
"text1 char 0 extent height");
66 isfuzzy(text1.getExtentOfChar(
1).x,
5 + charWidth,
0.01,
"text1 char 1 extent x");
67 is(text1.getExtentOfChar(
1).width, text1.getSubStringLength(
0,
1),
"text1 char 1 extent width");
68 is(text1.getExtentOfChar(
1).y, text1.getExtentOfChar(
0).y,
"text1 char 0/1 extent y");
69 is(text1.getExtentOfChar(
1).height, text1.getExtentOfChar(
0).height,
"text1 char 0/1 extent height");
70 isfuzzy(text1.getExtentOfChar(
2).x,
5 +
2 * charWidth,
0.02,
"text1 char 2 extent x");
71 is(text1.getExtentOfChar(
2).width, text1.getSubStringLength(
0,
1),
"text1 char 2 extent width");
72 is(text1.getExtentOfChar(
2).y, text1.getExtentOfChar(
0).y,
"text1 char 0/2 extent y");
73 is(text1.getExtentOfChar(
2).height, text1.getExtentOfChar(
0).height,
"text1 char 0/2 extent height");
74 is(text1.getRotationOfChar(
0),
0,
"text1 char 0 rotation");
75 is(text1.getRotationOfChar(
1),
0,
"text1 char 0 rotation");
76 is(text1.getRotationOfChar(
2),
0,
"text1 char 0 rotation");
79 is(text1.getCharNumAtPosition(p),
0,
"text1 finding char 0 left edge");
80 p.x =
5 + charWidth -
0.1;
81 is(text1.getCharNumAtPosition(p),
0,
"text1 finding char 0 on right");
83 is(text1.getCharNumAtPosition(p), -
1,
"text1 finding no char on left");
85 p.y = text1.getExtentOfChar(
0).y -
0.1;
86 is(text1.getCharNumAtPosition(p), -
1,
"text1 finding no char on top");
87 p.y = text1.getExtentOfChar(
0).y +
0.1;
88 is(text1.getCharNumAtPosition(p),
0,
"text1 finding char 0 top edge");
89 p.x =
5 +
3 * charWidth -
0.1;
90 is(text1.getCharNumAtPosition(p),
2,
"text1 finding char 2 top edge");
91 p.x =
5 +
3 * charWidth +
0.1;
92 is(text1.getCharNumAtPosition(p), -
1,
"text1 finding no char on right");
94 // Simple rotated-
90 string ... width might change because of hinting
96 charWidth = text2.getSubStringLength(
0,
1);
98 is(text2.getNumberOfChars(),
3,
"text2 length");
99 ok(text2.getComputedTextLength()
> 0,
"text2 measured length");
100 is(text2.getComputedTextLength(), text2.getSubStringLength(
0,
3),
"text2 substring length");
101 isPointFuzzy(text2.getStartPositionOfChar(
0),
100,
125,
"text2 char 0 start offset");
102 isPointFuzzy(text2.getStartPositionOfChar(
1),
100,
125 + charWidth,
"text2 char 1 start offset");
103 isPointFuzzy(text2.getStartPositionOfChar(
2),
100,
125 +
2 * charWidth,
"text2 char 2 start offset");
104 isPointFuzzy(text2.getEndPositionOfChar(
0),
100,
125 + charWidth,
"text2 char 0 end offset");
105 isPointFuzzy(text2.getEndPositionOfChar(
1),
100,
125 +
2 * charWidth,
"text2 char 1 end offset");
106 isPointFuzzy(text2.getEndPositionOfChar(
2),
100,
125 +
3 * charWidth,
"text2 char 2 end offset");
107 isfuzzy(text2.getExtentOfChar(
0).y,
125,
0.01,
"text2 char 0 extent y");
108 isfuzzy(text2.getExtentOfChar(
0).height, charWidth,
0.000001,
"text2 char 0 extent height");
109 ok(text2.getExtentOfChar(
0).width <
100,
"text2 char 0 extent x");
110 ok(xmost(text2.getExtentOfChar(
0))
> 100,
"text2 char 0 extent width");
111 isfuzzy(text2.getExtentOfChar(
1).y,
125 + charWidth,
0.01,
"text2 char 1 extent x");
112 isfuzzy(text2.getExtentOfChar(
1).height, text2.getSubStringLength(
0,
1),
0.000001,
"text2 char 1 extent width");
113 is(text2.getExtentOfChar(
1).x, text2.getExtentOfChar(
0).x,
"text2 char 0/1 extent y");
114 is(text2.getExtentOfChar(
1).width, text2.getExtentOfChar(
0).width,
"text2 char 0/1 extent height");
115 isfuzzy(text2.getExtentOfChar(
2).y,
125 +
2 * charWidth,
0.01,
"text2 char 2 extent x");
116 isfuzzy(text2.getExtentOfChar(
2).height, text2.getSubStringLength(
0,
1),
0.000001,
"text2 char 2 extent width");
117 is(text2.getExtentOfChar(
2).x, text2.getExtentOfChar(
0).x,
"text2 char 0/2 extent y");
118 is(text2.getExtentOfChar(
2).width, text2.getExtentOfChar(
0).width,
"text2 char 0/2 extent height");
119 is(text2.getRotationOfChar(
0),
90,
"text2 char 0 rotation");
120 is(text2.getRotationOfChar(
1),
90,
"text2 char 0 rotation");
121 is(text2.getRotationOfChar(
2),
90,
"text2 char 0 rotation");
124 is(text2.getCharNumAtPosition(p),
0,
"text2 finding char 0 top edge");
125 p.y =
125 + charWidth -
0.1;
126 is(text2.getCharNumAtPosition(p),
0,
"text2 finding char 0 on bottom");
128 is(text2.getCharNumAtPosition(p), -
1,
"text2 finding no char on top");
130 p.x = text2.getExtentOfChar(
0).x -
0.1;
131 is(text2.getCharNumAtPosition(p), -
1,
"text2 finding no char on left");
132 p.x = text2.getExtentOfChar(
0).x +
0.1;
133 is(text2.getCharNumAtPosition(p),
0,
"text2 finding char 0 left edge");
134 p.y =
125 +
3 * charWidth -
0.1;
135 is(text2.getCharNumAtPosition(p),
2,
"text2 finding char 2 bottom edge");
136 p.y =
1225 +
3 * charWidth +
0.1;
137 is(text2.getCharNumAtPosition(p), -
1,
"text2 finding no char on bottom");
139 // Text along a thin rectangle path
141 charWidth = text3.getSubStringLength(
0,
1);
143 is(text3.getNumberOfChars(),
26,
"text3 length");
144 ok(text3.getComputedTextLength()
> 0,
"text3 measured length");
145 is(text3.getComputedTextLength(), text3.getSubStringLength(
0,
26),
"text3 substring length");
147 // character
12 should be on the bottom side
148 is(text3.getStartPositionOfChar(
12).y,
253,
"text3 char 12 start offset");
149 is(text3.getEndPositionOfChar(
12).y,
253,
"text3 char 12 end offset");
150 ok(text3.getExtentOfChar(
12).y <
253,
"text3 char 12 extent y");
151 ok(ymost(text3.getExtentOfChar(
12))
> 253,
"text3 char 12 extent height");
152 isfuzzy(text3.getRotationOfChar(
12),
180,
0.001,
"text3 char 12 rotation");
153 p.x = text3.getExtentOfChar(
12).x +
0.1;
154 p.y = ymost(text3.getExtentOfChar(
12)) -
0.1;
155 is(text3.getCharNumAtPosition(p),
12,
"text3 finding char 12");
156 // This next test is tricky. The glyph for character
3 may overlap from the above
157 // but character
12 wins because it's the last to render
158 p.y = text3.getExtentOfChar(
12).y +
0.1;
159 is(text3.getCharNumAtPosition(p),
12,
"text3 finding last rendered char");
161 // character
25 should be beyond the end of the path
162 // Not sure what should happen here. Currently we throw, which seems wrong
163 // is(text3.getStartPositionOfChar(
25).x,
0,
"text3 char 25 start offset");
165 // Display:none string
167 is(text4.getNumberOfChars(),
0,
"text4 length");
168 is(text4.getComputedTextLength(),
0,
"text4 measured length");
169 is(text4.getSubStringLength(
0,
3),
0,
"text4 substring length");
170 p = text1.getStartPositionOfChar(
0);
171 is(text4.getCharNumAtPosition(p), -
1,
"text4 shouldn't find rendered char");
174 function runTests() {
177 var doc = $(
"svg").contentWindow.document;
178 doc.getElementById(
"g").setAttribute(
"transform",
"scale(2) rotate(90 200 200)");
185 window.addEventListener(
"load", runTests);