test_bug772796.html (19103B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=772796 5 --> 6 <head> 7 <meta charset="utf-8"> 8 <title>Test for Bug 772796</title> 9 <script src="/tests/SimpleTest/SimpleTest.js"></script> 10 <script src="/tests/SimpleTest/EventUtils.js"></script> 11 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 12 <style> .pre { white-space: pre } </style> 13 </head> 14 <body> 15 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=772796">Mozilla Bug 772796</a> 16 <p id="display"></p> 17 <div id="content" style="display: none"> 18 </div> 19 20 <div id="editable" contenteditable></div> 21 22 <pre id="test"> 23 24 <script type="application/javascript"> 25 var tests = [ 26 // FYI: Those tests were ported to join-pre-and-other-block.html 27 /* 00*/[ 28 "<div>test</div><pre>foobar\nbaz</pre>", 29 "<div>testfoobar</div><pre>baz</pre>", // expected 30 ], 31 /* 01*/[ 32 "<div>test</div><pre><b>foobar\nbaz</b></pre>", 33 "<div>test<b>foobar</b></div><pre><b>baz</b></pre>", // expected 34 ], 35 /* 02*/[ 36 "<div>test</div><pre><b>foo</b>bar\nbaz</pre>", 37 "<div>test<b>foo</b>bar</div><pre>baz</pre>", // expected 38 ], 39 /* 03*/[ 40 "<div>test</div><pre><b>foo</b>\nbar</pre>", 41 "<div>test<b>foo</b></div><pre>bar</pre>", // expected 42 ], 43 /* 04*/[ 44 "<div>test</div><pre><b>foo\n</b>bar\nbaz</pre>", 45 "<div>test<b>foo</b></div><pre>bar\nbaz</pre>", // expected 46 ], 47 48 // The <br> after the foobar is unfortunate but is behaviour that hasn't changed in bug 772796. 49 // FYI: Those tests were ported to join-pre-and-other-block.html 50 /* 05*/[ 51 "<div>test</div><pre>foobar<br>baz</pre>", 52 "<div>testfoobar</div><pre>baz</pre>", // expected 53 ], 54 /* 06*/[ 55 "<div>test</div><pre><b>foobar<br>baz</b></pre>", 56 "<div>test<b>foobar</b></div><pre><b>baz</b></pre>", // expected 57 ], 58 59 // Some tests with block elements. 60 // FYI: Those tests were ported to join-pre-and-other-block.html 61 /* 07*/[ 62 "<div>test</div><pre><div>foobar</div>baz</pre>", 63 "<div>testfoobar</div><pre>baz</pre>", // expected 64 ], 65 /* 08*/[ 66 "<div>test</div><pre>foobar<div>baz</div></pre>", 67 "<div>testfoobar</div><pre><div>baz</div></pre>", // expected 68 ], 69 /* 09*/[ 70 "<div>test</div><pre><div>foobar</div>baz\nfred</pre>", 71 "<div>testfoobar</div><pre>baz\nfred</pre>", // expected 72 ], 73 /* 10*/[ 74 "<div>test</div><pre>foobar<div>baz</div>\nfred</pre>", 75 "<div>testfoobar</div><pre><div>baz</div>\nfred</pre>", // expected 76 ], 77 /* 11*/[ 78 "<div>test</div><pre><div>foo\nbar</div>baz\nfred</pre>", 79 "<div>testfoo</div><pre><div>bar</div>baz\nfred</pre>", // expected 80 ], 81 /* 12*/[ 82 "<div>test</div><pre>foo<div>bar</div>baz\nfred</pre>", 83 "<div>testfoo</div><pre><div>bar</div>baz\nfred</pre>", // expected 84 ], 85 86 // Repeating all tests above with the <pre> on a new line. 87 // We know that backspace doesn't work (bug 1190161). Third argument shows the current outcome. 88 /* 13-00*/[ 89 "<div>test</div>\n<pre>foobar\nbaz</pre>", 90 "<div>testfoobar</div><pre>baz</pre>", // expected 91 ], 92 /* 14-01*/[ 93 "<div>test</div>\n<pre><b>foobar\nbaz</b></pre>", 94 "<div>test<b>foobar</b></div><pre><b>baz</b></pre>", // expected 95 ], 96 /* 15-02*/[ 97 "<div>test</div>\n<pre><b>foo</b>bar\nbaz</pre>", 98 "<div>test<b>foo</b>bar</div><pre>baz</pre>", // expected 99 ], 100 /* 16-03*/[ 101 "<div>test</div>\n<pre><b>foo</b>\nbar</pre>", 102 "<div>test<b>foo</b></div><pre>bar</pre>", // expected 103 ], 104 /* 17-04*/[ 105 "<div>test</div>\n<pre><b>foo\n</b>bar\nbaz</pre>", 106 "<div>test<b>foo</b></div><pre>bar\nbaz</pre>", // expected 107 ], 108 /* 18-05*/[ 109 "<div>test</div>\n<pre>foobar<br>baz</pre>", 110 "<div>testfoobar</div><pre>baz</pre>", // expected 111 ], 112 /* 19-06*/[ 113 "<div>test</div>\n<pre><b>foobar<br>baz</b></pre>", 114 "<div>test<b>foobar</b></div><pre><b>baz</b></pre>", // expected 115 ], 116 /* 20-07*/[ 117 "<div>test</div>\n<pre><div>foobar</div>baz</pre>", 118 "<div>testfoobar</div><pre>baz</pre>", // expected 119 ], 120 /* 21-08*/[ 121 "<div>test</div>\n<pre>foobar<div>baz</div></pre>", 122 "<div>testfoobar</div><pre><div>baz</div></pre>", // expected 123 ], 124 /* 22-09*/[ 125 "<div>test</div>\n<pre><div>foobar</div>baz\nfred</pre>", 126 "<div>testfoobar</div><pre>baz\nfred</pre>", // expected 127 ], 128 /* 23-10*/[ 129 "<div>test</div>\n<pre>foobar<div>baz</div>\nfred</pre>", 130 "<div>testfoobar</div><pre><div>baz</div>\nfred</pre>", // expected 131 ], 132 /* 24-11*/[ 133 "<div>test</div>\n<pre><div>foo\nbar</div>baz\nfred</pre>", 134 "<div>testfoo</div><pre><div>bar</div>baz\nfred</pre>", // expected 135 ], 136 /* 25-12*/[ 137 "<div>test</div>\n<pre>foo<div>bar</div>baz\nfred</pre>", 138 "<div>testfoo</div><pre><div>bar</div>baz\nfred</pre>", // expected 139 ], 140 141 // Some tests without <div>. These exercise the MoveBlock "right in left" 142 /* 26-00*/[ 143 "test<pre>foobar\nbaz</pre>", 144 "testfoobar<pre>baz</pre>", // expected 145 ], 146 /* 27-01*/[ 147 "test<pre><b>foobar\nbaz</b></pre>", 148 "test<b>foobar</b><pre><b>baz</b></pre>", // expected 149 ], 150 /* 28-02*/[ 151 "test<pre><b>foo</b>bar\nbaz</pre>", 152 "test<b>foo</b>bar<pre>baz</pre>", // expected 153 ], 154 /* 29-03*/[ 155 "test<pre><b>foo</b>\nbar</pre>", 156 "test<b>foo</b><pre>bar</pre>", // expected 157 ], 158 /* 30-04*/[ 159 "test<pre><b>foo\n</b>bar\nbaz</pre>", 160 "test<b>foo</b><pre>bar\nbaz</pre>", // expected 161 ], 162 /* 31-05*/[ 163 "test<pre>foobar<br>baz</pre>", 164 "testfoobar<pre>baz</pre>", // expected 165 ], 166 /* 32-06*/[ 167 "test<pre><b>foobar<br>baz</b></pre>", 168 "test<b>foobar</b><pre><b>baz</b></pre>", // expected 169 ], 170 /* 33-07*/[ 171 "test<pre><div>foobar</div>baz</pre>", 172 "testfoobar<pre>baz</pre>", // expected 173 ], 174 /* 34-08*/[ 175 "test<pre>foobar<div>baz</div></pre>", 176 "testfoobar<pre><div>baz</div></pre>", // expected 177 ], 178 /* 35-09*/[ 179 "test<pre><div>foobar</div>baz\nfred</pre>", 180 "testfoobar<pre>baz\nfred</pre>", // expected 181 ], 182 /* 36-10*/[ 183 "test<pre>foobar<div>baz</div>\nfred</pre>", 184 "testfoobar<pre><div>baz</div>\nfred</pre>", // expected 185 ], 186 /* 37-11*/[ 187 "test<pre><div>foo\nbar</div>baz\nfred</pre>", 188 "testfoo<pre><div>bar</div>baz\nfred</pre>", // expected 189 ], 190 /* 38-12*/[ 191 "test<pre>foo<div>bar</div>baz\nfred</pre>", 192 "testfoo<pre><div>bar</div>baz\nfred</pre>", // expected 193 ], 194 195 // Some tests with <span class="pre"> 196 // All these exercise MoveBlock "left in right". The "right" is the surrounding "contenteditable" div. 197 // FYI: Those tests except the cases <span> having <div> were ported to 198 // join-different-white-space-style-left-paragraph-and-right-line.html 199 /* 39-00*/[ 200 "<div>test</div><span class=\"pre\">foobar\nbaz</span>", 201 "<div>test<span class=\"pre\" style=\"white-space: pre;\">foobar</span></div><span class=\"pre\">baz</span>", // expected 202 ], 203 /* 40-01*/[ 204 "<div>test</div><span class=\"pre\"><b>foobar\nbaz</b></span>", 205 "<div>test<span class=\"pre\" style=\"white-space: pre;\"><b>foobar</b></span></div><span class=\"pre\"><b>baz</b></span>", // expected 206 ], 207 /* 41-02*/[ 208 "<div>test</div><span class=\"pre\"><b>foo</b>bar\nbaz</span>", 209 "<div>test<span class=\"pre\" style=\"white-space: pre;\"><b>foo</b>bar</span></div><span class=\"pre\">baz</span>", // expected 210 ], 211 /* 42-03*/[ 212 "<div>test</div><span class=\"pre\"><b>foo</b>\nbar</span>", 213 "<div>test<span class=\"pre\" style=\"white-space: pre;\"><b>foo</b></span></div><span class=\"pre\">bar</span>", // expected 214 ], 215 /* 43-04*/[ 216 "<div>test</div><span class=\"pre\"><b>foo\n</b>bar\nbaz</span>", 217 "<div>test<span class=\"pre\" style=\"white-space: pre;\"><b>foo</b></span></div><span class=\"pre\">bar\nbaz</span>", // expected 218 ], 219 /* 44-05*/[ 220 "<div>test</div><span class=\"pre\">foobar<br>baz</span>", 221 "<div>test<span class=\"pre\" style=\"white-space: pre;\">foobar</span></div><span class=\"pre\">baz</span>", // expected 222 ], 223 /* 45-06*/[ 224 "<div>test</div><span class=\"pre\"><b>foobar<br>baz</b></span>", 225 "<div>test<span class=\"pre\" style=\"white-space: pre;\"><b>foobar</b></span></div><span class=\"pre\"><b>baz</b></span>", // expected 226 ], 227 /* 46-07*/[ 228 "<div>test</div><span class=\"pre\"><div>foobar</div>baz</span>", 229 "<div>test<span class=\"pre\" style=\"white-space: pre;\"><div>foobar</div></span></div><span class=\"pre\">baz</span>", // expected 230 ], 231 /* 47-08*/[ 232 "<div>test</div><span class=\"pre\">foobar<div>baz</div></span>", 233 "<div>test<span class=\"pre\" style=\"white-space: pre;\">foobar</span></div><span class=\"pre\"><div>baz</div></span>", // expected 234 ], 235 /* 48-09*/[ 236 "<div>test</div><span class=\"pre\"><div>foobar</div>baz\nfred</span>", 237 "<div>test<span class=\"pre\" style=\"white-space: pre;\"><div>foobar</div></span></div><span class=\"pre\">baz\nfred</span>", // expected 238 ], 239 /* 49-10*/[ 240 "<div>test</div><span class=\"pre\">foobar<div>baz</div>\nfred</span>", 241 "<div>test<span class=\"pre\" style=\"white-space: pre;\">foobar</span></div><span class=\"pre\"><div>baz</div>\nfred</span>", // expected 242 ], 243 /* 50-11*/[ 244 "<div>test</div><span class=\"pre\"><div>foo\nbar</div>baz\nfred</span>", 245 "<div>test<span style=\"white-space: pre;\">foo</span></div><span class=\"pre\"><div>bar</div>baz\nfred</span>", // expected 246 ], 247 /* 51-12*/[ 248 "<div>test</div><span class=\"pre\">foo<div>bar</div>baz\nfred</span>", 249 "<div>test<span class=\"pre\" style=\"white-space: pre;\">foo</span></div><span class=\"pre\"><div>bar</div>baz\nfred</span>", // expected 250 ], 251 252 // Some tests with <div class="pre">. 253 // FYI: Those tests were ported to join-different-white-space-style-paragraphs.html 254 /* 52-00*/[ 255 "<div>test</div><div class=\"pre\">foobar\nbaz</div>", 256 "<div>test<span style=\"white-space: pre;\">foobar</span></div><div class=\"pre\">baz</div>", // expected 257 ], 258 /* 53-01*/[ 259 "<div>test</div><div class=\"pre\"><b>foobar\nbaz</b></div>", 260 "<div>test<b style=\"white-space: pre;\">foobar</b></div><div class=\"pre\"><b>baz</b></div>", // expected 261 ], 262 /* 54-02*/[ 263 "<div>test</div><div class=\"pre\"><b>foo</b>bar\nbaz</div>", 264 "<div>test<b style=\"white-space: pre;\">foo</b><span style=\"white-space: pre;\">bar</span></div><div class=\"pre\">baz</div>", // expected 265 ], 266 /* 55-03*/[ 267 "<div>test</div><div class=\"pre\"><b>foo</b>\nbar</div>", 268 "<div>test<b style=\"white-space: pre;\">foo</b></div><div class=\"pre\">bar</div>", // expected 269 ], 270 /* 56-04*/[ 271 "<div>test</div><div class=\"pre\"><b>foo\n</b>bar\nbaz</div>", 272 "<div>test<b style=\"white-space: pre;\">foo</b></div><div class=\"pre\">bar\nbaz</div>", // expected 273 ], 274 /* 57-05*/[ 275 "<div>test</div><div class=\"pre\">foobar<br>baz</div>", 276 "<div>test<span style=\"white-space: pre;\">foobar</span></div><div class=\"pre\">baz</div>", // expected 277 ], 278 /* 58-06*/[ 279 "<div>test</div><div class=\"pre\"><b>foobar<br>baz</b></div>", 280 "<div>test<b style=\"white-space: pre;\">foobar</b></div><div class=\"pre\"><b>baz</b></div>", // expected 281 ], 282 /* 59-07*/[ 283 "<div>test</div><div class=\"pre\"><div>foobar</div>baz</div>", 284 "<div>test<span style=\"white-space: pre;\">foobar</span></div><div class=\"pre\">baz</div>", // expected 285 ], 286 /* 60-08*/[ 287 "<div>test</div><div class=\"pre\">foobar<div>baz</div></div>", 288 "<div>test<span style=\"white-space: pre;\">foobar</span></div><div class=\"pre\"><div>baz</div></div>", // expected 289 ], 290 /* 61-09*/[ 291 "<div>test</div><div class=\"pre\"><div>foobar</div>baz\nfred</div>", 292 "<div>test<span style=\"white-space: pre;\">foobar</span></div><div class=\"pre\">baz\nfred</div>", // expected 293 ], 294 /* 62-10*/[ 295 "<div>test</div><div class=\"pre\">foobar<div>baz</div>\nfred</div>", 296 "<div>test<span style=\"white-space: pre;\">foobar</span></div><div class=\"pre\"><div>baz</div>\nfred</div>", // expected 297 ], 298 /* 63-11*/[ 299 "<div>test</div><div class=\"pre\"><div>foo\nbar</div>baz\nfred</div>", 300 "<div>test<span style=\"white-space: pre;\">foo</span></div><div class=\"pre\"><div>bar</div>baz\nfred</div>", // expected 301 ], 302 /* 64-12*/[ 303 "<div>test</div><div class=\"pre\">foo<div>bar</div>baz\nfred</div>", 304 "<div>test<span style=\"white-space: pre;\">foo</span></div><div class=\"pre\"><div>bar</div>baz\nfred</div>", // expected 305 ], 306 307 // Some tests with lists. These exercise the MoveBlock "left in right". 308 /* 65*/[ 309 "<ul><pre><li>test</li>foobar\nbaz</pre></ul>", 310 "<ul><pre><li>testfoobar</li>baz</pre></ul>", // expected 311 ], 312 /* 66*/[ 313 "<ul><pre><li>test</li><b>foobar\nbaz</b></pre></ul>", 314 "<ul><pre><li>test<b>foobar</b></li><b>baz</b></pre></ul>", // expected 315 ], 316 /* 67*/[ 317 "<ul><pre><li>test</li><b>foo</b>bar\nbaz</pre></ul>", 318 "<ul><pre><li>test<b>foo</b>bar</li>baz</pre></ul>", // expected 319 ], 320 /* 68*/[ 321 "<ul><pre><li>test</li><b>foo</b>\nbar</pre></ul>", 322 "<ul><pre><li>test<b>foo</b></li>bar</pre></ul>", // expected 323 ], 324 /* 69*/[ 325 "<ul><pre><li>test</li><b>foo\n</b>bar\nbaz</pre></ul>", 326 "<ul><pre><li>test<b>foo</b></li>bar\nbaz</pre></ul>", // expected 327 ], 328 329 // Last not least, some simple edge case tests. 330 // FYI: Those tests were ported to join-pre-and-other-block.html 331 /* 70*/[ 332 "<div>test</div><pre>foobar\n</pre>baz", 333 "<div>testfoobar</div>baz", // expected 334 ], 335 /* 71*/[ 336 "<div>test</div><pre>\nfoo\nbar</pre>", 337 "<div>testfoo</div><pre>bar</pre>", // expected 338 ], 339 /* 72*/[ 340 "<div>test</div><pre>\n\nfoo\nbar</pre>", 341 "<div>test</div><pre>foo\nbar</pre>", // expected 342 ], 343 ]; 344 345 /** Test for Bug 772796 */ 346 347 SimpleTest.waitForExplicitFinish(); 348 SimpleTest.waitForFocus(function() { 349 var sel = window.getSelection(); 350 var theEdit = document.getElementById("editable"); 351 var testName; 352 var theDiv; 353 354 for (let i = 0; i < tests.length; i++) { 355 testName = "test" + i.toString(); 356 357 /* Set up the selection. */ 358 theEdit.innerHTML = "<div id=\"" + testName + "\">" + tests[i][0] + "</div>"; 359 theDiv = document.getElementById(testName); 360 theDiv.focus(); 361 sel.collapse(theDiv, 0); 362 synthesizeMouse(theDiv, 100, 2, {}); /* click behind and down */ 363 364 function normalizeStyeAttributeValues(aElement) { 365 for (const element of Array.from( 366 aElement.querySelectorAll("[style]") 367 )) { 368 element.setAttribute( 369 "style", 370 element 371 .getAttribute("style") 372 // Random spacing differences 373 .replace(/$/, ";") 374 .replace(/;;$/, ";") 375 // Gecko likes "transparent" 376 .replace(/transparent/g, "rgba(0, 0, 0, 0)") 377 // WebKit likes to look overly precise 378 .replace(/, 0.496094\)/g, ", 0.5)") 379 // Gecko converts anything with full alpha to "transparent" which 380 // then becomes "rgba(0, 0, 0, 0)", so we have to make other 381 // browsers match 382 .replace(/rgba\([0-9]+, [0-9]+, [0-9]+, 0\)/g, "rgba(0, 0, 0, 0)") 383 ); 384 } 385 } 386 387 let todoCount = 0; 388 /** First round: Forward delete. */ 389 synthesizeKey("KEY_Delete"); 390 normalizeStyeAttributeValues(theDiv); 391 if (tests[i].length == 2 || theDiv.innerHTML == tests[i][1]) { 392 is(theDiv.innerHTML, tests[i][1], "delete(collapsed): inner HTML for " + testName); 393 } else { 394 todoCount++; 395 todo_is(theDiv.innerHTML, tests[i][1], "delete(should be): inner HTML for " + testName); 396 is(theDiv.innerHTML, tests[i][2], "delete(currently is): inner HTML for " + testName); 397 } 398 399 /* Set up the selection. */ 400 theEdit.innerHTML = "<div id=\"" + testName + "\">" + tests[i][0] + "</div>"; 401 theDiv = document.getElementById(testName); 402 theDiv.focus(); 403 sel.collapse(theDiv, 0); 404 synthesizeMouse(theDiv, 100, 2, {}); /* click behind and down */ 405 406 /** Second round: Backspace. */ 407 synthesizeKey("KEY_ArrowRight"); 408 synthesizeKey("KEY_Backspace"); 409 normalizeStyeAttributeValues(theDiv); 410 if (tests[i].length == 2 || theDiv.innerHTML == tests[i][1]) { 411 is(theDiv.innerHTML, tests[i][1], "backspace: inner HTML for " + testName); 412 } else { 413 todoCount++; 414 todo_is(theDiv.innerHTML, tests[i][1], "backspace(should be): inner HTML for " + testName); 415 is(theDiv.innerHTML, tests[i][2], "backspace(currently is): inner HTML for " + testName); 416 } 417 418 /* Set up the selection. */ 419 theEdit.innerHTML = "<div id=\"" + testName + "\">" + tests[i][0] + "</div>"; 420 theDiv = document.getElementById(testName); 421 theDiv.focus(); 422 sel.collapse(theDiv, 0); 423 synthesizeMouse(theDiv, 100, 2, {}); /* click behind and down */ 424 425 /** Third round: Delete with non-collapsed selection. */ 426 if (i == 72) { 427 if (tests[i].length == 3) { 428 ok(!!todoCount, `All tests unexpectedly passed in ${testName}`); 429 } 430 // This test doesn't work, since we can't select only one newline using the right arrow key. 431 continue; 432 } 433 synthesizeKey("KEY_ArrowLeft"); 434 /* Strangely enough we need to hit "right arrow" three times to select two characters. */ 435 synthesizeKey("KEY_ArrowRight", {shiftKey: true}); 436 synthesizeKey("KEY_ArrowRight", {shiftKey: true}); 437 synthesizeKey("KEY_ArrowRight", {shiftKey: true}); 438 synthesizeKey("KEY_Delete"); 439 normalizeStyeAttributeValues(theDiv); 440 441 /* We always expect to the delete the "tf" in "testfoo". */ 442 function makeNonCollapsedExpectation(aExpected) { 443 return aExpected 444 .replace("testfoo", 445 "tesoo") 446 .replace("test<b>foo", 447 "tes<b>oo") 448 .replace("test<b style=\"white-space: pre;\">foo", 449 "tes<b style=\"white-space: pre;\">oo") 450 .replace("test<span style=\"white-space: pre;\">foo", 451 "tes<span style=\"white-space: pre;\">oo") 452 .replace("test<span style=\"white-space: pre;\"><b>foo", 453 "tes<span style=\"white-space: pre;\"><b>oo") 454 .replace("test<span style=\"white-space: pre;\"><div>foo", 455 "tes<span style=\"white-space: pre;\"><div>oo") 456 .replace("test<span class=\"pre\" style=\"white-space: pre;\">foo", 457 "tes<span class=\"pre\" style=\"white-space: pre;\">oo") 458 .replace("test<span class=\"pre\" style=\"white-space: pre;\"><b>foo", 459 "tes<span class=\"pre\" style=\"white-space: pre;\"><b>oo") 460 .replace("test<span class=\"pre\" style=\"white-space: pre;\"><div>foo", 461 "tes<span class=\"pre\" style=\"white-space: pre;\"><div>oo"); 462 } 463 const expected = makeNonCollapsedExpectation(tests[i][1]); 464 if (tests[i].length == 2 || theDiv.innerHTML == expected) { 465 is(theDiv.innerHTML, expected, "delete(non-collapsed): inner HTML for " + testName); 466 } else { 467 todoCount++; 468 todo_is(theDiv.innerHTML, expected, "delete(non-collapsed, should be): inner HTML for " + testName); 469 is( 470 theDiv.innerHTML, 471 makeNonCollapsedExpectation(tests[i][2]), 472 "delete(non-collapsed, currently is): inner HTML for " + testName 473 ); 474 } 475 if (tests[i].length == 3) { 476 ok(!!todoCount, `All tests unexpectedly passed in ${testName}`); 477 } 478 } 479 480 SimpleTest.finish(); 481 }); 482 483 </script> 484 485 </pre> 486 </body> 487 </html>