2 * Copyright (C) 2005, 2006, 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 * Test DefineEditText tag.
22 * Uses both "embedded" font and device fonts.
23 * The text written is 'Hello world' in both cases.
24 * Text at the bottom is the one with embedded fonts.
26 * TODO: add a testrunner for pixel checking.
27 * TODO: test autoSize and wordWrap interaction (what takes precedence?)
29 * run as ./DefineEditTextTest
36 #include "ming_utils.h"
38 #define OUTPUT_VERSION 7
39 #define OUTPUT_FILENAME "DefineEditTextTest.swf"
41 SWFDisplayItem
add_text_field(SWFMovie mo
, SWFBlock font
, const char* text
,
42 float indent
, float leftMargin
, float rightMargin
, SWFTextFieldAlignment align
,
44 unsigned int textR
, unsigned int textG
, unsigned int textB
, unsigned int textA
);
47 add_text_field(SWFMovie mo
, SWFBlock font
, const char* text
, float indent
,
48 float leftMargin
, float rightMargin
,
49 SWFTextFieldAlignment align
, float lineSpacing
,
50 unsigned int textR
, unsigned int textG
,
51 unsigned int textB
, unsigned int textA
)
55 tf
= newSWFTextField();
57 SWFTextField_setFont(tf
, font
);
58 SWFTextField_setIndentation(tf
, indent
);
59 SWFTextField_setLeftMargin(tf
, leftMargin
);
60 SWFTextField_setRightMargin(tf
, rightMargin
);
61 SWFTextField_setAlignment(tf
, align
);
62 SWFTextField_setLineSpacing(tf
, lineSpacing
);
63 SWFTextField_setColor(tf
, textR
, textG
, textB
, textA
);
65 /* setting flags seem unneeded */
66 /*SWFTextField_setFlags(tf, SWFTEXTFIELD_USEFONT|SWFTEXTFIELD_NOEDIT);*/
67 SWFTextField_addChars(tf
, text
);
69 SWFTextField_addString(tf
, text
);
72 * Bounds computed by Ming (if we omit the setBounds call)
73 * are 2640, 240. This means that we're shrinking the available
74 * space with this explicit setting. Gnash chokes in this case.
76 * Ref: https://savannah.gnu.org/bugs/?func=detailitem&item_id=16637.
78 SWFTextField_setBounds(tf
, 100, 100);
79 //SWFTextField_setBounds(tf, 60000, 338);
82 * The following settings (found in the reported SWF)
83 * are not needed to exploit the bug.
86 /*SWFTextField_setHeight(tf, 240);*/
87 /*SWFTextField_setColor(tf, 0x00, 0x00, 0x00, 0xff);*/
88 /*SWFTextField_setAlignment(tf, SWFTEXTFIELD_ALIGN_LEFT);*/
89 /*SWFTextField_setLeftMargin(tf, 0);*/
90 /*SWFTextField_setRightMargin(tf, 0);*/
91 /*SWFTextField_setIndentation(tf, 0);*/
92 /*SWFTextField_setLineSpacing(tf, 40);*/
93 /*SWFTextField_setLineSpacing(tf, 40);*/
95 return SWFMovie_add(mo
, (SWFBlock
)tf
);
99 main(int argc
, char** argv
)
102 const char *srcdir
=".";
104 SWFMovieClip dejagnuclip
;
106 /*********************************************
110 *********************************************/
112 if ( argc
>1 ) srcdir
=argv
[1];
115 fprintf(stderr
, "Usage: %s <mediadir>\n", argv
[0]);
119 sprintf(fdbfont
, "%s/Bitstream-Vera-Sans.fdb", srcdir
);
121 puts("Setting things up");
124 Ming_useSWFVersion (OUTPUT_VERSION
);
125 //Ming_setScale(20.0); /* so we talk twips */
128 SWFMovie_setRate(mo
, 1.0);
129 SWFMovie_setDimension(mo
, 800, 600);
131 dejagnuclip
= get_dejagnu_clip((SWFBlock
)get_default_font(srcdir
), 10, 0, 0, 800, 600);
132 SWFMovie_add(mo
, (SWFBlock
)dejagnuclip
);
133 SWFMovie_nextFrame(mo
); // 1st frame
135 // Check that the dejagnu clip is really a TextField.
136 check_equals(mo
, "_root.getInstanceAtDepth(-16383)",
137 "_level0.instance1");
138 check(mo
, "_level0.instance1._xtrace_win "
139 "instanceof TextField");
141 // Note: the dejagnuclip already placed some texts, so the following
143 check(mo
, "TextField.prototype.hasOwnProperty('background')");
144 check(mo
, "TextField.prototype.hasOwnProperty('backgroundColor')");
145 check(mo
, "TextField.prototype.hasOwnProperty('text')");
146 check(mo
, "TextField.prototype.hasOwnProperty('textColor')");
148 /*********************************************
150 * Add some textfields
152 *********************************************/
155 FILE *font_file
= fopen(fdbfont
, "r");
156 if ( font_file
== NULL
)
161 SWFBrowserFont bfont
= newSWFBrowserFont("_sans");
162 SWFFont efont
= loadSWFFontFromFile(font_file
);
164 it
= add_text_field(mo
, (SWFBlock
)bfont
, "Hello", 1, 2, 3, SWFTEXTFIELD_ALIGN_LEFT
, 10, 100, 101, 102, 50);
165 SWFDisplayItem_setName(it
, "dtext1");
166 SWFDisplayItem_moveTo(it
, 0, 200);
167 it
= add_text_field(mo
, (SWFBlock
)efont
, "Hello", 4, 5, 6, SWFTEXTFIELD_ALIGN_CENTER
, 11, 110, 111, 112, 51);
168 SWFDisplayItem_setName(it
, "etext1");
169 SWFDisplayItem_moveTo(it
, 0, 300);
171 SWFBrowserFont bfont2
= newSWFBrowserFont("times");
172 it
= add_text_field(mo
, (SWFBlock
)bfont2
, "Hello", 7, 8, 9, SWFTEXTFIELD_ALIGN_RIGHT
, 12, 120, 121, 122, 52);
173 SWFDisplayItem_setName(it
, "dtext2");
174 SWFDisplayItem_moveTo(it
, 0, 400);
176 SWFMovie_nextFrame(mo
);
178 check_equals(mo
, "dtext1.embedFonts", "false");
179 check_equals(mo
, "etext1.embedFonts", "true");
180 check_equals(mo
, "etext1.hasOwnProperty('embedFonts')", "false");
182 add_actions(mo
, "ret = Selection.setFocus(dtext1);"
183 "check_equals(ret, false);"
184 "check_equals(Selection.getFocus(), '_level0.dtext1');");
185 add_actions(mo
, "ret = Selection.setFocus(etext1);"
186 "check_equals(ret, false);"
187 "check_equals(Selection.getFocus(), '_level0.etext1');");
189 add_actions(mo
, "createTextField('dynamictext1', 99, 10, 10, 10, 10);");
191 add_actions(mo
, "ret = Selection.setFocus(dynamictext1);"
192 "check_equals(ret, false);"
193 "check_equals(Selection.getFocus(), '_level0.dynamictext1');");
195 check_equals(mo
, "dtext1.__proto__", "TextField.prototype");
196 check_equals(mo
, "etext1.__proto__", "TextField.prototype");
197 check_equals(mo
, "etext1.__proto__", "dynamictext1.__proto__");
199 // checks after placing some swf defined TextField
200 check(mo
, "TextField.prototype.hasOwnProperty('background')");
201 check(mo
, "TextField.prototype.hasOwnProperty('backgroundColor')");
202 check(mo
, "TextField.prototype.hasOwnProperty('text')");
203 check(mo
, "TextField.prototype.hasOwnProperty('textColor')");
204 check(mo
, "!TextField.prototype.hasOwnProperty('_parent')");
205 check(mo
, "!TextField.prototype.hasOwnProperty('_xmouse')");
206 check(mo
, "!TextField.prototype.hasOwnProperty('_ymouse')");
207 check(mo
, "!TextField.prototype.hasOwnProperty('_xscale')");
208 check(mo
, "!TextField.prototype.hasOwnProperty('_yscale')");
210 check_equals(mo
, "typeof(dtext1)", "'object'");
211 check_equals(mo
, "typeof(dtext1.text)", "'string'");
212 check_equals(mo
, "typeof(dtext1.background)", "'boolean'");
213 check_equals(mo
, "typeof(dtext1.backgroundColor)", "'number'");
214 check_equals(mo
, "typeof(dtext1.textColor)", "'number'");
215 check_equals(mo
, "typeof(dtext1._alpha)", "'number'");
216 check_equals(mo
, "typeof(dtext1.type)", "'string'");
217 check_equals(mo
, "dtext1.type", "'input'");
219 check_equals(mo
, "typeof(dtext1.__proto__.text)", "'undefined'");
220 check_equals(mo
, "typeof(dtext1.__proto__.background)", "'undefined'");
221 check_equals(mo
, "typeof(dtext1.__proto__.backgroundColor)", "'undefined'");
222 check_equals(mo
, "typeof(dtext1.__proto__.textColor)", "'undefined'");
223 check_equals(mo
, "typeof(dtext1.__proto__._alpha)", "'undefined'");
225 check_equals(mo
, "dtext1.hasOwnProperty('text')", "false");
226 check_equals(mo
, "dtext1.hasOwnProperty('background')", "false");
227 check_equals(mo
, "dtext1.hasOwnProperty('backgroundColor')", "false");
228 check_equals(mo
, "dtext1.hasOwnProperty('textColor')", "false");
229 check_equals(mo
, "dtext1.hasOwnProperty('_alpha')", "false");
230 check(mo
, "!dtext1.hasOwnProperty('_parent')");
231 check(mo
, "!dtext1.hasOwnProperty('_xmouse')");
232 check(mo
, "!dtext1.hasOwnProperty('_ymouse')");
233 check(mo
, "!dtext1.hasOwnProperty('_xscale')");
234 check(mo
, "!dtext1.hasOwnProperty('_yscale')");
235 check(mo
, "!etext1.hasOwnProperty('_parent')");
236 check(mo
, "!etext1.hasOwnProperty('_xmouse')");
237 check(mo
, "!etext1.hasOwnProperty('_ymouse')");
238 check(mo
, "!etext1.hasOwnProperty('_xscale')");
239 check(mo
, "!etext1.hasOwnProperty('_yscale')");
241 check(mo
, "dtext1.__proto__.hasOwnProperty('text')");
242 check_equals(mo
, "dtext1.__proto__.hasOwnProperty('background')", "true");
243 check_equals(mo
, "dtext1.__proto__.hasOwnProperty('backgroundColor')", "true");
244 check_equals(mo
, "dtext1.__proto__.hasOwnProperty('textColor')", "true");
245 // Why _alpha is special???
246 check_equals(mo
, "dtext1.__proto__.hasOwnProperty('_alpha')", "false");
248 check_equals(mo
, "dtext1.text", "'Hello'");
249 check_equals(mo
, "etext1.text", "'Hello'");
250 check_equals(mo
, "dtext2.text", "'Hello'");
251 check_equals(mo
, "dtext1.background", "false");
252 check_equals(mo
, "etext1.background", "false");
253 check_equals(mo
, "dtext2.background", "false");
254 check_equals(mo
, "dtext1.backgroundColor", "0xffffff");
255 check_equals(mo
, "etext1.backgroundColor", "0xffffff");
256 check_equals(mo
, "dtext2.backgroundColor", "0xffffff");
257 check_equals(mo
, "dtext1.textColor", "6579558");
258 check_equals(mo
, "etext1.textColor", "7237488");
259 check_equals(mo
, "dtext2.textColor", "7895418");
260 check_equals(mo
, "dtext1._alpha", "100");
261 check_equals(mo
, "etext1._alpha", "100");
262 check_equals(mo
, "dtext2._alpha", "100");
263 check_equals(mo
, "etext1._parent", "_root");
264 check_equals(mo
, "dtext2._parent", "_root");
265 check_equals(mo
, "etext1._xscale", "100");
266 check_equals(mo
, "dtext2._xscale", "100");
267 check_equals(mo
, "etext1._yscale", "100");
268 check_equals(mo
, "dtext2._yscale", "100");
269 check_equals(mo
, "typeof(etext1._xmouse)", "'number'");
270 check_equals(mo
, "typeof(dtext2._xmouse)", "'number'");
271 check_equals(mo
, "typeof(etext1._ymouse)", "'number'");
272 check_equals(mo
, "typeof(dtext2._ymouse)", "'number'");
274 // TextFormat objects are created on the fly
276 "etext1.tf = etext1.getTextFormat();"
277 "dtext2.tf = dtext2.getTextFormat();"
279 check_equals(mo
, "typeof(etext1.tf)", "'object'");
280 check_equals(mo
, "typeof(dtext2.tf)", "'object'");
281 check_equals(mo
, "etext1.tf.size", "12");
282 check_equals(mo
, "dtext2.tf.size", "12");
283 check_equals(mo
, "etext1.tf.font", "'Bitstream Vera Sans'");
284 check_equals(mo
, "dtext2.tf.font", "'times'");
285 check_equals(mo
, "typeof(etext1.tf.bold)", "'boolean'");
286 check_equals(mo
, "typeof(dtext2.tf.bold)", "'boolean'");
287 check_equals(mo
, "etext1.tf.bold", "false");
288 check_equals(mo
, "dtext2.tf.bold", "false");
289 check_equals(mo
, "typeof(etext1.tf.italic)", "'boolean'");
290 check_equals(mo
, "typeof(dtext2.tf.italic)", "'boolean'");
291 check_equals(mo
, "etext1.tf.italic", "false");
292 check_equals(mo
, "dtext2.tf.italic", "false");
293 check_equals(mo
, "typeof(etext1.tf.indent)", "'number'");
294 check_equals(mo
, "typeof(dtext2.tf.indent)", "'number'");
295 check_equals(mo
, "etext1.tf.indent", "4");
296 check_equals(mo
, "dtext2.tf.indent", "7");
297 check_equals(mo
, "typeof(etext1.tf.leftMargin)", "'number'");
298 check_equals(mo
, "typeof(dtext2.tf.leftMargin)", "'number'");
299 check_equals(mo
, "etext1.tf.leftMargin", "5");
300 check_equals(mo
, "dtext2.tf.leftMargin", "8");
301 check_equals(mo
, "typeof(etext1.tf.rightMargin)", "'number'");
302 check_equals(mo
, "typeof(dtext2.tf.rightMargin)", "'number'");
303 check_equals(mo
, "etext1.tf.rightMargin", "6");
304 check_equals(mo
, "dtext2.tf.rightMargin", "9");
305 check_equals(mo
, "typeof(etext1.tf.align)", "'string'");
306 check_equals(mo
, "typeof(dtext2.tf.align)", "'string'");
307 check_equals(mo
, "etext1.tf.align", "'center'");
308 check_equals(mo
, "dtext2.tf.align", "'right'");
309 check_equals(mo
, "typeof(etext1.tf.leading)", "'number'");
310 check_equals(mo
, "typeof(dtext2.tf.leading)", "'number'");
311 check_equals(mo
, "etext1.tf.leading", "11");
312 check_equals(mo
, "dtext2.tf.leading", "12");
313 check_equals(mo
, "typeof(etext1.tf.color)", "'number'");
314 check_equals(mo
, "typeof(dtext2.tf.color)", "'number'");
315 check_equals(mo
, "etext1.tf.color", "7237488");
316 check_equals(mo
, "dtext2.tf.color", "7895418");
317 check_equals(mo
, "typeof(etext1.tf.blockIndent)", "'number'");
318 check_equals(mo
, "typeof(dtext2.tf.blockIndent)", "'number'");
319 check_equals(mo
, "etext1.tf.blockIndent", "0");
320 check_equals(mo
, "dtext2.tf.blockIndent", "0");
321 check_equals(mo
, "typeof(etext1.tf.underline)", "'boolean'");
322 check_equals(mo
, "typeof(dtext2.tf.underline)", "'boolean'");
323 check_equals(mo
, "etext1.tf.underline", "false");
324 check_equals(mo
, "dtext2.tf.underline", "false");
326 add_actions(mo
, "dtext1.background = true;"
327 "etext1.background = true;"
328 "dtext2.background = true;"
329 "dtext1.backgroundColor = 0xff0000;"
330 "etext1.backgroundColor = 0x00ff00;"
331 "dtext2.backgroundColor = 0x0000ff;"
332 "dtext1.textColor = 0x00ffff;"
333 "etext1.textColor = 0xff00ff;"
334 "dtext2.textColor = 0xffff00;"
335 "dtext1.text += ' world';"
336 "etext1.text += ' world';"
337 "dtext2.text += ' world';" );
339 check_equals(mo
, "etext1.getTextFormat().color", "0xff00ff");
340 check_equals(mo
, "dtext2.getTextFormat().color", "0xffff00");
342 check_equals(mo
, "dtext1.text", "'Hello world'");
343 check_equals(mo
, "etext1.text", "'Hello world'");
344 check_equals(mo
, "dtext2.text", "'Hello world'");
345 check_equals(mo
, "dtext1.background", "true");
346 check_equals(mo
, "etext1.background", "true");
347 check_equals(mo
, "dtext2.background", "true");
348 check_equals(mo
, "dtext1.backgroundColor", "0xff0000");
349 check_equals(mo
, "etext1.backgroundColor", "0x00ff00");
350 check_equals(mo
, "dtext2.backgroundColor", "0x0000ff");
351 check_equals(mo
, "dtext1.textColor", "0x00ffff");
352 check_equals(mo
, "etext1.textColor", "0xff00ff");
353 check_equals(mo
, "dtext2.textColor", "0xffff00");
354 SWFMovie_nextFrame(mo
);
356 add_actions(mo
, "dtext1._alpha = 0;"
358 "dtext2._alpha = 0;" );
359 check_equals(mo
, "dtext1._alpha", "0");
360 check_equals(mo
, "etext1._alpha", "0");
361 check_equals(mo
, "dtext2._alpha", "0");
362 SWFMovie_nextFrame(mo
);
364 add_actions(mo
, "dtext1._alpha = 100; dtext1.embedFonts=true; dtext1.text = 'embedFonts';"
365 "etext1._alpha = 100; etext1.embedFonts=false; etext1.text = '!embedFonts';"
366 "dtext2._alpha = 100;" );
368 check_equals(mo
, "dtext1.embedFonts", "true");
369 check_equals(mo
, "etext1.embedFonts", "false");
371 add_actions(mo
, "totals(); stop();");
372 SWFMovie_nextFrame(mo
);
374 /*****************************************************
378 *****************************************************/
379 puts("Saving " OUTPUT_FILENAME
);
381 SWFMovie_save(mo
, OUTPUT_FILENAME
);