tests.js (258575B)
1 // For the original (development) tests, we want to make a bunch of changes to 2 // the page as it loads. We don't want this for the conformance tests, so let 3 // them opt out. 4 if (typeof testsJsLibraryOnly == "undefined" || !testsJsLibraryOnly) { 5 // Alert the reader of egregious Opera bug that will make the specced 6 // implementation horribly buggy 7 //@{ 8 (function() { 9 var div = document.createElement("div"); 10 div.appendChild(document.createElement("br")); 11 document.body.insertBefore(div, document.body.firstChild); 12 var range = document.createRange(); 13 range.setStart(div, 1); 14 div.insertBefore(document.createElement("p"), div.firstChild); 15 if (range.startOffset > range.startContainer.childNodes.length) { 16 var warningDiv = document.createElement("p"); 17 document.body.insertBefore(warningDiv, document.body.firstChild); 18 warningDiv.style.fontWeight = "bold"; 19 warningDiv.style.fontSize = "2em"; 20 warningDiv.style.color = "red"; 21 warningDiv.innerHTML = 'Your browser suffers from an <a href="http://software.hixie.ch/utilities/js/live-dom-viewer/saved/1028">egregious bug</a> in range mutation that will give incorrect results for the spec columns in many cases. To ensure that the spec column contains the output actually required by the spec, use a different browser.'; 22 } 23 div.parentNode.removeChild(div); 24 })(); 25 //@} 26 27 // Insert the toolbar thingie as soon as the script file is loaded 28 //@{ 29 (function() { 30 var toolbarDiv = document.createElement("div"); 31 toolbarDiv.id = "toolbar"; 32 // Note: this is completely not a hack at all. 33 toolbarDiv.innerHTML = "<style id=alerts>body > div > table > tbody > tr:not(.alert):not(:first-child):not(.active) { display: none }</style>" 34 + "<label><input id=alert-checkbox type=checkbox accesskey=a checked onclick='updateAlertRowStyle()'> Display rows without spec <u>a</u>lerts</label>" 35 + "<label><input id=browser-checkbox type=checkbox accesskey=b checked onclick='localStorage[\"display-browser-tests\"] = event.target.checked'> Run <u>b</u>rowser tests as well as spec tests</label>"; 36 37 document.body.appendChild(toolbarDiv); 38 })(); 39 //@} 40 41 // Confusingly, we're storing a string here, not a boolean. 42 document.querySelector("#alert-checkbox").checked = localStorage["display-alerts"] != "false"; 43 document.querySelector("#browser-checkbox").checked = localStorage["display-browser-tests"] != "false"; 44 45 function updateAlertRowStyle() { 46 //@{ 47 var checked = document.querySelector("#alert-checkbox").checked; 48 document.querySelector("#alerts").disabled = checked; 49 localStorage["display-alerts"] = checked; 50 } 51 //@} 52 updateAlertRowStyle(); 53 54 // Feature-test whether the browser wraps at <wbr> or not, and set word-wrap: 55 // break-word where necessary if not. (IE and Opera don't wrap, Gecko and 56 // WebKit do.) word-wrap: break-word will break anywhere at all, so it looks 57 // significantly uglier. 58 //@{ 59 (function() { 60 var wordWrapTestDiv = document.createElement("div"); 61 wordWrapTestDiv.style.width = "5em"; 62 document.body.appendChild(wordWrapTestDiv); 63 wordWrapTestDiv.innerHTML = "abc"; 64 var height1 = getComputedStyle(wordWrapTestDiv).height; 65 wordWrapTestDiv.innerHTML = "abc<wbr>abc<wbr>abc<wbr>abc<wbr>abc<wbr>abc"; 66 var height2 = getComputedStyle(wordWrapTestDiv).height; 67 document.body.removeChild(wordWrapTestDiv); 68 if (height1 == height2) { 69 document.body.className = (document.body.className + " wbr-workaround").trim(); 70 } 71 })(); 72 //@} 73 } 74 75 // Now for the meat of the file. 76 var tests = { 77 backcolor: [ 78 //@{ Same as hilitecolor (set below) 79 ], 80 //@} 81 bold: [ 82 //@{ 83 'foo[]bar', 84 '<p>[foo</p> <p>bar]</p>', 85 '<span>[foo</span> <span>bar]</span>', 86 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>', 87 '<p>[foo<p><br><p>bar]', 88 '<b>foo[]bar</b>', 89 '<i>foo[]bar</i>', 90 '<span>foo</span>{}<span>bar</span>', 91 '<span>foo[</span><span>]bar</span>', 92 'foo[bar]baz', 93 'foo[bar<b>baz]qoz</b>quz', 94 'foo[bar<i>baz]qoz</i>quz', 95 '{<p><p> <p>foo</p>}', 96 97 'foo<span contenteditable=false>[bar]</span>baz', 98 'fo[o<span contenteditable=false>bar</span>b]az', 99 'foo<span contenteditable=false>ba[r</span>b]az', 100 'fo[o<span contenteditable=false>b]ar</span>baz', 101 'fo[<b>o</b><span contenteditable=false>bar</span><b>b</b>]az', 102 '<span contenteditable=false>foo<span contenteditable=true>[bar]</span>baz</span>', 103 '<span contenteditable=false>fo[o<span contenteditable=true>bar</span>b]az</span>', 104 '<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b]az</span>', 105 '<span contenteditable=false>fo[o<span contenteditable=true>b]ar</span>baz</span>', 106 '<span contenteditable=false>fo[<b>o<span contenteditable=true>bar</span>b</b>]az</span>', 107 108 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 109 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>', 110 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>', 111 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>', 112 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>', 113 '{<table><tr><td>foo<td>bar<td>baz</table>}', 114 115 'foo<span style="font-weight: bold">[bar]</span>baz', 116 'foo<b>[bar]</b>baz', 117 'foo<b>bar</b>[baz]', 118 '[foo]<b>bar</b>baz', 119 '<b>foo</b>[bar]<b>baz</b>', 120 'foo<strong>bar</strong>[baz]', 121 '[foo]<strong>bar</strong>baz', 122 '<strong>foo</strong>[bar]<strong>baz</strong>', 123 '<b>foo</b>[bar]<strong>baz</strong>', 124 '<strong>foo</strong>[bar]<b>baz</b>', 125 'foo[<b>bar</b>]baz', 126 'foo[<b>bar]</b>baz', 127 'foo<b>[bar</b>]baz', 128 129 'foo{<b></b>}baz', 130 'foo{<i></i>}baz', 131 'foo{<b><i></i></b>}baz', 132 'foo{<i><b></b></i>}baz', 133 134 'foo<strong>[bar]</strong>baz', 135 'foo[<strong>bar</strong>]baz', 136 'foo[<strong>bar]</strong>baz', 137 'foo<strong>[bar</strong>]baz', 138 'foo[<span style="font-weight: bold">bar</span>]baz', 139 'foo[<span style="font-weight: bold">bar]</span>baz', 140 'foo<span style="font-weight: bold">[bar</span>]baz', 141 142 '<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>', 143 '<b><p>foo[<i>bar</i>}</p><p>baz</p></b>', 144 145 'foo [bar <b>baz] qoz</b> quz sic', 146 'foo bar <b>baz [qoz</b> quz] sic', 147 148 '<b id=purple>bar [baz] qoz</b>', 149 150 'foo<span style="font-weight: 100">[bar]</span>baz', 151 'foo<span style="font-weight: 200">[bar]</span>baz', 152 'foo<span style="font-weight: 300">[bar]</span>baz', 153 'foo<span style="font-weight: 400">[bar]</span>baz', 154 'foo<span style="font-weight: 500">[bar]</span>baz', 155 'foo<span style="font-weight: 600">[bar]</span>baz', 156 'foo<span style="font-weight: 700">[bar]</span>baz', 157 'foo<span style="font-weight: 800">[bar]</span>baz', 158 'foo<span style="font-weight: 900">[bar]</span>baz', 159 'foo<span style="font-weight: 400">[bar</span>]baz', 160 'foo<span style="font-weight: 700">[bar</span>]baz', 161 'foo[<span style="font-weight: 400">bar]</span>baz', 162 'foo[<span style="font-weight: 700">bar]</span>baz', 163 'foo[<span style="font-weight: 400">bar</span>]baz', 164 'foo[<span style="font-weight: 700">bar</span>]baz', 165 '<span style="font-weight: 100">foo[bar]baz</span>', 166 '<span style="font-weight: 400">foo[bar]baz</span>', 167 '<span style="font-weight: 700">foo[bar]baz</span>', 168 '<span style="font-weight: 900">foo[bar]baz</span>', 169 '{<span style="font-weight: 100">foobar]baz</span>', 170 '{<span style="font-weight: 400">foobar]baz</span>', 171 '{<span style="font-weight: 700">foobar]baz</span>', 172 '{<span style="font-weight: 900">foobar]baz</span>', 173 '<span style="font-weight: 100">foo[barbaz</span>}', 174 '<span style="font-weight: 400">foo[barbaz</span>}', 175 '<span style="font-weight: 700">foo[barbaz</span>}', 176 '<span style="font-weight: 900">foo[barbaz</span>}', 177 178 '<h3>foo[bar]baz</h3>', 179 '{<h3>foobar]baz</h3>', 180 '<h3>foo[barbaz</h3>}', 181 '<h3>[foobarbaz]</h3>', 182 '{<h3>foobarbaz]</h3>', 183 '<h3>[foobarbaz</h3>}', 184 '{<h3>foobarbaz</h3>}', 185 186 '<b>foo<span style="font-weight: normal">bar<b>[baz]</b>quz</span>qoz</b>', 187 '<b>foo<span style="font-weight: normal">[bar]</span>baz</b>', 188 189 '{<b>foo</b> <b>bar</b>}', 190 '{<h3>foo</h3><b>bar</b>}', 191 192 '<i><b>foo</b></i>[bar]<i><b>baz</b></i>', 193 '<i><b>foo</b></i>[bar]<b>baz</b>', 194 '<b>foo</b>[bar]<i><b>baz</b></i>', 195 '<font color=blue face=monospace><b>foo</b></font>[bar]', 196 197 'foo<span style="font-weight: normal"><b>{bar}</b></span>baz', 198 '[foo<span class=notbold>bar</span>baz]', 199 '<b><span class=notbold>[foo]</span></b>', 200 '<b><span class=notbold>foo[bar]baz</span></b>', 201 202 '<p style="font-weight: bold">foo[bar]baz</p>', 203 204 // Tests for queryCommandIndeterm() and queryCommandState() 205 'fo[o<b>b]ar</b>baz', 206 'foo<b>ba[r</b>b]az', 207 'fo[o<b>bar</b>b]az', 208 'foo[<b>b]ar</b>baz', 209 'foo<b>ba[r</b>]baz', 210 'foo{<b>bar</b>}baz', 211 'fo[o<span style=font-weight:bold>b]ar</span>baz', 212 '<span style=font-weight:800>fo[o</span><span style=font-weight:900>b]ar</span>', 213 '<span style=font-weight:700>fo[o</span><span style=font-weight:800>b]ar</span>', 214 '<span style=font-weight:600>fo[o</span><span style=font-weight:700>b]ar</span>', 215 '<span style=font-weight:500>fo[o</span><span style=font-weight:600>b]ar</span>', 216 '<span style=font-weight:400>fo[o</span><span style=font-weight:500>b]ar</span>', 217 '<span style=font-weight:300>fo[o</span><span style=font-weight:400>b]ar</span>', 218 '<span style=font-weight:200>fo[o</span><span style=font-weight:300>b]ar</span>', 219 '<span style=font-weight:100>fo[o</span><span style=font-weight:200>b]ar</span>', 220 ], 221 //@} 222 createlink: [ 223 //@{ 224 'foo[]bar', 225 '<p>[foo</p> <p>bar]</p>', 226 '<span>[foo</span> <span>bar]</span>', 227 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>', 228 '<p>[foo<p><br><p>bar]', 229 '<b>foo[]bar</b>', 230 '<i>foo[]bar</i>', 231 '<span>foo</span>{}<span>bar</span>', 232 '<span>foo[</span><span>]bar</span>', 233 'foo[bar]baz', 234 'foo[bar<b>baz]qoz</b>quz', 235 'foo[bar<i>baz]qoz</i>quz', 236 '{<p><p> <p>foo</p>}', 237 238 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 239 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>', 240 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>', 241 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>', 242 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>', 243 '{<table><tr><td>foo<td>bar<td>baz</table>}', 244 245 '<a href=http://www.google.com/>foo[bar]baz</a>', 246 '<a href=http://www.google.com/>foo[barbaz</a>}', 247 '{<a href=http://www.google.com/>foobar]baz</a>', 248 '{<a href=http://www.google.com/>foobarbaz</a>}', 249 '<a href=http://www.google.com/>[foobarbaz]</a>', 250 251 'foo<a href=http://www.google.com/>[bar]</a>baz', 252 '[foo]<a href=http://www.google.com/>bar</a>baz', 253 'foo<a href=http://www.google.com/>bar</a>[baz]', 254 'foo[<a href=http://www.google.com/>bar</a>]baz', 255 'foo<a href=http://www.google.com/>[bar</a>baz]', 256 '[foo<a href=http://www.google.com/>bar]</a>baz', 257 '[foo<a href=http://www.google.com/>bar</a>baz]', 258 259 '<a href=otherurl>foo[bar]baz</a>', 260 '<a href=otherurl>foo[barbaz</a>}', 261 '{<a href=otherurl>foobar]baz</a>', 262 '{<a href=otherurl>foobarbaz</a>}', 263 '<a href=otherurl>[foobarbaz]</a>', 264 265 'foo<a href=otherurl>[bar]</a>baz', 266 'foo[<a href=otherurl>bar</a>]baz', 267 'foo<a href=otherurl>[bar</a>baz]', 268 '[foo<a href=otherurl>bar]</a>baz', 269 '[foo<a href=otherurl>bar</a>baz]', 270 271 '<a href=otherurl><b>foo[bar]baz</b></a>', 272 '<a href=otherurl><b>foo[barbaz</b></a>}', 273 '{<a href=otherurl><b>foobar]baz</b></a>', 274 '<a href=otherurl><b>[foobarbaz]</b></a>', 275 276 '<a name=abc>foo[bar]baz</a>', 277 '<a name=abc><b>foo[bar]baz</b></a>', 278 279 ['', 'foo[bar]baz'], 280 ], 281 //@} 282 // Opera requires this to be quoted, contrary to ES5 11.1.5 which allows 283 // PropertyName to be any IdentifierName, and see 7.6 which defines 284 // IdentifierName to include ReservedWord; Identifier excludes it. 285 "delete": [ 286 //@{ 287 // Collapsed selection 288 // 289 // These three commented-out test call Firefox 5.0a2 to blow up, not 290 // just throwing exceptions on the tests themselves but on many 291 // subsequent tests too. 292 //'[]foo', 293 //'<span>[]foo</span>', 294 //'<p>[]foo</p>', 295 'foo[]bar', 296 '<span>foo</span>{}<span>bar</span>', 297 '<span>foo[</span><span>]bar</span>', 298 'foo<span style=display:none>bar</span>[]baz', 299 'foo<script>bar</script>[]baz', 300 301 'foö[]bar', 302 'foö[]bar', 303 'foö̧[]bar', 304 'ö[]bar', 305 'ö[]bar', 306 'ö̧[]bar', 307 308 'שָׁ[]לוֹם', 309 'שָׁלוֹ[]ם', 310 311 '<p>foo</p><p>[]bar</p>', 312 '<p>foo</p>[]bar', 313 'foo<p>[]bar</p>', 314 '<p>foo<br></p><p>[]bar</p>', 315 '<p>foo<br></p>[]bar', 316 'foo<br><p>[]bar</p>', 317 '<p>foo<br><br></p><p>[]bar</p>', 318 '<p>foo<br><br></p>[]bar', 319 'foo<br><br><p>[]bar</p>', 320 321 '<div><p>foo</p></div><p>[]bar</p>', 322 '<p>foo</p><div><p>[]bar</p></div>', 323 '<div><p>foo</p></div><div><p>[]bar</p></div>', 324 '<div><p>foo</p></div>[]bar', 325 'foo<div><p>[]bar</p></div>', 326 327 '<div>foo</div><div>[]bar</div>', 328 '<pre>foo</pre>[]bar', 329 330 'foo<br>[]bar', 331 'foo<br><b>[]bar</b>', 332 'foo<hr>[]bar', 333 '<p>foo<hr><p>[]bar', 334 '<p>foo</p><br><p>[]bar</p>', 335 '<p>foo</p><br><br><p>[]bar</p>', 336 '<p>foo</p><img src=/img/lion.svg><p>[]bar', 337 'foo<img src=/img/lion.svg>[]bar', 338 339 '<a>foo</a>[]bar', 340 '<a href=/>foo</a>[]bar', 341 '<a name=abc>foo</a>[]bar', 342 '<a href=/ name=abc>foo</a>[]bar', 343 '<span><a>foo</a></span>[]bar', 344 '<span><a href=/>foo</a></span>[]bar', 345 '<span><a name=abc>foo</a></span>[]bar', 346 '<span><a href=/ name=abc>foo</a></span>[]bar', 347 'foo<a>[]bar</a>', 348 'foo<a href=/>[]bar</a>', 349 'foo<a name=abc>[]bar</a>', 350 'foo<a href=/ name=abc>[]bar</a>', 351 352 'foo []', 353 ' [] foo', 354 'foo []bar', 355 'foo []bar', 356 'foo []bar', 357 'foo []bar', 358 'foo [] bar', 359 'foo [] bar', 360 'foo []bar', 361 'foo []<span> </span> bar', 362 'foo <span> </span>[] bar', 363 'foo <span> </span> []bar', 364 '<b>foo </b> []bar', 365 '<b>foo </b> []bar', 366 '<b>foo </b> []bar', 367 '<b>foo </b> []bar', 368 '<p>foo </p><p>[] bar</p>', 369 370 '<pre>foo []</pre>', 371 '<pre> [] foo</pre>', 372 '<pre>foo []bar</pre>', 373 '<pre>foo []bar</pre>', 374 '<pre>foo []bar</pre>', 375 376 '<div style=white-space:pre>foo []</div>', 377 '<div style=white-space:pre> [] foo</div>', 378 '<div style=white-space:pre>foo []bar</div>', 379 '<div style=white-space:pre>foo []bar</div>', 380 '<div style=white-space:pre>foo []bar</div>', 381 382 '<div style=white-space:pre-wrap>foo []</div>', 383 '<div style=white-space:pre-wrap> [] foo</div>', 384 '<div style=white-space:pre-wrap>foo []bar</div>', 385 '<div style=white-space:pre-wrap>foo []bar</div>', 386 '<div style=white-space:pre-wrap>foo []bar</div>', 387 388 '<div style=white-space:pre-line>foo []</div>', 389 '<div style=white-space:pre-line> [] foo</div>', 390 '<div style=white-space:pre-line>foo []bar</div>', 391 '<div style=white-space:pre-line>foo []bar</div>', 392 '<div style=white-space:pre-line>foo []bar</div>', 393 394 '<div style=white-space:nowrap>foo []</div>', 395 '<div style=white-space:nowrap> [] foo</div>', 396 '<div style=white-space:nowrap>foo []bar</div>', 397 '<div style=white-space:nowrap>foo []bar</div>', 398 '<div style=white-space:nowrap>foo []bar</div>', 399 400 // Tables with collapsed selection 401 'foo<table><tr><td>[]bar</table>baz', 402 'foo<table><tr><td>bar</table>[]baz', 403 '<p>foo<table><tr><td>[]bar</table><p>baz', 404 '<p>foo<table><tr><td>bar</table><p>[]baz', 405 '<table><tr><td>foo<td>[]bar</table>', 406 '<table><tr><td>foo<tr><td>[]bar</table>', 407 408 'foo<br><table><tr><td>[]bar</table>baz', 409 'foo<table><tr><td>bar<br></table>[]baz', 410 '<p>foo<br><table><tr><td>[]bar</table><p>baz', 411 '<p>foo<table><tr><td>bar<br></table><p>[]baz', 412 '<table><tr><td>foo<br><td>[]bar</table>', 413 '<table><tr><td>foo<br><tr><td>[]bar</table>', 414 415 'foo<br><br><table><tr><td>[]bar</table>baz', 416 'foo<table><tr><td>bar<br><br></table>[]baz', 417 '<p>foo<br><br><table><tr><td>[]bar</table><p>baz', 418 '<p>foo<table><tr><td>bar<br><br></table><p>[]baz', 419 '<table><tr><td>foo<br><br><td>[]bar</table>', 420 '<table><tr><td>foo<br><br><tr><td>[]bar</table>', 421 422 'foo<hr><table><tr><td>[]bar</table>baz', 423 'foo<table><tr><td>bar<hr></table>[]baz', 424 '<table><tr><td>foo<hr><td>[]bar</table>', 425 '<table><tr><td>foo<hr><tr><td>[]bar</table>', 426 427 // Lists with collapsed selection 428 'foo<ol><li>[]bar<li>baz</ol>', 429 'foo<br><ol><li>[]bar<li>baz</ol>', 430 'foo<br><br><ol><li>[]bar<li>baz</ol>', 431 '<ol><li>foo<li>[]bar</ol>', 432 '<ol><li>foo<br><li>[]bar</ol>', 433 '<ol><li>foo<br><br><li>[]bar</ol>', 434 '<ol><li>foo<li>[]bar<br>baz</ol>', 435 '<ol><li>foo<br>bar<li>[]baz</ol>', 436 437 '<ol><li><p>foo</p>{}bar</ol>', 438 439 '<ol><li><p>foo<li>[]bar</ol>', 440 '<ol><li>foo<li><p>[]bar</ol>', 441 '<ol><li><p>foo<li><p>[]bar</ol>', 442 443 '<ol><li>foo<ul><li>[]bar</ul></ol>', 444 'foo<ol><ol><li>[]bar</ol></ol>', 445 'foo<div><ol><li>[]bar</ol></div>', 446 447 'foo<dl><dt>[]bar<dd>baz</dl>', 448 'foo<dl><dd>[]bar</dl>', 449 '<dl><dt>foo<dd>[]bar</dl>', 450 '<dl><dt>foo<dt>[]bar<dd>baz</dl>', 451 '<dl><dt>foo<dd>bar<dd>[]baz</dl>', 452 453 '<ol><li>foo</ol>[]bar', 454 '<ol><li>foo<br></ol>[]bar', 455 '<ol><li>foo<br><br></ol>[]bar', 456 '<ol><li><br></ol>[]bar', 457 '<ol><li>foo<li><br></ol>[]bar', 458 459 '<ol><li>foo</ol><p>[]bar', 460 '<ol><li>foo<br></ol><p>[]bar', 461 '<ol><li>foo<br><br></ol><p>[]bar', 462 '<ol><li><br></ol><p>[]bar', 463 '<ol><li>foo<li><br></ol><p>[]bar', 464 465 '<ol><li>foo</ol>{}<br>', 466 '<ol><li>foo<br></ol>{}<br>', 467 '<ol><li>foo<br><br></ol>{}<br>', 468 '<ol><li><br></ol>{}<br>', 469 '<ol><li>foo<li><br></ol>{}<br>', 470 471 '<ol><li>foo</ol><p>{}<br>', 472 '<ol><li>foo<br></ol><p>{}<br>', 473 '<ol><li>foo<br><br></ol><p>{}<br>', 474 '<ol><li><br></ol><p>{}<br>', 475 '<ol><li>foo<li><br></ol><p>{}<br>', 476 477 // Indented stuff with collapsed selection 478 'foo<blockquote>[]bar</blockquote>', 479 'foo<blockquote><blockquote>[]bar</blockquote></blockquote>', 480 'foo<blockquote><div>[]bar</div></blockquote>', 481 'foo<blockquote style="color: blue">[]bar</blockquote>', 482 483 'foo<blockquote><blockquote><p>[]bar<p>baz</blockquote></blockquote>', 484 'foo<blockquote><div><p>[]bar<p>baz</div></blockquote>', 485 'foo<blockquote style="color: blue"><p>[]bar<p>baz</blockquote>', 486 487 'foo<blockquote><p><b>[]bar</b><p>baz</blockquote>', 488 'foo<blockquote><p><strong>[]bar</strong><p>baz</blockquote>', 489 'foo<blockquote><p><span>[]bar</span><p>baz</blockquote>', 490 491 'foo<blockquote><ol><li>[]bar</ol></blockquote><p>extra', 492 'foo<blockquote>bar<ol><li>[]baz</ol>quz</blockquote><p>extra', 493 'foo<blockquote><ol><li>bar</li><ol><li>[]baz</ol><li>quz</ol></blockquote><p>extra', 494 495 // Invisible stuff with collapsed selection 496 'foo<span></span>[]bar', 497 'foo<span><span></span></span>[]bar', 498 'foo<quasit></quasit>[]bar', 499 'foo<br><span></span>[]bar', 500 '<span>foo<span></span></span>[]bar', 501 'foo<span></span><span>[]bar</span>', 502 'foo<div><div><p>[]bar</div></div>', 503 'foo<div><div><p><!--abc-->[]bar</div></div>', 504 'foo<div><div><!--abc--><p>[]bar</div></div>', 505 'foo<div><!--abc--><div><p>[]bar</div></div>', 506 'foo<!--abc--><div><div><p>[]bar</div></div>', 507 '<div><div><p>foo</div></div>[]bar', 508 '<div><div><p>foo</div></div><!--abc-->[]bar', 509 '<div><div><p>foo</div><!--abc--></div>[]bar', 510 '<div><div><p>foo</p><!--abc--></div></div>[]bar', 511 '<div><div><p>foo<!--abc--></div></div>[]bar', 512 '<div><div><p>foo</p></div></div><div><div><div>[]bar</div></div></div>', 513 '<div><div><p>foo<!--abc--></p></div></div><div><div><div>[]bar</div></div></div>', 514 '<div><div><p>foo</p><!--abc--></div></div><div><div><div>[]bar</div></div></div>', 515 '<div><div><p>foo</p></div><!--abc--></div><div><div><div>[]bar</div></div></div>', 516 '<div><div><p>foo</p></div></div><!--abc--><div><div><div>[]bar</div></div></div>', 517 '<div><div><p>foo</p></div></div><div><!--abc--><div><div>[]bar</div></div></div>', 518 '<div><div><p>foo</p></div></div><div><div><!--abc--><div>[]bar</div></div></div>', 519 '<div><div><p>foo</p></div></div><div><div><div><!--abc-->[]bar</div></div></div>', 520 521 // Styled stuff with collapsed selection 522 '<p style=color:blue>foo<p>[]bar', 523 '<p style=color:blue>foo<p style=color:brown>[]bar', 524 '<p style=color:blue>foo<p style=color:rgba(0,0,255,1)>[]bar', 525 '<p style=color:transparent>foo<p style=color:rgba(0,0,0,0)>[]bar', 526 '<p>foo<p style=color:brown>[]bar', 527 '<p><font color=blue>foo</font><p>[]bar', 528 '<p><font color=blue>foo</font><p><font color=brown>[]bar</font>', 529 '<p>foo<p><font color=brown>[]bar</font>', 530 '<p><span style=color:blue>foo</font><p>[]bar', 531 '<p><span style=color:blue>foo</font><p><span style=color:brown>[]bar</font>', 532 '<p>foo<p><span style=color:brown>[]bar</font>', 533 534 '<p style=background-color:aqua>foo<p>[]bar', 535 '<p style=background-color:aqua>foo<p style=background-color:tan>[]bar', 536 '<p>foo<p style=background-color:tan>[]bar', 537 '<p><span style=background-color:aqua>foo</font><p>[]bar', 538 '<p><span style=background-color:aqua>foo</font><p><span style=background-color:tan>[]bar</font>', 539 '<p>foo<p><span style=background-color:tan>[]bar</font>', 540 541 '<p style=text-decoration:underline>foo<p>[]bar', 542 '<p style=text-decoration:underline>foo<p style=text-decoration:line-through>[]bar', 543 '<p>foo<p style=text-decoration:line-through>[]bar', 544 '<p><u>foo</u><p>[]bar', 545 '<p><u>foo</u><p><s>[]bar</s>', 546 '<p>foo<p><s>[]bar</s>', 547 548 '<p style=color:blue>foo</p>[]bar', 549 'foo<p style=color:brown>[]bar', 550 '<div style=color:blue><p style=color:green>foo</div>[]bar', 551 '<div style=color:blue><p style=color:green>foo</div><p style=color:brown>[]bar', 552 '<p style=color:blue>foo<div style=color:brown><p style=color:green>[]bar', 553 554 // Uncollapsed selection 555 'foo[bar]baz', 556 '<p>foo<span style=color:#aBcDeF>[bar]</span>baz', 557 '<p>foo<span style=color:#aBcDeF>{bar}</span>baz', 558 '<p>foo{<span style=color:#aBcDeF>bar</span>}baz', 559 '<p>[foo<span style=color:#aBcDeF>bar]</span>baz', 560 '<p>{foo<span style=color:#aBcDeF>bar}</span>baz', 561 '<p>foo<span style=color:#aBcDeF>[bar</span>baz]', 562 '<p>foo<span style=color:#aBcDeF>{bar</span>baz}', 563 '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz', 564 565 'foo<b>[bar]</b>baz', 566 'foo<b>{bar}</b>baz', 567 'foo{<b>bar</b>}baz', 568 'foo<span>[bar]</span>baz', 569 'foo<span>{bar}</span>baz', 570 'foo{<span>bar</span>}baz', 571 '<b>foo[bar</b><i>baz]quz</i>', 572 '<p>foo</p><p>[bar]</p><p>baz</p>', 573 '<p>foo</p><p>{bar}</p><p>baz</p>', 574 '<p>foo</p><p>{bar</p>}<p>baz</p>', 575 '<p>foo</p>{<p>bar}</p><p>baz</p>', 576 '<p>foo</p>{<p>bar</p>}<p>baz</p>', 577 578 '<p>foo[bar<p>baz]quz', 579 '<p>foo[bar<div>baz]quz</div>', 580 '<p>foo[bar<h1>baz]quz</h1>', 581 '<div>foo[bar</div><p>baz]quz', 582 '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>', 583 584 '<p><b>foo[bar</b><p>baz]quz', 585 '<div><p>foo[bar</div><p>baz]quz', 586 '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote', 587 '<p>foo[bar<p style=color:blue>baz]quz', 588 '<p>foo[bar<p><b>baz]quz</b>', 589 590 '<div><p>foo<p>[bar<p>baz]</div>', 591 592 'foo[<br>]bar', 593 '<p>foo[</p><p>]bar</p>', 594 '<p>foo[</p><p>]bar<br>baz</p>', 595 'foo[<p>]bar</p>', 596 'foo{<p>}bar</p>', 597 'foo[<p>]bar<br>baz</p>', 598 'foo[<p>]bar</p>baz', 599 'foo{<p>bar</p>}baz', 600 'foo<p>{bar</p>}baz', 601 'foo{<p>bar}</p>baz', 602 '<p>foo[</p>]bar', 603 '<p>foo{</p>}bar', 604 '<p>foo[</p>]bar<br>baz', 605 '<p>foo[</p>]bar<p>baz</p>', 606 'foo[<div><p>]bar</div>', 607 '<div><p>foo[</p></div>]bar', 608 'foo[<div><p>]bar</p>baz</div>', 609 'foo[<div>]bar<p>baz</p></div>', 610 '<div><p>foo</p>bar[</div>]baz', 611 '<div>foo<p>bar[</p></div>]baz', 612 613 '<p>foo<br>{</p>]bar', 614 '<p>foo<br><br>{</p>]bar', 615 'foo<br>{<p>]bar</p>', 616 'foo<br><br>{<p>]bar</p>', 617 '<p>foo<br>{</p><p>}bar</p>', 618 '<p>foo<br><br>{</p><p>}bar</p>', 619 620 '<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>', 621 '<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>', 622 '<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>', 623 '<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>', 624 '<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>', 625 '<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>', 626 '{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}', 627 '<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>', 628 '<p>fo[o<table><tr><td>b]ar</table><p>baz', 629 '<p>foo<table><tr><td>ba[r</table><p>b]az', 630 '<p>fo[o<table><tr><td>bar</table><p>b]az', 631 632 '<p>foo<ol><li>ba[r<li>b]az</ol><p>quz', 633 '<p>foo<ol><li>bar<li>[baz]</ol><p>quz', 634 '<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz', 635 '<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz', 636 '<p>fo[o<ol><li>bar<li>b]az</ol><p>quz', 637 '<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz', 638 639 '<ol><li>fo[o</ol><ol><li>b]ar</ol>', 640 '<ol><li>fo[o</ol><ul><li>b]ar</ul>', 641 642 'foo[<ol><li>]bar</ol>', 643 '<ol><li>foo[<li>]bar</ol>', 644 'foo[<dl><dt>]bar<dd>baz</dl>', 645 'foo[<dl><dd>]bar</dl>', 646 '<dl><dt>foo[<dd>]bar</dl>', 647 '<dl><dt>foo[<dt>]bar<dd>baz</dl>', 648 '<dl><dt>foo<dd>bar[<dd>]baz</dl>', 649 650 '<b>foo [ </b>bar]', 651 'foo<b> [ bar]</b>', 652 '<b>[foo ] </b>bar', 653 '[foo<b> ] bar</b>', 654 655 // Do we merge based on element names or the display property? 656 '<p style=display:inline>fo[o<p style=display:inline>b]ar', 657 '<span style=display:block>fo[o</span><span style=display:block>b]ar</span>', 658 '<span style=display:inline-block>fo[o</span><span style=display:inline-block>b]ar</span>', 659 '<span style=display:inline-table>fo[o</span><span style=display:inline-table>b]ar</span>', 660 '<span style=display:none>fo[o</span><span style=display:none>b]ar</span>', 661 '<quasit style=display:block>fo[o</quasit><quasit style=display:block>b]ar</quasit>', 662 663 // https://bugs.webkit.org/show_bug.cgi?id=35281 664 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13976 665 '<ol><li>foo</ol>{}<br><ol><li>bar</ol>', 666 '<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>', 667 '<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>', 668 '<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>', 669 '<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>', 670 '<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>', 671 '<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>', 672 // Broken test: http://www.w3.org/Bugs/Public/show_bug.cgi?id=14727 673 '!<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>', 674 '<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>', 675 '<ol><li>foo[</ol>bar]<ol><li>baz</ol>', 676 '<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>', 677 '<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>', 678 '<ol><li>foo[]</ol><ol><li>bar</ol>', 679 '<ol><li>foo</ol>[bar<ol><li>]baz</ol>', 680 '<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>', 681 '<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>', 682 '<ol><li>foo</ol><ol><li>b[]ar</ol>', 683 '<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>', 684 '<ul><li>foo</ul>{}<br><ul><li>bar</ul>', 685 '<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>', 686 '<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>', 687 '<ol><li>foo</ol>{}<br><ul><li>bar</ul>', 688 '<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>', 689 '<ul><li>foo</ul>{}<br><ol><li>bar</ol>', 690 '<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>', 691 692 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13831 693 '<p><b>[foo]</b>', 694 '<p><quasit>[foo]</quasit>', 695 '<p><b><i>[foo]</i></b>', 696 '<p><b>{foo}</b>', 697 '<p>{<b>foo</b>}', 698 '<p><b>f[]</b>', 699 '<b>[foo]</b>', 700 '<div><b>[foo]</b></div>', 701 ], 702 //@} 703 fontname: [ 704 //@{ 705 'foo[]bar', 706 '<p>[foo</p> <p>bar]</p>', 707 '<span>[foo</span> <span>bar]</span>', 708 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>', 709 '<p>[foo<p><br><p>bar]', 710 '<b>foo[]bar</b>', 711 '<i>foo[]bar</i>', 712 '<span>foo</span>{}<span>bar</span>', 713 '<span>foo[</span><span>]bar</span>', 714 'foo[bar]baz', 715 'foo[bar<b>baz]qoz</b>quz', 716 'foo[bar<i>baz]qoz</i>quz', 717 '{<p><p> <p>foo</p>}', 718 719 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 720 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>', 721 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>', 722 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>', 723 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>', 724 '{<table><tr><td>foo<td>bar<td>baz</table>}', 725 726 'foo<code>[bar]</code>baz', 727 'foo<kbd>[bar]</kbd>baz', 728 'foo<listing>[bar]</listing>baz', 729 'foo<pre>[bar]</pre>baz', 730 'foo<samp>[bar]</samp>baz', 731 'foo<tt>[bar]</tt>baz', 732 733 'foo<code>b[a]r</code>baz', 734 'foo<kbd>b[a]r</kbd>baz', 735 'foo<listing>b[a]r</listing>baz', 736 'foo<pre>b[a]r</pre>baz', 737 'foo<samp>b[a]r</samp>baz', 738 'foo<tt>b[a]r</tt>baz', 739 740 '[foo<code>bar</code>baz]', 741 '[foo<kbd>bar</kbd>baz]', 742 '[foo<listing>bar</listing>baz]', 743 '[foo<pre>bar</pre>baz]', 744 '[foo<samp>bar</samp>baz]', 745 '[foo<tt>bar</tt>baz]', 746 747 '[foo<code>ba]r</code>baz', 748 '[foo<kbd>ba]r</kbd>baz', 749 '[foo<listing>ba]r</listing>baz', 750 '[foo<pre>ba]r</pre>baz', 751 '[foo<samp>ba]r</samp>baz', 752 '[foo<tt>ba]r</tt>baz', 753 754 'foo<code>b[ar</code>baz]', 755 'foo<kbd>b[ar</kbd>baz]', 756 'foo<listing>b[ar</listing>baz]', 757 'foo<pre>b[ar</pre>baz]', 758 'foo<samp>b[ar</samp>baz]', 759 'foo<tt>b[ar</tt>baz]', 760 761 'foo<span style="font-family: sans-serif">[bar]</span>baz', 762 'foo<span style="font-family: sans-serif">b[a]r</span>baz', 763 'foo<span style="font-family: monospace">[bar]</span>baz', 764 'foo<span style="font-family: monospace">b[a]r</span>baz', 765 766 'foo<tt contenteditable=false>ba[r</tt>b]az', 767 'fo[o<tt contenteditable=false>b]ar</tt>baz', 768 'foo<tt>{}<br></tt>bar', 769 'foo<tt>{<br></tt>}bar', 770 'foo<tt>{<br></tt>b]ar', 771 772 // Tests for queryCommandIndeterm() and queryCommandState() 773 'fo[o<span style=font-family:monospace>b]ar</span>baz', 774 'foo<span style=font-family:monospace>ba[r</span>b]az', 775 'fo[o<span style=font-family:monospace>bar</span>b]az', 776 'foo[<span style=font-family:monospace>b]ar</span>baz', 777 'foo<span style=font-family:monospace>ba[r</span>]baz', 778 'foo[<span style=font-family:monospace>bar</span>]baz', 779 'foo<span style=font-family:monospace>[bar]</span>baz', 780 'foo{<span style=font-family:monospace>bar</span>}baz', 781 'fo[o<code>b]ar</code>', 782 'fo[o<kbd>b]ar</kbd>', 783 'fo[o<listing>b]ar</listing>', 784 'fo[o<pre>b]ar</pre>', 785 'fo[o<samp>b]ar</samp>', 786 'fo[o<tt>b]ar</tt>', 787 '<tt>fo[o</tt><code>b]ar</code>', 788 '<pre>fo[o</pre><samp>b]ar</samp>', 789 '<span style=font-family:monospace>fo[o</span><kbd>b]ar</kbd>', 790 ], 791 //@} 792 fontsize: [ 793 //@{ 794 'foo[]bar', 795 '<p>[foo</p> <p>bar]</p>', 796 '<span>[foo</span> <span>bar]</span>', 797 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>', 798 '<p>[foo<p><br><p>bar]', 799 '<b>foo[]bar</b>', 800 '<i>foo[]bar</i>', 801 '<span>foo</span>{}<span>bar</span>', 802 '<span>foo[</span><span>]bar</span>', 803 'foo[bar]baz', 804 'foo[bar<b>baz]qoz</b>quz', 805 'foo[bar<i>baz]qoz</i>quz', 806 '{<p><p> <p>foo</p>}', 807 808 ["1", 'foo[bar]baz'], 809 ["0", 'foo[bar]baz'], 810 ["-5", 'foo[bar]baz'], 811 ["6", 'foo[bar]baz'], 812 ["7", 'foo[bar]baz'], 813 ["8", 'foo[bar]baz'], 814 ["100", 'foo[bar]baz'], 815 ["2em", 'foo[bar]baz'], 816 ["20pt", 'foo[bar]baz'], 817 ["xx-large", 'foo[bar]baz'], 818 [" 1 ", 'foo[bar]baz'], 819 ["1.", 'foo[bar]baz'], 820 ["1.0", 'foo[bar]baz'], 821 ["1.0e2", 'foo[bar]baz'], 822 ["1.1", 'foo[bar]baz'], 823 ["1.9", 'foo[bar]baz'], 824 ["+0", 'foo[bar]baz'], 825 ["+1", 'foo[bar]baz'], 826 ["+9", 'foo[bar]baz'], 827 ["-0", 'foo[bar]baz'], 828 ["-1", 'foo[bar]baz'], 829 ["-9", 'foo[bar]baz'], 830 ["", 'foo[bar]baz'], 831 832 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 833 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>', 834 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>', 835 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>', 836 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>', 837 '{<table><tr><td>foo<td>bar<td>baz</table>}', 838 839 'foo<font size=1>[bar]</font>baz', 840 '<font size=1>foo[bar]baz</font>', 841 'foo<font size=3>[bar]</font>baz', 842 '<font size=3>foo[bar]baz</font>', 843 'foo<font size=4>[bar]</font>baz', 844 '<font size=4>foo[bar]baz</font>', 845 'foo<font size=+1>[bar]</font>baz', 846 '<font size=+1>foo[bar]baz</font>', 847 '<font size=4>foo<font size=1>b[a]r</font>baz</font>', 848 849 'foo<span style="font-size: xx-small">[bar]</span>baz', 850 '<span style="font-size: xx-small">foo[bar]baz</span>', 851 'foo<span style="font-size: medium">[bar]</span>baz', 852 '<span style="font-size: medium">foo[bar]baz</span>', 853 'foo<span style="font-size: large">[bar]</span>baz', 854 '<span style="font-size: large">foo[bar]baz</span>', 855 '<span style="font-size: large">foo<span style="font-size: xx-small">b[a]r</span>baz</span>', 856 857 'foo<span style="font-size: 2em">[bar]</span>baz', 858 '<span style="font-size: 2em">foo[bar]baz</span>', 859 860 '<p style="font-size: xx-small">foo[bar]baz</p>', 861 '<p style="font-size: medium">foo[bar]baz</p>', 862 '<p style="font-size: large">foo[bar]baz</p>', 863 '<p style="font-size: 2em">foo[bar]baz</p>', 864 865 ["3", '<p style="font-size: xx-small">foo[bar]baz</p>'], 866 ["3", '<p style="font-size: medium">foo[bar]baz</p>'], 867 ["3", '<p style="font-size: large">foo[bar]baz</p>'], 868 ["3", '<p style="font-size: 2em">foo[bar]baz</p>'], 869 870 // Minor algorithm bug: this changes the size of the "b" and "r" in 871 // "bar" when we pull down styles 872 ["3", '<font size=6>foo <span style="font-size: 2em">b[a]r</span> baz</font>'], 873 874 ["3", 'foo<big>[bar]</big>baz'], 875 ["3", 'foo<big>b[a]r</big>baz'], 876 ["3", 'foo<small>[bar]</small>baz'], 877 ["3", 'foo<small>b[a]r</small>baz'], 878 879 // Tests for queryCommandIndeterm() and queryCommandState() 880 'fo[o<font size=2>b]ar</font>baz', 881 'foo<font size=2>ba[r</font>b]az', 882 'fo[o<font size=2>bar</font>b]az', 883 'foo[<font size=2>b]ar</font>baz', 884 'foo<font size=2>ba[r</font>]baz', 885 'foo[<font size=2>bar</font>]baz', 886 'foo<font size=2>[bar]</font>baz', 887 'foo{<font size=2>bar</font>}baz', 888 '<font size=1>fo[o</font><span style=font-size:xx-small>b]ar</span>', 889 '<font size=2>fo[o</font><span style=font-size:small>b]ar</span>', 890 '<font size=3>fo[o</font><span style=font-size:medium>b]ar</span>', 891 '<font size=4>fo[o</font><span style=font-size:large>b]ar</span>', 892 '<font size=5>fo[o</font><span style=font-size:x-large>b]ar</span>', 893 '<font size=6>fo[o</font><span style=font-size:xx-large>b]ar</span>', 894 895 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13829 896 ["!6", '<span style=background-color:aqua>[foo]</span>'], 897 ["!6", '<span style=background-color:aqua>foo[bar]baz</span>'], 898 ["!6", '[foo<span style=background-color:aqua>bar</span>baz]'], 899 ], 900 //@} 901 forecolor: [ 902 //@{ 903 'foo[]bar', 904 '<p>[foo</p> <p>bar]</p>', 905 '<span>[foo</span> <span>bar]</span>', 906 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>', 907 '<p>[foo<p><br><p>bar]', 908 '<b>foo[]bar</b>', 909 '<i>foo[]bar</i>', 910 '<span>foo</span>{}<span>bar</span>', 911 '<span>foo[</span><span>]bar</span>', 912 'foo[bar]baz', 913 'foo[bar<b>baz]qoz</b>quz', 914 'foo[bar<i>baz]qoz</i>quz', 915 '{<p><p> <p>foo</p>}', 916 917 ['blue', 'foo[bar]baz'], 918 ['f', 'foo[bar]baz'], 919 ['#f', 'foo[bar]baz'], 920 ['00f', 'foo[bar]baz'], 921 ['#00f', 'foo[bar]baz'], 922 ['0000ff', 'foo[bar]baz'], 923 ['#0000ff', 'foo[bar]baz'], 924 ['000000fff', 'foo[bar]baz'], 925 ['#000000fff', 'foo[bar]baz'], 926 ['rgb(0, 0, 255)', 'foo[bar]baz'], 927 ['rgb(0%, 0%, 100%)', 'foo[bar]baz'], 928 ['rgb( 0 ,0 ,255)', 'foo[bar]baz'], 929 ['rgba(0, 0, 255, 0.0)', 'foo[bar]baz'], 930 ['rgb(15, -10, 375)', 'foo[bar]baz'], 931 ['rgba(0, 0, 0, 1)', 'foo[bar]baz'], 932 ['rgba(255, 255, 255, 1)', 'foo[bar]baz'], 933 ['rgba(0, 0, 255, 0.5)', 'foo[bar]baz'], 934 ['hsl(240, 100%, 50%)', 'foo[bar]baz'], 935 ['cornsilk', 'foo[bar]baz'], 936 ['potato quiche', 'foo[bar]baz'], 937 ['transparent', 'foo[bar]baz'], 938 ['currentColor', 'foo[bar]baz'], 939 940 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 941 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>', 942 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>', 943 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>', 944 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>', 945 '{<table><tr><td>foo<td>bar<td>baz</table>}', 946 947 'foo<font color=blue>[bar]</font>baz', 948 'foo{<font color=blue>bar</font>}baz', 949 '<span style="color: blue">foo<span style="color: brown">[bar]</span>baz</span>', 950 '<span style="color: #00f">foo<span style="color: brown">[bar]</span>baz</span>', 951 '<span style="color: #0000ff">foo<span style="color: brown">[bar]</span>baz</span>', 952 '<span style="color: rgb(0, 0, 255)">foo<span style="color: brown">[bar]</span>baz</span>', 953 '<font color=blue>foo<font color=brown>[bar]</font>baz</font>', 954 '<span style="color: rgb(0, 0, 255)">foo<span style="color: brown">b[ar]</span>baz</span>', 955 'foo<span id=purple>ba[r</span>ba]z', 956 '<span style="color: rgb(0, 0, 255)">foo<span id=purple>b[a]r</span>baz</span>', 957 958 ['blue', '<a href=http://www.google.com>foo[bar]baz</a>'], 959 ['#0000ff', '<a href=http://www.google.com>foo[bar]baz</a>'], 960 ['rgb(0,0,255)', '<a href=http://www.google.com>foo[bar]baz</a>'], 961 962 // Tests for queryCommandValue() 963 '<font color="blue">[foo]</font>', 964 '<font color="0000ff">[foo]</font>', 965 '<font color="#0000ff">[foo]</font>', 966 '<span style="color: blue">[foo]</span>', 967 '<span style="color: #0000ff">[foo]</span>', 968 '<span style="color: rgb(0, 0, 255)">[foo]</span>', 969 '<span style="color: rgb(0%, 0%, 100%)">[foo]</span>', 970 '<span style="color: rgb( 0 ,0 ,255)">[foo]</span>', 971 '<span style="color: rgba(0, 0, 255, 0.0)">[foo]</span>', 972 '<span style="color: rgb(15, -10, 375)">[foo]</span>', 973 '<span style="color: rgba(0, 0, 0, 1)">[foo]</span>', 974 '<span style="color: rgba(255, 255, 255, 1)">[foo]</span>', 975 '<span style="color: rgba(0, 0, 255, 0.5)">[foo]</span>', 976 '<span style="color: hsl(240, 100%, 50%)">[foo]</span>', 977 '<span style="color: cornsilk">[foo]</span>', 978 '<span style="color: transparent">[foo]</span>', 979 '<span style="color: currentColor">[foo]</span>', 980 981 // Tests for queryCommandIndeterm() and queryCommandState() 982 'fo[o<font color=brown>b]ar</font>baz', 983 'foo<font color=brown>ba[r</font>b]az', 984 'fo[o<font color=brown>bar</font>b]az', 985 'foo[<font color=brown>b]ar</font>baz', 986 'foo<font color=brown>ba[r</font>]baz', 987 'foo[<font color=brown>bar</font>]baz', 988 'foo<font color=brown>[bar]</font>baz', 989 'foo{<font color=brown>bar</font>}baz', 990 '<font color=brown>fo[o</font><span style=color:brown>b]ar</span>', 991 '<span style=color:brown>fo[o</span><span style=color:#0000ff>b]ar</span>', 992 ], 993 //@} 994 formatblock: [ 995 //@{ 996 'foo[]bar<p>extra', 997 '<span>foo</span>{}<span>bar</span><p>extra', 998 '<span>foo[</span><span>]bar</span><p>extra', 999 'foo[bar]baz<p>extra', 1000 'foo]bar[baz<p>extra', 1001 '{<p><p> <p>foo</p>}', 1002 'foo[bar<i>baz]qoz</i>quz<p>extra', 1003 1004 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 1005 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>', 1006 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>', 1007 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>', 1008 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>', 1009 '{<table><tr><td>foo<td>bar<td>baz</table>}', 1010 1011 '<div>[foobar]</div>', 1012 '<p>[foobar]</p>', 1013 '<blockquote>[foobar]</blockquote>', 1014 '<h1>[foobar]</h1>', 1015 '<h2>[foobar]</h2>', 1016 '<h3>[foobar]</h3>', 1017 '<h4>[foobar]</h4>', 1018 '<h5>[foobar]</h5>', 1019 '<h6>[foobar]</h6>', 1020 '<dl><dt>[foo]<dd>bar</dl>', 1021 '<dl><dt>foo<dd>[bar]</dl>', 1022 '<dl><dt>[foo<dd>bar]</dl>', 1023 '<ol><li>[foobar]</ol>', 1024 '<ul><li>[foobar]</ul>', 1025 '<address>[foobar]</address>', 1026 '<pre>[foobar]</pre>', 1027 '<article>[foobar]</article>', 1028 '<ins>[foobar]</ins>', 1029 '<del>[foobar]</del>', 1030 '<quasit>[foobar]</quasit>', 1031 '<quasit style="display: block">[foobar]</quasit>', 1032 1033 ['<p>', 'foo[]bar<p>extra'], 1034 ['<p>', '<span>foo</span>{}<span>bar</span><p>extra'], 1035 ['<p>', '<span>foo[</span><span>]bar</span><p>extra'], 1036 ['<p>', 'foo[bar]baz<p>extra'], 1037 ['<p>', 'foo]bar[baz<p>extra'], 1038 ['<p>', '{<p><p> <p>foo</p>}'], 1039 ['<p>', 'foo[bar<i>baz]qoz</i>quz<p>extra'], 1040 1041 ['<p>', '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>'], 1042 ['<p>', '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>'], 1043 ['<p>', '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>'], 1044 ['<p>', '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>'], 1045 ['<p>', '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>'], 1046 ['<p>', '{<table><tr><td>foo<td>bar<td>baz</table>}'], 1047 1048 ['<p>', '<div>[foobar]</div>'], 1049 ['<p>', '<p>[foobar]</p>'], 1050 ['<p>', '<blockquote>[foobar]</blockquote>'], 1051 ['<p>', '<h1>[foobar]</h1>'], 1052 ['<p>', '<h2>[foobar]</h2>'], 1053 ['<p>', '<h3>[foobar]</h3>'], 1054 ['<p>', '<h4>[foobar]</h4>'], 1055 ['<p>', '<h5>[foobar]</h5>'], 1056 ['<p>', '<h6>[foobar]</h6>'], 1057 ['<p>', '<dl><dt>[foo]<dd>bar</dl>'], 1058 ['<p>', '<dl><dt>foo<dd>[bar]</dl>'], 1059 ['<p>', '<dl><dt>[foo<dd>bar]</dl>'], 1060 ['<p>', '<ol><li>[foobar]</ol>'], 1061 ['<p>', '<ul><li>[foobar]</ul>'], 1062 ['<p>', '<address>[foobar]</address>'], 1063 ['<p>', '<pre>[foobar]</pre>'], 1064 ['<p>', '<listing>[foobar]</listing>'], 1065 ['<p>', '<xmp>[foobar]</xmp>'], 1066 ['<p>', '<article>[foobar]</article>'], 1067 ['<p>', '<ins>[foobar]</ins>'], 1068 ['<p>', '<del>[foobar]</del>'], 1069 ['<p>', '<quasit>[foobar]</quasit>'], 1070 ['<p>', '<quasit style="display: block">[foobar]</quasit>'], 1071 1072 ['<blockquote>', '<blockquote>[foo]</blockquote><p>extra'], 1073 ['<blockquote>', '<blockquote><p>[foo]<p>bar</blockquote><p>extra'], 1074 ['<blockquote>', '[foo]<blockquote>bar</blockquote><p>extra'], 1075 ['<blockquote>', '<p>[foo<p>bar]<p>baz'], 1076 ['<blockquote>', '<section>[foo]</section>'], 1077 ['<blockquote>', '<section><p>[foo]</section>'], 1078 ['<blockquote>', '<section><hgroup><h1>[foo]</h1><h2>bar</h2></hgroup><p>baz</section>'], 1079 ['<article>', '<section>[foo]</section>'], 1080 1081 ['<address>', '<div>[foobar]</div>'], 1082 ['<article>', '<div>[foobar]</div>'], 1083 ['<blockquote>', '<div>[foobar]</div>'], 1084 ['<dd>', '<div>[foobar]</div>'], 1085 ['<del>', '<div>[foobar]</div>'], 1086 ['<dl>', '<div>[foobar]</div>'], 1087 ['<dt>', '<div>[foobar]</div>'], 1088 ['<h1>', '<div>[foobar]</div>'], 1089 ['<h2>', '<div>[foobar]</div>'], 1090 ['<h3>', '<div>[foobar]</div>'], 1091 ['<h4>', '<div>[foobar]</div>'], 1092 ['<h5>', '<div>[foobar]</div>'], 1093 ['<h6>', '<div>[foobar]</div>'], 1094 ['<ins>', '<div>[foobar]</div>'], 1095 ['<li>', '<div>[foobar]</div>'], 1096 ['<ol>', '<div>[foobar]</div>'], 1097 ['<pre>', '<div>[foobar]</div>'], 1098 ['<ul>', '<div>[foobar]</div>'], 1099 ['<quasit>', '<div>[foobar]</div>'], 1100 1101 ['<address>', '<p>[foobar]</p>'], 1102 ['<article>', '<p>[foobar]</p>'], 1103 ['<aside>', '<p>[foobar]</p>'], 1104 ['<blockquote>', '<p>[foobar]</p>'], 1105 ['<body>', '<p>[foobar]</p>'], 1106 ['<dd>', '<p>[foobar]</p>'], 1107 ['<del>', '<p>[foobar]</p>'], 1108 ['<details>', '<p>[foobar]</p>'], 1109 ['<dir>', '<p>[foobar]</p>'], 1110 ['<dl>', '<p>[foobar]</p>'], 1111 ['<dt>', '<p>[foobar]</p>'], 1112 ['<fieldset>', '<p>[foobar]</p>'], 1113 ['<figcaption>', '<p>[foobar]</p>'], 1114 ['<figure>', '<p>[foobar]</p>'], 1115 ['<footer>', '<p>[foobar]</p>'], 1116 ['<form>', '<p>[foobar]</p>'], 1117 ['<h1>', '<p>[foobar]</p>'], 1118 ['<h2>', '<p>[foobar]</p>'], 1119 ['<h3>', '<p>[foobar]</p>'], 1120 ['<h4>', '<p>[foobar]</p>'], 1121 ['<h5>', '<p>[foobar]</p>'], 1122 ['<h6>', '<p>[foobar]</p>'], 1123 ['<header>', '<p>[foobar]</p>'], 1124 ['<head>', '<p>[foobar]</p>'], 1125 ['<hgroup>', '<p>[foobar]</p>'], 1126 ['<hr>', '<p>[foobar]</p>'], 1127 ['<html>', '<p>[foobar]</p>'], 1128 ['<ins>', '<p>[foobar]</p>'], 1129 ['<li>', '<p>[foobar]</p>'], 1130 ['<listing>', '<p>[foobar]</p>'], 1131 ['<menu>', '<p>[foobar]</p>'], 1132 ['<nav>', '<p>[foobar]</p>'], 1133 ['<ol>', '<p>[foobar]</p>'], 1134 ['<plaintext>', '<p>[foobar]</p>'], 1135 ['<pre>', '<p>[foobar]</p>'], 1136 ['<section>', '<p>[foobar]</p>'], 1137 ['<ul>', '<p>[foobar]</p>'], 1138 ['<xmp>', '<p>[foobar]</p>'], 1139 ['<quasit>', '<p>[foobar]</p>'], 1140 1141 ['<address>', '<p>[foo<p>bar]'], 1142 ['<article>', '<p>[foo<p>bar]'], 1143 ['<aside>', '<p>[foo<p>bar]'], 1144 ['<blockquote>', '<p>[foo<p>bar]'], 1145 ['<body>', '<p>[foo<p>bar]'], 1146 ['<dd>', '<p>[foo<p>bar]'], 1147 ['<del>', '<p>[foo<p>bar]'], 1148 ['<details>', '<p>[foo<p>bar]'], 1149 ['<dir>', '<p>[foo<p>bar]'], 1150 ['<div>', '<p>[foo<p>bar]'], 1151 ['<dl>', '<p>[foo<p>bar]'], 1152 ['<dt>', '<p>[foo<p>bar]'], 1153 ['<fieldset>', '<p>[foo<p>bar]'], 1154 ['<figcaption>', '<p>[foo<p>bar]'], 1155 ['<figure>', '<p>[foo<p>bar]'], 1156 ['<footer>', '<p>[foo<p>bar]'], 1157 ['<form>', '<p>[foo<p>bar]'], 1158 ['<h1>', '<p>[foo<p>bar]'], 1159 ['<h2>', '<p>[foo<p>bar]'], 1160 ['<h3>', '<p>[foo<p>bar]'], 1161 ['<h4>', '<p>[foo<p>bar]'], 1162 ['<h5>', '<p>[foo<p>bar]'], 1163 ['<h6>', '<p>[foo<p>bar]'], 1164 ['<header>', '<p>[foo<p>bar]'], 1165 ['<head>', '<p>[foo<p>bar]'], 1166 ['<hgroup>', '<p>[foo<p>bar]'], 1167 ['<hr>', '<p>[foo<p>bar]'], 1168 ['<html>', '<p>[foo<p>bar]'], 1169 ['<ins>', '<p>[foo<p>bar]'], 1170 ['<li>', '<p>[foo<p>bar]'], 1171 ['<listing>', '<p>[foo<p>bar]'], 1172 ['<menu>', '<p>[foo<p>bar]'], 1173 ['<nav>', '<p>[foo<p>bar]'], 1174 ['<ol>', '<p>[foo<p>bar]'], 1175 ['<p>', '<p>[foo<p>bar]'], 1176 ['<plaintext>', '<p>[foo<p>bar]'], 1177 ['<pre>', '<p>[foo<p>bar]'], 1178 ['<section>', '<p>[foo<p>bar]'], 1179 ['<ul>', '<p>[foo<p>bar]'], 1180 ['<xmp>', '<p>[foo<p>bar]'], 1181 ['<quasit>', '<p>[foo<p>bar]'], 1182 1183 ['p', '<div>[foobar]</div>'], 1184 1185 '<ol><li>[foo]<li>bar</ol>', 1186 1187 ['<p>', '<h1>[foo]<br>bar</h1>'], 1188 ['<p>', '<h1>foo<br>[bar]</h1>'], 1189 ['<p>', '<h1>[foo<br>bar]</h1>'], 1190 ['<address>', '<h1>[foo]<br>bar</h1>'], 1191 ['<address>', '<h1>foo<br>[bar]</h1>'], 1192 ['<address>', '<h1>[foo<br>bar]</h1>'], 1193 ['<pre>', '<h1>[foo]<br>bar</h1>'], 1194 ['<pre>', '<h1>foo<br>[bar]</h1>'], 1195 ['<pre>', '<h1>[foo<br>bar]</h1>'], 1196 ['<h2>', '<h1>[foo]<br>bar</h1>'], 1197 ['<h2>', '<h1>foo<br>[bar]</h1>'], 1198 ['<h2>', '<h1>[foo<br>bar]</h1>'], 1199 1200 ['<h1>', '<p>[foo]<br>bar</p>'], 1201 ['<h1>', '<p>foo<br>[bar]</p>'], 1202 ['<h1>', '<p>[foo<br>bar]</p>'], 1203 ['<address>', '<p>[foo]<br>bar</p>'], 1204 ['<address>', '<p>foo<br>[bar]</p>'], 1205 ['<address>', '<p>[foo<br>bar]</p>'], 1206 ['<pre>', '<p>[foo]<br>bar</p>'], 1207 ['<pre>', '<p>foo<br>[bar]</p>'], 1208 ['<pre>', '<p>[foo<br>bar]</p>'], 1209 1210 ['<p>', '<address>[foo]<br>bar</address>'], 1211 ['<p>', '<address>foo<br>[bar]</address>'], 1212 ['<p>', '<address>[foo<br>bar]</address>'], 1213 ['<pre>', '<address>[foo]<br>bar</address>'], 1214 ['<pre>', '<address>foo<br>[bar]</address>'], 1215 ['<pre>', '<address>[foo<br>bar]</address>'], 1216 ['<h1>', '<address>[foo]<br>bar</address>'], 1217 ['<h1>', '<address>foo<br>[bar]</address>'], 1218 ['<h1>', '<address>[foo<br>bar]</address>'], 1219 1220 ['<p>', '<pre>[foo]<br>bar</pre>'], 1221 ['<p>', '<pre>foo<br>[bar]</pre>'], 1222 ['<p>', '<pre>[foo<br>bar]</pre>'], 1223 ['<address>', '<pre>[foo]<br>bar</pre>'], 1224 ['<address>', '<pre>foo<br>[bar]</pre>'], 1225 ['<address>', '<pre>[foo<br>bar]</pre>'], 1226 ['<h1>', '<pre>[foo]<br>bar</pre>'], 1227 ['<h1>', '<pre>foo<br>[bar]</pre>'], 1228 ['<h1>', '<pre>[foo<br>bar]</pre>'], 1229 1230 ['<h1>', '<p>[foo</p>bar]'], 1231 ['<h1>', '[foo<p>bar]</p>'], 1232 ['<p>', '<div>[foo<p>bar]</p></div>'], 1233 ['<p>', '<xmp>[foo]</xmp>'], 1234 ['<div>', '<xmp>[foo]</xmp>'], 1235 1236 '<div><ol><li>[foo]</ol></div>', 1237 '<div><table><tr><td>[foo]</table></div>', 1238 '<p>[foo<h1>bar]</h1>', 1239 '<h1>[foo</h1><h2>bar]</h2>', 1240 '<div>[foo</div>bar]', 1241 1242 // https://bugs.webkit.org/show_bug.cgi?id=47054 1243 ['<p>', '<div style=color:blue>[foo]</div>'], 1244 // https://bugs.webkit.org/show_bug.cgi?id=47574 1245 ['<h1>', '{<p>foo</p>ba]r'], 1246 ['<pre>', ' [foo<p>bar]</p>'], 1247 // From https://bugs.webkit.org/show_bug.cgi?id=47300 1248 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14009 1249 ['!<p>', '{<pre> foo bar </pre>}'], 1250 ], 1251 //@} 1252 forwarddelete: [ 1253 //@{ 1254 // Collapsed selection 1255 'foo[]', 1256 '<span>foo[]</span>', 1257 '<p>foo[]</p>', 1258 'foo[]bar', 1259 '<span>foo</span>{}<span>bar</span>', 1260 '<span>foo[</span><span>]bar</span>', 1261 'foo[]<span style=display:none>bar</span>baz', 1262 'foo[]<script>bar</script>baz', 1263 'fo[]öbar', 1264 'fo[]öbar', 1265 'fo[]ö̧bar', 1266 '[]öbar', 1267 '[]öbar', 1268 '[]ö̧bar', 1269 1270 '[]שָׁלוֹם', 1271 'שָׁל[]וֹם', 1272 1273 '<p>foo[]</p><p>bar</p>', 1274 '<p>foo[]</p>bar', 1275 'foo[]<p>bar</p>', 1276 '<p>foo[]<br></p><p>bar</p>', 1277 '<p>foo[]<br></p>bar', 1278 'foo[]<br><p>bar</p>', 1279 1280 '<p>{}<br></p>foo', 1281 '<p>{}<span><br></span></p>foo', 1282 'foo{}<p><br>', 1283 'foo{}<p><span><br></span>', 1284 'foo{}<br><p><br>', 1285 'foo{}<span><br></span><p><br>', 1286 'foo{}<br><p><span><br></span>', 1287 'foo{}<span><br></span><p><span><br></span>', 1288 'foo{}<p>', 1289 '<table><tr><td>{}</table>foo', 1290 '<table><tr><td>{}<br></table>foo', 1291 '<table><tr><td>{}<span><br></span></table>foo', 1292 1293 '<div><p>foo[]</p></div><p>bar</p>', 1294 '<p>foo[]</p><div><p>bar</p></div>', 1295 '<div><p>foo[]</p></div><div><p>bar</p></div>', 1296 '<div><p>foo[]</p></div>bar', 1297 'foo[]<div><p>bar</p></div>', 1298 1299 '<div>foo[]</div><div>bar</div>', 1300 '<pre>foo[]</pre>bar', 1301 1302 'foo[]<br>bar', 1303 '<b>foo[]</b><br>bar', 1304 'foo[]<hr>bar', 1305 '<p>foo[]<hr><p>bar', 1306 '<p>foo[]</p><br><p>bar</p>', 1307 '<p>foo[]</p><br><br><p>bar</p>', 1308 '<p>foo[]</p><img src=/img/lion.svg><p>bar', 1309 'foo[]<img src=/img/lion.svg>bar', 1310 1311 'foo[]<a>bar</a>', 1312 'foo[]<a href=/>bar</a>', 1313 'foo[]<a name=abc>bar</a>', 1314 'foo[]<a href=/ name=abc>bar</a>', 1315 'foo[]<span><a>bar</a></span>', 1316 'foo[]<span><a href=/>bar</a></span>', 1317 'foo[]<span><a name=abc>bar</a></span>', 1318 'foo[]<span><a href=/ name=abc>bar</a></span>', 1319 '<a>foo[]</a>bar', 1320 '<a href=/>foo[]</a>bar', 1321 '<a name=abc>foo[]</a>bar', 1322 '<a href=/ name=abc>foo[]</a>bar', 1323 1324 'foo [] ', 1325 '[] foo', 1326 'foo[] bar', 1327 'foo[] bar', 1328 'foo[] bar', 1329 'foo[] bar', 1330 'foo[] bar', 1331 'foo [] bar', 1332 'foo [] bar', 1333 'foo[] <span> </span> bar', 1334 'foo []<span> </span> bar', 1335 'foo <span> </span>[] bar', 1336 '<b>foo[] </b> bar', 1337 '<b>foo[] </b> bar', 1338 '<b>foo[] </b> bar', 1339 '<b>foo[] </b> bar', 1340 1341 '<pre>foo [] </pre>', 1342 '<pre>[] foo</pre>', 1343 '<pre>foo[] bar</pre>', 1344 '<pre>foo[] bar</pre>', 1345 '<pre>foo[] bar</pre>', 1346 1347 '<div style=white-space:pre>foo [] </div>', 1348 '<div style=white-space:pre>[] foo</div>', 1349 '<div style=white-space:pre>foo[] bar</div>', 1350 '<div style=white-space:pre>foo[] bar</div>', 1351 '<div style=white-space:pre>foo[] bar</div>', 1352 1353 '<div style=white-space:pre-wrap>foo [] </div>', 1354 '<div style=white-space:pre-wrap>[] foo</div>', 1355 '<div style=white-space:pre-wrap>foo[] bar</div>', 1356 '<div style=white-space:pre-wrap>foo[] bar</div>', 1357 '<div style=white-space:pre-wrap>foo[] bar</div>', 1358 1359 '<div style=white-space:pre-line>foo [] </div>', 1360 '<div style=white-space:pre-line>[] foo</div>', 1361 '<div style=white-space:pre-line>foo[] bar</div>', 1362 '<div style=white-space:pre-line>foo[] bar</div>', 1363 '<div style=white-space:pre-line>foo[] bar</div>', 1364 1365 '<div style=white-space:nowrap>foo [] </div>', 1366 '<div style=white-space:nowrap>[] foo</div>', 1367 '<div style=white-space:nowrap>foo[] bar</div>', 1368 '<div style=white-space:nowrap>foo[] bar</div>', 1369 '<div style=white-space:nowrap>foo[] bar</div>', 1370 1371 // Tables with collapsed selection 1372 'foo[]<table><tr><td>bar</table>baz', 1373 'foo<table><tr><td>bar[]</table>baz', 1374 '<p>foo[]<table><tr><td>bar</table><p>baz', 1375 '<table><tr><td>foo[]<td>bar</table>', 1376 '<table><tr><td>foo[]<tr><td>bar</table>', 1377 1378 'foo[]<br><table><tr><td>bar</table>baz', 1379 'foo<table><tr><td>bar[]<br></table>baz', 1380 '<p>foo[]<br><table><tr><td>bar</table><p>baz', 1381 '<p>foo<table><tr><td>bar[]<br></table><p>baz', 1382 '<table><tr><td>foo[]<br><td>bar</table>', 1383 '<table><tr><td>foo[]<br><tr><td>bar</table>', 1384 1385 'foo<table><tr><td>bar[]</table><br>baz', 1386 'foo[]<table><tr><td><hr>bar</table>baz', 1387 '<table><tr><td>foo[]<td><hr>bar</table>', 1388 '<table><tr><td>foo[]<tr><td><hr>bar</table>', 1389 1390 // Lists with collapsed selection 1391 'foo[]<ol><li>bar<li>baz</ol>', 1392 'foo[]<br><ol><li>bar<li>baz</ol>', 1393 '<ol><li>foo[]<li>bar</ol>', 1394 '<ol><li>foo[]<br><li>bar</ol>', 1395 '<ol><li>foo[]<li>bar<br>baz</ol>', 1396 1397 '<ol><li><p>foo[]<li>bar</ol>', 1398 '<ol><li>foo[]<li><p>bar</ol>', 1399 '<ol><li><p>foo[]<li><p>bar</ol>', 1400 1401 '<ol><li>foo[]<ul><li>bar</ul></ol>', 1402 'foo[]<ol><ol><li>bar</ol></ol>', 1403 'foo[]<div><ol><li>bar</ol></div>', 1404 1405 'foo[]<dl><dt>bar<dd>baz</dl>', 1406 'foo[]<dl><dd>bar</dl>', 1407 '<dl><dt>foo[]<dd>bar</dl>', 1408 '<dl><dt>foo[]<dt>bar<dd>baz</dl>', 1409 '<dl><dt>foo<dd>bar[]<dd>baz</dl>', 1410 1411 '<ol><li>foo[]</ol>bar', 1412 '<ol><li>foo[]<br></ol>bar', 1413 '<ol><li>{}<br></ol>bar', 1414 '<ol><li>foo<li>{}<br></ol>bar', 1415 1416 '<ol><li>foo[]</ol><p>bar', 1417 '<ol><li>foo[]<br></ol><p>bar', 1418 '<ol><li>{}<br></ol><p>bar', 1419 '<ol><li>foo<li>{}<br></ol><p>bar', 1420 1421 '<ol><li>foo[]</ol><br>', 1422 '<ol><li>foo[]<br></ol><br>', 1423 '<ol><li>{}<br></ol><br>', 1424 '<ol><li>foo<li>{}<br></ol><br>', 1425 1426 '<ol><li>foo[]</ol><p><br>', 1427 '<ol><li>foo[]<br></ol><p><br>', 1428 '<ol><li>{}<br></ol><p><br>', 1429 '<ol><li>foo<li>{}<br></ol><p><br>', 1430 1431 // Indented stuff with collapsed selection 1432 'foo[]<blockquote>bar</blockquote>', 1433 'foo[]<blockquote><blockquote>bar</blockquote></blockquote>', 1434 'foo[]<blockquote><div>bar</div></blockquote>', 1435 'foo[]<blockquote style="color: blue">bar</blockquote>', 1436 1437 'foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>', 1438 'foo[]<blockquote><div><p>bar<p>baz</div></blockquote>', 1439 'foo[]<blockquote style="color: blue"><p>bar<p>baz</blockquote>', 1440 1441 'foo[]<blockquote><p><b>bar</b><p>baz</blockquote>', 1442 'foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>', 1443 'foo[]<blockquote><p><span>bar</span><p>baz</blockquote>', 1444 1445 'foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra', 1446 'foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra', 1447 'foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra', 1448 1449 // Invisible stuff with collapsed selection 1450 'foo[]<span></span>bar', 1451 'foo[]<span><span></span></span>bar', 1452 'foo[]<quasit></quasit>bar', 1453 'foo[]<span></span><br>bar', 1454 '<span>foo[]<span></span></span>bar', 1455 'foo[]<span></span><span>bar</span>', 1456 'foo[]<div><div><p>bar</div></div>', 1457 'foo[]<div><div><p><!--abc-->bar</div></div>', 1458 'foo[]<div><div><!--abc--><p>bar</div></div>', 1459 'foo[]<div><!--abc--><div><p>bar</div></div>', 1460 'foo[]<!--abc--><div><div><p>bar</div></div>', 1461 '<div><div><p>foo[]</div></div>bar', 1462 '<div><div><p>foo[]</div></div><!--abc-->bar', 1463 '<div><div><p>foo[]</div><!--abc--></div>bar', 1464 '<div><div><p>foo[]</p><!--abc--></div></div>bar', 1465 '<div><div><p>foo[]<!--abc--></div></div>bar', 1466 '<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>', 1467 '<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>', 1468 '<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>', 1469 '<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>', 1470 '<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>', 1471 '<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>', 1472 '<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>', 1473 '<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>', 1474 1475 // Styled stuff with collapsed selection 1476 '<p style=color:blue>foo[]<p>bar', 1477 '<p style=color:blue>foo[]<p style=color:brown>bar', 1478 '<p>foo[]<p style=color:brown>bar', 1479 '<p><font color=blue>foo[]</font><p>bar', 1480 '<p><font color=blue>foo[]</font><p><font color=brown>bar</font>', 1481 '<p>foo[]<p><font color=brown>bar</font>', 1482 '<p><span style=color:blue>foo[]</font><p>bar', 1483 '<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>', 1484 '<p>foo[]<p><span style=color:brown>bar</font>', 1485 1486 '<p style=background-color:aqua>foo[]<p>bar', 1487 '<p style=background-color:aqua>foo[]<p style=background-color:tan>bar', 1488 '<p>foo[]<p style=background-color:tan>bar', 1489 '<p><span style=background-color:aqua>foo[]</font><p>bar', 1490 '<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>', 1491 '<p>foo[]<p><span style=background-color:tan>bar</font>', 1492 1493 '<p style=text-decoration:underline>foo[]<p>bar', 1494 '<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar', 1495 '<p>foo[]<p style=text-decoration:line-through>bar', 1496 '<p><u>foo[]</u><p>bar', 1497 '<p><u>foo[]</u><p><s>bar</s>', 1498 '<p>foo[]<p><s>bar</s>', 1499 1500 '<p style=color:blue>foo[]</p>bar', 1501 'foo[]<p style=color:brown>bar', 1502 '<div style=color:blue><p style=color:green>foo[]</div>bar', 1503 '<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar', 1504 '<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar', 1505 1506 // Uncollapsed selection (should be same as delete command) 1507 'foo[bar]baz', 1508 '<p>foo<span style=color:#aBcDeF>[bar]</span>baz', 1509 '<p>foo<span style=color:#aBcDeF>{bar}</span>baz', 1510 '<p>foo{<span style=color:#aBcDeF>bar</span>}baz', 1511 '<p>[foo<span style=color:#aBcDeF>bar]</span>baz', 1512 '<p>{foo<span style=color:#aBcDeF>bar}</span>baz', 1513 '<p>foo<span style=color:#aBcDeF>[bar</span>baz]', 1514 '<p>foo<span style=color:#aBcDeF>{bar</span>baz}', 1515 '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz', 1516 1517 'foo<b>[bar]</b>baz', 1518 'foo<b>{bar}</b>baz', 1519 'foo{<b>bar</b>}baz', 1520 'foo<span>[bar]</span>baz', 1521 'foo<span>{bar}</span>baz', 1522 'foo{<span>bar</span>}baz', 1523 '<b>foo[bar</b><i>baz]quz</i>', 1524 '<p>foo</p><p>[bar]</p><p>baz</p>', 1525 '<p>foo</p><p>{bar}</p><p>baz</p>', 1526 '<p>foo</p><p>{bar</p>}<p>baz</p>', 1527 '<p>foo</p>{<p>bar}</p><p>baz</p>', 1528 '<p>foo</p>{<p>bar</p>}<p>baz</p>', 1529 1530 '<p>foo[bar<p>baz]quz', 1531 '<p>foo[bar<div>baz]quz</div>', 1532 '<p>foo[bar<h1>baz]quz</h1>', 1533 '<div>foo[bar</div><p>baz]quz', 1534 '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>', 1535 1536 '<p><b>foo[bar</b><p>baz]quz', 1537 '<div><p>foo[bar</div><p>baz]quz', 1538 '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote', 1539 '<p>foo[bar<p style=color:blue>baz]quz', 1540 '<p>foo[bar<p><b>baz]quz</b>', 1541 1542 '<div><p>foo<p>[bar<p>baz]</div>', 1543 1544 'foo[<br>]bar', 1545 '<p>foo[</p><p>]bar</p>', 1546 '<p>foo[</p><p>]bar<br>baz</p>', 1547 'foo[<p>]bar</p>', 1548 'foo{<p>}bar</p>', 1549 'foo[<p>]bar<br>baz</p>', 1550 'foo[<p>]bar</p>baz', 1551 'foo{<p>bar</p>}baz', 1552 'foo<p>{bar</p>}baz', 1553 'foo{<p>bar}</p>baz', 1554 '<p>foo[</p>]bar', 1555 '<p>foo{</p>}bar', 1556 '<p>foo[</p>]bar<br>baz', 1557 '<p>foo[</p>]bar<p>baz</p>', 1558 'foo[<div><p>]bar</div>', 1559 '<div><p>foo[</p></div>]bar', 1560 'foo[<div><p>]bar</p>baz</div>', 1561 'foo[<div>]bar<p>baz</p></div>', 1562 '<div><p>foo</p>bar[</div>]baz', 1563 '<div>foo<p>bar[</p></div>]baz', 1564 1565 '<p>foo<br>{</p>]bar', 1566 '<p>foo<br><br>{</p>]bar', 1567 'foo<br>{<p>]bar</p>', 1568 'foo<br><br>{<p>]bar</p>', 1569 '<p>foo<br>{</p><p>}bar</p>', 1570 '<p>foo<br><br>{</p><p>}bar</p>', 1571 1572 '<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>', 1573 '<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>', 1574 '<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>', 1575 '<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>', 1576 '<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>', 1577 '<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>', 1578 '{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}', 1579 '<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>', 1580 '<p>fo[o<table><tr><td>b]ar</table><p>baz', 1581 '<p>foo<table><tr><td>ba[r</table><p>b]az', 1582 '<p>fo[o<table><tr><td>bar</table><p>b]az', 1583 1584 '<p>foo<ol><li>ba[r<li>b]az</ol><p>quz', 1585 '<p>foo<ol><li>bar<li>[baz]</ol><p>quz', 1586 '<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz', 1587 '<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz', 1588 '<p>fo[o<ol><li>bar<li>b]az</ol><p>quz', 1589 '<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz', 1590 1591 '<ol><li>fo[o</ol><ol><li>b]ar</ol>', 1592 '<ol><li>fo[o</ol><ul><li>b]ar</ul>', 1593 1594 'foo[<ol><li>]bar</ol>', 1595 '<ol><li>foo[<li>]bar</ol>', 1596 'foo[<dl><dt>]bar<dd>baz</dl>', 1597 'foo[<dl><dd>]bar</dl>', 1598 '<dl><dt>foo[<dd>]bar</dl>', 1599 '<dl><dt>foo[<dt>]bar<dd>baz</dl>', 1600 '<dl><dt>foo<dd>bar[<dd>]baz</dl>', 1601 1602 // https://bugs.webkit.org/show_bug.cgi?id=35281 1603 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13976 1604 '<ol><li>foo</ol>{}<br><ol><li>bar</ol>', 1605 '<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>', 1606 '<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>', 1607 '<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>', 1608 '<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>', 1609 '<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>', 1610 '<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>', 1611 '<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>', 1612 '<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>', 1613 '<ol><li>foo[</ol>bar]<ol><li>baz</ol>', 1614 '<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>', 1615 '<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>', 1616 '<ol><li>fo[]o</ol><ol><li>bar</ol>', 1617 '<ol><li>foo</ol>[bar<ol><li>]baz</ol>', 1618 '<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>', 1619 '<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>', 1620 '<ol><li>foo</ol><ol><li>[]bar</ol>', 1621 '<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>', 1622 '<ul><li>foo</ul>{}<br><ul><li>bar</ul>', 1623 '<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>', 1624 '<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>', 1625 '<ol><li>foo</ol>{}<br><ul><li>bar</ul>', 1626 '<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>', 1627 '<ul><li>foo</ul>{}<br><ol><li>bar</ol>', 1628 '<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>', 1629 1630 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13831 1631 '<p><b>[foo]</b>', 1632 '<p><quasit>[foo]</quasit>', 1633 '<p><b><i>[foo]</i></b>', 1634 '<p><b>{foo}</b>', 1635 '<p>{<b>foo</b>}', 1636 '<p><b>[]f</b>', 1637 '<b>[foo]</b>', 1638 '<div><b>[foo]</b></div>', 1639 ], 1640 //@} 1641 hilitecolor: [ 1642 //@{ 1643 'foo[]bar', 1644 '<p>[foo</p> <p>bar]</p>', 1645 '<span>[foo</span> <span>bar]</span>', 1646 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>', 1647 '<p>[foo<p><br><p>bar]', 1648 '<b>foo[]bar</b>', 1649 '<i>foo[]bar</i>', 1650 '<span>foo</span>{}<span>bar</span>', 1651 '<span>foo[</span><span>]bar</span>', 1652 'foo[bar]baz', 1653 'foo[bar<b>baz]qoz</b>quz', 1654 'foo[bar<i>baz]qoz</i>quz', 1655 '{<p><p> <p>foo</p>}', 1656 1657 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 1658 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>', 1659 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>', 1660 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>', 1661 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>', 1662 '{<table><tr><td>foo<td>bar<td>baz</table>}', 1663 1664 '<p style="background-color: rgb(0, 255, 255)">foo[bar]baz</p>', 1665 '<p style="background-color: #00ffff">foo[bar]baz</p>', 1666 '<p style="background-color: aqua">foo[bar]baz</p>', 1667 '{<p style="background-color: aqua">foo</p><p>bar</p>}', 1668 '<span style="background-color: aqua">foo<span style="background-color: tan">[bar]</span>baz</span>', 1669 '<span style="background-color: #00ffff">foo<span style="background-color: tan">[bar]</span>baz</span>', 1670 '<span style="background-color: #0ff">foo<span style="background-color: tan">[bar]</span>baz</span>', 1671 '<span style="background-color: rgb(0, 255, 255)">foo<span style="background-color: tan">[bar]</span>baz</span>', 1672 '<span style="background-color: aqua">foo<span style="background-color: tan">b[ar]</span>baz</span>', 1673 '<p style="background-color: aqua">foo<span style="background-color: tan">b[ar]</span>baz</p>', 1674 '<div style="background-color: aqua"><p style="background-color: tan">b[ar]</p></div>', 1675 '<span style="display: block; background-color: aqua"><span style="display: block; background-color: tan">b[ar]</span></span>', 1676 1677 // Tests for queryCommandIndeterm() and queryCommandState() 1678 'fo[o<span style=background-color:tan>b]ar</span>baz', 1679 'foo<span style=background-color:tan>ba[r</span>b]az', 1680 'fo[o<span style=background-color:tan>bar</span>b]az', 1681 'foo[<span style=background-color:tan>b]ar</span>baz', 1682 'foo<span style=background-color:tan>ba[r</span>]baz', 1683 'foo[<span style=background-color:tan>bar</span>]baz', 1684 'foo<span style=background-color:tan>[bar]</span>baz', 1685 'foo{<span style=background-color:tan>bar</span>}baz', 1686 '<span style=background-color:tan>fo[o</span><span style=background-color:yellow>b]ar</span>', 1687 '<span style=background-color:tan>fo[o</span><span style=background-color:tan>b]ar</span>', 1688 '<span style=background-color:tan>fo[o<span style=background-color:transparent>b]ar</span></span>', 1689 1690 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13829 1691 '!<font size=6>[foo]</font>', 1692 '!<span style=font-size:xx-large>[foo]</span>', 1693 '!<font size=6>foo[bar]baz</font>', 1694 '!<span style=font-size:xx-large>foo[bar]baz</span>', 1695 '![foo<font size=6>bar</font>baz]', 1696 '![foo<span style=font-size:xx-large>bar</span>baz]', 1697 ], 1698 //@} 1699 indent: [ 1700 //@{ 1701 // All these have a trailing unselected paragraph, because otherwise 1702 // Gecko is unhappy: it throws exceptions in non-CSS mode, and in CSS 1703 // mode it adds the indentation invisibly to the wrapper div in many 1704 // cases. 1705 'foo[]bar<p>extra', 1706 '<span>foo</span>{}<span>bar</span><p>extra', 1707 '<span>foo[</span><span>]bar</span><p>extra', 1708 'foo[bar]baz<p>extra', 1709 '<p dir=rtl>פו[בר]בז<p dir=rtl>נוםף', 1710 '<p dir=rtl>פו[ברבז<p>Foobar]baz<p>Extra', 1711 '<p>Foo[barbaz<p dir=rtl>פובר]בז<p>Extra', 1712 '<div><p>Foo[barbaz<p dir=rtl>פובר]בז</div><p>Extra', 1713 'foo]bar[baz<p>extra', 1714 '{<p><p> <p>foo</p>}<p>extra', 1715 'foo[bar<i>baz]qoz</i>quz<p>extra', 1716 '[]foo<p>extra', 1717 'foo[]<p>extra', 1718 '<p>[]foo<p>extra', 1719 '<p>foo[]<p>extra', 1720 '<p>{}<br>foo</p><p>extra', 1721 '<p>foo<br>{}</p><p>extra', 1722 '<span>{}<br>foo</span>bar<p>extra', 1723 '<span>foo<br>{}</span>bar<p>extra', 1724 '<p>foo</p>{}<p>bar</p>', 1725 1726 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra', 1727 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 1728 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 1729 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra', 1730 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra', 1731 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra', 1732 1733 '<p>foo[bar]</p><p>baz</p><p>extra', 1734 '<p>[foobar</p><p>ba]z</p><p>extra', 1735 'foo[bar]<br>baz<p>extra', 1736 'foo[bar]<br><br><br><br>baz<p>extra', 1737 'foobar<br>[ba]z<p>extra', 1738 'foobar<br><br><br><br>[ba]z<p>extra', 1739 'foo[bar<br>ba]z<p>extra', 1740 '<div>foo<p>[bar]</p>baz</div><p>extra', 1741 1742 // These mimic existing indentation in various browsers, to see how 1743 // they cope with indenting twice. This is spec, Gecko non-CSS, and 1744 // Opera: 1745 '<blockquote><p>foo[bar]</p><p>baz</p></blockquote><p>extra', 1746 '<blockquote><p>foo[bar</p><p>b]az</p></blockquote><p>extra', 1747 '<blockquote><p>foo[bar]</p></blockquote><p>baz</p><p>extra', 1748 '<blockquote><p>foo[bar</p></blockquote><p>b]az</p><p>extra', 1749 '<p>[foo]<blockquote><p>bar</blockquote><p>extra', 1750 '<p>[foo<blockquote><p>b]ar</blockquote><p>extra', 1751 '<p>foo<blockquote><p>bar</blockquote><p>[baz]<p>extra', 1752 '<p>foo<blockquote><p>[bar</blockquote><p>baz]<p>extra', 1753 '<p>[foo<blockquote><p>bar</blockquote><p>baz]<p>extra', 1754 '<blockquote><p>foo</blockquote><p>[bar]<blockquote><p>baz</blockquote><p>extra', 1755 1756 '<blockquote>foo[bar]<br>baz</blockquote><p>extra', 1757 '<blockquote>foo[bar<br>b]az</blockquote><p>extra', 1758 '<blockquote>foo[bar]</blockquote>baz<p>extra', 1759 '<blockquote>foo[bar</blockquote>b]az<p>extra', 1760 '[foo]<blockquote>bar</blockquote><p>extra', 1761 '[foo<blockquote>b]ar</blockquote><p>extra', 1762 'foo<blockquote>bar</blockquote>[baz]<p>extra', 1763 '[foo<blockquote>bar</blockquote>baz]<p>extra', 1764 '<blockquote>foo</blockquote>[bar]<blockquote>baz</blockquote><p>extra', 1765 1766 // IE: 1767 '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar]</p><p>baz</p></blockquote><p>extra', 1768 '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar</p><p>b]az</p></blockquote><p>extra', 1769 '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar]</p></blockquote><p>baz</p><p>extra', 1770 '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar</p></blockquote><p>b]az</p><p>extra', 1771 '<p>[foo]<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>extra', 1772 '<p>[foo<blockquote style="margin-right: 0" dir="ltr"><p>b]ar</blockquote><p>extra', 1773 '<p>foo<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>[baz]<p>extra', 1774 '<p>foo<blockquote style="margin-right: 0" dir="ltr"><p>[bar</blockquote><p>baz]<p>extra', 1775 '<p>[foo<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>baz]<p>extra', 1776 '<blockquote style="margin-right: 0" dir="ltr"><p>foo</blockquote><p>[bar]<blockquote style="margin-right: 0" dir="ltr"><p>baz</blockquote><p>extra', 1777 1778 // Firefox CSS mode: 1779 '<p style="margin-left: 40px">foo[bar]</p><p style="margin-left: 40px">baz</p><p>extra', 1780 '<p style="margin-left: 40px">foo[bar</p><p style="margin-left: 40px">b]az</p><p>extra', 1781 '<p style="margin-left: 40px">foo[bar]</p><p>baz</p><p>extra', 1782 '<p style="margin-left: 40px">foo[bar</p><p>b]az</p><p>extra', 1783 '<p>[foo]<p style="margin-left: 40px">bar<p>extra', 1784 '<p>[foo<p style="margin-left: 40px">b]ar<p>extra', 1785 '<p>foo<p style="margin-left: 40px">bar<p>[baz]<p>extra', 1786 '<p>foo<p style="margin-left: 40px">[bar<p>baz]<p>extra', 1787 '<p>[foo<p style="margin-left: 40px">bar<p>baz]<p>extra', 1788 '<p style="margin-left: 40px">foo<p>[bar]<p style="margin-left: 40px">baz<p>extra', 1789 1790 // WebKit: 1791 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar]</p><p>baz</p></blockquote><p>extra', 1792 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar</p><p>b]az</p></blockquote><p>extra', 1793 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar]</p></blockquote><p>baz</p><p>extra', 1794 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar</p></blockquote><p>b]az</p><p>extra', 1795 '<p>[foo]<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>extra', 1796 '<p>[foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>b]ar</blockquote><p>extra', 1797 '<p>foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>[baz]<p>extra', 1798 '<p>foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>[bar</blockquote><p>baz]<p>extra', 1799 '<p>[foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>baz]<p>extra', 1800 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo</blockquote><p>[bar]<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>baz</blockquote><p>extra', 1801 1802 // MDC says "In Firefox, if the selection spans multiple lines at 1803 // different levels of indentation, only the least indented lines in 1804 // the selection will be indented." Let's test that. 1805 '<blockquote>f[oo<blockquote>b]ar</blockquote></blockquote><p>extra', 1806 1807 // Lists! 1808 '<ol><li>foo<li>[bar]<li>baz</ol>', 1809 '<ol data-start=1 data-end=2><li>foo<li>bar<li>baz</ol>', 1810 '<ol><li>foo</ol>[bar]', 1811 '<ol><li>[foo]<br>bar<li>baz</ol>', 1812 '<ol><li>foo<br>[bar]<li>baz</ol>', 1813 '<ol><li><div>[foo]</div>bar<li>baz</ol>', 1814 '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>', 1815 '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>', 1816 '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>', 1817 '<ol><li>foo</li><ol data-start=0 data-end=1><li>bar<li>baz</ol><li>quz</ol>', 1818 '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>', 1819 '<ol><li>foo</li><ol data-start=1 data-end=2><li>bar<li>baz</ol><li>quz</ol>', 1820 '<ol><li>foo<ol><li>b[a]r</ol><li>baz</ol>', 1821 '<ol><li>foo</li><ol><li>b[a]r</ol><li>baz</ol>', 1822 '<ol><li>foo{<ol><li>bar</ol>}<li>baz</ol>', 1823 '<ol><li>foo</li>{<ol><li>bar</ol>}<li>baz</ol>', 1824 '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>', 1825 '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>', 1826 '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>', 1827 '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>', 1828 '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>', 1829 '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>', 1830 1831 // Lists with id's: 1832 // http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2009-July/020721.html 1833 '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>', 1834 '<ol><ol><li id=i1>foo</ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>', 1835 '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</li><ol><li id=i3>baz</ol></ol>', 1836 '<ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>', 1837 '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</ol>', 1838 1839 // Try indenting multiple items at once. 1840 '<ol><li>foo<li>b[ar<li>baz]</ol>', 1841 '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>', 1842 '<ol><li>[foo</li><ol><li>bar]</ol><li>baz</ol>', 1843 '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>', 1844 '<ol><li>foo</li><ol><li>b[ar</ol><li>b]az</ol>', 1845 '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra', 1846 '<ol><li>[foo</li><ol><li>bar</ol><li>baz]</ol><p>extra', 1847 1848 // We probably can't actually get this DOM . . . 1849 '<ol><li>[foo]<ol><li>bar</ol>baz</ol>', 1850 '<ol><li>foo<ol><li>[bar]</ol>baz</ol>', 1851 '<ol><li>foo<ol><li>bar</ol>[baz]</ol>', 1852 '<ol><li>[foo<ol><li>bar]</ol>baz</ol>', 1853 1854 'foo<!--bar-->[baz]<p>extra', 1855 '[foo]<!--bar-->baz<p>extra', 1856 '<p>foo<!--bar-->{}<p>extra', 1857 '<p>{}<!--foo-->bar<p>extra', 1858 1859 // Whitespace nodes 1860 '<blockquote><p>foo</blockquote> <p>[bar]', 1861 '<p>[foo]</p> <blockquote><p>bar</blockquote>', 1862 '<blockquote><p>foo</blockquote> <p>[bar]</p> <blockquote><p>baz</blockquote>', 1863 '<ol><li>foo</li><ol><li>bar</li> </ol><li>[baz]</ol>', 1864 '<ol><li>foo</li><ol><li>bar</li></ol> <li>[baz]</ol>', 1865 '<ol><li>foo</li><ol><li>bar</li> </ol> <li>[baz]</ol>', 1866 '<ol><li>foo<ol><li>bar</li> </ol></li><li>[baz]</ol>', 1867 '<ol><li>foo<ol><li>bar</li></ol></li> <li>[baz]</ol>', 1868 '<ol><li>foo<ol><li>bar</li> </ol></li> <li>[baz]</ol>', 1869 '<ol><li>foo<li>[bar]</li> <ol><li>baz</ol></ol>', 1870 '<ol><li>foo<li>[bar]</li><ol> <li>baz</ol></ol>', 1871 '<ol><li>foo<li>[bar]</li> <ol> <li>baz</ol></ol>', 1872 '<ol><li>foo<li>[bar] <ol><li>baz</ol></ol>', 1873 '<ol><li>foo<li>[bar]<ol> <li>baz</ol></ol>', 1874 '<ol><li>foo<li>[bar] <ol> <li>baz</ol></ol>', 1875 1876 // https://bugs.webkit.org/show_bug.cgi?id=32003 1877 '<ul><li>a<br>{<br>}</li><li>b</li></ul>', 1878 ], 1879 //@} 1880 inserthorizontalrule: [ 1881 //@{ 1882 'foo[]bar', 1883 '<span>foo</span>{}<span>bar</span>', 1884 '<span>foo[</span><span>]bar</span>', 1885 '<p>foo[bar<p>baz]quz', 1886 '<div><b>foo</b>{}<b>bar</b></div>', 1887 '<div><b>foo[</b><b>]bar</b></div>', 1888 '<div><b>foo</b>{<b>bar</b>}<b>baz</b></div>', 1889 '<b>foo[]bar</b>', 1890 '<b id=abc>foo[]bar</b>', 1891 ["abc", 'foo[bar]baz'], 1892 'foo[bar]baz', 1893 1894 'foo<b>[bar]</b>baz', 1895 'foo<b>{bar}</b>baz', 1896 'foo{<b>bar</b>}baz', 1897 '<p>foo<p>[bar]<p>baz', 1898 '<p>foo<p>{bar}<p>baz', 1899 '<p>foo{<p>bar</p>}<p>baz', 1900 1901 '<p>foo[bar]baz</p>', 1902 '<p id=abc>foo[bar]baz</p>', 1903 '<h1>foo[bar]baz</h1>', 1904 '<p>foo<b>b[a]r</b>baz</p>', 1905 1906 '<a>foo[bar]baz</a>', 1907 '<a href=/>foo[bar]baz</a>', 1908 '<abbr>foo[bar]baz</abbr>', 1909 '<address>foo[bar]baz</address>', 1910 '<article>foo[bar]baz</article>', 1911 '<aside>foo[bar]baz</aside>', 1912 '<b>foo[bar]baz</b>', 1913 '<bdi>foo[bar]baz</bdi>', 1914 '<bdo dir=rtl>foo[bar]baz</bdo>', 1915 '<blockquote>foo[bar]baz</blockquote>', 1916 '<table><caption>foo[bar]baz</caption><tr><td>quz</table>', 1917 '<cite>foo[bar]baz</cite>', 1918 '<code>foo[bar]baz</code>', 1919 '<dl><dd>foo[bar]baz</dd></dl>', 1920 '<del>foo[bar]baz</del>', 1921 '<details>foo[bar]baz</details>', 1922 '<dfn>foo[bar]baz</dfn>', 1923 '<div>foo[bar]baz</div>', 1924 '<dl><dt>foo[bar]baz</dt></dl>', 1925 '<em>foo[bar]baz</em>', 1926 '<figure><figcaption>foo[bar]baz</figcaption>quz</figure>', 1927 '<figure>foo[bar]baz</figure>', 1928 '<footer>foo[bar]baz</footer>', 1929 '<h1>foo[bar]baz</h1>', 1930 '<h2>foo[bar]baz</h2>', 1931 '<h3>foo[bar]baz</h3>', 1932 '<h4>foo[bar]baz</h4>', 1933 '<h5>foo[bar]baz</h5>', 1934 '<h6>foo[bar]baz</h6>', 1935 '<header>foo[bar]baz</header>', 1936 '<hgroup>foo[bar]baz</hgroup>', 1937 '<hgroup><h1>foo[bar]baz</h1></hgroup>', 1938 '<i>foo[bar]baz</i>', 1939 '<ins>foo[bar]baz</ins>', 1940 '<kbd>foo[bar]baz</kbd>', 1941 '<mark>foo[bar]baz</mark>', 1942 '<nav>foo[bar]baz</nav>', 1943 '<ol><li>foo[bar]baz</li></ol>', 1944 '<p>foo[bar]baz</p>', 1945 '<pre>foo[bar]baz</pre>', 1946 '<q>foo[bar]baz</q>', 1947 '<ruby>foo[bar]baz<rt>quz</rt></ruby>', 1948 '<ruby>foo<rt>bar[baz]quz</rt></ruby>', 1949 '<ruby>foo<rp>bar[baz]quz</rp><rt>qoz</rt><rp>qiz</rp></ruby>', 1950 '<s>foo[bar]baz</s>', 1951 '<samp>foo[bar]baz</samp>', 1952 '<section>foo[bar]baz</section>', 1953 '<small>foo[bar]baz</small>', 1954 '<span>foo[bar]baz</span>', 1955 '<strong>foo[bar]baz</strong>', 1956 '<sub>foo[bar]baz</sub>', 1957 '<sup>foo[bar]baz</sup>', 1958 '<table><tr><td>foo[bar]baz</td></table>', 1959 '<table><tr><th>foo[bar]baz</th></table>', 1960 '<u>foo[bar]baz</u>', 1961 '<ul><li>foo[bar]baz</li></ul>', 1962 '<var>foo[bar]baz</var>', 1963 1964 '<acronym>foo[bar]baz</acronym>', 1965 '<big>foo[bar]baz</big>', 1966 '<blink>foo[bar]baz</blink>', 1967 '<center>foo[bar]baz</center>', 1968 '<dir>foo[bar]baz</dir>', 1969 '<dir><li>foo[bar]baz</li></dir>', 1970 '<font>foo[bar]baz</font>', 1971 '<listing>foo[bar]baz</listing>', 1972 '<marquee>foo[bar]baz</marquee>', 1973 '<nobr>foo[bar]baz</nobr>', 1974 '<strike>foo[bar]baz</strike>', 1975 '<tt>foo[bar]baz</tt>', 1976 '<xmp>foo[bar]baz</xmp>', 1977 1978 '<quasit>foo[bar]baz</quasit>', 1979 1980 '<table><tr><td>fo[o<td>b]ar</table>', 1981 'fo[o<span contenteditable=false>bar</span>b]az', 1982 ], 1983 //@} 1984 inserthtml: [ 1985 //@{ 1986 'foo[]bar', 1987 'foo[bar]baz', 1988 'foo<span style=color:#aBcDeF>[bar]</span>baz', 1989 'foo<span style=color:#aBcDeF>{bar}</span>baz', 1990 'foo{<span style=color:#aBcDeF>bar</span>}baz', 1991 '[foo<span style=color:#aBcDeF>bar]</span>baz', 1992 '{foo<span style=color:#aBcDeF>bar}</span>baz', 1993 'foo<span style=color:#aBcDeF>[bar</span>baz]', 1994 'foo<span style=color:#aBcDeF>{bar</span>baz}', 1995 'foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz', 1996 1997 ['', 'foo[bar]baz'], 1998 ['\0', 'foo[bar]baz'], 1999 ['\x07', 'foo[bar]baz'], 2000 // The following line makes Firefox 7.0a2 go into an infinite loop on 2001 // my machine. 2002 //['\ud800', 'foo[bar]baz'], 2003 2004 ['<b>', 'foo[bar]baz'], 2005 ['<b>abc', 'foo[bar]baz'], 2006 ['<p>abc', '<p>foo[bar]baz'], 2007 ['<li>abc', '<p>foo[bar]baz'], 2008 ['<p>abc', '<ol>{<li>foo</li>}<li>bar</ol>'], 2009 ['<p>abc', '<ol><li>foo</li>{<li>bar</li>}<li>baz</ol>'], 2010 ['<p>abc', '<ol><li>[foo]</li><li>bar</ol>'], 2011 2012 ['abc', '<xmp>f[o]o</xmp>'], 2013 ['<b>abc</b>', '<xmp>f[o]o</xmp>'], 2014 ['abc', '<script>f[o]o</script>bar'], 2015 ['<b>abc</b>', '<script>f[o]o</script>bar'], 2016 2017 ['<a>abc</a>', '<a>f[o]o</a>'], 2018 ['<a href=/>abc</a>', '<a href=.>f[o]o</a>'], 2019 ['<hr>', '<p>f[o]o'], 2020 ['<hr>', '<b>f[o]o</b>'], 2021 ['<h2>abc</h2>', '<h1>f[o]o</h1>'], 2022 ['<td>abc</td>', '<table><tr><td>f[o]o</table>'], 2023 ['<td>abc</td>', 'f[o]o'], 2024 2025 ['<dt>abc</dt>', '<dl><dt>f[o]o<dd>bar</dl>'], 2026 ['<dt>abc</dt>', '<dl><dt>foo<dd>b[a]r</dl>'], 2027 ['<dd>abc</dd>', '<dl><dt>f[o]o<dd>bar</dl>'], 2028 ['<dd>abc</dd>', '<dl><dt>foo<dd>b[a]r</dl>'], 2029 ['<dt>abc</dt>', 'f[o]o'], 2030 ['<dt>abc</dt>', '<ol><li>f[o]o</ol>'], 2031 ['<dd>abc</dd>', 'f[o]o'], 2032 ['<dd>abc</dd>', '<ol><li>f[o]o</ol>'], 2033 2034 ['<li>abc</li>', '<dir><li>f[o]o</dir>'], 2035 ['<li>abc</li>', '<ol><li>f[o]o</ol>'], 2036 ['<li>abc</li>', '<ul><li>f[o]o</ul>'], 2037 ['<dir><li>abc</dir>', '<dir><li>f[o]o</dir>'], 2038 ['<dir><li>abc</dir>', '<ol><li>f[o]o</ol>'], 2039 ['<dir><li>abc</dir>', '<ul><li>f[o]o</ul>'], 2040 ['<ol><li>abc</ol>', '<dir><li>f[o]o</dir>'], 2041 ['<ol><li>abc</ol>', '<ol><li>f[o]o</ol>'], 2042 ['<ol><li>abc</ol>', '<ul><li>f[o]o</ul>'], 2043 ['<ul><li>abc</ul>', '<dir><li>f[o]o</dir>'], 2044 ['<ul><li>abc</ul>', '<ol><li>f[o]o</ol>'], 2045 ['<ul><li>abc</ul>', '<ul><li>f[o]o</ul>'], 2046 ['<li>abc</li>', 'f[o]o'], 2047 2048 ['<nobr>abc</nobr>', '<nobr>f[o]o</nobr>'], 2049 ['<nobr>abc</nobr>', 'f[o]o'], 2050 2051 ['<p>abc', '<font color=blue>foo[]bar</font>'], 2052 ['<p>abc', '<span style=color:blue>foo[]bar</span>'], 2053 ['<p>abc', '<span style=font-variant:small-caps>foo[]bar</span>'], 2054 [' ', '<p>[foo]</p>'], 2055 ['<span style=display:none></span>', '<p>[foo]</p>'], 2056 ['<!--abc-->', '<p>[foo]</p>'], 2057 2058 ['abc', '<p>{}<br></p>'], 2059 ['<!--abc-->', '<p>{}<br></p>'], 2060 ['abc', '<p><!--foo-->{}<span><br></span><!--bar--></p>'], 2061 ['<!--abc-->', '<p><!--foo-->{}<span><br></span><!--bar--></p>'], 2062 ['abc', '<p>{}<span><!--foo--><br><!--bar--></span></p>'], 2063 ['<!--abc-->', '<p>{}<span><!--foo--><br><!--bar--></span></p>'], 2064 2065 ['abc', '<p><br>{}</p>'], 2066 ['<!--abc-->', '<p><br>{}</p>'], 2067 ['abc', '<p><!--foo--><span><br></span>{}<!--bar--></p>'], 2068 ['<!--abc-->', '<p><!--foo--><span><br></span>{}<!--bar--></p>'], 2069 ['abc', '<p><span><!--foo--><br><!--bar--></span>{}</p>'], 2070 ['<!--abc-->', '<p><span><!--foo--><br><!--bar--></span>{}</p>'], 2071 ], 2072 //@} 2073 insertimage: [ 2074 //@{ 2075 'foo[]bar', 2076 '<span>foo</span>{}<span>bar</span>', 2077 '<span>foo[</span><span>]bar</span>', 2078 ["", 'foo[bar]baz'], 2079 'foo[bar]baz', 2080 'foo<span style=color:#aBcDeF>[bar]</span>baz', 2081 'foo<span style=color:#aBcDeF>{bar}</span>baz', 2082 'foo{<span style=color:#aBcDeF>bar</span>}baz', 2083 '[foo<span style=color:#aBcDeF>bar]</span>baz', 2084 '{foo<span style=color:#aBcDeF>bar}</span>baz', 2085 'foo<span style=color:#aBcDeF>[bar</span>baz]', 2086 'foo<span style=color:#aBcDeF>{bar</span>baz}', 2087 'foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz', 2088 2089 'foo<b>[bar]</b>baz', 2090 'foo<b>{bar}</b>baz', 2091 'foo{<b>bar</b>}baz', 2092 'foo<span>[bar]</span>baz', 2093 'foo<span>{bar}</span>baz', 2094 'foo{<span>bar</span>}baz', 2095 '<b>foo[bar</b><i>baz]quz</i>', 2096 '<p>foo</p><p>[bar]</p><p>baz</p>', 2097 '<p>foo</p><p>{bar}</p><p>baz</p>', 2098 '<p>foo</p>{<p>bar</p>}<p>baz</p>', 2099 2100 '<p>foo[bar<p>baz]quz', 2101 '<p>foo[bar<div>baz]quz</div>', 2102 '<p>foo[bar<h1>baz]quz</h1>', 2103 '<div>foo[bar</div><p>baz]quz', 2104 '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>', 2105 2106 '<p><b>foo[bar</b><p>baz]quz', 2107 '<div><p>foo[bar</div><p>baz]quz', 2108 '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote', 2109 '<p>foo[bar<p style=color:blue>baz]quz', 2110 '<p>foo[bar<p><b>baz]quz</b>', 2111 2112 '<div><p>foo<p>[bar<p>baz]</div>', 2113 2114 'foo[<br>]bar', 2115 '<p>foo[</p><p>]bar</p>', 2116 '<p>foo[</p><p>]bar<br>baz</p>', 2117 'foo[<p>]bar</p>', 2118 'foo[<p>]bar<br>baz</p>', 2119 'foo[<p>]bar</p>baz', 2120 '<p>foo[</p>]bar', 2121 '<p>foo[</p>]bar<br>baz', 2122 '<p>foo[</p>]bar<p>baz</p>', 2123 'foo[<div><p>]bar</div>', 2124 '<div><p>foo[</p></div>]bar', 2125 'foo[<div><p>]bar</p>baz</div>', 2126 'foo[<div>]bar<p>baz</p></div>', 2127 '<div><p>foo</p>bar[</div>]baz', 2128 '<div>foo<p>bar[</p></div>]baz', 2129 ], 2130 //@} 2131 insertlinebreak: [ 2132 //@{ Same as insertparagraph (set below) 2133 ], 2134 //@} 2135 insertorderedlist: [ 2136 //@{ 2137 'foo[]bar', 2138 'foo[bar]baz', 2139 'foo<br>[bar]', 2140 'f[oo<br>b]ar<br>baz', 2141 '<p>[foo]<br>bar</p>', 2142 '[foo<ol><li>bar]</ol>baz', 2143 'foo<ol><li>[bar</ol>baz]', 2144 '[foo<ul><li>bar]</ul>baz', 2145 'foo<ul><li>[bar</ul>baz]', 2146 'foo<ul><li>[bar</ul><ol><li>baz]</ol>quz', 2147 'foo<ol><li>[bar</ol><ul><li>baz]</ul>quz', 2148 2149 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 2150 '<table><tbody><tr><td>fo[o<td>b]ar<td>baz</table>', 2151 '{<table><tr><td>foo<td>bar<td>baz</table>}', 2152 2153 '<p>foo<p>[bar]<p>baz', 2154 '<p>foo<blockquote>[bar]</blockquote><p>baz', 2155 '<dl><dt>foo<dd>[bar]<dt>baz<dd>quz</dl>', 2156 '<dl><dt>foo<dd>bar<dt>[baz]<dd>quz</dl>', 2157 2158 '<p>[foo<p>bar]<p>baz', 2159 '<p>[foo<blockquote>bar]</blockquote><p>baz', 2160 '<dl><dt>[foo<dd>bar]<dt>baz<dd>quz</dl>', 2161 '<dl><dt>foo<dd>[bar<dt>baz]<dd>quz</dl>', 2162 2163 '<p>[foo<blockquote><p>bar]<p>baz</blockquote>', 2164 2165 2166 // Various <ol> stuff 2167 '<ol><li>foo<li>[bar]<li>baz</ol>', 2168 '<ol><li>foo</ol>[bar]', 2169 '[foo]<ol><li>bar</ol>', 2170 '<ol><li>foo</ol>[bar]<ol><li>baz</ol>', 2171 '<ol><ol><li>[foo]</ol></ol>', 2172 '<ol><li>[foo]<br>bar<li>baz</ol>', 2173 '<ol><li>foo<br>[bar]<li>baz</ol>', 2174 '<ol><li><div>[foo]</div>bar<li>baz</ol>', 2175 '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>', 2176 '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>', 2177 '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>', 2178 '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>', 2179 '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>', 2180 '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>', 2181 '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>', 2182 '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>', 2183 '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>', 2184 '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>', 2185 2186 // Multiple items at once. 2187 '<ol><li>foo<li>[bar<li>baz]</ol>', 2188 '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>', 2189 '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>', 2190 '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra', 2191 2192 // We probably can't actually get this DOM . . . 2193 '<ol><li>[foo]<ol><li>bar</ol>baz</ol>', 2194 '<ol><li>foo<ol><li>[bar]</ol>baz</ol>', 2195 '<ol><li>foo<ol><li>bar</ol>[baz]</ol>', 2196 '<ol><li>[foo<ol><li>bar]</ol>baz</ol>', 2197 2198 2199 // Same stuff but with <ul> 2200 '<ul><li>foo<li>[bar]<li>baz</ul>', 2201 '<ul><li>foo</ul>[bar]', 2202 '[foo]<ul><li>bar</ul>', 2203 '<ul><li>foo</ul>[bar]<ul><li>baz</ul>', 2204 '<ul><ul><li>[foo]</ul></ul>', 2205 '<ul><li>[foo]<br>bar<li>baz</ul>', 2206 '<ul><li>foo<br>[bar]<li>baz</ul>', 2207 '<ul><li><div>[foo]</div>bar<li>baz</ul>', 2208 '<ul><li>foo<ul><li>[bar]<li>baz</ul><li>quz</ul>', 2209 '<ul><li>foo<ul><li>bar<li>[baz]</ul><li>quz</ul>', 2210 '<ul><li>foo</li><ul><li>[bar]<li>baz</ul><li>quz</ul>', 2211 '<ul><li>foo</li><ul><li>bar<li>[baz]</ul><li>quz</ul>', 2212 '<ul><li>[foo]<ul><li>bar</ul><li>baz</ul>', 2213 '<ul><li>[foo]</li><ul><li>bar</ul><li>baz</ul>', 2214 '<ul><li>foo<li>[bar]<ul><li>baz</ul><li>quz</ul>', 2215 '<ul><li>foo<li>[bar]</li><ul><li>baz</ul><li>quz</ul>', 2216 '<ul><li>foo<ul><li>bar<li>baz</ul><li>[quz]</ul>', 2217 '<ul><li>foo</li><ul><li>bar<li>baz</ul><li>[quz]</ul>', 2218 2219 // Multiple items at once. 2220 '<ul><li>foo<li>[bar<li>baz]</ul>', 2221 '<ul><li>[foo<ul><li>bar]</ul><li>baz</ul>', 2222 '<ul><li>foo<ul><li>b[ar</ul><li>b]az</ul>', 2223 '<ul><li>[foo<ul><li>bar</ul><li>baz]</ul><p>extra', 2224 2225 // We probably can't actually get this DOM . . . 2226 '<ul><li>[foo]<ul><li>bar</ul>baz</ul>', 2227 '<ul><li>foo<ul><li>[bar]</ul>baz</ul>', 2228 '<ul><li>foo<ul><li>bar</ul>[baz]</ul>', 2229 '<ul><li>[foo<ul><li>bar]</ul>baz</ul>', 2230 2231 2232 // Mix of <ol> and <ul> 2233 'foo<ol><li>bar</ol><ul><li>[baz]</ul>quz', 2234 'foo<ol><li>bar</ol><ul><li>[baz</ul>quz]', 2235 'foo<ul><li>[bar]</ul><ol><li>baz</ol>quz', 2236 '[foo<ul><li>bar]</ul><ol><li>baz</ol>quz', 2237 2238 // Interaction with indentation 2239 '[foo]<blockquote>bar</blockquote>baz', 2240 'foo<blockquote>[bar]</blockquote>baz', 2241 '[foo<blockquote>bar]</blockquote>baz', 2242 '<ol><li>foo</ol><blockquote>[bar]</blockquote>baz', 2243 '[foo]<blockquote><ol><li>bar</ol></blockquote>baz', 2244 'foo<blockquote>[bar]<br>baz</blockquote>', 2245 '[foo<blockquote>bar]<br>baz</blockquote>', 2246 '<ol><li>foo</ol><blockquote>[bar]<br>baz</blockquote>', 2247 2248 '<p>[foo]<blockquote><p>bar</blockquote><p>baz', 2249 '<p>foo<blockquote><p>[bar]</blockquote><p>baz', 2250 '<p>[foo<blockquote><p>bar]</blockquote><p>baz', 2251 '<ol><li>foo</ol><blockquote><p>[bar]</blockquote><p>baz', 2252 2253 // Attributes 2254 '<ul id=abc><li>foo<li>[bar]<li>baz</ul>', 2255 '<ul style=color:blue><li>foo<li>[bar]<li>baz</ul>', 2256 '<ul style=text-indent:1em><li>foo<li>[bar]<li>baz</ul>', 2257 '<ul id=abc><li>[foo]<li>bar<li>baz</ul>', 2258 '<ul style=color:blue><li>[foo]<li>bar<li>baz</ul>', 2259 '<ul style=text-indent:1em><li>[foo]<li>bar<li>baz</ul>', 2260 '<ul id=abc><li>foo<li>bar<li>[baz]</ul>', 2261 '<ul style=color:blue><li>foo<li>bar<li>[baz]</ul>', 2262 '<ul style=text-indent:1em><li>foo<li>bar<li>[baz]</ul>', 2263 2264 // Whitespace nodes 2265 '<ol><li>foo</ol> <p>[bar]', 2266 '<p>[foo]</p> <ol><li>bar</ol>', 2267 '<ol><li>foo</ol> <p>[bar]</p> <ol><li>baz</ol>', 2268 2269 // This caused an infinite loop at one point due to a bug in "fix 2270 // disallowed ancestors". Disabled because I'm not sure how we want it 2271 // to behave: 2272 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14578 2273 '!<span contenteditable=true>foo[]</span>', 2274 ], 2275 //@} 2276 insertparagraph: [ 2277 //@{ 2278 'foo[bar]baz', 2279 'fo[o<table><tr><td>b]ar</table>', 2280 '<table><tr><td>[foo<td>bar]<tr><td>baz<td>quz</table>', 2281 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<tr><td>baz<td>quz</table>', 2282 '<table><tr><td>fo[o</table>b]ar', 2283 '<table><tr><td>fo[o<td>b]ar<td>baz</table>', 2284 '{<table><tr><td>foo</table>}', 2285 '<table><tr><td>[foo]</table>', 2286 '<ol><li>[foo]<li>bar</ol>', 2287 '<ol><li>f[o]o<li>bar</ol>', 2288 2289 '[]foo', 2290 'foo[]', 2291 '<span>foo[]</span>', 2292 'foo[]<br>', 2293 'foo[]bar', 2294 '<address>[]foo</address>', 2295 '<address>foo[]</address>', 2296 '<address>foo[]<br></address>', 2297 '<address>foo[]bar</address>', 2298 '<div>[]foo</div>', 2299 '<div>foo[]</div>', 2300 '<div>foo[]<br></div>', 2301 '<div>foo[]bar</div>', 2302 '<dl><dt>[]foo<dd>bar</dl>', 2303 '<dl><dt>foo[]<dd>bar</dl>', 2304 '<dl><dt>foo[]<br><dd>bar</dl>', 2305 '<dl><dt>foo[]bar<dd>baz</dl>', 2306 '<dl><dt>foo<dd>[]bar</dl>', 2307 '<dl><dt>foo<dd>bar[]</dl>', 2308 '<dl><dt>foo<dd>bar[]<br></dl>', 2309 '<dl><dt>foo<dd>bar[]baz</dl>', 2310 '<h1>[]foo</h1>', 2311 '<h1>foo[]</h1>', 2312 '<h1>foo[]<br></h1>', 2313 '<h1>foo[]bar</h1>', 2314 '<ol><li>[]foo</ol>', 2315 '<ol><li>foo[]</ol>', 2316 '<ol><li>foo[]<br></ol>', 2317 '<ol><li>foo[]bar</ol>', 2318 '<p>[]foo</p>', 2319 '<p>foo[]</p>', 2320 '<p>foo[]<br></p>', 2321 '<p>foo[]bar</p>', 2322 '<pre>[]foo</pre>', 2323 '<pre>foo[]</pre>', 2324 '<pre>foo[]<br></pre>', 2325 '<pre>foo[]bar</pre>', 2326 2327 '<pre>foo[]<br><br></pre>', 2328 '<pre>foo<br>{}<br></pre>', 2329 '<pre>foo []</pre>', 2330 '<pre>foo[] </pre>', 2331 '<pre>foo [] </pre>', 2332 2333 '<xmp>foo[]bar</xmp>', 2334 '<script>foo[]bar</script>baz', 2335 '<div style=display:none>foo[]bar</div>baz', 2336 '<listing>foo[]bar</listing>', 2337 2338 '<ol><li>{}<br></li></ol>', 2339 'foo<ol><li>{}<br></li></ol>', 2340 '<ol><li>{}<br></li></ol>foo', 2341 '<ol><li>foo<li>{}<br></ol>', 2342 '<ol><li>{}<br><li>bar</ol>', 2343 '<ol><li>foo</li><ul><li>{}<br></ul></ol>', 2344 2345 '<dl><dt>{}<br></dt></dl>', 2346 '<dl><dt>foo<dd>{}<br></dl>', 2347 '<dl><dt>{}<br><dd>bar</dl>', 2348 '<dl><dt>foo<dd>bar<dl><dt>{}<br><dd>baz</dl></dl>', 2349 '<dl><dt>foo<dd>bar<dl><dt>baz<dd>{}<br></dl></dl>', 2350 2351 '<h1>foo[bar</h1><p>baz]quz</p>', 2352 '<p>foo[bar</p><h1>baz]quz</h1>', 2353 '<p>foo</p>{}<br>', 2354 '{}<br><p>foo</p>', 2355 '<p>foo</p>{}<br><h1>bar</h1>', 2356 '<h1>foo</h1>{}<br><p>bar</p>', 2357 '<h1>foo</h1>{}<br><h2>bar</h2>', 2358 '<p>foo</p><h1>[bar]</h1><p>baz</p>', 2359 '<p>foo</p>{<h1>bar</h1>}<p>baz</p>', 2360 2361 '<table><tr><td>foo[]bar</table>', 2362 '<table><tr><td><p>foo[]bar</table>', 2363 2364 '<blockquote>[]foo</blockquote>', 2365 '<blockquote>foo[]</blockquote>', 2366 '<blockquote>foo[]<br></blockquote>', 2367 '<blockquote>foo[]bar</blockquote>', 2368 '<blockquote><p>[]foo</blockquote>', 2369 '<blockquote><p>foo[]</blockquote>', 2370 '<blockquote><p>foo[]bar</blockquote>', 2371 '<blockquote><p>foo[]<p>bar</blockquote>', 2372 '<blockquote><p>foo[]bar<p>baz</blockquote>', 2373 2374 '<span>foo[]bar</span>', 2375 '<span>foo[]bar</span>baz', 2376 '<b>foo[]bar</b>', 2377 '<b>foo[]bar</b>baz', 2378 '<b>foo[]</b>bar', 2379 'foo<b>[]bar</b>', 2380 '<b>foo[]</b><i>bar</i>', 2381 '<b id=x class=y>foo[]bar</b>', 2382 '<i><b>foo[]bar</b>baz</i>', 2383 2384 '<p><b>foo[]bar</b></p>', 2385 '<p><b>[]foo</b></p>', 2386 '<p><b id=x class=y>foo[]bar</b></p>', 2387 '<div><b>foo[]bar</b></div>', 2388 2389 '<a href=foo>foo[]bar</a>', 2390 '<a href=foo>foo[]bar</a>baz', 2391 '<a href=foo>foo[]</a>bar', 2392 'foo<a href=foo>[]bar</a>', 2393 2394 '<p>foo[]<!--bar-->', 2395 '<p><!--foo-->[]bar', 2396 2397 '<p>foo<span style=color:#aBcDeF>[bar]</span>baz', 2398 '<p>foo<span style=color:#aBcDeF>{bar}</span>baz', 2399 '<p>foo{<span style=color:#aBcDeF>bar</span>}baz', 2400 '<p>[foo<span style=color:#aBcDeF>bar]</span>baz', 2401 '<p>{foo<span style=color:#aBcDeF>bar}</span>baz', 2402 '<p>foo<span style=color:#aBcDeF>[bar</span>baz]', 2403 '<p>foo<span style=color:#aBcDeF>{bar</span>baz}', 2404 '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz', 2405 2406 // https://bugs.webkit.org/show_bug.cgi?id=5036 2407 '<ul contenteditable><li>{}<br></ul>', 2408 '<ul contenteditable><li>foo[]</ul>', 2409 '<div contenteditable=false><ul contenteditable><li>{}<br></ul></div>', 2410 '<div contenteditable=false><ul contenteditable><li>foo[]</ul></div>', 2411 2412 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13841 2413 // https://bugs.webkit.org/show_bug.cgi?id=23507 2414 '<address><p>foo[]</address>', 2415 '<dl><dt><p>foo[]</dl>', 2416 '<dl><dd><p>foo[]</dl>', 2417 '<ol><li><p>foo[]</ol>', 2418 '<ul><li><p>foo[]</ul>', 2419 '<address><div>foo[]</address>', 2420 '<dl><dt><div>foo[]</dl>', 2421 '<dl><dd><div>foo[]</dl>', 2422 '<ol><li><div>foo[]</ol>', 2423 '<ul><li><div>foo[]</ul>', 2424 '<div><p>foo[]</div>', 2425 '<div><div>foo[]</div>', 2426 2427 '<address><p>[]foo</address>', 2428 '<dl><dt><p>[]foo</dl>', 2429 '<dl><dd><p>[]foo</dl>', 2430 '<ol><li><p>[]foo</ol>', 2431 '<ul><li><p>[]foo</ul>', 2432 '<address><div>[]foo</address>', 2433 '<dl><dt><div>[]foo</dl>', 2434 '<dl><dd><div>[]foo</dl>', 2435 '<ol><li><div>[]foo</ol>', 2436 '<ul><li><div>[]foo</ul>', 2437 '<div><p>[]foo</div>', 2438 '<div><div>[]foo</div>', 2439 2440 '<address><p>foo[]bar</address>', 2441 '<dl><dt><p>foo[]bar</dl>', 2442 '<dl><dd><p>foo[]bar</dl>', 2443 '<ol><li><p>foo[]bar</ol>', 2444 '<ul><li><p>foo[]bar</ul>', 2445 '<address><div>foo[]bar</address>', 2446 '<dl><dt><div>foo[]bar</dl>', 2447 '<dl><dd><div>foo[]bar</dl>', 2448 '<ol><li><div>foo[]bar</ol>', 2449 '<ul><li><div>foo[]bar</ul>', 2450 '<div><p>foo[]bar</div>', 2451 '<div><div>foo[]bar</div>', 2452 2453 '<ol><li class=a id=x><p class=b id=y>foo[]</ol>', 2454 '<div class=a id=x><div class=b id=y>foo[]</div></div>', 2455 '<div class=a id=x><p class=b id=y>foo[]</div>', 2456 '<ol><li class=a id=x><p class=b id=y>[]foo</ol>', 2457 '<div class=a id=x><div class=b id=y>[]foo</div></div>', 2458 '<div class=a id=x><p class=b id=y>[]foo</div>', 2459 '<ol><li class=a id=x><p class=b id=y>foo[]bar</ol>', 2460 '<div class=a id=x><div class=b id=y>foo[]bar</div></div>', 2461 '<div class=a id=x><p class=b id=y>foo[]bar</div>', 2462 ], 2463 //@} 2464 inserttext: [ 2465 //@{ 2466 'foo[bar]baz', 2467 ['', 'foo[bar]baz'], 2468 2469 ['\t', 'foo[]bar'], 2470 ['&', 'foo[]bar'], 2471 ['\n', 'foo[]bar'], 2472 ['abc\ndef', 'foo[]bar'], 2473 ['\x07', 'foo[]bar'], 2474 2475 ['<b>hi</b>', 'foo[]bar'], 2476 ['<', 'foo[]bar'], 2477 ['&', 'foo[]bar'], 2478 2479 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14254 2480 ['!\r', 'foo[]bar'], 2481 ['!\r\n', 'foo[]bar'], 2482 ['!\0', 'foo[]bar'], 2483 ['!\ud800', 'foo[]bar'], 2484 2485 // Whitespace tests! The following two bugs are relevant to some of 2486 // these: 2487 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14119 2488 // https://bugzilla.mozilla.org/show_bug.cgi?id=681626 2489 [' ', 'foo[]bar'], 2490 [' ', 'foo []bar'], 2491 [' ', 'foo[] bar'], 2492 [' ', 'foo []bar'], 2493 [' ', 'foo [] bar'], 2494 [' ', 'foo[] bar'], 2495 [' ', 'foo []bar'], 2496 [' ', 'foo [] bar'], 2497 [' ', 'foo[] bar'], 2498 [' ', 'foo []bar'], 2499 [' ', 'foo [] bar'], 2500 [' ', 'foo[] bar'], 2501 [' ', 'foo [] bar'], 2502 [' ', 'foo []bar'], 2503 [' ', 'foo [] bar'], 2504 2505 [' ', '[]foo'], 2506 [' ', '{}foo'], 2507 [' ', 'foo[]'], 2508 [' ', 'foo{}'], 2509 [' ', 'foo []'], 2510 [' ', 'foo {}'], 2511 [' ', 'foo []'], 2512 [' ', 'foo {}'], 2513 [' ', '<b>foo[]</b>bar'], 2514 [' ', 'foo[]<b>bar</b>'], 2515 2516 [' ', 'foo[] '], 2517 [' ', ' foo [] '], 2518 [' ', 'foo[]<span> </span>'], 2519 [' ', 'foo[]<span> </span> '], 2520 [' ', ' []foo'], 2521 [' ', ' [] foo '], 2522 [' ', '<span> </span>[]foo'], 2523 [' ', ' <span> </span>[]foo'], 2524 2525 [' ', '{}<br>'], 2526 [' ', '<p>{}<br>'], 2527 2528 [' ', '<p>foo[]<p>bar'], 2529 [' ', '<p>foo []<p>bar'], 2530 [' ', '<p>foo[]<p> bar'], 2531 2532 // Some of the same tests as above, repeated with various values of 2533 // white-space. 2534 [' ', '<pre>foo[]bar</pre>'], 2535 [' ', '<pre>foo []bar</pre>'], 2536 [' ', '<pre>foo[] bar</pre>'], 2537 [' ', '<pre>foo []bar</pre>'], 2538 [' ', '<pre>[]foo</pre>'], 2539 [' ', '<pre>foo[]</pre>'], 2540 [' ', '<pre>foo []</pre>'], 2541 [' ', '<pre> foo [] </pre>'], 2542 2543 [' ', '<div style=white-space:pre>foo[]bar</div>'], 2544 [' ', '<div style=white-space:pre>foo []bar</div>'], 2545 [' ', '<div style=white-space:pre>foo[] bar</div>'], 2546 [' ', '<div style=white-space:pre>foo []bar</div>'], 2547 [' ', '<div style=white-space:pre>[]foo</div>'], 2548 [' ', '<div style=white-space:pre>foo[]</div>'], 2549 [' ', '<div style=white-space:pre>foo []</div>'], 2550 [' ', '<div style=white-space:pre> foo [] </div>'], 2551 2552 [' ', '<div style=white-space:pre-wrap>foo[]bar</div>'], 2553 [' ', '<div style=white-space:pre-wrap>foo []bar</div>'], 2554 [' ', '<div style=white-space:pre-wrap>foo[] bar</div>'], 2555 [' ', '<div style=white-space:pre-wrap>foo []bar</div>'], 2556 [' ', '<div style=white-space:pre-wrap>[]foo</div>'], 2557 [' ', '<div style=white-space:pre-wrap>foo[]</div>'], 2558 [' ', '<div style=white-space:pre-wrap>foo []</div>'], 2559 [' ', '<div style=white-space:pre-wrap> foo [] </div>'], 2560 2561 [' ', '<div style=white-space:pre-line>foo[]bar</div>'], 2562 [' ', '<div style=white-space:pre-line>foo []bar</div>'], 2563 [' ', '<div style=white-space:pre-line>foo[] bar</div>'], 2564 [' ', '<div style=white-space:pre-line>foo []bar</div>'], 2565 [' ', '<div style=white-space:pre-line>[]foo</div>'], 2566 [' ', '<div style=white-space:pre-line>foo[]</div>'], 2567 [' ', '<div style=white-space:pre-line>foo []</div>'], 2568 [' ', '<div style=white-space:pre-line> foo [] </div>'], 2569 2570 [' ', '<div style=white-space:nowrap>foo[]bar</div>'], 2571 [' ', '<div style=white-space:nowrap>foo []bar</div>'], 2572 [' ', '<div style=white-space:nowrap>foo[] bar</div>'], 2573 [' ', '<div style=white-space:nowrap>foo []bar</div>'], 2574 [' ', '<div style=white-space:nowrap>[]foo</div>'], 2575 [' ', '<div style=white-space:nowrap>foo[]</div>'], 2576 [' ', '<div style=white-space:nowrap>foo []</div>'], 2577 [' ', '<div style=white-space:nowrap> foo [] </div>'], 2578 2579 // End whitespace tests 2580 2581 // Autolinking tests 2582 [' ', 'http://a[]'], 2583 [' ', 'ftp://a[]'], 2584 [' ', 'quasit://a[]'], 2585 [' ', '.x-++-.://a[]'], 2586 [' ', '(http://a)[]'], 2587 [' ', '<http://a>[]'], 2588 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14744 2589 ['! ', '[http://a][]'], 2590 ['! ', '{http://a}[]'], 2591 [' ', 'http://a![]'], 2592 [' ', '!"#$%&\'()*+,-./:;<=>?\^_`|~http://a!"#$%&\'()*+,-./:;<=>?\^_`|~[]'], 2593 [' ', 'http://a!"\'(),-.:;<>`[]'], 2594 [' ', 'http://a#$%&*+/=?\^_|~[]'], 2595 [' ', 'mailto:a[]'], 2596 [' ', 'a@b[]'], 2597 [' ', 'a@[]'], 2598 [' ', '@b[]'], 2599 [' ', '#@x[]'], 2600 [' ', 'a@.[]'], 2601 [' ', '!"#$%&\'()*+,-./:;<=>?\^_`|~a@b!"#$%&\'()*+,-./:;<=>?\^_`|~[]'], 2602 [' ', '<b>a@b</b>{}'], 2603 [' ', '<b>a</b><i>@</i><u>b</u>{}'], 2604 [' ', 'a@b<b>[]c</b>'], 2605 [' ', '<p>a@b</p><p>[]c</p>'], 2606 ['a', 'http://a[]'], 2607 ['\t', 'http://a[]'], 2608 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14254 2609 ['!\r', 'http://a[]'], 2610 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14745 2611 ['!\n', 'http://a[]'], 2612 ['\f', 'http://a[]'], 2613 ['\u00A0', 'http://a[]'], 2614 2615 [' ', 'foo[]'], 2616 2617 'foo[]bar', 2618 'foo []', 2619 'foo\xa0[]', 2620 '<p>foo[]', 2621 '<p>foo</p>{}', 2622 '<p>[]foo', 2623 '<p>{}foo', 2624 '{}<p>foo', 2625 '<p>foo</p>{}<p>bar</p>', 2626 '<b>foo[]</b>bar', 2627 '<b>foo</b>[]bar', 2628 'foo<b>{}</b>bar', 2629 '<a>foo[]</a>bar', 2630 '<a>foo</a>[]bar', 2631 '<a href=/>foo[]</a>bar', 2632 '<a href=/>foo</a>[]bar', 2633 '<p>fo[o<p>b]ar', 2634 '<p>fo[o<p>bar<p>b]az', 2635 '{}<br>', 2636 '<p>{}<br>', 2637 '<p><span>{}<br></span>', 2638 '<p>foo<span style=color:#aBcDeF>[bar]</span>baz', 2639 '<p>foo<span style=color:#aBcDeF>{bar}</span>baz', 2640 '<p>foo{<span style=color:#aBcDeF>bar</span>}baz', 2641 '<p>[foo<span style=color:#aBcDeF>bar]</span>baz', 2642 '<p>{foo<span style=color:#aBcDeF>bar}</span>baz', 2643 '<p>foo<span style=color:#aBcDeF>[bar</span>baz]', 2644 '<p>foo<span style=color:#aBcDeF>{bar</span>baz}', 2645 '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz', 2646 2647 2648 // These are like the corresponding tests in the multitest section, but 2649 // because the selection isn't collapsed, we don't need to do 2650 // multitests to set overrides. 2651 'foo<b>[bar]</b>baz', 2652 'foo<i>[bar]</i>baz', 2653 'foo<s>[bar]</s>baz', 2654 'foo<sub>[bar]</sub>baz', 2655 'foo<sup>[bar]</sup>baz', 2656 'foo<u>[bar]</u>baz', 2657 'foo<a href=http://www.google.com>[bar]</a>baz', 2658 'foo<font face=sans-serif>[bar]</font>baz', 2659 'foo<font size=4>[bar]</font>baz', 2660 'foo<font color=#0000FF>[bar]</font>baz', 2661 'foo<span style=background-color:#00FFFF>[bar]</span>baz', 2662 'foo<a href=http://www.google.com><font color=blue>[bar]</font></a>baz', 2663 'foo<font color=blue><a href=http://www.google.com>[bar]</a></font>baz', 2664 'foo<a href=http://www.google.com><font color=brown>[bar]</font></a>baz', 2665 'foo<font color=brown><a href=http://www.google.com>[bar]</a></font>baz', 2666 'foo<a href=http://www.google.com><font color=black>[bar]</font></a>baz', 2667 'foo<a href=http://www.google.com><u>[bar]</u></a>baz', 2668 'foo<u><a href=http://www.google.com>[bar]</a></u>baz', 2669 'foo<sub><font size=2>[bar]</font></sub>baz', 2670 'foo<font size=2><sub>[bar]</sub></font>baz', 2671 'foo<sub><font size=3>[bar]</font></sub>baz', 2672 'foo<font size=3><sub>[bar]</sub></font>baz', 2673 2674 // Now repeat but with different selections. 2675 '[foo<b>bar]</b>baz', 2676 '[foo<i>bar]</i>baz', 2677 '[foo<s>bar]</s>baz', 2678 '[foo<sub>bar]</sub>baz', 2679 '[foo<sup>bar]</sup>baz', 2680 '[foo<u>bar]</u>baz', 2681 '[foo<a href=http://www.google.com>bar]</a>baz', 2682 '[foo<font face=sans-serif>bar]</font>baz', 2683 '[foo<font size=4>bar]</font>baz', 2684 '[foo<font color=#0000FF>bar]</font>baz', 2685 '[foo<span style=background-color:#00FFFF>bar]</span>baz', 2686 '[foo<a href=http://www.google.com><font color=blue>bar]</font></a>baz', 2687 '[foo<font color=blue><a href=http://www.google.com>bar]</a></font>baz', 2688 '[foo<a href=http://www.google.com><font color=brown>bar]</font></a>baz', 2689 '[foo<font color=brown><a href=http://www.google.com>bar]</a></font>baz', 2690 '[foo<a href=http://www.google.com><font color=black>bar]</font></a>baz', 2691 '[foo<a href=http://www.google.com><u>bar]</u></a>baz', 2692 '[foo<u><a href=http://www.google.com>bar]</a></u>baz', 2693 '[foo<sub><font size=2>bar]</font></sub>baz', 2694 '[foo<font size=2><sub>bar]</sub></font>baz', 2695 '[foo<sub><font size=3>bar]</font></sub>baz', 2696 '[foo<font size=3><sub>bar]</sub></font>baz', 2697 2698 'foo<b>[bar</b>baz]', 2699 'foo<i>[bar</i>baz]', 2700 'foo<s>[bar</s>baz]', 2701 'foo<sub>[bar</sub>baz]', 2702 'foo<sup>[bar</sup>baz]', 2703 'foo<u>[bar</u>baz]', 2704 'foo<a href=http://www.google.com>[bar</a>baz]', 2705 'foo<font face=sans-serif>[bar</font>baz]', 2706 'foo<font size=4>[bar</font>baz]', 2707 'foo<font color=#0000FF>[bar</font>baz]', 2708 'foo<span style=background-color:#00FFFF>[bar</span>baz]', 2709 'foo<a href=http://www.google.com><font color=blue>[bar</font></a>baz]', 2710 'foo<font color=blue><a href=http://www.google.com>[bar</a></font>baz]', 2711 'foo<a href=http://www.google.com><font color=brown>[bar</font></a>baz]', 2712 'foo<font color=brown><a href=http://www.google.com>[bar</a></font>baz]', 2713 'foo<a href=http://www.google.com><font color=black>[bar</font></a>baz]', 2714 'foo<a href=http://www.google.com><u>[bar</u></a>baz]', 2715 'foo<u><a href=http://www.google.com>[bar</a></u>baz]', 2716 'foo<sub><font size=2>[bar</font></sub>baz]', 2717 'foo<font size=2><sub>[bar</sub></font>baz]', 2718 'foo<sub><font size=3>[bar</font></sub>baz]', 2719 'foo<font size=3><sub>[bar</sub></font>baz]', 2720 2721 // https://bugs.webkit.org/show_bug.cgi?id=19702 2722 '<blockquote><font color=blue>[foo]</font></blockquote>', 2723 ], 2724 //@} 2725 insertunorderedlist: [ 2726 //@{ 2727 'foo[]bar', 2728 'foo[bar]baz', 2729 'foo<br>[bar]', 2730 'f[oo<br>b]ar<br>baz', 2731 '<p>[foo]<br>bar</p>', 2732 '[foo<ol><li>bar]</ol>baz', 2733 'foo<ol><li>[bar</ol>baz]', 2734 '[foo<ul><li>bar]</ul>baz', 2735 'foo<ul><li>[bar</ul>baz]', 2736 'foo<ul><li>[bar</ul><ol><li>baz]</ol>quz', 2737 'foo<ol><li>[bar</ol><ul><li>baz]</ul>quz', 2738 2739 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 2740 '<table><tbody><tr><td>fo[o<td>b]ar<td>baz</table>', 2741 '{<table><tr><td>foo<td>bar<td>baz</table>}', 2742 2743 '<p>foo<p>[bar]<p>baz', 2744 '<p>foo<blockquote>[bar]</blockquote><p>baz', 2745 '<dl><dt>foo<dd>[bar]<dt>baz<dd>quz</dl>', 2746 '<dl><dt>foo<dd>bar<dt>[baz]<dd>quz</dl>', 2747 2748 '<p>[foo<p>bar]<p>baz', 2749 '<p>[foo<blockquote>bar]</blockquote><p>baz', 2750 '<dl><dt>[foo<dd>bar]<dt>baz<dd>quz</dl>', 2751 '<dl><dt>foo<dd>[bar<dt>baz]<dd>quz</dl>', 2752 2753 '<p>[foo<blockquote><p>bar]<p>baz</blockquote>', 2754 2755 2756 // Various <ol> stuff 2757 '<ol><li>foo<li>[bar]<li>baz</ol>', 2758 '<ol><li>foo</ol>[bar]', 2759 '[foo]<ol><li>bar</ol>', 2760 '<ol><li>foo</ol>[bar]<ol><li>baz</ol>', 2761 '<ol><ol><li>[foo]</ol></ol>', 2762 '<ol><li>[foo]<br>bar<li>baz</ol>', 2763 '<ol><li>foo<br>[bar]<li>baz</ol>', 2764 '<ol><li><div>[foo]</div>bar<li>baz</ol>', 2765 '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>', 2766 '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>', 2767 '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>', 2768 '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>', 2769 '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>', 2770 '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>', 2771 '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>', 2772 '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>', 2773 '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>', 2774 '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>', 2775 2776 // Multiple items at once. 2777 '<ol><li>foo<li>[bar<li>baz]</ol>', 2778 '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>', 2779 '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>', 2780 '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra', 2781 2782 // We probably can't actually get this DOM . . . 2783 '<ol><li>[foo]<ol><li>bar</ol>baz</ol>', 2784 '<ol><li>foo<ol><li>[bar]</ol>baz</ol>', 2785 '<ol><li>foo<ol><li>bar</ol>[baz]</ol>', 2786 '<ol><li>[foo<ol><li>bar]</ol>baz</ol>', 2787 2788 2789 // Same stuff but with <ul> 2790 '<ul><li>foo<li>[bar]<li>baz</ul>', 2791 '<ul><li>foo</ul>[bar]', 2792 '[foo]<ul><li>bar</ul>', 2793 '<ul><li>foo</ul>[bar]<ul><li>baz</ul>', 2794 '<ul><ul><li>[foo]</ul></ul>', 2795 '<ul><li>[foo]<br>bar<li>baz</ul>', 2796 '<ul><li>foo<br>[bar]<li>baz</ul>', 2797 '<ul><li><div>[foo]</div>bar<li>baz</ul>', 2798 '<ul><li>foo<ul><li>[bar]<li>baz</ul><li>quz</ul>', 2799 '<ul><li>foo<ul><li>bar<li>[baz]</ul><li>quz</ul>', 2800 '<ul><li>foo</li><ul><li>[bar]<li>baz</ul><li>quz</ul>', 2801 '<ul><li>foo</li><ul><li>bar<li>[baz]</ul><li>quz</ul>', 2802 '<ul><li>[foo]<ul><li>bar</ul><li>baz</ul>', 2803 '<ul><li>[foo]</li><ul><li>bar</ul><li>baz</ul>', 2804 '<ul><li>foo<li>[bar]<ul><li>baz</ul><li>quz</ul>', 2805 '<ul><li>foo<li>[bar]</li><ul><li>baz</ul><li>quz</ul>', 2806 '<ul><li>foo<ul><li>bar<li>baz</ul><li>[quz]</ul>', 2807 '<ul><li>foo</li><ul><li>bar<li>baz</ul><li>[quz]</ul>', 2808 2809 // Multiple items at once. 2810 '<ul><li>foo<li>[bar<li>baz]</ul>', 2811 '<ul><li>[foo<ul><li>bar]</ul><li>baz</ul>', 2812 '<ul><li>foo<ul><li>b[ar</ul><li>b]az</ul>', 2813 '<ul><li>[foo<ul><li>bar</ul><li>baz]</ul><p>extra', 2814 2815 // We probably can't actually get this DOM . . . 2816 '<ul><li>[foo]<ul><li>bar</ul>baz</ul>', 2817 '<ul><li>foo<ul><li>[bar]</ul>baz</ul>', 2818 '<ul><li>foo<ul><li>bar</ul>[baz]</ul>', 2819 '<ul><li>[foo<ul><li>bar]</ul>baz</ul>', 2820 2821 2822 // Mix of <ol> and <ul> 2823 'foo<ol><li>bar</ol><ul><li>[baz]</ul>quz', 2824 'foo<ol><li>bar</ol><ul><li>[baz</ul>quz]', 2825 'foo<ul><li>[bar]</ul><ol><li>baz</ol>quz', 2826 '[foo<ul><li>bar]</ul><ol><li>baz</ol>quz', 2827 2828 // Interaction with indentation 2829 '[foo]<blockquote>bar</blockquote>baz', 2830 'foo<blockquote>[bar]</blockquote>baz', 2831 '[foo<blockquote>bar]</blockquote>baz', 2832 '<ol><li>foo</ol><blockquote>[bar]</blockquote>baz', 2833 '[foo]<blockquote><ol><li>bar</ol></blockquote>baz', 2834 'foo<blockquote>[bar]<br>baz</blockquote>', 2835 '[foo<blockquote>bar]<br>baz</blockquote>', 2836 '<ol><li>foo</ol><blockquote>[bar]<br>baz</blockquote>', 2837 2838 '<p>[foo]<blockquote><p>bar</blockquote><p>baz', 2839 '<p>foo<blockquote><p>[bar]</blockquote><p>baz', 2840 '<p>[foo<blockquote><p>bar]</blockquote><p>baz', 2841 '<ol><li>foo</ol><blockquote><p>[bar]</blockquote><p>baz', 2842 2843 // Attributes 2844 '<ul id=abc><li>foo<li>[bar]<li>baz</ul>', 2845 '<ul style=color:blue><li>foo<li>[bar]<li>baz</ul>', 2846 '<ul style=text-indent:1em><li>foo<li>[bar]<li>baz</ul>', 2847 '<ul id=abc><li>[foo]<li>bar<li>baz</ul>', 2848 '<ul style=color:blue><li>[foo]<li>bar<li>baz</ul>', 2849 '<ul style=text-indent:1em><li>[foo]<li>bar<li>baz</ul>', 2850 '<ul id=abc><li>foo<li>bar<li>[baz]</ul>', 2851 '<ul style=color:blue><li>foo<li>bar<li>[baz]</ul>', 2852 '<ul style=text-indent:1em><li>foo<li>bar<li>[baz]</ul>', 2853 2854 // Whitespace nodes 2855 '<ul><li>foo</ul> <p>[bar]', 2856 '<p>[foo]</p> <ul><li>bar</ul>', 2857 '<ul><li>foo</ul> <p>[bar]</p> <ul><li>baz</ul>', 2858 2859 // https://bugs.webkit.org/show_bug.cgi?id=24167 2860 '{<div style="font-size: 1.3em">1</div><div style="font-size: 1.1em">2</div>}', 2861 ], 2862 //@} 2863 italic: [ 2864 //@{ 2865 'foo[]bar', 2866 '<p>[foo</p> <p>bar]</p>', 2867 '<span>[foo</span> <span>bar]</span>', 2868 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>', 2869 '<p>[foo<p><br><p>bar]', 2870 '<b>foo[]bar</b>', 2871 '<i>foo[]bar</i>', 2872 '<span>foo</span>{}<span>bar</span>', 2873 '<span>foo[</span><span>]bar</span>', 2874 'foo[bar]baz', 2875 'foo[bar<b>baz]qoz</b>quz', 2876 'foo[bar<i>baz]qoz</i>quz', 2877 '{<p><p> <p>foo</p>}', 2878 2879 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 2880 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>', 2881 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>', 2882 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>', 2883 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>', 2884 '{<table><tr><td>foo<td>bar<td>baz</table>}', 2885 2886 'foo<span style="font-style: italic">[bar]</span>baz', 2887 'foo<address>[bar]</address>baz', 2888 'foo<cite>[bar]</cite>baz', 2889 'foo<dfn>[bar]</dfn>baz', 2890 'foo<em>[bar]</em>baz', 2891 'foo<i>[bar]</i>baz', 2892 'foo<var>[bar]</var>baz', 2893 2894 'foo{<address>bar</address>}baz', 2895 'foo{<cite>bar</cite>}baz', 2896 'foo{<dfn>bar</dfn>}baz', 2897 'foo{<em>bar</em>}baz', 2898 'foo{<i>bar</i>}baz', 2899 'foo{<var>bar</var>}baz', 2900 2901 'foo<address>b[a]r</address>baz', 2902 'foo<cite>b[a]r</cite>baz', 2903 'foo<dfn>b[a]r</dfn>baz', 2904 'foo<em>b[a]r</em>baz', 2905 'foo<i>b[a]r</i>baz', 2906 'foo<var>b[a]r</var>baz', 2907 2908 'fo[o<address>bar</address>b]az', 2909 'fo[o<cite>bar</cite>b]az', 2910 'fo[o<dfn>bar</dfn>b]az', 2911 'fo[o<em>bar</em>b]az', 2912 'fo[o<i>bar</i>b]az', 2913 'fo[o<var>bar</var>b]az', 2914 2915 'foo[<address>bar</address>baz]', 2916 'foo[<cite>bar</cite>baz]', 2917 'foo[<dfn>bar</dfn>baz]', 2918 'foo[<em>bar</em>baz]', 2919 'foo[<i>bar</i>baz]', 2920 'foo[<var>bar</var>baz]', 2921 2922 '[foo<address>bar</address>]baz', 2923 '[foo<cite>bar</cite>]baz', 2924 '[foo<dfn>bar</dfn>]baz', 2925 '[foo<em>bar</em>]baz', 2926 '[foo<i>bar</i>]baz', 2927 '[foo<var>bar</var>]baz', 2928 2929 'foo<span style="font-style: italic">[bar]</span>baz', 2930 'foo<span style="font-style: oblique">[bar]</span>baz', 2931 'foo<span style="font-style: oblique">b[a]r</span>baz', 2932 2933 '<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>', 2934 '<i><p>foo[<b>bar</b>}</p><p>baz</p></i>', 2935 'foo [bar <b>baz] qoz</b> quz sic', 2936 'foo bar <b>baz [qoz</b> quz] sic', 2937 'foo [bar <i>baz] qoz</i> quz sic', 2938 'foo bar <i>baz [qoz</i> quz] sic', 2939 2940 // Tests for queryCommandIndeterm() and queryCommandState() 2941 'fo[o<i>b]ar</i>baz', 2942 'foo<i>ba[r</i>b]az', 2943 'fo[o<i>bar</i>b]az', 2944 'foo[<i>b]ar</i>baz', 2945 'foo<i>ba[r</i>]baz', 2946 'foo[<i>bar</i>]baz', 2947 'foo<i>[bar]</i>baz', 2948 'foo{<i>bar</i>}baz', 2949 'fo[o<span style=font-style:italic>b]ar</span>baz', 2950 'fo[o<span style=font-style:oblique>b]ar</span>baz', 2951 '<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b]ar</span>', 2952 '<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b]ar</span>', 2953 '<i>fo[o</i><address>b]ar</address>', 2954 ], 2955 //@} 2956 justifycenter: [ 2957 //@{ 2958 'foo[]bar<p>extra', 2959 '<span>foo</span>{}<span>bar</span><p>extra', 2960 '<span>foo[</span><span>]bar</span><p>extra', 2961 'foo[bar]baz<p>extra', 2962 'foo[bar<b>baz]qoz</b>quz<p>extra', 2963 '<p>foo[]bar<p>extra', 2964 '<p>foo[bar]baz<p>extra', 2965 '<h1>foo[bar]baz</h1><p>extra', 2966 '<pre>foo[bar]baz</pre><p>extra', 2967 '<xmp>foo[bar]baz</xmp><p>extra', 2968 '<center><p>[foo]<p>bar</center><p>extra', 2969 '<center><p>[foo<p>bar]</center><p>extra', 2970 2971 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra', 2972 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 2973 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 2974 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra', 2975 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra', 2976 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra', 2977 2978 '<table align=center><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra', 2979 '<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 2980 '<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 2981 '<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra', 2982 '<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra', 2983 '{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra', 2984 2985 '<table><tbody align=center><tr><td>foo<td>b[a]r<td>baz</table><p>extra', 2986 '<table><tbody align=center><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 2987 '<table><tbody align=center><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 2988 '<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra', 2989 '<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra', 2990 '{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra', 2991 2992 '<table><tbody><tr align=center><td>foo<td>b[a]r<td>baz</table><p>extra', 2993 '<table><tbody><tr align=center data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 2994 '<table><tbody><tr align=center data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 2995 '<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra', 2996 '<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra', 2997 '{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra', 2998 2999 '<div align=center><p>[foo]<p>bar</div><p>extra', 3000 '<div align=center><p>[foo<p>bar}</div><p>extra', 3001 '<div style=text-align:center><p>[foo]<p>bar</div><p>extra', 3002 '<div style=text-align:center><p>[foo<p>bar]</div><p>extra', 3003 3004 '<div align=justify><p>[foo]<p>bar</div><p>extra', 3005 '<div align=justify><p>[foo<p>bar}</div><p>extra', 3006 '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra', 3007 '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra', 3008 3009 '<div align=left><p>[foo]<p>bar</div><p>extra', 3010 '<div align=left><p>[foo<p>bar}</div><p>extra', 3011 '<div style=text-align:left><p>[foo]<p>bar</div><p>extra', 3012 '<div style=text-align:left><p>[foo<p>bar]</div><p>extra', 3013 3014 '<div align=right><p>[foo]<p>bar</div><p>extra', 3015 '<div align=right><p>[foo<p>bar}</div><p>extra', 3016 '<div style=text-align:right><p>[foo]<p>bar</div><p>extra', 3017 '<div style=text-align:right><p>[foo<p>bar]</div><p>extra', 3018 3019 '<center>foo</center>[bar]<p>extra', 3020 '[foo]<center>bar</center><p>extra', 3021 '<center>foo</center>[bar]<center>baz</center><p>extra', 3022 '<div align=center>foo</div>[bar]<p>extra', 3023 '[foo]<div align=center>bar</div><p>extra', 3024 '<div align=center>foo</div>[bar]<div align=center>baz</div><p>extra', 3025 '<div align=center><p>foo</div><p>[bar]<p>extra', 3026 '<p>[foo]<div align=center><p>bar</div><p>extra', 3027 '<div align=center><p>foo</div><p>[bar]<div align=center><p>baz</div><p>extra', 3028 '<div style=text-align:center>foo</div>[bar]<p>extra', 3029 '[foo]<div style=text-align:center>bar</div><p>extra', 3030 '<div style=text-align:center>foo</div>[bar]<div style=text-align:center>baz</div><p>extra', 3031 '<div style=text-align:center><p>foo</div><p>[bar]<p>extra', 3032 '<p>[foo]<div style=text-align:center><p>bar</div><p>extra', 3033 '<div style=text-align:center><p>foo</div><p>[bar]<div style=text-align:center><p>baz</div><p>extra', 3034 '<p align=center>foo<p>[bar]<p>extra', 3035 '<p>[foo]<p align=center>bar<p>extra', 3036 '<p align=center>foo<p>[bar]<p align=center>baz<p>extra', 3037 3038 '<center>[foo</center>bar]<p>extra', 3039 '<center>fo[o</center>b]ar<p>extra', 3040 '<div align=center>[foo</div>bar]<p>extra', 3041 '<div align=center>fo[o</div>b]ar<p>extra', 3042 '<div style=text-align:center>[foo</div>bar]<p>extra', 3043 '<div style=text-align:center>fo[o</div>b]ar<p>extra', 3044 '<span style=text-align:center>[foo]</span><p>extra', 3045 '<span style=text-align:center>f[o]o</span><p>extra', 3046 3047 '<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra', 3048 3049 '<div align=nonsense><p>[foo]</div><p>extra', 3050 '<div style=text-align:inherit><p>[foo]</div><p>extra', 3051 '<quasit align=right><p>[foo]</p></quasit><p>extra', 3052 3053 '<div align=center>{<div align=left>foo</div>}</div>', 3054 '<div align=left>{<div align=center>foo</div>}</div>', 3055 '<div align=center>{<div align=left>foo</div>bar}</div>', 3056 '<div align=left>{<div align=center>foo</div>bar}</div>', 3057 '<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>', 3058 '<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>', 3059 '<div align=center>{<div align=left>foo</div><!-- bar -->}</div>', 3060 '<div align=left>{<div align=center>foo</div><!-- bar -->}</div>', 3061 3062 '<div style=text-align:start>[foo]</div><p>extra', 3063 '<div style=text-align:end>[foo]</div><p>extra', 3064 '<div dir=rtl style=text-align:start>[foo]</div><p>extra', 3065 '<div dir=rtl style=text-align:end>[foo]</div><p>extra', 3066 3067 // Whitespace nodes 3068 '<div style=text-align:center><p>foo</div> <p>[bar]', 3069 '<div align=center><p>foo</div> <p>[bar]', 3070 '<center><p>foo</center> <p>[bar]', 3071 '<p>[foo]</p> <div style=text-align:center><p>bar</div>', 3072 '<p>[foo]</p> <div align=center><p>bar</div>', 3073 '<p>[foo]</p> <center><p>bar</center>', 3074 '<div style=text-align:center><p>foo</div> <p>[bar]</p> <div style=text-align:center><p>baz</div>', 3075 '<div align=center><p>foo</div> <p>[bar]</p> <div align=center><p>baz</div>', 3076 '<center><p>foo</center> <p>[bar]</p> <center><p>baz</center>', 3077 ], 3078 //@} 3079 justifyfull: [ 3080 //@{ 3081 'foo[]bar<p>extra', 3082 '<span>foo</span>{}<span>bar</span><p>extra', 3083 '<span>foo[</span><span>]bar</span><p>extra', 3084 'foo[bar]baz<p>extra', 3085 'foo[bar<b>baz]qoz</b>quz<p>extra', 3086 '<p>foo[]bar<p>extra', 3087 '<p>foo[bar]baz<p>extra', 3088 '<h1>foo[bar]baz</h1><p>extra', 3089 '<pre>foo[bar]baz</pre><p>extra', 3090 '<xmp>foo[bar]baz</xmp><p>extra', 3091 '<center><p>[foo]<p>bar</center><p>extra', 3092 '<center><p>[foo<p>bar]</center><p>extra', 3093 3094 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra', 3095 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3096 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3097 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra', 3098 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra', 3099 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra', 3100 3101 '<table align=justify><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra', 3102 '<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3103 '<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3104 '<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra', 3105 '<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra', 3106 '{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra', 3107 3108 '<table><tbody align=justify><tr><td>foo<td>b[a]r<td>baz</table><p>extra', 3109 '<table><tbody align=justify><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3110 '<table><tbody align=justify><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3111 '<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra', 3112 '<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra', 3113 '{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra', 3114 3115 '<table><tbody><tr align=justify><td>foo<td>b[a]r<td>baz</table><p>extra', 3116 '<table><tbody><tr align=justify data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3117 '<table><tbody><tr align=justify data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3118 '<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra', 3119 '<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra', 3120 '{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra', 3121 3122 '<div align=center><p>[foo]<p>bar</div><p>extra', 3123 '<div align=center><p>[foo<p>bar}</div><p>extra', 3124 '<div style=text-align:center><p>[foo]<p>bar</div><p>extra', 3125 '<div style=text-align:center><p>[foo<p>bar]</div><p>extra', 3126 3127 '<div align=justify><p>[foo]<p>bar</div><p>extra', 3128 '<div align=justify><p>[foo<p>bar}</div><p>extra', 3129 '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra', 3130 '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra', 3131 3132 '<div align=left><p>[foo]<p>bar</div><p>extra', 3133 '<div align=left><p>[foo<p>bar}</div><p>extra', 3134 '<div style=text-align:left><p>[foo]<p>bar</div><p>extra', 3135 '<div style=text-align:left><p>[foo<p>bar]</div><p>extra', 3136 3137 '<div align=right><p>[foo]<p>bar</div><p>extra', 3138 '<div align=right><p>[foo<p>bar}</div><p>extra', 3139 '<div style=text-align:right><p>[foo]<p>bar</div><p>extra', 3140 '<div style=text-align:right><p>[foo<p>bar]</div><p>extra', 3141 3142 '<div align=justify>foo</div>[bar]<p>extra', 3143 '[foo]<div align=justify>bar</div><p>extra', 3144 '<div align=justify>foo</div>[bar]<div align=justify>baz</div><p>extra', 3145 '<div align=justify><p>foo</div><p>[bar]<p>extra', 3146 '<p>[foo]<div align=justify><p>bar</div><p>extra', 3147 '<div align=justify><p>foo</div><p>[bar]<div align=justify><p>baz</div><p>extra', 3148 '<div style=text-align:justify>foo</div>[bar]<p>extra', 3149 '[foo]<div style=text-align:justify>bar</div><p>extra', 3150 '<div style=text-align:justify>foo</div>[bar]<div style=text-align:justify>baz</div><p>extra', 3151 '<div style=text-align:justify><p>foo</div><p>[bar]<p>extra', 3152 '<p>[foo]<div style=text-align:justify><p>bar</div><p>extra', 3153 '<div style=text-align:justify><p>foo</div><p>[bar]<div style=text-align:justify><p>baz</div><p>extra', 3154 '<p align=justify>foo<p>[bar]<p>extra', 3155 '<p>[foo]<p align=justify>bar<p>extra', 3156 '<p align=justify>foo<p>[bar]<p align=justify>baz<p>extra', 3157 3158 '<div align=justify>[foo</div>bar]<p>extra', 3159 '<div align=justify>fo[o</div>b]ar<p>extra', 3160 '<div style=text-align:justify>[foo</div>bar]<p>extra', 3161 '<div style=text-align:justify>fo[o</div>b]ar<p>extra', 3162 '<span style=text-align:justify>[foo]</span><p>extra', 3163 '<span style=text-align:justify>f[o]o</span><p>extra', 3164 3165 '<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra', 3166 3167 '<div align=nonsense><p>[foo]</div><p>extra', 3168 '<div style=text-align:inherit><p>[foo]</div><p>extra', 3169 '<quasit align=center><p>[foo]</p></quasit><p>extra', 3170 3171 '<div style=text-align:start>[foo]</div><p>extra', 3172 '<div style=text-align:end>[foo]</div><p>extra', 3173 '<div dir=rtl style=text-align:start>[foo]</div><p>extra', 3174 '<div dir=rtl style=text-align:end>[foo]</div><p>extra', 3175 3176 // Whitespace nodes 3177 '<div style=text-align:justify><p>foo</div> <p>[bar]', 3178 '<div align=justify><p>foo</div> <p>[bar]', 3179 '<p>[foo]</p> <div style=text-align:justify><p>bar</div>', 3180 '<p>[foo]</p> <div align=justify><p>bar</div>', 3181 '<div style=text-align:justify><p>foo</div> <p>[bar]</p> <div style=text-align:justify><p>baz</div>', 3182 '<div align=justify><p>foo</div> <p>[bar]</p> <div align=justify><p>baz</div>', 3183 ], 3184 //@} 3185 justifyleft: [ 3186 //@{ 3187 'foo[]bar<p>extra', 3188 '<span>foo</span>{}<span>bar</span><p>extra', 3189 '<span>foo[</span><span>]bar</span><p>extra', 3190 'foo[bar]baz<p>extra', 3191 'foo[bar<b>baz]qoz</b>quz<p>extra', 3192 '<p>foo[]bar<p>extra', 3193 '<p>foo[bar]baz<p>extra', 3194 '<h1>foo[bar]baz</h1><p>extra', 3195 '<pre>foo[bar]baz</pre><p>extra', 3196 '<xmp>foo[bar]baz</xmp><p>extra', 3197 '<center><p>[foo]<p>bar</center><p>extra', 3198 '<center><p>[foo<p>bar]</center><p>extra', 3199 3200 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra', 3201 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3202 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3203 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra', 3204 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra', 3205 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra', 3206 3207 '<table align=left><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra', 3208 '<table align=left><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3209 '<table align=left><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3210 '<table align=left><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra', 3211 '<table align=left data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra', 3212 '{<table align=left><tr><td>foo<td>bar<td>baz</table>}<p>extra', 3213 3214 '<table><tbody align=left><tr><td>foo<td>b[a]r<td>baz</table><p>extra', 3215 '<table><tbody align=left><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3216 '<table><tbody align=left><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3217 '<table><tbody align=left data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra', 3218 '<table data-start=0 data-end=1><tbody align=left><tr><td>foo<td>bar<td>baz</table><p>extra', 3219 '{<table><tbody align=left><tr><td>foo<td>bar<td>baz</table>}<p>extra', 3220 3221 '<table><tbody><tr align=left><td>foo<td>b[a]r<td>baz</table><p>extra', 3222 '<table><tbody><tr align=left data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3223 '<table><tbody><tr align=left data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3224 '<table><tbody data-start=0 data-end=1><tr align=left><td>foo<td>bar<td>baz</table><p>extra', 3225 '<table data-start=0 data-end=1><tbody><tr align=left><td>foo<td>bar<td>baz</table><p>extra', 3226 '{<table><tr align=left><td>foo<td>bar<td>baz</table>}<p>extra', 3227 3228 '<div align=center><p>[foo]<p>bar</div><p>extra', 3229 '<div align=center><p>[foo<p>bar}</div><p>extra', 3230 '<div style=text-align:center><p>[foo]<p>bar</div><p>extra', 3231 '<div style=text-align:center><p>[foo<p>bar]</div><p>extra', 3232 3233 '<div align=justify><p>[foo]<p>bar</div><p>extra', 3234 '<div align=justify><p>[foo<p>bar}</div><p>extra', 3235 '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra', 3236 '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra', 3237 3238 '<div align=left><p>[foo]<p>bar</div><p>extra', 3239 '<div align=left><p>[foo<p>bar}</div><p>extra', 3240 '<div style=text-align:left><p>[foo]<p>bar</div><p>extra', 3241 '<div style=text-align:left><p>[foo<p>bar]</div><p>extra', 3242 3243 '<div align=right><p>[foo]<p>bar</div><p>extra', 3244 '<div align=right><p>[foo<p>bar}</div><p>extra', 3245 '<div style=text-align:right><p>[foo]<p>bar</div><p>extra', 3246 '<div style=text-align:right><p>[foo<p>bar]</div><p>extra', 3247 3248 '<div align=left>foo</div>[bar]<p>extra', 3249 '[foo]<div align=left>bar</div><p>extra', 3250 '<div align=left>foo</div>[bar]<div align=left>baz</div><p>extra', 3251 '<div align=left><p>foo</div><p>[bar]<p>extra', 3252 '<p>[foo]<div align=left><p>bar</div><p>extra', 3253 '<div align=left><p>foo</div><p>[bar]<div align=left><p>baz</div><p>extra', 3254 '<div style=text-align:left>foo</div>[bar]<p>extra', 3255 '[foo]<div style=text-align:left>bar</div><p>extra', 3256 '<div style=text-align:left>foo</div>[bar]<div style=text-align:left>baz</div><p>extra', 3257 '<div style=text-align:left><p>foo</div><p>[bar]<p>extra', 3258 '<p>[foo]<div style=text-align:left><p>bar</div><p>extra', 3259 '<div style=text-align:left><p>foo</div><p>[bar]<div style=text-align:left><p>baz</div><p>extra', 3260 '<p align=left>foo<p>[bar]<p>extra', 3261 '<p>[foo]<p align=left>bar<p>extra', 3262 '<p align=left>foo<p>[bar]<p align=left>baz<p>extra', 3263 3264 '<div align=left>[foo</div>bar]<p>extra', 3265 '<div align=left>fo[o</div>b]ar<p>extra', 3266 '<div style=text-align:left>[foo</div>bar]<p>extra', 3267 '<div style=text-align:left>fo[o</div>b]ar<p>extra', 3268 '<span style=text-align:left>[foo]</span><p>extra', 3269 '<span style=text-align:left>f[o]o</span><p>extra', 3270 3271 '<div style=text-align:left>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra', 3272 3273 '<div align=nonsense><p>[foo]</div><p>extra', 3274 '<div style=text-align:inherit><p>[foo]</div><p>extra', 3275 '<quasit align=center><p>[foo]</p></quasit><p>extra', 3276 3277 '<div style=text-align:start>[foo]</div><p>extra', 3278 '<div style=text-align:end>[foo]</div><p>extra', 3279 '<div dir=rtl style=text-align:start>[foo]</div><p>extra', 3280 '<div dir=rtl style=text-align:end>[foo]</div><p>extra', 3281 3282 // Whitespace nodes 3283 '<div style=text-align:left><p>foo</div> <p>[bar]', 3284 '<div align=left><p>foo</div> <p>[bar]', 3285 '<p>[foo]</p> <div style=text-align:left><p>bar</div>', 3286 '<p>[foo]</p> <div align=left><p>bar</div>', 3287 '<div style=text-align:left><p>foo</div> <p>[bar]</p> <div style=text-align:left><p>baz</div>', 3288 '<div align=left><p>foo</div> <p>[bar]</p> <div align=left><p>baz</div>', 3289 ], 3290 //@} 3291 justifyright: [ 3292 //@{ 3293 'foo[]bar<p>extra', 3294 '<span>foo</span>{}<span>bar</span><p>extra', 3295 '<span>foo[</span><span>]bar</span><p>extra', 3296 'foo[bar]baz<p>extra', 3297 'foo[bar<b>baz]qoz</b>quz<p>extra', 3298 '<p>foo[]bar<p>extra', 3299 '<p>foo[bar]baz<p>extra', 3300 '<h1>foo[bar]baz</h1><p>extra', 3301 '<pre>foo[bar]baz</pre><p>extra', 3302 '<xmp>foo[bar]baz</xmp><p>extra', 3303 '<center><p>[foo]<p>bar</center><p>extra', 3304 '<center><p>[foo<p>bar]</center><p>extra', 3305 3306 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra', 3307 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3308 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3309 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra', 3310 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra', 3311 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra', 3312 3313 '<table align=right><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra', 3314 '<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3315 '<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3316 '<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra', 3317 '<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra', 3318 '{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra', 3319 3320 '<table><tbody align=right><tr><td>foo<td>b[a]r<td>baz</table><p>extra', 3321 '<table><tbody align=right><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3322 '<table><tbody align=right><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3323 '<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra', 3324 '<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra', 3325 '{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra', 3326 3327 '<table><tbody><tr align=right><td>foo<td>b[a]r<td>baz</table><p>extra', 3328 '<table><tbody><tr align=right data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3329 '<table><tbody><tr align=right data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra', 3330 '<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra', 3331 '<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra', 3332 '{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra', 3333 3334 '<div align=center><p>[foo]<p>bar</div><p>extra', 3335 '<div align=center><p>[foo<p>bar}</div><p>extra', 3336 '<div style=text-align:center><p>[foo]<p>bar</div><p>extra', 3337 '<div style=text-align:center><p>[foo<p>bar]</div><p>extra', 3338 3339 '<div align=justify><p>[foo]<p>bar</div><p>extra', 3340 '<div align=justify><p>[foo<p>bar}</div><p>extra', 3341 '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra', 3342 '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra', 3343 3344 '<div align=left><p>[foo]<p>bar</div><p>extra', 3345 '<div align=left><p>[foo<p>bar}</div><p>extra', 3346 '<div style=text-align:left><p>[foo]<p>bar</div><p>extra', 3347 '<div style=text-align:left><p>[foo<p>bar]</div><p>extra', 3348 3349 '<div align=right><p>[foo]<p>bar</div><p>extra', 3350 '<div align=right><p>[foo<p>bar}</div><p>extra', 3351 '<div style=text-align:right><p>[foo]<p>bar</div><p>extra', 3352 '<div style=text-align:right><p>[foo<p>bar]</div><p>extra', 3353 3354 '<div align=right>foo</div>[bar]<p>extra', 3355 '[foo]<div align=right>bar</div><p>extra', 3356 '<div align=right>foo</div>[bar]<div align=right>baz</div><p>extra', 3357 '<div align=right><p>foo</div><p>[bar]<p>extra', 3358 '<p>[foo]<div align=right><p>bar</div><p>extra', 3359 '<div align=right><p>foo</div><p>[bar]<div align=right><p>baz</div><p>extra', 3360 '<div style=text-align:right>foo</div>[bar]<p>extra', 3361 '[foo]<div style=text-align:right>bar</div><p>extra', 3362 '<div style=text-align:right>foo</div>[bar]<div style=text-align:right>baz</div><p>extra', 3363 '<div style=text-align:right><p>foo</div><p>[bar]<p>extra', 3364 '<p>[foo]<div style=text-align:right><p>bar</div><p>extra', 3365 '<div style=text-align:right><p>foo</div><p>[bar]<div style=text-align:right><p>baz</div><p>extra', 3366 '<p align=right>foo<p>[bar]<p>extra', 3367 '<p>[foo]<p align=right>bar<p>extra', 3368 '<p align=right>foo<p>[bar]<p align=right>baz<p>extra', 3369 3370 '<div align=right>[foo</div>bar]<p>extra', 3371 '<div align=right>fo[o</div>b]ar<p>extra', 3372 '<div style=text-align:right>[foo</div>bar]<p>extra', 3373 '<div style=text-align:right>fo[o</div>b]ar<p>extra', 3374 '<span style=text-align:right>[foo]</span><p>extra', 3375 '<span style=text-align:right>f[o]o</span><p>extra', 3376 3377 '<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra', 3378 3379 '<div align=nonsense><p>[foo]</div><p>extra', 3380 '<div style=text-align:inherit><p>[foo]</div><p>extra', 3381 '<quasit align=center><p>[foo]</p></quasit><p>extra', 3382 3383 '<div style=text-align:start>[foo]</div><p>extra', 3384 '<div style=text-align:end>[foo]</div><p>extra', 3385 '<div dir=rtl style=text-align:start>[foo]</div><p>extra', 3386 '<div dir=rtl style=text-align:end>[foo]</div><p>extra', 3387 3388 // Whitespace nodes 3389 '<div style=text-align:right><p>foo</div> <p>[bar]', 3390 '<div align=right><p>foo</div> <p>[bar]', 3391 '<p>[foo]</p> <div style=text-align:right><p>bar</div>', 3392 '<p>[foo]</p> <div align=right><p>bar</div>', 3393 '<div style=text-align:right><p>foo</div> <p>[bar]</p> <div style=text-align:right><p>baz</div>', 3394 '<div align=right><p>foo</div> <p>[bar]</p> <div align=right><p>baz</div>', 3395 ], 3396 //@} 3397 outdent: [ 3398 //@{ 3399 // These mimic existing indentation in various browsers, to see how 3400 // they cope with outdenting various things. This is spec, Gecko 3401 // non-CSS, and Opera: 3402 '<blockquote><p>foo[bar]</p><p>baz</p></blockquote><p>extra', 3403 '<blockquote><p>foo[bar</p><p>b]az</p></blockquote><p>extra', 3404 '<blockquote><p>foo[bar]</p></blockquote><p>baz</p><p>extra', 3405 '<blockquote><p>foo[bar</p></blockquote><p>b]az</p><p>extra', 3406 3407 // IE: 3408 '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar]</p><p>baz</p></blockquote><p>extra', 3409 '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar</p><p>b]az</p></blockquote><p>extra', 3410 '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar]</p></blockquote><p>baz</p><p>extra', 3411 '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar</p></blockquote><p>b]az</p><p>extra', 3412 3413 // Firefox CSS mode: 3414 '<p style="margin-left: 40px">foo[bar]</p><p style="margin-left: 40px">baz</p><p>extra', 3415 '<p style="margin-left: 40px">foo[bar</p><p style="margin-left: 40px">b]az</p><p>extra', 3416 '<p style="margin-left: 40px">foo[bar]</p><p>baz</p><p>extra', 3417 '<p style="margin-left: 40px">foo[bar</p><p>b]az</p><p>extra', 3418 3419 // WebKit: 3420 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar]</p><p>baz</p></blockquote><p>extra', 3421 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar</p><p>b]az</p></blockquote><p>extra', 3422 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar]</p></blockquote><p>baz</p><p>extra', 3423 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar</p></blockquote><p>b]az</p><p>extra', 3424 3425 // Now let's try nesting lots of stuff and see what happens. 3426 '<blockquote><blockquote>foo[bar]baz</blockquote></blockquote>', 3427 '<blockquote><blockquote data-abc=def>foo[bar]baz</blockquote></blockquote>', 3428 '<blockquote data-abc=def><blockquote>foo[bar]baz</blockquote></blockquote>', 3429 '<blockquote><div>foo[bar]baz</div></blockquote>', 3430 '<blockquote><div id=abc>foo[bar]baz</div></blockquote>', 3431 '<blockquote id=abc>foo[bar]baz</blockquote>', 3432 '<blockquote style="color: blue">foo[bar]baz</blockquote>', 3433 3434 '<blockquote><blockquote><p>foo[bar]<p>baz</blockquote></blockquote>', 3435 '<blockquote><blockquote data-abc=def><p>foo[bar]<p>baz</blockquote></blockquote>', 3436 '<blockquote data-abc=def><blockquote><p>foo[bar]<p>baz</blockquote></blockquote>', 3437 '<blockquote><div><p>foo[bar]<p>baz</div></blockquote>', 3438 '<blockquote><div id=abc><p>foo[bar]<p>baz</div></blockquote>', 3439 '<blockquote id=abc><p>foo[bar]<p>baz</blockquote>', 3440 '<blockquote style="color: blue"><p>foo[bar]<p>baz</blockquote>', 3441 3442 '<blockquote><p><b>foo[bar]</b><p>baz</blockquote>', 3443 '<blockquote><p><strong>foo[bar]</strong><p>baz</blockquote>', 3444 '<blockquote><p><span>foo[bar]</span><p>baz</blockquote>', 3445 '<blockquote><blockquote style="color: blue"><p>foo[bar]</blockquote><p>baz</blockquote>', 3446 '<blockquote style="color: blue"><blockquote><p>foo[bar]</blockquote><p>baz</blockquote>', 3447 3448 // Lists! 3449 '<ol><li>foo<li>[bar]<li>baz</ol>', 3450 '<ol data-start=1 data-end=2><li>foo<li>bar<li>baz</ol>', 3451 '<ol><li>foo</ol>[bar]', 3452 '<ol><li>[foo]<br>bar<li>baz</ol>', 3453 '<ol><li>foo<br>[bar]<li>baz</ol>', 3454 '<ol><li><div>[foo]</div>bar<li>baz</ol>', 3455 '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>', 3456 '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>', 3457 '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>', 3458 '<ol><li>foo</li><ol data-start=0 data-end=1><li>bar<li>baz</ol><li>quz</ol>', 3459 '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>', 3460 '<ol><li>foo</li><ol data-start=1 data-end=2><li>bar<li>baz</ol><li>quz</ol>', 3461 '<ol><li>foo<ol><li>b[a]r</ol><li>baz</ol>', 3462 '<ol><li>foo</li><ol><li>b[a]r</ol><li>baz</ol>', 3463 '<ol><li>foo{<ol><li>bar</ol>}<li>baz</ol>', 3464 '<ol><li>foo</li>{<ol><li>bar</ol>}<li>baz</ol>', 3465 '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>', 3466 '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>', 3467 '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>', 3468 '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>', 3469 '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>', 3470 '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>', 3471 3472 // Try outdenting multiple items at once. 3473 '<ol><li>foo<li>b[ar<li>baz]</ol>', 3474 '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>', 3475 '<ol><li>[foo</li><ol><li>bar]</ol><li>baz</ol>', 3476 '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>', 3477 '<ol><li>foo</li><ol><li>b[ar</ol><li>b]az</ol>', 3478 '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra', 3479 '<ol><li>[foo</li><ol><li>bar</ol><li>baz]</ol><p>extra', 3480 3481 // We probably can't actually get this DOM . . . 3482 '<ol><li>[foo]<ol><li>bar</ol>baz</ol>', 3483 '<ol><li>foo<ol><li>[bar]</ol>baz</ol>', 3484 '<ol><li>foo<ol><li>bar</ol>[baz]</ol>', 3485 '<ol><li>[foo<ol><li>bar]</ol>baz</ol>', 3486 3487 // Attribute handling on lists 3488 'foo<ol start=5><li>[bar]</ol>baz', 3489 'foo<ol id=abc><li>[bar]</ol>baz', 3490 'foo<ol style=color:blue><li>[bar]</ol>baz', 3491 'foo<ol><li value=5>[bar]</ol>baz', 3492 'foo<ol><li id=abc>[bar]</ol>baz', 3493 'foo<ol><li style=color:blue>[bar]</ol>baz', 3494 '<ol><li>foo</li><ol><li value=5>[bar]</ol></ol>', 3495 '<ul><li>foo</li><ol><li value=5>[bar]</ol></ul>', 3496 '<ol><li>foo</li><ol start=5><li>[bar]</ol><li>baz</ol>', 3497 '<ol><li>foo</li><ol id=abc><li>[bar]</ol><li>baz</ol>', 3498 '<ol><li>foo</li><ol style=color:blue><li>[bar]</ol><li>baz</ol>', 3499 '<ol><li>foo</li><ol style=text-indent:1em><li>[bar]</ol><li>baz</ol>', 3500 '<ol><li>foo</li><ol start=5><li>[bar<li>baz]</ol><li>quz</ol>', 3501 '<ol><li>foo</li><ol id=abc><li>[bar<li>baz]</ol><li>quz</ol>', 3502 '<ol><li>foo</li><ol style=color:blue><li>[bar<li>baz]</ol><li>quz</ol>', 3503 '<ol><li>foo</li><ol style=text-indent:1em><li>[bar<li>baz]</ol><li>quz</ol>', 3504 3505 // List inside indentation element 3506 '<blockquote><ol><li>[foo]</ol></blockquote><p>extra', 3507 '<blockquote>foo<ol><li>[bar]</ol>baz</blockquote><p>extra', 3508 '<blockquote><ol><li>foo</li><ol><li>[bar]</ol><li>baz</ol></blockquote><p>extra', 3509 3510 '<ol><li><h1>[foo]</h1></ol>', 3511 '<ol><li><xmp>[foo]</xmp></li></ol>', 3512 '<blockquote><ol><li>foo<div><ol><li>[bar]</ol></div><li>baz</ol></blockquote>', 3513 3514 // Whitespace nodes 3515 '<blockquote> <p>[foo]</p></blockquote>', 3516 '<blockquote><p>[foo]</p> </blockquote>', 3517 '<blockquote> <p>[foo]</p> </blockquote>', 3518 '<ol> <li>[foo]</li></ol>', 3519 '<ol><li>[foo]</li> </ol>', 3520 '<ol> <li>[foo]</li> </ol>', 3521 '<ul> <li>[foo]</li></ul>', 3522 '<ul><li>[foo]</li> </ul>', 3523 '<ul> <li>[foo]</li> </ul>', 3524 '<blockquote> <p>[foo]</p> <p>bar</p> <p>baz</p></blockquote>', 3525 '<blockquote> <p>foo</p> <p>[bar]</p> <p>baz</p></blockquote>', 3526 '<blockquote> <p>foo</p> <p>bar</p> <p>[baz]</p></blockquote>', 3527 '<ol> <li>[foo]</li> <li>bar</li> <li>baz</li></ol>', 3528 '<ol> <li>foo</li> <li>[bar]</li> <li>baz</li></ol>', 3529 '<ol> <li>foo</li> <li>bar</li> <li>[baz]</li></ol>', 3530 '<ul> <li>[foo]</li> <li>bar</li> <li>baz</li></ul>', 3531 '<ul> <li>foo</li> <li>[bar]</li> <li>baz</li></ul>', 3532 '<ul> <li>foo</li> <li>bar</li> <li>[baz]</li></ul>', 3533 3534 // https://bugs.webkit.org/show_bug.cgi?id=24249 3535 '<ol><li>[]a<table><tr><td><br></table></ol>', 3536 // https://bugs.webkit.org/show_bug.cgi?id=43447 3537 '<blockquote><span>foo<br>[bar]</span></blockquote>', 3538 ], 3539 //@} 3540 removeformat: [ 3541 //@{ 3542 'foo[]bar', 3543 '<span>foo</span>{}<span>bar</span>', 3544 '<span>foo[</span><span>]bar</span>', 3545 '[foo<b>bar</b>baz]', 3546 'foo[<b>bar</b>baz]', 3547 'foo[<b>bar</b>]baz', 3548 'foo<b>[bar]</b>baz', 3549 'foo<b>b[a]r</b>baz', 3550 '[foo<strong>bar</strong>baz]', 3551 '[foo<span style="font-weight: bold">bar</span>baz]', 3552 'foo<span style="font-weight: bold">b[a]r</span>baz', 3553 '[foo<span style="font-variant: small-caps">bar</span>baz]', 3554 'foo<span style="font-variant: small-caps">b[a]r</span>baz', 3555 '[foo<b id=foo>bar</b>baz]', 3556 'foo<b id=foo>b[a]r</b>baz', 3557 3558 // HTML has lots of inline elements, doesn't it? 3559 '[foo<a>bar</a>baz]', 3560 'foo<a>b[a]r</a>baz', 3561 '[foo<a href=foo>bar</a>baz]', 3562 'foo<a href=foo>b[a]r</a>baz', 3563 '[foo<abbr>bar</abbr>baz]', 3564 'foo<abbr>b[a]r</abbr>baz', 3565 '[foo<acronym>bar</acronym>baz]', 3566 'foo<acronym>b[a]r</acronym>baz', 3567 '[foo<b>bar</b>baz]', 3568 'foo<b>b[a]r</b>baz', 3569 '[foo<bdi dir=rtl>bar</bdi>baz]', 3570 'foo<bdi dir=rtl>b[a]r</bdi>baz', 3571 '[foo<bdo dir=rtl>bar</bdo>baz]', 3572 'foo<bdo dir=rtl>b[a]r</bdo>baz', 3573 '[foo<big>bar</big>baz]', 3574 'foo<big>b[a]r</big>baz', 3575 '[foo<blink>bar</blink>baz]', 3576 'foo<blink>b[a]r</blink>baz', 3577 '[foo<cite>bar</cite>baz]', 3578 'foo<cite>b[a]r</cite>baz', 3579 '[foo<code>bar</code>baz]', 3580 'foo<code>b[a]r</code>baz', 3581 '[foo<del>bar</del>baz]', 3582 'foo<del>b[a]r</del>baz', 3583 '[foo<dfn>bar</dfn>baz]', 3584 'foo<dfn>b[a]r</dfn>baz', 3585 '[foo<em>bar</em>baz]', 3586 'foo<em>b[a]r</em>baz', 3587 '[foo<font>bar</font>baz]', 3588 'foo<font>b[a]r</font>baz', 3589 '[foo<font color=blue>bar</font>baz]', 3590 'foo<font color=blue>b[a]r</font>baz', 3591 '[foo<i>bar</i>baz]', 3592 'foo<i>b[a]r</i>baz', 3593 '[foo<ins>bar</ins>baz]', 3594 'foo<ins>b[a]r</ins>baz', 3595 '[foo<kbd>bar</kbd>baz]', 3596 'foo<kbd>b[a]r</kbd>baz', 3597 '[foo<mark>bar</mark>baz]', 3598 'foo<mark>b[a]r</mark>baz', 3599 '[foo<nobr>bar</nobr>baz]', 3600 'foo<nobr>b[a]r</nobr>baz', 3601 '[foo<q>bar</q>baz]', 3602 'foo<q>b[a]r</q>baz', 3603 '[foo<samp>bar</samp>baz]', 3604 'foo<samp>b[a]r</samp>baz', 3605 '[foo<s>bar</s>baz]', 3606 'foo<s>b[a]r</s>baz', 3607 '[foo<small>bar</small>baz]', 3608 'foo<small>b[a]r</small>baz', 3609 '[foo<span>bar</span>baz]', 3610 'foo<span>b[a]r</span>baz', 3611 '[foo<strike>bar</strike>baz]', 3612 'foo<strike>b[a]r</strike>baz', 3613 '[foo<strong>bar</strong>baz]', 3614 'foo<strong>b[a]r</strong>baz', 3615 '[foo<sub>bar</sub>baz]', 3616 'foo<sub>b[a]r</sub>baz', 3617 '[foo<sup>bar</sup>baz]', 3618 'foo<sup>b[a]r</sup>baz', 3619 '[foo<tt>bar</tt>baz]', 3620 'foo<tt>b[a]r</tt>baz', 3621 '[foo<u>bar</u>baz]', 3622 'foo<u>b[a]r</u>baz', 3623 '[foo<var>bar</var>baz]', 3624 'foo<var>b[a]r</var>baz', 3625 3626 // Empty and replaced elements 3627 '[foo<br>bar]', 3628 '[foo<hr>bar]', 3629 '[foo<wbr>bar]', 3630 '[foo<img>bar]', 3631 '[foo<img src=abc>bar]', 3632 '[foo<video></video>bar]', 3633 '[foo<video src=abc></video>bar]', 3634 '[foo<svg><circle fill=blue r=20 cx=20 cy=20 /></svg>bar]', 3635 3636 // Unrecognized elements 3637 '[foo<nonexistentelement>bar</nonexistentelement>baz]', 3638 'foo<nonexistentelement>b[a]r</nonexistentelement>baz', 3639 '[foo<nonexistentelement style="display: block">bar</nonexistentelement>baz]', 3640 'foo<nonexistentelement style="display: block">b[a]r</nonexistentelement>baz', 3641 3642 // Random stuff 3643 '[foo<span id=foo>bar</span>baz]', 3644 'foo<span id=foo>b[a]r</span>baz', 3645 '[foo<span class=foo>bar</span>baz]', 3646 'foo<span class=foo>b[a]r</span>baz', 3647 '[foo<b style="font-weight: normal">bar</b>baz]', 3648 'foo<b style="font-weight: normal">b[a]r</b>baz', 3649 '<p style="background-color: aqua">foo[bar]baz</p>', 3650 '<p><span style="background-color: aqua">foo[bar]baz</span></p>', 3651 '<p style="font-weight: bold">foo[bar]baz</p>', 3652 '<b><p style="font-weight: bold">foo[bar]baz</p></b>', 3653 '<p style="font-variant: small-caps">foo[bar]baz</p>', 3654 '{<p style="font-variant: small-caps">foobarbaz</p>}', 3655 '<p style="text-indent: 2em">foo[bar]baz</p>', 3656 '{<p style="text-indent: 2em">foobarbaz</p>}', 3657 3658 // https://bugzilla.mozilla.org/show_bug.cgi?id=649138 3659 // Chrome 15 dev fails this for some unclear reason. 3660 '<table data-start=0 data-end=1><tr><td><b>foo</b></table>', 3661 ], 3662 //@} 3663 strikethrough: [ 3664 //@{ 3665 'foo[]bar', 3666 '<p>[foo</p> <p>bar]</p>', 3667 '<span>[foo</span> <span>bar]</span>', 3668 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>', 3669 '<p>[foo<p><br><p>bar]', 3670 '<b>foo[]bar</b>', 3671 '<i>foo[]bar</i>', 3672 '<span>foo</span>{}<span>bar</span>', 3673 '<span>foo[</span><span>]bar</span>', 3674 'foo[bar]baz', 3675 'foo[bar<b>baz]qoz</b>quz', 3676 'foo[bar<i>baz]qoz</i>quz', 3677 '{<p><p> <p>foo</p>}', 3678 3679 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 3680 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>', 3681 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>', 3682 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>', 3683 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>', 3684 '{<table><tr><td>foo<td>bar<td>baz</table>}', 3685 3686 'foo<u>[bar]</u>baz', 3687 'foo<span style="text-decoration: underline">[bar]</span>baz', 3688 '<u>foo[bar]baz</u>', 3689 '<u>foo[b<span style="color:blue">ar]ba</span>z</u>', 3690 '<u>foo[b<span style="color:blue" id=foo>ar]ba</span>z</u>', 3691 '<u>foo[b<span style="font-size:3em">ar]ba</span>z</u>', 3692 '<u>foo[b<i>ar]ba</i>z</u>', 3693 '<p style="text-decoration: underline">foo[bar]baz</p>', 3694 3695 'foo<s>[bar]</s>baz', 3696 'foo<span style="text-decoration: line-through">[bar]</span>baz', 3697 '<s>foo[bar]baz</s>', 3698 '<s>foo[b<span style="color:blue">ar]ba</span>z</s>', 3699 '<s>foo[b<span style="color:blue" id=foo>ar]ba</span>z</s>', 3700 '<s>foo[b<span style="font-size:3em">ar]ba</span>z</s>', 3701 '<s>foo[b<i>ar]ba</i>z</s>', 3702 '<p style="text-decoration: line-through">foo[bar]baz</p>', 3703 3704 'foo<strike>[bar]</strike>baz', 3705 '<strike>foo[bar]baz</strike>', 3706 '<strike>foo[b<span style="color:blue">ar]ba</span>z</strike>', 3707 '<strike>foo[b<span style="color:blue" id=foo>ar]ba</span>z</strike>', 3708 '<strike>foo[b<span style="font-size:3em">ar]ba</span>z</strike>', 3709 '<strike>foo[b<i>ar]ba</i>z</strike>', 3710 3711 'foo<ins>[bar]</ins>baz', 3712 '<ins>foo[bar]baz</ins>', 3713 '<ins>foo[b<span style="color:blue">ar]ba</span>z</ins>', 3714 '<ins>foo[b<span style="color:blue" id=foo>ar]ba</span>z</ins>', 3715 '<ins>foo[b<span style="font-size:3em">ar]ba</span>z</ins>', 3716 '<ins>foo[b<i>ar]ba</i>z</ins>', 3717 3718 'foo<del>[bar]</del>baz', 3719 '<del>foo[bar]baz</del>', 3720 '<del>foo[b<span style="color:blue">ar]ba</span>z</del>', 3721 '<del>foo[b<span style="color:blue" id=foo>ar]ba</span>z</del>', 3722 '<del>foo[b<span style="font-size:3em">ar]ba</span>z</del>', 3723 '<del>foo[b<i>ar]ba</i>z</del>', 3724 3725 'foo<span style="text-decoration: underline line-through">[bar]</span>baz', 3726 'foo<span style="text-decoration: underline line-through">b[a]r</span>baz', 3727 'foo<s style="text-decoration: underline">[bar]</s>baz', 3728 'foo<s style="text-decoration: underline">b[a]r</s>baz', 3729 'foo<u style="text-decoration: line-through">[bar]</u>baz', 3730 'foo<u style="text-decoration: line-through">b[a]r</u>baz', 3731 'foo<s style="text-decoration: overline">[bar]</s>baz', 3732 'foo<s style="text-decoration: overline">b[a]r</s>baz', 3733 'foo<u style="text-decoration: overline">[bar]</u>baz', 3734 'foo<u style="text-decoration: overline">b[a]r</u>baz', 3735 3736 '<p style="text-decoration: line-through">foo[bar]baz</p>', 3737 '<p style="text-decoration: overline">foo[bar]baz</p>', 3738 3739 'foo<span class="underline">[bar]</span>baz', 3740 'foo<span class="underline">b[a]r</span>baz', 3741 'foo<span class="line-through">[bar]</span>baz', 3742 'foo<span class="line-through">b[a]r</span>baz', 3743 'foo<span class="underline-and-line-through">[bar]</span>baz', 3744 'foo<span class="underline-and-line-through">b[a]r</span>baz', 3745 3746 // Tests for queryCommandIndeterm() and queryCommandState() 3747 'fo[o<s>b]ar</s>baz', 3748 'foo<s>ba[r</s>b]az', 3749 'fo[o<s>bar</s>b]az', 3750 'foo[<s>b]ar</s>baz', 3751 'foo<s>ba[r</s>]baz', 3752 'foo[<s>bar</s>]baz', 3753 'foo<s>[bar]</s>baz', 3754 'foo{<s>bar</s>}baz', 3755 'fo[o<span style=text-decoration:line-through>b]ar</span>baz', 3756 '<strike>fo[o</strike><s>b]ar</s>', 3757 '<s>fo[o</s><del>b]ar</del>', 3758 ], 3759 //@} 3760 subscript: [ 3761 //@{ 3762 'foo[]bar', 3763 '<p>[foo</p> <p>bar]</p>', 3764 '<span>[foo</span> <span>bar]</span>', 3765 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>', 3766 '<p>[foo<p><br><p>bar]', 3767 '<b>foo[]bar</b>', 3768 '<i>foo[]bar</i>', 3769 '<span>foo</span>{}<span>bar</span>', 3770 '<span>foo[</span><span>]bar</span>', 3771 'foo[bar]baz', 3772 'foo[bar<b>baz]qoz</b>quz', 3773 'foo[bar<i>baz]qoz</i>quz', 3774 '{<p><p> <p>foo</p>}', 3775 3776 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 3777 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>', 3778 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>', 3779 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>', 3780 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>', 3781 '{<table><tr><td>foo<td>bar<td>baz</table>}', 3782 3783 'foo<sub>[bar]</sub>baz', 3784 'foo<sub>b[a]r</sub>baz', 3785 'foo<sup>[bar]</sup>baz', 3786 'foo<sup>b[a]r</sup>baz', 3787 3788 'foo<span style=vertical-align:sub>[bar]</span>baz', 3789 'foo<span style=vertical-align:super>[bar]</span>baz', 3790 3791 'foo<sub><sub>[bar]</sub></sub>baz', 3792 'foo<sub><sub>b[a]r</sub></sub>baz', 3793 'foo<sub>b<sub>[a]</sub>r</sub>baz', 3794 'foo<sup><sup>[bar]</sup></sup>baz', 3795 'foo<sup><sup>b[a]r</sup></sup>baz', 3796 'foo<sup>b<sup>[a]</sup>r</sup>baz', 3797 'foo<sub><sup>[bar]</sup></sub>baz', 3798 'foo<sub><sup>b[a]r</sup></sub>baz', 3799 'foo<sub>b<sup>[a]</sup>r</sub>baz', 3800 'foo<sup><sub>[bar]</sub></sup>baz', 3801 'foo<sup><sub>b[a]r</sub></sup>baz', 3802 'foo<sup>b<sub>[a]</sub>r</sup>baz', 3803 3804 // Tests for queryCommandIndeterm() and queryCommandState() 3805 'fo[o<sub>b]ar</sub>baz', 3806 'foo<sub>ba[r</sub>b]az', 3807 'fo[o<sub>bar</sub>b]az', 3808 'foo[<sub>b]ar</sub>baz', 3809 'foo<sub>ba[r</sub>]baz', 3810 'foo[<sub>bar</sub>]baz', 3811 'foo<sub>[bar]</sub>baz', 3812 'foo{<sub>bar</sub>}baz', 3813 '<sub>fo[o</sub><sup>b]ar</sup>', 3814 '<sub>fo[o</sub><span style=vertical-align:sub>b]ar</span>', 3815 'foo<span style=vertical-align:top>[bar]</span>baz', 3816 '<sub>fo[o</sub><span style=vertical-align:top>b]ar</span>', 3817 ], 3818 //@} 3819 superscript: [ 3820 //@{ 3821 'foo[]bar', 3822 '<p>[foo</p> <p>bar]</p>', 3823 '<span>[foo</span> <span>bar]</span>', 3824 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>', 3825 '<p>[foo<p><br><p>bar]', 3826 '<b>foo[]bar</b>', 3827 '<i>foo[]bar</i>', 3828 '<span>foo</span>{}<span>bar</span>', 3829 '<span>foo[</span><span>]bar</span>', 3830 'foo[bar]baz', 3831 'foo[bar<b>baz]qoz</b>quz', 3832 'foo[bar<i>baz]qoz</i>quz', 3833 '{<p><p> <p>foo</p>}', 3834 3835 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 3836 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>', 3837 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>', 3838 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>', 3839 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>', 3840 '{<table><tr><td>foo<td>bar<td>baz</table>}', 3841 3842 'foo<sub>[bar]</sub>baz', 3843 'foo<sub>b[a]r</sub>baz', 3844 'foo<sup>[bar]</sup>baz', 3845 'foo<sup>b[a]r</sup>baz', 3846 3847 'foo<span style=vertical-align:sub>[bar]</span>baz', 3848 'foo<span style=vertical-align:super>[bar]</span>baz', 3849 3850 'foo<sub><sub>[bar]</sub></sub>baz', 3851 'foo<sub><sub>b[a]r</sub></sub>baz', 3852 'foo<sub>b<sub>[a]</sub>r</sub>baz', 3853 'foo<sup><sup>[bar]</sup></sup>baz', 3854 'foo<sup><sup>b[a]r</sup></sup>baz', 3855 'foo<sup>b<sup>[a]</sup>r</sup>baz', 3856 'foo<sub><sup>[bar]</sup></sub>baz', 3857 'foo<sub><sup>b[a]r</sup></sub>baz', 3858 'foo<sub>b<sup>[a]</sup>r</sub>baz', 3859 'foo<sup><sub>[bar]</sub></sup>baz', 3860 'foo<sup><sub>b[a]r</sub></sup>baz', 3861 'foo<sup>b<sub>[a]</sub>r</sup>baz', 3862 3863 // Tests for queryCommandIndeterm() and queryCommandState() 3864 'fo[o<sup>b]ar</sup>baz', 3865 'foo<sup>ba[r</sup>b]az', 3866 'fo[o<sup>bar</sup>b]az', 3867 'foo[<sup>b]ar</sup>baz', 3868 'foo<sup>ba[r</sup>]baz', 3869 'foo[<sup>bar</sup>]baz', 3870 'foo<sup>[bar]</sup>baz', 3871 'foo{<sup>bar</sup>}baz', 3872 '<sup>fo[o</sup><sub>b]ar</sub>', 3873 '<sup>fo[o</sup><span style=vertical-align:super>b]ar</span>', 3874 'foo<span style=vertical-align:bottom>[bar]</span>baz', 3875 '<sup>fo[o</sup><span style=vertical-align:bottom>b]ar</span>', 3876 3877 // https://bugs.webkit.org/show_bug.cgi?id=28472 3878 'foo<sup>[bar]<br></sup>', 3879 ], 3880 //@} 3881 underline: [ 3882 //@{ 3883 'foo[]bar', 3884 '<p>[foo</p> <p>bar]</p>', 3885 '<span>[foo</span> <span>bar]</span>', 3886 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>', 3887 '<p>[foo<p><br><p>bar]', 3888 '<b>foo[]bar</b>', 3889 '<i>foo[]bar</i>', 3890 '<span>foo</span>{}<span>bar</span>', 3891 '<span>foo[</span><span>]bar</span>', 3892 'foo[bar]baz', 3893 'foo[bar<b>baz]qoz</b>quz', 3894 'foo[bar<i>baz]qoz</i>quz', 3895 '{<p><p> <p>foo</p>}', 3896 3897 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>', 3898 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>', 3899 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>', 3900 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>', 3901 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>', 3902 '{<table><tr><td>foo<td>bar<td>baz</table>}', 3903 3904 'foo<u>[bar]</u>baz', 3905 'foo<span style="text-decoration: underline">[bar]</span>baz', 3906 '<u>foo[bar]baz</u>', 3907 '<u>foo[b<span style="color:blue">ar]ba</span>z</u>', 3908 '<u>foo[b<span style="color:blue" id=foo>ar]ba</span>z</u>', 3909 '<u>foo[b<span style="font-size:3em">ar]ba</span>z</u>', 3910 '<u>foo[b<i>ar]ba</i>z</u>', 3911 '<p style="text-decoration: underline">foo[bar]baz</p>', 3912 3913 'foo<s>[bar]</s>baz', 3914 'foo<span style="text-decoration: line-through">[bar]</span>baz', 3915 '<s>foo[bar]baz</s>', 3916 '<s>foo[b<span style="color:blue">ar]ba</span>z</s>', 3917 '<s>foo[b<span style="color:blue" id=foo>ar]ba</span>z</s>', 3918 '<s>foo[b<span style="font-size:3em">ar]ba</span>z</s>', 3919 '<s>foo[b<i>ar]ba</i>z</s>', 3920 '<p style="text-decoration: line-through">foo[bar]baz</p>', 3921 3922 'foo<strike>[bar]</strike>baz', 3923 '<strike>foo[bar]baz</strike>', 3924 '<strike>foo[b<span style="color:blue">ar]ba</span>z</strike>', 3925 '<strike>foo[b<span style="color:blue" id=foo>ar]ba</span>z</strike>', 3926 '<strike>foo[b<span style="font-size:3em">ar]ba</span>z</strike>', 3927 '<strike>foo[b<i>ar]ba</i>z</strike>', 3928 3929 'foo<ins>[bar]</ins>baz', 3930 '<ins>foo[bar]baz</ins>', 3931 '<ins>foo[b<span style="color:blue">ar]ba</span>z</ins>', 3932 '<ins>foo[b<span style="color:blue" id=foo>ar]ba</span>z</ins>', 3933 '<ins>foo[b<span style="font-size:3em">ar]ba</span>z</ins>', 3934 '<ins>foo[b<i>ar]ba</i>z</ins>', 3935 3936 'foo<del>[bar]</del>baz', 3937 '<del>foo[bar]baz</del>', 3938 '<del>foo[b<span style="color:blue">ar]ba</span>z</del>', 3939 '<del>foo[b<span style="color:blue" id=foo>ar]ba</span>z</del>', 3940 '<del>foo[b<span style="font-size:3em">ar]ba</span>z</del>', 3941 '<del>foo[b<i>ar]ba</i>z</del>', 3942 3943 'foo<span style="text-decoration: underline line-through">[bar]</span>baz', 3944 'foo<span style="text-decoration: underline line-through">b[a]r</span>baz', 3945 'foo<s style="text-decoration: underline">[bar]</s>baz', 3946 'foo<s style="text-decoration: underline">b[a]r</s>baz', 3947 'foo<u style="text-decoration: line-through">[bar]</u>baz', 3948 'foo<u style="text-decoration: line-through">b[a]r</u>baz', 3949 'foo<s style="text-decoration: overline">[bar]</s>baz', 3950 'foo<s style="text-decoration: overline">b[a]r</s>baz', 3951 'foo<u style="text-decoration: overline">[bar]</u>baz', 3952 'foo<u style="text-decoration: overline">b[a]r</u>baz', 3953 3954 '<p style="text-decoration: line-through">foo[bar]baz</p>', 3955 '<p style="text-decoration: overline">foo[bar]baz</p>', 3956 3957 'foo<span class="underline">[bar]</span>baz', 3958 'foo<span class="underline">b[a]r</span>baz', 3959 'foo<span class="line-through">[bar]</span>baz', 3960 'foo<span class="line-through">b[a]r</span>baz', 3961 'foo<span class="underline-and-line-through">[bar]</span>baz', 3962 'foo<span class="underline-and-line-through">b[a]r</span>baz', 3963 3964 // Tests for queryCommandIndeterm() and queryCommandState() 3965 'fo[o<u>b]ar</u>baz', 3966 'foo<u>ba[r</u>b]az', 3967 'fo[o<u>bar</u>b]az', 3968 'foo[<u>b]ar</u>baz', 3969 'foo<u>ba[r</u>]baz', 3970 'foo[<u>bar</u>]baz', 3971 'foo<u>[bar]</u>baz', 3972 'foo{<u>bar</u>}baz', 3973 'fo[o<span style=text-decoration:underline>b]ar</span>baz', 3974 '<ins>fo[o</ins><u>b]ar</u>', 3975 '<u>fo[o</u><ins>b]ar</ins>', 3976 ], 3977 //@} 3978 unlink: [ 3979 //@{ 3980 'foo[]bar', 3981 '<p>[foo</p> <p>bar]</p>', 3982 '<span>[foo</span> <span>bar]</span>', 3983 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>', 3984 '<b>foo[]bar</b>', 3985 '<i>foo[]bar</i>', 3986 '<span>foo</span>{}<span>bar</span>', 3987 '<span>foo[</span><span>]bar</span>', 3988 'foo[bar]baz', 3989 'foo[bar<b>baz]qoz</b>quz', 3990 'foo[bar<i>baz]qoz</i>quz', 3991 '{<p><p> <p>foo</p>}', 3992 3993 '<a href=http://www.google.com/>foo[bar]baz</a>', 3994 '<a href=http://www.google.com/>foo[barbaz</a>}', 3995 '{<a href=http://www.google.com/>foobar]baz</a>', 3996 '{<a href=http://www.google.com/>foobarbaz</a>}', 3997 '<a href=http://www.google.com/>[foobarbaz]</a>', 3998 3999 'foo<a href=http://www.google.com/>b[]ar</a>baz', 4000 'foo<a href=http://www.google.com/>[bar]</a>baz', 4001 'foo[<a href=http://www.google.com/>bar</a>]baz', 4002 'foo<a href=http://www.google.com/>[bar</a>baz]', 4003 '[foo<a href=http://www.google.com/>bar]</a>baz', 4004 '[foo<a href=http://www.google.com/>bar</a>baz]', 4005 4006 '<a id=foo href=http://www.google.com/>foobar[]baz</a>', 4007 '<a id=foo href=http://www.google.com/>foo[bar]baz</a>', 4008 '<a id=foo href=http://www.google.com/>[foobarbaz]</a>', 4009 'foo<a id=foo href=http://www.google.com/>[bar]</a>baz', 4010 'foo[<a id=foo href=http://www.google.com/>bar</a>]baz', 4011 '[foo<a id=foo href=http://www.google.com/>bar</a>baz]', 4012 4013 '<a name=foo>foobar[]baz</a>', 4014 '<a name=foo>foo[bar]baz</a>', 4015 '<a name=foo>[foobarbaz]</a>', 4016 'foo<a name=foo>[bar]</a>baz', 4017 'foo[<a name=foo>bar</a>]baz', 4018 '[foo<a name=foo>bar</a>baz]', 4019 ], 4020 //@} 4021 copy: ['!foo[bar]baz'], 4022 cut: ['!foo[bar]baz'], 4023 defaultparagraphseparator: [ 4024 //@{ 4025 ['', 'foo[bar]baz'], 4026 ['div', 'foo[bar]baz'], 4027 ['p', 'foo[bar]baz'], 4028 ['DIV', 'foo[bar]baz'], 4029 ['P', 'foo[bar]baz'], 4030 [' div ', 'foo[bar]baz'], 4031 [' p ', 'foo[bar]baz'], 4032 ['<div>', 'foo[bar]baz'], 4033 ['<p>', 'foo[bar]baz'], 4034 ['li', 'foo[bar]baz'], 4035 ['blockquote', 'foo[bar]baz'], 4036 ], 4037 //@} 4038 paste: ['!foo[bar]baz'], 4039 selectall: ['foo[bar]baz'], 4040 stylewithcss: [ 4041 //@{ 4042 ['true', 'foo[bar]baz'], 4043 ['TRUE', 'foo[bar]baz'], 4044 ['TrUe', 'foo[bar]baz'], 4045 ['true ', 'foo[bar]baz'], 4046 [' true', 'foo[bar]baz'], 4047 ['truer', 'foo[bar]baz'], 4048 [' true ', 'foo[bar]baz'], 4049 [' TrUe', 'foo[bar]baz'], 4050 ['', 'foo[bar]baz'], 4051 [' ', 'foo[bar]baz'], 4052 ['false', 'foo[bar]baz'], 4053 ['FALSE', 'foo[bar]baz'], 4054 ['FaLsE', 'foo[bar]baz'], 4055 [' false', 'foo[bar]baz'], 4056 ['false ', 'foo[bar]baz'], 4057 ['falser', 'foo[bar]baz'], 4058 ['falsé', 'foo[bar]baz'], 4059 ], 4060 //@} 4061 usecss: [ 4062 //@{ 4063 ['true', 'foo[bar]baz'], 4064 ['TRUE', 'foo[bar]baz'], 4065 ['TrUe', 'foo[bar]baz'], 4066 ['true ', 'foo[bar]baz'], 4067 [' true', 'foo[bar]baz'], 4068 ['truer', 'foo[bar]baz'], 4069 [' true ', 'foo[bar]baz'], 4070 [' TrUe', 'foo[bar]baz'], 4071 ['', 'foo[bar]baz'], 4072 [' ', 'foo[bar]baz'], 4073 ['false', 'foo[bar]baz'], 4074 ['FALSE', 'foo[bar]baz'], 4075 ['FaLsE', 'foo[bar]baz'], 4076 [' false', 'foo[bar]baz'], 4077 ['false ', 'foo[bar]baz'], 4078 ['falser', 'foo[bar]baz'], 4079 ['falsé', 'foo[bar]baz'], 4080 ], 4081 //@} 4082 quasit: ['foo[bar]baz'], 4083 multitest: [ 4084 //@{ 4085 // Insertion-affecting state. Test that insertText works right, and 4086 // test that various block commands preserve (or don't preserve) the 4087 // state. 4088 ['foo[]bar', 'bold', 'inserttext'], 4089 ['foo[]bar', 'bold', 'delete'], 4090 ['foo[]bar', 'bold', 'delete', 'inserttext'], 4091 ['foo[]bar', 'bold', 'formatblock'], 4092 ['foo[]bar', 'bold', 'formatblock', 'inserttext'], 4093 ['foo[]bar', 'bold', 'forwarddelete'], 4094 ['foo[]bar', 'bold', 'forwarddelete', 'inserttext'], 4095 ['foo[]bar', 'bold', 'indent'], 4096 ['foo[]bar', 'bold', 'indent', 'inserttext'], 4097 ['foo[]bar', 'bold', 'inserthorizontalrule'], 4098 ['foo[]bar', 'bold', 'inserthorizontalrule', 'inserttext'], 4099 ['foo[]bar', 'bold', 'inserthtml'], 4100 ['foo[]bar', 'bold', 'inserthtml', 'inserttext'], 4101 ['foo[]bar', 'bold', 'insertimage'], 4102 ['foo[]bar', 'bold', 'insertimage', 'inserttext'], 4103 ['foo[]bar', 'bold', 'insertlinebreak'], 4104 ['foo[]bar', 'bold', 'insertlinebreak', 'inserttext'], 4105 ['foo[]bar', 'bold', 'insertorderedlist'], 4106 ['foo[]bar', 'bold', 'insertorderedlist', 'inserttext'], 4107 ['foo[]bar', 'bold', 'insertparagraph'], 4108 ['foo[]bar', 'bold', 'insertparagraph', 'inserttext'], 4109 ['foo[]bar', 'bold', 'insertunorderedlist'], 4110 ['foo[]bar', 'bold', 'insertunorderedlist', 'inserttext'], 4111 ['foo[]bar', 'bold', 'justifycenter'], 4112 ['foo[]bar', 'bold', 'justifycenter', 'inserttext'], 4113 ['foo[]bar', 'bold', 'justifyfull'], 4114 ['foo[]bar', 'bold', 'justifyfull', 'inserttext'], 4115 ['foo[]bar', 'bold', 'justifyleft'], 4116 ['foo[]bar', 'bold', 'justifyleft', 'inserttext'], 4117 ['foo[]bar', 'bold', 'justifyright'], 4118 ['foo[]bar', 'bold', 'justifyright', 'inserttext'], 4119 ['foo[]bar', 'bold', 'outdent'], 4120 ['foo[]bar', 'bold', 'outdent', 'inserttext'], 4121 4122 ['foo[]bar', 'italic', 'inserttext'], 4123 ['foo[]bar', 'italic', 'delete'], 4124 ['foo[]bar', 'italic', 'delete', 'inserttext'], 4125 ['foo[]bar', 'italic', 'formatblock'], 4126 ['foo[]bar', 'italic', 'formatblock', 'inserttext'], 4127 ['foo[]bar', 'italic', 'forwarddelete'], 4128 ['foo[]bar', 'italic', 'forwarddelete', 'inserttext'], 4129 ['foo[]bar', 'italic', 'indent'], 4130 ['foo[]bar', 'italic', 'indent', 'inserttext'], 4131 ['foo[]bar', 'italic', 'inserthorizontalrule'], 4132 ['foo[]bar', 'italic', 'inserthorizontalrule', 'inserttext'], 4133 ['foo[]bar', 'italic', 'inserthtml'], 4134 ['foo[]bar', 'italic', 'inserthtml', 'inserttext'], 4135 ['foo[]bar', 'italic', 'insertimage'], 4136 ['foo[]bar', 'italic', 'insertimage', 'inserttext'], 4137 ['foo[]bar', 'italic', 'insertlinebreak'], 4138 ['foo[]bar', 'italic', 'insertlinebreak', 'inserttext'], 4139 ['foo[]bar', 'italic', 'insertorderedlist'], 4140 ['foo[]bar', 'italic', 'insertorderedlist', 'inserttext'], 4141 ['foo[]bar', 'italic', 'insertparagraph'], 4142 ['foo[]bar', 'italic', 'insertparagraph', 'inserttext'], 4143 ['foo[]bar', 'italic', 'insertunorderedlist'], 4144 ['foo[]bar', 'italic', 'insertunorderedlist', 'inserttext'], 4145 ['foo[]bar', 'italic', 'justifycenter'], 4146 ['foo[]bar', 'italic', 'justifycenter', 'inserttext'], 4147 ['foo[]bar', 'italic', 'justifyfull'], 4148 ['foo[]bar', 'italic', 'justifyfull', 'inserttext'], 4149 ['foo[]bar', 'italic', 'justifyleft'], 4150 ['foo[]bar', 'italic', 'justifyleft', 'inserttext'], 4151 ['foo[]bar', 'italic', 'justifyright'], 4152 ['foo[]bar', 'italic', 'justifyright', 'inserttext'], 4153 ['foo[]bar', 'italic', 'outdent'], 4154 ['foo[]bar', 'italic', 'outdent', 'inserttext'], 4155 4156 ['foo[]bar', 'strikethrough', 'inserttext'], 4157 ['foo[]bar', 'strikethrough', 'delete'], 4158 ['foo[]bar', 'strikethrough', 'delete', 'inserttext'], 4159 ['foo[]bar', 'strikethrough', 'formatblock'], 4160 ['foo[]bar', 'strikethrough', 'formatblock', 'inserttext'], 4161 ['foo[]bar', 'strikethrough', 'forwarddelete'], 4162 ['foo[]bar', 'strikethrough', 'forwarddelete', 'inserttext'], 4163 ['foo[]bar', 'strikethrough', 'indent'], 4164 ['foo[]bar', 'strikethrough', 'indent', 'inserttext'], 4165 ['foo[]bar', 'strikethrough', 'inserthorizontalrule'], 4166 ['foo[]bar', 'strikethrough', 'inserthorizontalrule', 'inserttext'], 4167 ['foo[]bar', 'strikethrough', 'inserthtml'], 4168 ['foo[]bar', 'strikethrough', 'inserthtml', 'inserttext'], 4169 ['foo[]bar', 'strikethrough', 'insertimage'], 4170 ['foo[]bar', 'strikethrough', 'insertimage', 'inserttext'], 4171 ['foo[]bar', 'strikethrough', 'insertlinebreak'], 4172 ['foo[]bar', 'strikethrough', 'insertlinebreak', 'inserttext'], 4173 ['foo[]bar', 'strikethrough', 'insertorderedlist'], 4174 ['foo[]bar', 'strikethrough', 'insertorderedlist', 'inserttext'], 4175 ['foo[]bar', 'strikethrough', 'insertparagraph'], 4176 ['foo[]bar', 'strikethrough', 'insertparagraph', 'inserttext'], 4177 ['foo[]bar', 'strikethrough', 'insertunorderedlist'], 4178 ['foo[]bar', 'strikethrough', 'insertunorderedlist', 'inserttext'], 4179 ['foo[]bar', 'strikethrough', 'justifycenter'], 4180 ['foo[]bar', 'strikethrough', 'justifycenter', 'inserttext'], 4181 ['foo[]bar', 'strikethrough', 'justifyfull'], 4182 ['foo[]bar', 'strikethrough', 'justifyfull', 'inserttext'], 4183 ['foo[]bar', 'strikethrough', 'justifyleft'], 4184 ['foo[]bar', 'strikethrough', 'justifyleft', 'inserttext'], 4185 ['foo[]bar', 'strikethrough', 'justifyright'], 4186 ['foo[]bar', 'strikethrough', 'justifyright', 'inserttext'], 4187 ['foo[]bar', 'strikethrough', 'outdent'], 4188 ['foo[]bar', 'strikethrough', 'outdent', 'inserttext'], 4189 4190 ['foo[]bar', 'subscript', 'inserttext'], 4191 ['foo[]bar', 'subscript', 'delete'], 4192 ['foo[]bar', 'subscript', 'delete', 'inserttext'], 4193 ['foo[]bar', 'subscript', 'formatblock'], 4194 ['foo[]bar', 'subscript', 'formatblock', 'inserttext'], 4195 ['foo[]bar', 'subscript', 'forwarddelete'], 4196 ['foo[]bar', 'subscript', 'forwarddelete', 'inserttext'], 4197 ['foo[]bar', 'subscript', 'indent'], 4198 ['foo[]bar', 'subscript', 'indent', 'inserttext'], 4199 ['foo[]bar', 'subscript', 'inserthorizontalrule'], 4200 ['foo[]bar', 'subscript', 'inserthorizontalrule', 'inserttext'], 4201 ['foo[]bar', 'subscript', 'inserthtml'], 4202 ['foo[]bar', 'subscript', 'inserthtml', 'inserttext'], 4203 ['foo[]bar', 'subscript', 'insertimage'], 4204 ['foo[]bar', 'subscript', 'insertimage', 'inserttext'], 4205 ['foo[]bar', 'subscript', 'insertlinebreak'], 4206 ['foo[]bar', 'subscript', 'insertlinebreak', 'inserttext'], 4207 ['foo[]bar', 'subscript', 'insertorderedlist'], 4208 ['foo[]bar', 'subscript', 'insertorderedlist', 'inserttext'], 4209 ['foo[]bar', 'subscript', 'insertparagraph'], 4210 ['foo[]bar', 'subscript', 'insertparagraph', 'inserttext'], 4211 ['foo[]bar', 'subscript', 'insertunorderedlist'], 4212 ['foo[]bar', 'subscript', 'insertunorderedlist', 'inserttext'], 4213 ['foo[]bar', 'subscript', 'justifycenter'], 4214 ['foo[]bar', 'subscript', 'justifycenter', 'inserttext'], 4215 ['foo[]bar', 'subscript', 'justifyfull'], 4216 ['foo[]bar', 'subscript', 'justifyfull', 'inserttext'], 4217 ['foo[]bar', 'subscript', 'justifyleft'], 4218 ['foo[]bar', 'subscript', 'justifyleft', 'inserttext'], 4219 ['foo[]bar', 'subscript', 'justifyright'], 4220 ['foo[]bar', 'subscript', 'justifyright', 'inserttext'], 4221 ['foo[]bar', 'subscript', 'outdent'], 4222 ['foo[]bar', 'subscript', 'outdent', 'inserttext'], 4223 4224 ['foo[]bar', 'superscript', 'inserttext'], 4225 ['foo[]bar', 'superscript', 'delete'], 4226 ['foo[]bar', 'superscript', 'delete', 'inserttext'], 4227 ['foo[]bar', 'superscript', 'formatblock'], 4228 ['foo[]bar', 'superscript', 'formatblock', 'inserttext'], 4229 ['foo[]bar', 'superscript', 'forwarddelete'], 4230 ['foo[]bar', 'superscript', 'forwarddelete', 'inserttext'], 4231 ['foo[]bar', 'superscript', 'indent'], 4232 ['foo[]bar', 'superscript', 'indent', 'inserttext'], 4233 ['foo[]bar', 'superscript', 'inserthorizontalrule'], 4234 ['foo[]bar', 'superscript', 'inserthorizontalrule', 'inserttext'], 4235 ['foo[]bar', 'superscript', 'inserthtml'], 4236 ['foo[]bar', 'superscript', 'inserthtml', 'inserttext'], 4237 ['foo[]bar', 'superscript', 'insertimage'], 4238 ['foo[]bar', 'superscript', 'insertimage', 'inserttext'], 4239 ['foo[]bar', 'superscript', 'insertlinebreak'], 4240 ['foo[]bar', 'superscript', 'insertlinebreak', 'inserttext'], 4241 ['foo[]bar', 'superscript', 'insertorderedlist'], 4242 ['foo[]bar', 'superscript', 'insertorderedlist', 'inserttext'], 4243 ['foo[]bar', 'superscript', 'insertparagraph'], 4244 ['foo[]bar', 'superscript', 'insertparagraph', 'inserttext'], 4245 ['foo[]bar', 'superscript', 'insertunorderedlist'], 4246 ['foo[]bar', 'superscript', 'insertunorderedlist', 'inserttext'], 4247 ['foo[]bar', 'superscript', 'justifycenter'], 4248 ['foo[]bar', 'superscript', 'justifycenter', 'inserttext'], 4249 ['foo[]bar', 'superscript', 'justifyfull'], 4250 ['foo[]bar', 'superscript', 'justifyfull', 'inserttext'], 4251 ['foo[]bar', 'superscript', 'justifyleft'], 4252 ['foo[]bar', 'superscript', 'justifyleft', 'inserttext'], 4253 ['foo[]bar', 'superscript', 'justifyright'], 4254 ['foo[]bar', 'superscript', 'justifyright', 'inserttext'], 4255 ['foo[]bar', 'superscript', 'outdent'], 4256 ['foo[]bar', 'superscript', 'outdent', 'inserttext'], 4257 4258 ['foo[]bar', 'underline', 'inserttext'], 4259 ['foo[]bar', 'underline', 'delete'], 4260 ['foo[]bar', 'underline', 'delete', 'inserttext'], 4261 ['foo[]bar', 'underline', 'formatblock'], 4262 ['foo[]bar', 'underline', 'formatblock', 'inserttext'], 4263 ['foo[]bar', 'underline', 'forwarddelete'], 4264 ['foo[]bar', 'underline', 'forwarddelete', 'inserttext'], 4265 ['foo[]bar', 'underline', 'indent'], 4266 ['foo[]bar', 'underline', 'indent', 'inserttext'], 4267 ['foo[]bar', 'underline', 'inserthorizontalrule'], 4268 ['foo[]bar', 'underline', 'inserthorizontalrule', 'inserttext'], 4269 ['foo[]bar', 'underline', 'inserthtml'], 4270 ['foo[]bar', 'underline', 'inserthtml', 'inserttext'], 4271 ['foo[]bar', 'underline', 'insertimage'], 4272 ['foo[]bar', 'underline', 'insertimage', 'inserttext'], 4273 ['foo[]bar', 'underline', 'insertlinebreak'], 4274 ['foo[]bar', 'underline', 'insertlinebreak', 'inserttext'], 4275 ['foo[]bar', 'underline', 'insertorderedlist'], 4276 ['foo[]bar', 'underline', 'insertorderedlist', 'inserttext'], 4277 ['foo[]bar', 'underline', 'insertparagraph'], 4278 ['foo[]bar', 'underline', 'insertparagraph', 'inserttext'], 4279 ['foo[]bar', 'underline', 'insertunorderedlist'], 4280 ['foo[]bar', 'underline', 'insertunorderedlist', 'inserttext'], 4281 ['foo[]bar', 'underline', 'justifycenter'], 4282 ['foo[]bar', 'underline', 'justifycenter', 'inserttext'], 4283 ['foo[]bar', 'underline', 'justifyfull'], 4284 ['foo[]bar', 'underline', 'justifyfull', 'inserttext'], 4285 ['foo[]bar', 'underline', 'justifyleft'], 4286 ['foo[]bar', 'underline', 'justifyleft', 'inserttext'], 4287 ['foo[]bar', 'underline', 'justifyright'], 4288 ['foo[]bar', 'underline', 'justifyright', 'inserttext'], 4289 ['foo[]bar', 'underline', 'outdent'], 4290 ['foo[]bar', 'underline', 'outdent', 'inserttext'], 4291 4292 // Insertion-affecting value. Test that insertText works right, and 4293 // test that various block commands preserve (or don't preserve) the 4294 // value. 4295 ['foo[]bar', 'backcolor', 'inserttext'], 4296 ['foo[]bar', 'backcolor', 'delete'], 4297 ['foo[]bar', 'backcolor', 'delete', 'inserttext'], 4298 ['foo[]bar', 'backcolor', 'formatblock'], 4299 ['foo[]bar', 'backcolor', 'formatblock', 'inserttext'], 4300 ['foo[]bar', 'backcolor', 'forwarddelete'], 4301 ['foo[]bar', 'backcolor', 'forwarddelete', 'inserttext'], 4302 ['foo[]bar', 'backcolor', 'indent'], 4303 ['foo[]bar', 'backcolor', 'indent', 'inserttext'], 4304 ['foo[]bar', 'backcolor', 'inserthorizontalrule'], 4305 ['foo[]bar', 'backcolor', 'inserthorizontalrule', 'inserttext'], 4306 ['foo[]bar', 'backcolor', 'inserthtml'], 4307 ['foo[]bar', 'backcolor', 'inserthtml', 'inserttext'], 4308 ['foo[]bar', 'backcolor', 'insertimage'], 4309 ['foo[]bar', 'backcolor', 'insertimage', 'inserttext'], 4310 ['foo[]bar', 'backcolor', 'insertlinebreak'], 4311 ['foo[]bar', 'backcolor', 'insertlinebreak', 'inserttext'], 4312 ['foo[]bar', 'backcolor', 'insertorderedlist'], 4313 ['foo[]bar', 'backcolor', 'insertorderedlist', 'inserttext'], 4314 ['foo[]bar', 'backcolor', 'insertparagraph'], 4315 ['foo[]bar', 'backcolor', 'insertparagraph', 'inserttext'], 4316 ['foo[]bar', 'backcolor', 'insertunorderedlist'], 4317 ['foo[]bar', 'backcolor', 'insertunorderedlist', 'inserttext'], 4318 ['foo[]bar', 'backcolor', 'justifycenter'], 4319 ['foo[]bar', 'backcolor', 'justifycenter', 'inserttext'], 4320 ['foo[]bar', 'backcolor', 'justifyfull'], 4321 ['foo[]bar', 'backcolor', 'justifyfull', 'inserttext'], 4322 ['foo[]bar', 'backcolor', 'justifyleft'], 4323 ['foo[]bar', 'backcolor', 'justifyleft', 'inserttext'], 4324 ['foo[]bar', 'backcolor', 'justifyright'], 4325 ['foo[]bar', 'backcolor', 'justifyright', 'inserttext'], 4326 ['foo[]bar', 'backcolor', 'outdent'], 4327 ['foo[]bar', 'backcolor', 'outdent', 'inserttext'], 4328 4329 ['foo[]bar', 'createlink', 'inserttext'], 4330 ['foo[]bar', 'createlink', 'delete'], 4331 ['foo[]bar', 'createlink', 'delete', 'inserttext'], 4332 ['foo[]bar', 'createlink', 'formatblock'], 4333 ['foo[]bar', 'createlink', 'formatblock', 'inserttext'], 4334 ['foo[]bar', 'createlink', 'forwarddelete'], 4335 ['foo[]bar', 'createlink', 'forwarddelete', 'inserttext'], 4336 ['foo[]bar', 'createlink', 'indent'], 4337 ['foo[]bar', 'createlink', 'indent', 'inserttext'], 4338 ['foo[]bar', 'createlink', 'inserthorizontalrule'], 4339 ['foo[]bar', 'createlink', 'inserthorizontalrule', 'inserttext'], 4340 ['foo[]bar', 'createlink', 'inserthtml'], 4341 ['foo[]bar', 'createlink', 'inserthtml', 'inserttext'], 4342 ['foo[]bar', 'createlink', 'insertimage'], 4343 ['foo[]bar', 'createlink', 'insertimage', 'inserttext'], 4344 ['foo[]bar', 'createlink', 'insertlinebreak'], 4345 ['foo[]bar', 'createlink', 'insertlinebreak', 'inserttext'], 4346 ['foo[]bar', 'createlink', 'insertorderedlist'], 4347 ['foo[]bar', 'createlink', 'insertorderedlist', 'inserttext'], 4348 ['foo[]bar', 'createlink', 'insertparagraph'], 4349 ['foo[]bar', 'createlink', 'insertparagraph', 'inserttext'], 4350 ['foo[]bar', 'createlink', 'insertunorderedlist'], 4351 ['foo[]bar', 'createlink', 'insertunorderedlist', 'inserttext'], 4352 ['foo[]bar', 'createlink', 'justifycenter'], 4353 ['foo[]bar', 'createlink', 'justifycenter', 'inserttext'], 4354 ['foo[]bar', 'createlink', 'justifyfull'], 4355 ['foo[]bar', 'createlink', 'justifyfull', 'inserttext'], 4356 ['foo[]bar', 'createlink', 'justifyleft'], 4357 ['foo[]bar', 'createlink', 'justifyleft', 'inserttext'], 4358 ['foo[]bar', 'createlink', 'justifyright'], 4359 ['foo[]bar', 'createlink', 'justifyright', 'inserttext'], 4360 ['foo[]bar', 'createlink', 'outdent'], 4361 ['foo[]bar', 'createlink', 'outdent', 'inserttext'], 4362 4363 ['foo[]bar', 'fontname', 'inserttext'], 4364 ['foo[]bar', 'fontname', 'delete'], 4365 ['foo[]bar', 'fontname', 'delete', 'inserttext'], 4366 ['foo[]bar', 'fontname', 'formatblock'], 4367 ['foo[]bar', 'fontname', 'formatblock', 'inserttext'], 4368 ['foo[]bar', 'fontname', 'forwarddelete'], 4369 ['foo[]bar', 'fontname', 'forwarddelete', 'inserttext'], 4370 ['foo[]bar', 'fontname', 'indent'], 4371 ['foo[]bar', 'fontname', 'indent', 'inserttext'], 4372 ['foo[]bar', 'fontname', 'inserthorizontalrule'], 4373 ['foo[]bar', 'fontname', 'inserthorizontalrule', 'inserttext'], 4374 ['foo[]bar', 'fontname', 'inserthtml'], 4375 ['foo[]bar', 'fontname', 'inserthtml', 'inserttext'], 4376 ['foo[]bar', 'fontname', 'insertimage'], 4377 ['foo[]bar', 'fontname', 'insertimage', 'inserttext'], 4378 ['foo[]bar', 'fontname', 'insertlinebreak'], 4379 ['foo[]bar', 'fontname', 'insertlinebreak', 'inserttext'], 4380 ['foo[]bar', 'fontname', 'insertorderedlist'], 4381 ['foo[]bar', 'fontname', 'insertorderedlist', 'inserttext'], 4382 ['foo[]bar', 'fontname', 'insertparagraph'], 4383 ['foo[]bar', 'fontname', 'insertparagraph', 'inserttext'], 4384 ['foo[]bar', 'fontname', 'insertunorderedlist'], 4385 ['foo[]bar', 'fontname', 'insertunorderedlist', 'inserttext'], 4386 ['foo[]bar', 'fontname', 'justifycenter'], 4387 ['foo[]bar', 'fontname', 'justifycenter', 'inserttext'], 4388 ['foo[]bar', 'fontname', 'justifyfull'], 4389 ['foo[]bar', 'fontname', 'justifyfull', 'inserttext'], 4390 ['foo[]bar', 'fontname', 'justifyleft'], 4391 ['foo[]bar', 'fontname', 'justifyleft', 'inserttext'], 4392 ['foo[]bar', 'fontname', 'justifyright'], 4393 ['foo[]bar', 'fontname', 'justifyright', 'inserttext'], 4394 ['foo[]bar', 'fontname', 'outdent'], 4395 ['foo[]bar', 'fontname', 'outdent', 'inserttext'], 4396 4397 ['foo[]bar', 'fontsize', 'inserttext'], 4398 ['foo[]bar', 'fontsize', 'delete'], 4399 ['foo[]bar', 'fontsize', 'delete', 'inserttext'], 4400 ['foo[]bar', 'fontsize', 'formatblock'], 4401 ['foo[]bar', 'fontsize', 'formatblock', 'inserttext'], 4402 ['foo[]bar', 'fontsize', 'forwarddelete'], 4403 ['foo[]bar', 'fontsize', 'forwarddelete', 'inserttext'], 4404 ['foo[]bar', 'fontsize', 'indent'], 4405 ['foo[]bar', 'fontsize', 'indent', 'inserttext'], 4406 ['foo[]bar', 'fontsize', 'inserthorizontalrule'], 4407 ['foo[]bar', 'fontsize', 'inserthorizontalrule', 'inserttext'], 4408 ['foo[]bar', 'fontsize', 'inserthtml'], 4409 ['foo[]bar', 'fontsize', 'inserthtml', 'inserttext'], 4410 ['foo[]bar', 'fontsize', 'insertimage'], 4411 ['foo[]bar', 'fontsize', 'insertimage', 'inserttext'], 4412 ['foo[]bar', 'fontsize', 'insertlinebreak'], 4413 ['foo[]bar', 'fontsize', 'insertlinebreak', 'inserttext'], 4414 ['foo[]bar', 'fontsize', 'insertorderedlist'], 4415 ['foo[]bar', 'fontsize', 'insertorderedlist', 'inserttext'], 4416 ['foo[]bar', 'fontsize', 'insertparagraph'], 4417 ['foo[]bar', 'fontsize', 'insertparagraph', 'inserttext'], 4418 ['foo[]bar', 'fontsize', 'insertunorderedlist'], 4419 ['foo[]bar', 'fontsize', 'insertunorderedlist', 'inserttext'], 4420 ['foo[]bar', 'fontsize', 'justifycenter'], 4421 ['foo[]bar', 'fontsize', 'justifycenter', 'inserttext'], 4422 ['foo[]bar', 'fontsize', 'justifyfull'], 4423 ['foo[]bar', 'fontsize', 'justifyfull', 'inserttext'], 4424 ['foo[]bar', 'fontsize', 'justifyleft'], 4425 ['foo[]bar', 'fontsize', 'justifyleft', 'inserttext'], 4426 ['foo[]bar', 'fontsize', 'justifyright'], 4427 ['foo[]bar', 'fontsize', 'justifyright', 'inserttext'], 4428 ['foo[]bar', 'fontsize', 'outdent'], 4429 ['foo[]bar', 'fontsize', 'outdent', 'inserttext'], 4430 4431 ['foo[]bar', 'forecolor', 'inserttext'], 4432 ['foo[]bar', 'forecolor', 'delete'], 4433 ['foo[]bar', 'forecolor', 'delete', 'inserttext'], 4434 ['foo[]bar', 'forecolor', 'formatblock'], 4435 ['foo[]bar', 'forecolor', 'formatblock', 'inserttext'], 4436 ['foo[]bar', 'forecolor', 'forwarddelete'], 4437 ['foo[]bar', 'forecolor', 'forwarddelete', 'inserttext'], 4438 ['foo[]bar', 'forecolor', 'indent'], 4439 ['foo[]bar', 'forecolor', 'indent', 'inserttext'], 4440 ['foo[]bar', 'forecolor', 'inserthorizontalrule'], 4441 ['foo[]bar', 'forecolor', 'inserthorizontalrule', 'inserttext'], 4442 ['foo[]bar', 'forecolor', 'inserthtml'], 4443 ['foo[]bar', 'forecolor', 'inserthtml', 'inserttext'], 4444 ['foo[]bar', 'forecolor', 'insertimage'], 4445 ['foo[]bar', 'forecolor', 'insertimage', 'inserttext'], 4446 ['foo[]bar', 'forecolor', 'insertlinebreak'], 4447 ['foo[]bar', 'forecolor', 'insertlinebreak', 'inserttext'], 4448 ['foo[]bar', 'forecolor', 'insertorderedlist'], 4449 ['foo[]bar', 'forecolor', 'insertorderedlist', 'inserttext'], 4450 ['foo[]bar', 'forecolor', 'insertparagraph'], 4451 ['foo[]bar', 'forecolor', 'insertparagraph', 'inserttext'], 4452 ['foo[]bar', 'forecolor', 'insertunorderedlist'], 4453 ['foo[]bar', 'forecolor', 'insertunorderedlist', 'inserttext'], 4454 ['foo[]bar', 'forecolor', 'justifycenter'], 4455 ['foo[]bar', 'forecolor', 'justifycenter', 'inserttext'], 4456 ['foo[]bar', 'forecolor', 'justifyfull'], 4457 ['foo[]bar', 'forecolor', 'justifyfull', 'inserttext'], 4458 ['foo[]bar', 'forecolor', 'justifyleft'], 4459 ['foo[]bar', 'forecolor', 'justifyleft', 'inserttext'], 4460 ['foo[]bar', 'forecolor', 'justifyright'], 4461 ['foo[]bar', 'forecolor', 'justifyright', 'inserttext'], 4462 ['foo[]bar', 'forecolor', 'outdent'], 4463 ['foo[]bar', 'forecolor', 'outdent', 'inserttext'], 4464 4465 ['foo[]bar', 'hilitecolor', 'inserttext'], 4466 ['foo[]bar', 'hilitecolor', 'delete'], 4467 ['foo[]bar', 'hilitecolor', 'delete', 'inserttext'], 4468 ['foo[]bar', 'hilitecolor', 'formatblock'], 4469 ['foo[]bar', 'hilitecolor', 'formatblock', 'inserttext'], 4470 ['foo[]bar', 'hilitecolor', 'forwarddelete'], 4471 ['foo[]bar', 'hilitecolor', 'forwarddelete', 'inserttext'], 4472 ['foo[]bar', 'hilitecolor', 'indent'], 4473 ['foo[]bar', 'hilitecolor', 'indent', 'inserttext'], 4474 ['foo[]bar', 'hilitecolor', 'inserthorizontalrule'], 4475 ['foo[]bar', 'hilitecolor', 'inserthorizontalrule', 'inserttext'], 4476 ['foo[]bar', 'hilitecolor', 'inserthtml'], 4477 ['foo[]bar', 'hilitecolor', 'inserthtml', 'inserttext'], 4478 ['foo[]bar', 'hilitecolor', 'insertimage'], 4479 ['foo[]bar', 'hilitecolor', 'insertimage', 'inserttext'], 4480 ['foo[]bar', 'hilitecolor', 'insertlinebreak'], 4481 ['foo[]bar', 'hilitecolor', 'insertlinebreak', 'inserttext'], 4482 ['foo[]bar', 'hilitecolor', 'insertorderedlist'], 4483 ['foo[]bar', 'hilitecolor', 'insertorderedlist', 'inserttext'], 4484 ['foo[]bar', 'hilitecolor', 'insertparagraph'], 4485 ['foo[]bar', 'hilitecolor', 'insertparagraph', 'inserttext'], 4486 ['foo[]bar', 'hilitecolor', 'insertunorderedlist'], 4487 ['foo[]bar', 'hilitecolor', 'insertunorderedlist', 'inserttext'], 4488 ['foo[]bar', 'hilitecolor', 'justifycenter'], 4489 ['foo[]bar', 'hilitecolor', 'justifycenter', 'inserttext'], 4490 ['foo[]bar', 'hilitecolor', 'justifyfull'], 4491 ['foo[]bar', 'hilitecolor', 'justifyfull', 'inserttext'], 4492 ['foo[]bar', 'hilitecolor', 'justifyleft'], 4493 ['foo[]bar', 'hilitecolor', 'justifyleft', 'inserttext'], 4494 ['foo[]bar', 'hilitecolor', 'justifyright'], 4495 ['foo[]bar', 'hilitecolor', 'justifyright', 'inserttext'], 4496 ['foo[]bar', 'hilitecolor', 'outdent'], 4497 ['foo[]bar', 'hilitecolor', 'outdent', 'inserttext'], 4498 4499 // Test things that interfere with each other 4500 ['foo[]bar', 'superscript', 'subscript', 'inserttext'], 4501 ['foo[]bar', 'subscript', 'superscript', 'inserttext'], 4502 4503 ['foo[]bar', 'createlink', ['forecolor', '#0000FF'], 'inserttext'], 4504 ['foo[]bar', ['forecolor', '#0000FF'], 'createlink', 'inserttext'], 4505 ['foo[]bar', 'createlink', ['forecolor', 'blue'], 'inserttext'], 4506 ['foo[]bar', ['forecolor', 'blue'], 'createlink', 'inserttext'], 4507 ['foo[]bar', 'createlink', ['forecolor', 'brown'], 'inserttext'], 4508 ['foo[]bar', ['forecolor', 'brown'], 'createlink', 'inserttext'], 4509 ['foo[]bar', 'createlink', ['forecolor', 'black'], 'inserttext'], 4510 ['foo[]bar', ['forecolor', 'black'], 'createlink', 'inserttext'], 4511 ['foo[]bar', 'createlink', 'underline', 'inserttext'], 4512 ['foo[]bar', 'underline', 'createlink', 'inserttext'], 4513 ['foo[]bar', 'createlink', 'underline', 'underline', 'inserttext'], 4514 ['foo[]bar', 'underline', 'underline', 'createlink', 'inserttext'], 4515 4516 ['foo[]bar', 'subscript', ['fontsize', '2'], 'inserttext'], 4517 ['foo[]bar', ['fontsize', '2'], 'subscript', 'inserttext'], 4518 ['foo[]bar', 'subscript', ['fontsize', '3'], 'inserttext'], 4519 ['foo[]bar', ['fontsize', '3'], 'subscript', 'inserttext'], 4520 4521 ['foo[]bar', ['hilitecolor', 'aqua'], ['backcolor', 'tan'], 'inserttext'], 4522 ['foo[]bar', ['backcolor', 'tan'], ['hilitecolor', 'aqua'], 'inserttext'], 4523 4524 4525 // The following are all just inserttext tests that we took from there, 4526 // but we first backspace the selected text instead of letting 4527 // inserttext handle it. This tests that deletion correctly sets 4528 // overrides. 4529 ['foo<b>[bar]</b>baz', 'delete', 'inserttext'], 4530 ['foo<i>[bar]</i>baz', 'delete', 'inserttext'], 4531 ['foo<s>[bar]</s>baz', 'delete', 'inserttext'], 4532 ['foo<sub>[bar]</sub>baz', 'delete', 'inserttext'], 4533 ['foo<sup>[bar]</sup>baz', 'delete', 'inserttext'], 4534 ['foo<u>[bar]</u>baz', 'delete', 'inserttext'], 4535 ['foo<a href=http://www.google.com>[bar]</a>baz', 'delete', 'inserttext'], 4536 ['foo<font face=sans-serif>[bar]</font>baz', 'delete', 'inserttext'], 4537 ['foo<font size=4>[bar]</font>baz', 'delete', 'inserttext'], 4538 ['foo<font color=#0000FF>[bar]</font>baz', 'delete', 'inserttext'], 4539 ['foo<span style=background-color:#00FFFF>[bar]</span>baz', 'delete', 'inserttext'], 4540 ['foo<a href=http://www.google.com><font color=blue>[bar]</font></a>baz', 'delete', 'inserttext'], 4541 ['foo<font color=blue><a href=http://www.google.com>[bar]</a></font>baz', 'delete', 'inserttext'], 4542 ['foo<a href=http://www.google.com><font color=brown>[bar]</font></a>baz', 'delete', 'inserttext'], 4543 ['foo<font color=brown><a href=http://www.google.com>[bar]</a></font>baz', 'delete', 'inserttext'], 4544 ['foo<a href=http://www.google.com><font color=black>[bar]</font></a>baz', 'delete', 'inserttext'], 4545 ['foo<a href=http://www.google.com><u>[bar]</u></a>baz', 'delete', 'inserttext'], 4546 ['foo<u><a href=http://www.google.com>[bar]</a></u>baz', 'delete', 'inserttext'], 4547 ['foo<sub><font size=2>[bar]</font></sub>baz', 'delete', 'inserttext'], 4548 ['foo<font size=2><sub>[bar]</sub></font>baz', 'delete', 'inserttext'], 4549 ['foo<sub><font size=3>[bar]</font></sub>baz', 'delete', 'inserttext'], 4550 ['foo<font size=3><sub>[bar]</sub></font>baz', 'delete', 'inserttext'], 4551 4552 // Now repeat but with different selections. 4553 ['[foo<b>bar]</b>baz', 'delete', 'inserttext'], 4554 ['[foo<i>bar]</i>baz', 'delete', 'inserttext'], 4555 ['[foo<s>bar]</s>baz', 'delete', 'inserttext'], 4556 ['[foo<sub>bar]</sub>baz', 'delete', 'inserttext'], 4557 ['[foo<sup>bar]</sup>baz', 'delete', 'inserttext'], 4558 ['[foo<u>bar]</u>baz', 'delete', 'inserttext'], 4559 ['[foo<a href=http://www.google.com>bar]</a>baz', 'delete', 'inserttext'], 4560 ['[foo<font face=sans-serif>bar]</font>baz', 'delete', 'inserttext'], 4561 ['[foo<font size=4>bar]</font>baz', 'delete', 'inserttext'], 4562 ['[foo<font color=#0000FF>bar]</font>baz', 'delete', 'inserttext'], 4563 ['[foo<span style=background-color:#00FFFF>bar]</span>baz', 'delete', 'inserttext'], 4564 ['[foo<a href=http://www.google.com><font color=blue>bar]</font></a>baz', 'delete', 'inserttext'], 4565 ['[foo<font color=blue><a href=http://www.google.com>bar]</a></font>baz', 'delete', 'inserttext'], 4566 ['[foo<a href=http://www.google.com><font color=brown>bar]</font></a>baz', 'delete', 'inserttext'], 4567 ['[foo<font color=brown><a href=http://www.google.com>bar]</a></font>baz', 'delete', 'inserttext'], 4568 ['[foo<a href=http://www.google.com><font color=black>bar]</font></a>baz', 'delete', 'inserttext'], 4569 ['[foo<a href=http://www.google.com><u>bar]</u></a>baz', 'delete', 'inserttext'], 4570 ['[foo<u><a href=http://www.google.com>bar]</a></u>baz', 'delete', 'inserttext'], 4571 ['[foo<sub><font size=2>bar]</font></sub>baz', 'delete', 'inserttext'], 4572 ['[foo<font size=2><sub>bar]</sub></font>baz', 'delete', 'inserttext'], 4573 ['[foo<sub><font size=3>bar]</font></sub>baz', 'delete', 'inserttext'], 4574 ['[foo<font size=3><sub>bar]</sub></font>baz', 'delete', 'inserttext'], 4575 4576 ['foo<b>[bar</b>baz]', 'delete', 'inserttext'], 4577 ['foo<i>[bar</i>baz]', 'delete', 'inserttext'], 4578 ['foo<s>[bar</s>baz]', 'delete', 'inserttext'], 4579 ['foo<sub>[bar</sub>baz]', 'delete', 'inserttext'], 4580 ['foo<sup>[bar</sup>baz]', 'delete', 'inserttext'], 4581 ['foo<u>[bar</u>baz]', 'delete', 'inserttext'], 4582 ['foo<a href=http://www.google.com>[bar</a>baz]', 'delete', 'inserttext'], 4583 ['foo<font face=sans-serif>[bar</font>baz]', 'delete', 'inserttext'], 4584 ['foo<font size=4>[bar</font>baz]', 'delete', 'inserttext'], 4585 ['foo<font color=#0000FF>[bar</font>baz]', 'delete', 'inserttext'], 4586 ['foo<span style=background-color:#00FFFF>[bar</span>baz]', 'delete', 'inserttext'], 4587 ['foo<a href=http://www.google.com><font color=blue>[bar</font></a>baz]', 'delete', 'inserttext'], 4588 ['foo<font color=blue><a href=http://www.google.com>[bar</a></font>baz]', 'delete', 'inserttext'], 4589 ['foo<a href=http://www.google.com><font color=brown>[bar</font></a>baz]', 'delete', 'inserttext'], 4590 ['foo<font color=brown><a href=http://www.google.com>[bar</a></font>baz]', 'delete', 'inserttext'], 4591 ['foo<a href=http://www.google.com><font color=black>[bar</font></a>baz]', 'delete', 'inserttext'], 4592 ['foo<a href=http://www.google.com><u>[bar</u></a>baz]', 'delete', 'inserttext'], 4593 ['foo<u><a href=http://www.google.com>[bar</a></u>baz]', 'delete', 'inserttext'], 4594 ['foo<sub><font size=2>[bar</font></sub>baz]', 'delete', 'inserttext'], 4595 ['foo<font size=2><sub>[bar</sub></font>baz]', 'delete', 'inserttext'], 4596 ['foo<sub><font size=3>[bar</font></sub>baz]', 'delete', 'inserttext'], 4597 ['foo<font size=3><sub>[bar</sub></font>baz]', 'delete', 'inserttext'], 4598 4599 // https://bugs.webkit.org/show_bug.cgi?id=19702 4600 ['<blockquote><font color=blue>[foo]</font></blockquote>', 'delete', 'inserttext'], 4601 ], 4602 //@} 4603 }; 4604 tests.backcolor = tests.hilitecolor; 4605 tests.insertlinebreak = tests.insertparagraph; 4606 4607 // Tests that start with "!" are believed to have bogus results and should be 4608 // skipped until the relevant bugs are fixed. 4609 var badTests = {}; 4610 (function(){ 4611 for (var command in tests) { 4612 badTests[command] = []; 4613 for (var i = 0; i < tests[command].length; i++) { 4614 var test = tests[command][i]; 4615 if (typeof test == "string" && test[0] == "!") { 4616 test = test.slice(1); 4617 tests[command][i] = test; 4618 badTests[command].push(test); 4619 } 4620 if (typeof test == "object" && test[0][0] == "!") { 4621 test = [test[0].slice(1)].concat(test.slice(1)); 4622 tests[command][i] = test; 4623 badTests[command].push(test); 4624 } 4625 } 4626 } 4627 })(); 4628 4629 var defaultValues = { 4630 //@{ 4631 backcolor: "#00FFFF", 4632 createlink: "http://www.google.com/", 4633 fontname: "sans-serif", 4634 fontsize: "4", 4635 forecolor: "#0000FF", 4636 formatblock: "<div>", 4637 hilitecolor: "#00FFFF", 4638 inserthorizontalrule: "", 4639 inserthtml: "ab<b>c</b>d", 4640 insertimage: "/img/lion.svg", 4641 inserttext: "a", 4642 defaultparagraphseparator: "div", 4643 stylewithcss: "true", 4644 usecss: "true", 4645 }; 4646 //@} 4647 4648 var notes = { 4649 //@{ 4650 fontname: 'Note that the body\'s font-family is "serif".', 4651 }; 4652 //@} 4653 4654 var doubleTestingCommands = [ 4655 //@{ 4656 "backcolor", 4657 "bold", 4658 "fontname", 4659 "fontsize", 4660 "forecolor", 4661 "italic", 4662 "justifycenter", 4663 "justifyfull", 4664 "justifyleft", 4665 "justifyright", 4666 "strikethrough", 4667 "stylewithcss", 4668 "subscript", 4669 "superscript", 4670 "underline", 4671 "usecss", 4672 ]; 4673 //@} 4674 4675 function prettyPrint(value) { 4676 //@{ 4677 // Partly stolen from testharness.js 4678 if (typeof value != "string") { 4679 return String(value); 4680 } 4681 4682 value = value.replace(/\\/g, "\\\\") 4683 .replace(/"/g, '\\"'); 4684 4685 for (var i = 0; i < 32; i++) { 4686 var replace = "\\"; 4687 switch (i) { 4688 case 0: replace += "0"; break; 4689 case 1: replace += "x01"; break; 4690 case 2: replace += "x02"; break; 4691 case 3: replace += "x03"; break; 4692 case 4: replace += "x04"; break; 4693 case 5: replace += "x05"; break; 4694 case 6: replace += "x06"; break; 4695 case 7: replace += "x07"; break; 4696 case 8: replace += "b"; break; 4697 case 9: replace += "t"; break; 4698 case 10: replace += "n"; break; 4699 case 11: replace += "v"; break; 4700 case 12: replace += "f"; break; 4701 case 13: replace += "r"; break; 4702 case 14: replace += "x0e"; break; 4703 case 15: replace += "x0f"; break; 4704 case 16: replace += "x10"; break; 4705 case 17: replace += "x11"; break; 4706 case 18: replace += "x12"; break; 4707 case 19: replace += "x13"; break; 4708 case 20: replace += "x14"; break; 4709 case 21: replace += "x15"; break; 4710 case 22: replace += "x16"; break; 4711 case 23: replace += "x17"; break; 4712 case 24: replace += "x18"; break; 4713 case 25: replace += "x19"; break; 4714 case 26: replace += "x1a"; break; 4715 case 27: replace += "x1b"; break; 4716 case 28: replace += "x1c"; break; 4717 case 29: replace += "x1d"; break; 4718 case 30: replace += "x1e"; break; 4719 case 31: replace += "x1f"; break; 4720 } 4721 value = value.replace(new RegExp(String.fromCharCode(i), "g"), replace); 4722 } 4723 return '"' + value + '"'; 4724 } 4725 //@} 4726 4727 function doSetup(selector, idx) { 4728 //@{ 4729 var table = document.querySelectorAll(selector)[idx]; 4730 4731 var tr = document.createElement("tr"); 4732 table.firstChild.appendChild(tr); 4733 tr.className = (tr.className + " active").trim(); 4734 4735 return tr; 4736 } 4737 //@} 4738 4739 function queryOutputHelper(beforeIndeterm, beforeState, beforeValue, 4740 afterIndeterm, afterState, afterValue, 4741 command, value) { 4742 //@{ 4743 var frag = document.createDocumentFragment(); 4744 var beforeDiv = document.createElement("div"); 4745 var afterDiv = document.createElement("div"); 4746 frag.appendChild(beforeDiv); 4747 frag.appendChild(afterDiv); 4748 beforeDiv.className = afterDiv.className = "extra-results"; 4749 beforeDiv.textContent = "Before: "; 4750 afterDiv.textContent = "After: "; 4751 4752 beforeDiv.appendChild(document.createElement("span")); 4753 afterDiv.appendChild(document.createElement("span")); 4754 if ("indeterm" in commands[command]) { 4755 // We only know it has to be either true or false. 4756 if (beforeIndeterm !== true && beforeIndeterm !== false) { 4757 beforeDiv.lastChild.className = "bad-result"; 4758 } 4759 } else { 4760 // It always has to be false. 4761 beforeDiv.lastChild.className = beforeIndeterm === false 4762 ? "good-result" 4763 : "bad-result"; 4764 } 4765 // After running the command, indeterminate must always be false, except if 4766 // it's an exception, or if it's insert*list and the state was true to 4767 // begin with. And we can't help strikethrough/underline. 4768 if ((/^insert(un)?orderedlist$/.test(command) && beforeState) 4769 || command == "strikethrough" 4770 || command == "underline") { 4771 if (afterIndeterm !== true && afterIndeterm !== false) { 4772 afterDiv.lastChild.className = "bad-result"; 4773 } 4774 } else { 4775 afterDiv.lastChild.className = 4776 afterIndeterm === false 4777 ? "good-result" 4778 : "bad-result"; 4779 } 4780 beforeDiv.lastChild.textContent = "indeterm " + prettyPrint(beforeIndeterm); 4781 afterDiv.lastChild.textContent = "indeterm " + prettyPrint(afterIndeterm); 4782 4783 beforeDiv.appendChild(document.createTextNode(", ")); 4784 afterDiv.appendChild(document.createTextNode(", ")); 4785 4786 beforeDiv.appendChild(document.createElement("span")); 4787 afterDiv.appendChild(document.createElement("span")); 4788 if (/^insert(un)?orderedlist$/.test(command)) { 4789 // If the before state is true, the after state could be either true or 4790 // false. But if the before state is false, the after state has to be 4791 // true. 4792 if (beforeState !== true && beforeState !== false) { 4793 beforeDiv.lastChild.className = "bad-result"; 4794 } 4795 if (!beforeState) { 4796 afterDiv.lastChild.className = afterState === true 4797 ? "good-result" 4798 : "bad-result"; 4799 } else if (afterState !== true && afterState !== false) { 4800 afterDiv.lastChild.className = "bad-result"; 4801 } 4802 } else if (/^justify(center|full|left|right)$/.test(command)) { 4803 // We don't know about the before state, but the after state is always 4804 // supposed to be true. 4805 if (beforeState !== true && beforeState !== false) { 4806 beforeDiv.lastChild.className = "bad-result"; 4807 } 4808 afterDiv.lastChild.className = afterState === true 4809 ? "good-result" 4810 : "bad-result"; 4811 } else if (command == "strikethrough" || command == "underline") { 4812 // The only thing we can say is the before/after states need to be 4813 // either true or false. 4814 if (beforeState !== true && beforeState !== false) { 4815 beforeDiv.lastChild.className = "bad-result"; 4816 } 4817 if (afterState !== true && afterState !== false) { 4818 afterDiv.lastChild.className = "bad-result"; 4819 } 4820 } else { 4821 // The general rule is it must flip the state, unless there's no state 4822 // defined, in which case it should always be false. 4823 beforeDiv.lastChild.className = 4824 afterDiv.lastChild.className = 4825 ("state" in commands[command] && typeof beforeState == "boolean" && typeof afterState == "boolean" && beforeState === !afterState) 4826 || (!("state" in commands[command]) && beforeState === false && afterState === false) 4827 ? "good-result" 4828 : "bad-result"; 4829 } 4830 beforeDiv.lastChild.textContent = "state " + prettyPrint(beforeState); 4831 afterDiv.lastChild.textContent = "state " + prettyPrint(afterState); 4832 4833 beforeDiv.appendChild(document.createTextNode(", ")); 4834 afterDiv.appendChild(document.createTextNode(", ")); 4835 4836 beforeDiv.appendChild(document.createElement("span")); 4837 afterDiv.appendChild(document.createElement("span")); 4838 4839 // Direct equality comparison doesn't make sense in a bunch of cases. 4840 if (command == "backcolor" || command == "forecolor" || command == "hilitecolor") { 4841 if (/^([0-9a-fA-F]{3}){1,2}$/.test(value)) { 4842 value = "#" + value; 4843 } 4844 } else if (command == "fontsize") { 4845 value = normalizeFontSize(value); 4846 if (value !== null) { 4847 value = String(cssSizeToLegacy(value)); 4848 } 4849 } else if (command == "formatblock") { 4850 value = value.replace(/^<(.*)>$/, "$1").toLowerCase(); 4851 } else if (command == "defaultparagraphseparator") { 4852 value = value.toLowerCase(); 4853 if (value != "p" && value != "div") { 4854 value = ""; 4855 } 4856 } 4857 4858 if (((command == "backcolor" || command == "forecolor" || command == "hilitecolor") && value.toLowerCase() == "currentcolor") 4859 || (command == "fontsize" && value === null) 4860 || (command == "formatblock" && formattableBlockNames.indexOf(value.replace(/^<(.*)>$/, "$1").trim()) == -1) 4861 || (command == "defaultparagraphseparator" && value == "")) { 4862 afterDiv.lastChild.className = beforeValue === afterValue 4863 ? "good-result" 4864 : "bad-result"; 4865 } else if (/^justify(center|full|left|right)$/.test(command)) { 4866 // We know there are only four correct values beforehand, and afterward 4867 // the value has to be the one we set. 4868 if (!/^(center|justify|left|right)$/.test(beforeValue)) { 4869 beforeDiv.lastChild.className = "bad-result"; 4870 } 4871 var expectedValue = command == "justifyfull" 4872 ? "justify" 4873 : command.replace("justify", ""); 4874 afterDiv.lastChild.className = afterValue === expectedValue 4875 ? "good-result" 4876 : "bad-result"; 4877 } else if (!("value" in commands[command])) { 4878 // If it's not defined we want "". 4879 beforeDiv.lastChild.className = beforeValue === "" 4880 ? "good-result" 4881 : "bad-result"; 4882 afterDiv.lastChild.className = afterValue === "" 4883 ? "good-result" 4884 : "bad-result"; 4885 } else { 4886 // And in all other cases, the value afterwards has to be the one we 4887 // set. 4888 afterDiv.lastChild.className = 4889 areEquivalentValues(command, afterValue, value) 4890 ? "good-result" 4891 : "bad-result"; 4892 } 4893 beforeDiv.lastChild.textContent = "value " + prettyPrint(beforeValue); 4894 afterDiv.lastChild.textContent = "value " + prettyPrint(afterValue); 4895 4896 return frag; 4897 } 4898 //@} 4899 4900 function normalizeTest(command, test, styleWithCss) { 4901 //@{ 4902 // Our standard format for test processing is: 4903 // [input HTML, 4904 // [command1, value1, optional_name_mod], 4905 // [command2, value2, optional_name_mod], ...] 4906 // Where `optional_name_mod` is an optionally-specified string used when 4907 // generating test names (necessary to ensure uniqueness for command 4908 // sequences that use the same command multiple times). This format is 4909 // verbose, so we actually use three different formats in the tests and 4910 // multiTests arrays: 4911 // 4912 // 1) Plain string giving the input HTML. The command is implicit from the 4913 // key of the tests array. If the command takes values, the value is given 4914 // by defaultValues, otherwise it's "". Has to be converted to 4915 // [input HTML, [command, value]. 4916 // 4917 // 2) Two-element array [value, input HTML]. Has to be converted to 4918 // [input HTML, [command, value]]. 4919 // 4920 // 3) An element of multiTests. This just has to have values filled in. 4921 // 4922 // Optionally, a styleWithCss argument can be passed, either true or false. 4923 // If it is, we'll prepend a styleWithCss invocation. 4924 if (command == "multitest") { 4925 if (typeof test == "string") { 4926 test = JSON.parse(test); 4927 } 4928 for (var i = 1; i < test.length; i++) { 4929 if (typeof test[i] == "string" 4930 && test[i] in defaultValues) { 4931 test[i] = [test[i], defaultValues[test[i]]]; 4932 } else if (typeof test[i] == "string") { 4933 test[i] = [test[i], ""]; 4934 } 4935 } 4936 return test; 4937 } 4938 4939 if (typeof test == "string") { 4940 if (command in defaultValues) { 4941 test = [test, [command, defaultValues[command]]]; 4942 } else { 4943 test = [test, [command, ""]]; 4944 } 4945 } else if (test.length == 2) { 4946 test = [test[1], [command, String(test[0])]]; 4947 } 4948 4949 if (styleWithCss !== undefined) { 4950 test.splice(1, 0, ["stylewithcss", String(styleWithCss)]); 4951 } 4952 4953 return test; 4954 } 4955 //@} 4956 4957 function doInputCell(tr, test, command) { 4958 //@{ 4959 var testHtml = test[0]; 4960 4961 var msg = null; 4962 if (command in defaultValues) { 4963 // Single command with a value, possibly with a styleWithCss stuck 4964 // before. We don't need to specify the command itself, since this 4965 // presumably isn't in multiTests, so the command is already given by 4966 // the section header. 4967 msg = 'value: ' + prettyPrint(test[test.length - 1][1]); 4968 } else if (command == "multitest") { 4969 // Uses a different input format 4970 msg = JSON.stringify(test); 4971 } 4972 var inputCell = document.createElement("td"); 4973 inputCell.innerHTML = "<div></div><div></div>"; 4974 inputCell.firstChild.innerHTML = testHtml; 4975 inputCell.lastChild.textContent = inputCell.firstChild.innerHTML; 4976 if (msg !== null) { 4977 inputCell.lastChild.textContent += " (" + msg + ")"; 4978 } 4979 4980 tr.appendChild(inputCell); 4981 } 4982 //@} 4983 4984 function doSpecCell(tr, test, command) { 4985 //@{ 4986 var specCell = document.createElement("td"); 4987 tr.appendChild(specCell); 4988 try { 4989 var points = setupCell(specCell, test[0]); 4990 var range = document.createRange(); 4991 range.setStart(points[0], points[1]); 4992 range.setEnd(points[2], points[3]); 4993 // The points might be backwards 4994 if (range.collapsed) { 4995 range.setEnd(points[0], points[1]); 4996 } 4997 specCell.firstChild.contentEditable = "true"; 4998 specCell.firstChild.spellcheck = false; 4999 5000 if (command != "multitest") { 5001 try { var beforeIndeterm = myQueryCommandIndeterm(command, range) } 5002 catch(e) { beforeIndeterm = "Exception" } 5003 try { var beforeState = myQueryCommandState(command, range) } 5004 catch(e) { beforeState = "Exception" } 5005 try { var beforeValue = myQueryCommandValue(command, range) } 5006 catch(e) { beforeValue = "Exception" } 5007 } 5008 5009 for (var i = 1; i < test.length; i++) { 5010 myExecCommand(test[i][0], false, test[i][1], range); 5011 } 5012 5013 if (command != "multitest") { 5014 try { var afterIndeterm = myQueryCommandIndeterm(command, range) } 5015 catch(e) { afterIndeterm = "Exception" } 5016 try { var afterState = myQueryCommandState(command, range) } 5017 catch(e) { afterState = "Exception" } 5018 try { var afterValue = myQueryCommandValue(command, range) } 5019 catch(e) { afterValue = "Exception" } 5020 } 5021 5022 specCell.firstChild.contentEditable = "inherit"; 5023 specCell.firstChild.removeAttribute("spellcheck"); 5024 var compareDiv1 = specCell.firstChild.cloneNode(true); 5025 5026 // Now do various sanity checks, and throw if they're violated. First 5027 // just count children: 5028 if (specCell.childNodes.length != 2) { 5029 throw "The cell didn't have two children. Did something spill outside the test div?"; 5030 } 5031 5032 // Now verify that the DOM serializes. 5033 compareDiv1.normalize(); 5034 var compareDiv2 = compareDiv1.cloneNode(false); 5035 compareDiv2.innerHTML = compareDiv1.innerHTML; 5036 // Oddly, IE9 sometimes produces two nodes that return true for 5037 // isEqualNode but have different innerHTML (omitting closing tags vs. 5038 // not). 5039 if (!compareDiv1.isEqualNode(compareDiv2) 5040 && compareDiv1.innerHTML != compareDiv2.innerHTML) { 5041 throw "DOM does not round-trip through serialization! " 5042 + compareDiv1.innerHTML + " vs. " + compareDiv2.innerHTML; 5043 } 5044 if (!compareDiv1.isEqualNode(compareDiv2)) { 5045 throw "DOM does not round-trip through serialization (although innerHTML is the same)! " 5046 + compareDiv1.innerHTML; 5047 } 5048 5049 // Check for attributes 5050 if (specCell.firstChild.attributes.length) { 5051 throw "Wrapper div has attributes! " + 5052 specCell.innerHTML.replace(/<div><\/div>$/, ""); 5053 } 5054 5055 // Final sanity check: make sure everything isAllowedChild() of its 5056 // parent. 5057 getDescendants(specCell.firstChild).forEach(function(descendant) { 5058 if (!isAllowedChild(descendant, descendant.parentNode)) { 5059 throw "Something here is not an allowed child of its parent: " + descendant; 5060 } 5061 }); 5062 5063 addBrackets(range); 5064 5065 specCell.lastChild.textContent = specCell.firstChild.innerHTML; 5066 if (command != "multitest") { 5067 specCell.lastChild.appendChild(queryOutputHelper( 5068 beforeIndeterm, beforeState, beforeValue, 5069 afterIndeterm, afterState, afterValue, 5070 command, test[test.length - 1][1])); 5071 if (specCell.querySelector(".bad-result")) { 5072 specCell.parentNode.className = "alert"; 5073 } 5074 } 5075 } catch (e) { 5076 specCell.firstChild.contentEditable = "inherit"; 5077 specCell.firstChild.removeAttribute("spellcheck"); 5078 specCell.lastChild.textContent = "Exception: " + formatException(e); 5079 5080 specCell.parentNode.className = "alert"; 5081 specCell.lastChild.className = "alert"; 5082 5083 // Don't bother comparing to localStorage, this is always wrong no 5084 // matter what. 5085 return; 5086 } 5087 5088 if (command != "multitest") { 5089 // Old storage format 5090 var key = "execcommand-" + command 5091 + "-" + (test.length == 2 || test[1][1] == "false" ? "0" : "1") 5092 + "-" + tr.firstChild.lastChild.textContent; 5093 } else { 5094 var key = "execcommand-" + JSON.stringify(test); 5095 } 5096 5097 // Use getItem() instead of direct property access to work around Firefox 5098 // bug: https://bugzilla.mozilla.org/show_bug.cgi?id=532062 5099 var oldValue = localStorage.getItem(key); 5100 var newValue = specCell.lastChild.firstChild.textContent; 5101 5102 // Ignore differences between {} and []. 5103 if (oldValue === null 5104 || oldValue.replace("{}", "[]") !== newValue.replace("{}", "[]")) { 5105 specCell.parentNode.className = "alert"; 5106 var alertDiv = document.createElement("div"); 5107 specCell.lastChild.appendChild(alertDiv); 5108 alertDiv.className = "alert"; 5109 if (oldValue === null) { 5110 alertDiv.textContent = "Newly added test result"; 5111 } else if (oldValue.replace(/[\[\]{}]/g, "") == newValue.replace(/[\[\]{}]/g, "")) { 5112 alertDiv.textContent = "Last run produced a different selection: " + oldValue; 5113 } else { 5114 alertDiv.textContent = "Last run produced different markup: " + oldValue; 5115 } 5116 5117 var button = document.createElement("button"); 5118 alertDiv.appendChild(button); 5119 button.textContent = "Store new result"; 5120 button.className = "store-new-result"; 5121 button.onclick = (function(key, val, alertDiv) { return function() { 5122 localStorage[key] = val; 5123 // Make it easier to do mass updates, and also to jump to the next 5124 // new result 5125 var buttons = document.getElementsByClassName("store-new-result"); 5126 for (var i = 0; i < buttons.length; i++) { 5127 if (isDescendant(buttons[i], alertDiv) 5128 && i + 1 < buttons.length) { 5129 buttons[i + 1].focus(); 5130 break; 5131 } 5132 } 5133 var td = alertDiv; 5134 while (td.tagName != "TD") { 5135 td = td.parentNode; 5136 } 5137 alertDiv.parentNode.removeChild(alertDiv); 5138 if (!td.querySelector(".alert")) { 5139 td.parentNode.className = (" " + td.parentNode.className + " ") 5140 .replace(/ alert /g, "") 5141 .replace(/^ | $/g, ""); 5142 } 5143 } })(key, newValue, alertDiv); 5144 } 5145 } 5146 //@} 5147 5148 function browserCellException(e, testDiv, browserCell) { 5149 //@{ 5150 if (testDiv) { 5151 testDiv.contenteditable = "inherit"; 5152 testDiv.removeAttribute("spellcheck"); 5153 } 5154 browserCell.lastChild.className = "alert"; 5155 browserCell.lastChild.textContent = "Exception: " + formatException(e); 5156 if (testDiv && testDiv.parentNode != browserCell) { 5157 browserCell.insertBefore(testDiv, browserCell.firstChild); 5158 } 5159 } 5160 //@} 5161 5162 function formatException(e) { 5163 //@{ 5164 if (typeof e == "object" && "stack" in e) { 5165 return e + " (stack: " + e.stack + ")"; 5166 } 5167 return String(e); 5168 } 5169 //@} 5170 5171 function doSameCell(tr) { 5172 //@{ 5173 tr.className = (" " + tr.className + " ").replace(" active ", "").trim(); 5174 if (tr.className == "") { 5175 tr.removeAttribute("class"); 5176 } 5177 5178 var sameCell = document.createElement("td"); 5179 if (!document.querySelector("#browser-checkbox").checked) { 5180 sameCell.className = "maybe"; 5181 sameCell.textContent = "?"; 5182 } else { 5183 var exception = false; 5184 try { 5185 // Ad hoc normalization to avoid basically spurious mismatches. For 5186 // now this includes ignoring where the selection goes. 5187 var normalizedSpecCell = tr.childNodes[1].lastChild.firstChild.textContent 5188 .replace(/[[\]{}]/g, "") 5189 .replace(/ style="margin: 0 0 0 40px; border: none; padding: 0px;"/g, '') 5190 .replace(/ style="margin-right: 0px;" dir="ltr"/g, '') 5191 .replace(/ style="margin-left: 0px;" dir="rtl"/g, '') 5192 .replace(/ style="margin-(left|right): 40px;"/g, '') 5193 .replace(/: /g, ":") 5194 .replace(/;? ?"/g, '"') 5195 .replace(/<(\/?)strong/g, '<$1b') 5196 .replace(/<(\/?)strike/g, '<$1s') 5197 .replace(/<(\/?)em/g, '<$1i') 5198 .replace(/#[0-9a-fA-F]{6}/g, function(match) { return match.toUpperCase(); }); 5199 var normalizedBrowserCell = tr.childNodes[2].lastChild.firstChild.textContent 5200 .replace(/[[\]{}]/g, "") 5201 .replace(/ style="margin: 0 0 0 40px; border: none; padding: 0px;"/g, '') 5202 .replace(/ style="margin-right: 0px;" dir="ltr"/g, '') 5203 .replace(/ style="margin-left: 0px;" dir="rtl"/g, '') 5204 .replace(/ style="margin-(left|right): 40px;"/g, '') 5205 .replace(/: /g, ":") 5206 .replace(/;? ?"/g, '"') 5207 .replace(/<(\/?)strong/g, '<$1b') 5208 .replace(/<(\/?)strike/g, '<$1s') 5209 .replace(/<(\/?)em/g, '<$1i') 5210 .replace(/#[0-9a-fA-F]{6}/g, function(match) { return match.toUpperCase(); }) 5211 .replace(/ size="2" width="100%"/g, ''); 5212 if (navigator.userAgent.indexOf("MSIE") != -1) { 5213 // IE produces <font style> instead of <span style>, so let's 5214 // translate all <span>s to <font>s. 5215 normalizedSpecCell = normalizedSpecCell 5216 .replace(/<(\/?)span/g, '<$1font'); 5217 normalizedBrowserCell = normalizedBrowserCell 5218 .replace(/<(\/?)span/g, '<$1font'); 5219 } 5220 } catch (e) { 5221 exception = true; 5222 } 5223 if (!exception && normalizedSpecCell == normalizedBrowserCell) { 5224 sameCell.className = "yes"; 5225 sameCell.textContent = "\u2713"; 5226 } else { 5227 sameCell.className = "no"; 5228 sameCell.textContent = "\u2717"; 5229 } 5230 } 5231 tr.appendChild(sameCell); 5232 5233 for (var i = 0; i <= 2; i++) { 5234 // Insert <wbr> so IE doesn't stretch the screen. This is considerably 5235 // more complicated than it has to be, thanks to Firefox's lack of 5236 // support for outerHTML. 5237 var div = tr.childNodes[i].lastChild; 5238 if (div.firstChild) { 5239 var text = div.firstChild.textContent; 5240 div.removeChild(div.firstChild); 5241 div.insertBefore(document.createElement("div"), div.firstChild); 5242 div.firstChild.innerHTML = text 5243 .replace(/&/g, "&") 5244 .replace(/</g, "<") 5245 .replace(/>/g, "><wbr>") 5246 .replace(/</g, "<wbr><"); 5247 while (div.firstChild.hasChildNodes()) { 5248 div.insertBefore(div.firstChild.lastChild, div.firstChild.nextSibling); 5249 } 5250 div.removeChild(div.firstChild); 5251 } 5252 5253 // Add position: absolute span to not affect vertical layout 5254 getDescendants(tr.childNodes[i].firstChild) 5255 .filter(function(node) { 5256 return node.nodeType == Node.TEXT_NODE 5257 && /^(\{\}?|\})$/.test(node.data); 5258 }).forEach(function(node) { 5259 var span = document.createElement("span"); 5260 span.style.position = "absolute"; 5261 span.textContent = node.data; 5262 node.parentNode.insertBefore(span, node); 5263 node.parentNode.removeChild(node); 5264 }); 5265 } 5266 } 5267 //@} 5268 5269 function doTearDown(command) { 5270 //@{ 5271 getSelection().removeAllRanges(); 5272 } 5273 //@} 5274 5275 function setupCell(cell, html) { 5276 //@{ 5277 cell.innerHTML = "<div></div><div></div>"; 5278 5279 return setupDiv(cell.firstChild, html); 5280 } 5281 //@} 5282 5283 function setupDiv(node, html) { 5284 //@{ 5285 // A variety of checks to avoid simple errors. Not foolproof, of course. 5286 var re = /\{|\[|data-start/g; 5287 var markers = []; 5288 var marker; 5289 while (marker = re.exec(html)) { 5290 markers.push(marker); 5291 } 5292 if (markers.length != 1) { 5293 throw "Need exactly one start marker ([ or { or data-start), found " + markers.length; 5294 } 5295 5296 var re = /\}|\]|data-end/g; 5297 var markers = []; 5298 var marker; 5299 while (marker = re.exec(html)) { 5300 markers.push(marker); 5301 } 5302 if (markers.length != 1) { 5303 throw "Need exactly one end marker (] or } or data-end), found " + markers.length; 5304 } 5305 5306 node.innerHTML = html; 5307 5308 var startNode, startOffset, endNode, endOffset; 5309 5310 // For braces that don't lie inside text nodes, we can't just set 5311 // innerHTML, because that might disturb the DOM. For instance, if the 5312 // brace is right before a <tr>, it could get moved outside the table 5313 // entirely, which messes everything up pretty badly. So we instead 5314 // allow using data attributes: data-start and data-end on the start and 5315 // end nodes, with a numeric value indicating the offset. This format 5316 // doesn't allow the parent div to be a start or end node, but in that case 5317 // you can always use the curly braces. 5318 if (node.querySelector("[data-start]")) { 5319 startNode = node.querySelector("[data-start]"); 5320 startOffset = startNode.getAttribute("data-start"); 5321 startNode.removeAttribute("data-start"); 5322 } 5323 if (node.querySelector("[data-end]")) { 5324 endNode = node.querySelector("[data-end]"); 5325 endOffset = endNode.getAttribute("data-end"); 5326 endNode.removeAttribute("data-end"); 5327 } 5328 5329 var cur = node; 5330 while (true) { 5331 if (!cur || (cur != node && !(cur.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINS))) { 5332 break; 5333 } 5334 5335 if (cur.nodeType != Node.TEXT_NODE) { 5336 cur = nextNode(cur); 5337 continue; 5338 } 5339 5340 var data = cur.data.replace(/\]/g, ""); 5341 var startIdx = data.indexOf("["); 5342 5343 data = cur.data.replace(/\[/g, ""); 5344 var endIdx = data.indexOf("]"); 5345 5346 cur.data = cur.data.replace(/[\[\]]/g, ""); 5347 5348 if (startIdx != -1) { 5349 startNode = cur; 5350 startOffset = startIdx; 5351 } 5352 5353 if (endIdx != -1) { 5354 endNode = cur; 5355 endOffset = endIdx; 5356 } 5357 5358 // These are only legal as the first or last 5359 data = cur.data.replace(/\}/g, ""); 5360 var elStartIdx = data.indexOf("{"); 5361 5362 data = cur.data.replace(/\{/g, ""); 5363 var elEndIdx = data.indexOf("}"); 5364 5365 if (elStartIdx == 0) { 5366 startNode = cur.parentNode; 5367 startOffset = getNodeIndex(cur); 5368 } else if (elStartIdx != -1) { 5369 startNode = cur.parentNode; 5370 startOffset = getNodeIndex(cur) + 1; 5371 } 5372 if (elEndIdx == 0) { 5373 endNode = cur.parentNode; 5374 endOffset = getNodeIndex(cur); 5375 } else if (elEndIdx != -1) { 5376 endNode = cur.parentNode; 5377 endOffset = getNodeIndex(cur) + 1; 5378 } 5379 5380 cur.data = cur.data.replace(/[{}]/g, ""); 5381 if (!cur.data.length) { 5382 if (cur == startNode || cur == endNode) { 5383 throw "You put a square bracket where there was no text node . . ."; 5384 } 5385 var oldCur = cur; 5386 cur = nextNode(cur); 5387 oldCur.parentNode.removeChild(oldCur); 5388 } else { 5389 cur = nextNode(cur); 5390 } 5391 } 5392 5393 return [startNode, startOffset, endNode, endOffset]; 5394 } 5395 //@} 5396 5397 function setSelection(startNode, startOffset, endNode, endOffset) { 5398 //@{ 5399 if (navigator.userAgent.indexOf("Opera") != -1) { 5400 // Yes, browser sniffing is evil, but I can't be bothered to debug 5401 // Opera. 5402 var range = document.createRange(); 5403 range.setStart(startNode, startOffset); 5404 range.setEnd(endNode, endOffset); 5405 if (range.collapsed) { 5406 range.setEnd(startNode, startOffset); 5407 } 5408 getSelection().removeAllRanges(); 5409 getSelection().addRange(range); 5410 } else if ("extend" in getSelection()) { 5411 // WebKit behaves unreasonably for collapse(), so do that manually. 5412 /* 5413 var range = document.createRange(); 5414 range.setStart(startNode, startOffset); 5415 getSelection().removeAllRanges(); 5416 getSelection().addRange(range); 5417 */ 5418 getSelection().collapse(startNode, startOffset); 5419 getSelection().extend(endNode, endOffset); 5420 } else { 5421 // IE9. Selections have no direction, so we just make the selection 5422 // always forwards. 5423 var range; 5424 if (getSelection().rangeCount) { 5425 range = getSelection().getRangeAt(0); 5426 } else { 5427 range = document.createRange(); 5428 } 5429 range.setStart(startNode, startOffset); 5430 range.setEnd(endNode, endOffset); 5431 if (range.collapsed) { 5432 // Phooey, we got them backwards. 5433 range.setEnd(startNode, startOffset); 5434 } 5435 if (!getSelection().rangeCount) { 5436 getSelection().addRange(range); 5437 } 5438 } 5439 } 5440 //@} 5441 5442 /** 5443 * Add brackets at the start and end points of the given range, so that they're 5444 * visible. 5445 */ 5446 function addBrackets(range) { 5447 //@{ 5448 // Handle the collapsed case specially, to avoid confusingly getting the 5449 // markers backwards in some cases 5450 if (range.startContainer.nodeType == Node.TEXT_NODE 5451 || range.startContainer.nodeType == Node.COMMENT_NODE) { 5452 if (range.collapsed) { 5453 range.startContainer.insertData(range.startOffset, "[]"); 5454 } else { 5455 range.startContainer.insertData(range.startOffset, "["); 5456 } 5457 } else { 5458 var marker = range.collapsed ? "{}" : "{"; 5459 if (range.startOffset != range.startContainer.childNodes.length 5460 && range.startContainer.childNodes[range.startOffset].nodeType == Node.TEXT_NODE) { 5461 range.startContainer.childNodes[range.startOffset].insertData(0, marker); 5462 } else if (range.startOffset != 0 5463 && range.startContainer.childNodes[range.startOffset - 1].nodeType == Node.TEXT_NODE) { 5464 range.startContainer.childNodes[range.startOffset - 1].appendData(marker); 5465 } else { 5466 // Seems to serialize as I'd want even for tables . . . IE doesn't 5467 // allow undefined to be passed as the second argument (it throws 5468 // an exception), so we have to explicitly check the number of 5469 // children and pass null. 5470 range.startContainer.insertBefore(document.createTextNode(marker), 5471 range.startContainer.childNodes.length == range.startOffset 5472 ? null 5473 : range.startContainer.childNodes[range.startOffset]); 5474 } 5475 } 5476 if (range.collapsed) { 5477 return; 5478 } 5479 if (range.endContainer.nodeType == Node.TEXT_NODE 5480 || range.endContainer.nodeType == Node.COMMENT_NODE) { 5481 range.endContainer.insertData(range.endOffset, "]"); 5482 } else { 5483 if (range.endOffset != range.endContainer.childNodes.length 5484 && range.endContainer.childNodes[range.endOffset].nodeType == Node.TEXT_NODE) { 5485 range.endContainer.childNodes[range.endOffset].insertData(0, "}"); 5486 } else if (range.endOffset != 0 5487 && range.endContainer.childNodes[range.endOffset - 1].nodeType == Node.TEXT_NODE) { 5488 range.endContainer.childNodes[range.endOffset - 1].appendData("}"); 5489 } else { 5490 range.endContainer.insertBefore(document.createTextNode("}"), 5491 range.endContainer.childNodes.length == range.endOffset 5492 ? null 5493 : range.endContainer.childNodes[range.endOffset]); 5494 } 5495 } 5496 } 5497 //@} 5498 5499 function normalizeSerializedStyle(wrapper) { 5500 //@{ 5501 // Inline CSS attribute serialization has terrible interop, so we fix 5502 // things up a bit to avoid spurious mismatches. This needs to be removed 5503 // once CSSOM defines this stuff properly, but for now there's just no 5504 // standard for any of it. This only normalizes descendants of wrapper, 5505 // not wrapper itself. 5506 [].forEach.call(wrapper.querySelectorAll("[style]"), function(node) { 5507 if (node.style.color != "") { 5508 var newColor = normalizeColor(node.style.color); 5509 node.style.color = ""; 5510 node.style.color = newColor; 5511 } 5512 if (node.style.backgroundColor != "") { 5513 var newBackgroundColor = normalizeColor(node.style.backgroundColor); 5514 node.style.backgroundColor = ""; 5515 node.style.backgroundColor = newBackgroundColor; 5516 } 5517 node.setAttribute("style", node.getAttribute("style") 5518 // Random spacing differences 5519 .replace(/; ?$/, "") 5520 .replace(/: /g, ":") 5521 // Gecko likes "transparent" 5522 .replace(/transparent/g, "rgba(0, 0, 0, 0)") 5523 // WebKit likes to look overly precise 5524 .replace(/, 0.496094\)/g, ", 0.5)") 5525 // Gecko converts anything with full alpha to "transparent" which 5526 // then becomes "rgba(0, 0, 0, 0)", so we have to make other 5527 // browsers match 5528 .replace(/rgba\([0-9]+, [0-9]+, [0-9]+, 0\)/g, "rgba(0, 0, 0, 0)") 5529 ); 5530 }); 5531 } 5532 //@} 5533 5534 /** 5535 * Input is in the following format: 5536 * [input HTML, 5537 * array of commands, 5538 * expected output HTML, 5539 * array of expected execCommand() return values, 5540 * object of expected indeterm/state/value]. 5541 * The array of commands is [[command, value, optionalDesc], [command, value, 5542 * optionalDesc], ...]. optionalDesc is appended to the description of the 5543 * test in the generated test name. 5544 * 5545 * The 5546 * array of expected execCommand() return values is [true|false, true|false, 5547 * ...], where the indices match those in the array of commands. The 5548 * indeterm/state/value object is of the form 5549 * {command: [expected indeterm before, expected state before, 5550 * expected value before, expected indeterm after, 5551 * expected state after, expected value after], 5552 * command: ... } 5553 * null for any of the last six entries means an INVALID_ACCESS_ERR must be 5554 * raised. 5555 */ 5556 function runConformanceTest(browserTest) { 5557 //@{ 5558 document.getElementById("test-container").innerHTML = "<div contenteditable></div><p>test"; 5559 var testName = JSON.stringify(browserTest[1]) + " " + format_value(browserTest[0]); 5560 var testDiv = document.querySelector("div[contenteditable]"); 5561 var originalRootElement, newRootElement; 5562 var exception = null; 5563 var expectedExecCommandReturnValues = browserTest[3]; 5564 var expectedQueryResults = browserTest[4]; 5565 var actualQueryResults = {}; 5566 var actualQueryExceptions = {}; 5567 var subtestName; 5568 5569 try { 5570 var points = setupDiv(testDiv, browserTest[0]); 5571 5572 var range = document.createRange(); 5573 range.setStart(points[0], points[1]); 5574 range.setEnd(points[2], points[3]); 5575 // The points might be backwards 5576 if (range.collapsed) { 5577 range.setEnd(points[0], points[1]); 5578 } 5579 getSelection().removeAllRanges(); 5580 getSelection().addRange(range); 5581 5582 var originalRootElement = document.documentElement.cloneNode(true); 5583 originalRootElement.querySelector("[contenteditable]").parentNode 5584 .removeChild(originalRootElement.querySelector("[contenteditable]")); 5585 originalRootElement.querySelector("#log").parentNode 5586 .removeChild(originalRootElement.querySelector("#log")); 5587 5588 for (var command in expectedQueryResults) { 5589 var results = []; 5590 var exceptions = {}; 5591 try { results[0] = document.queryCommandIndeterm(command) } 5592 catch(e) { exceptions[0] = e } 5593 try { results[1] = document.queryCommandState(command) } 5594 catch(e) { exceptions[1] = e } 5595 try { results[2] = document.queryCommandValue(command) } 5596 catch(e) { exceptions[2] = e } 5597 actualQueryResults[command] = results; 5598 actualQueryExceptions[command] = exceptions; 5599 } 5600 } catch(e) { 5601 exception = e; 5602 } 5603 5604 for (var i = 0; i < browserTest[1].length; i++) { 5605 subtestName = testName + ": execCommand(" + 5606 format_value(browserTest[1][i][0]) + ", false, " + 5607 format_value(browserTest[1][i][1]) + ") " + 5608 (browserTest[1][i][2] ? browserTest[1][i][2] + " " : "") + 5609 "return value" 5610 subsetTest(test, function() { 5611 assert_equals(exception, null, "Setup must not throw an exception"); 5612 5613 assert_equals(document.execCommand(browserTest[1][i][0], false, browserTest[1][i][1]), 5614 expectedExecCommandReturnValues[i]); 5615 }, subtestName); 5616 } 5617 5618 if (exception === null) { 5619 try { 5620 for (var command in expectedQueryResults) { 5621 var results = actualQueryResults[command]; 5622 var exceptions = actualQueryExceptions[command]; 5623 try { results[3] = document.queryCommandIndeterm(command) } 5624 catch(e) { exceptions[3] = e } 5625 try { results[4] = document.queryCommandState(command) } 5626 catch(e) { exceptions[4] = e } 5627 try { results[5] = document.queryCommandValue(command) } 5628 catch(e) { exceptions[5] = e } 5629 } 5630 5631 var newRootElement = document.documentElement.cloneNode(true); 5632 newRootElement.querySelector("[contenteditable]").parentNode 5633 .removeChild(newRootElement.querySelector("[contenteditable]")); 5634 newRootElement.querySelector("#log").parentNode 5635 .removeChild(newRootElement.querySelector("#log")); 5636 5637 normalizeSerializedStyle(testDiv); 5638 } catch(e) { 5639 exception = e; 5640 } 5641 } 5642 5643 subsetTest(test, function() { 5644 assert_equals(exception, null, "Setup must not throw an exception"); 5645 5646 // Now test for modifications to non-editable content. First just 5647 // count children: 5648 assert_equals(testDiv.parentNode.childNodes.length, 2, 5649 "The parent div must have two children. Did something spill outside the test div?"); 5650 5651 // Check for attributes 5652 assert_equals(testDiv.attributes.length, 1, 5653 'Wrapper div must have only one attribute (<div contenteditable="">), but has more (' + 5654 formatStartTag(testDiv) + ")"); 5655 5656 assert_equals(document.body.attributes.length, 0, 5657 "Body element must have no attributes (<body>), but has more (" + 5658 formatStartTag(document.body) + ")"); 5659 5660 // Check that in general, nothing outside the test div was modified. 5661 // TODO: Less verbose error reporting, the way some of the range tests 5662 // do? 5663 assert_equals(newRootElement.innerHTML, originalRootElement.innerHTML, 5664 "Everything outside the editable div must be unchanged, but some change did occur"); 5665 }, testName + " checks for modifications to non-editable content"); 5666 5667 subsetTest(test, function() { 5668 assert_equals(exception, null, "Setup must not throw an exception"); 5669 5670 if (Array.isArray(browserTest[2])) { 5671 var expectedInnerHTMLArray = []; 5672 browserTest[2].forEach(function (expectedInnerHTML) { 5673 expectedInnerHTMLArray.push(expectedInnerHTML.replace(/[\[\]{}]/g, "")); 5674 }); 5675 assert_in_array(testDiv.innerHTML, 5676 expectedInnerHTMLArray, 5677 "Unexpected innerHTML (after normalizing inline style)"); 5678 } else { 5679 assert_equals(testDiv.innerHTML, 5680 browserTest[2].replace(/[\[\]{}]/g, ""), 5681 "Unexpected innerHTML (after normalizing inline style)"); 5682 } 5683 }, testName + " compare innerHTML"); 5684 5685 for (var command in expectedQueryResults) { 5686 var descriptions = [ 5687 'queryCommandIndeterm("' + command + '") before', 5688 'queryCommandState("' + command + '") before', 5689 'queryCommandValue("' + command + '") before', 5690 'queryCommandIndeterm("' + command + '") after', 5691 'queryCommandState("' + command + '") after', 5692 'queryCommandValue("' + command + '") after', 5693 ]; 5694 for (var i = 0; i < 6; i++) { 5695 subsetTest(test, function() { 5696 assert_equals(exception, null, "Setup must not throw an exception"); 5697 5698 if (expectedQueryResults[command][i] === null) { 5699 // Some ad hoc tests to verify that we have a real 5700 // DOMException. FIXME: This should be made more rigorous, 5701 // with clear steps specified for checking that something 5702 // is really a DOMException. 5703 assert_true(i in actualQueryExceptions[command], 5704 "An exception must be thrown in this case"); 5705 var e = actualQueryExceptions[command][i]; 5706 assert_equals(typeof e, "object", 5707 "typeof thrown object"); 5708 assert_idl_attribute(e, "code", 5709 "Thrown object must be a DOMException"); 5710 assert_idl_attribute(e, "INVALID_ACCESS_ERR", 5711 "Thrown object must be a DOMException"); 5712 assert_equals(e.code, e.INVALID_ACCESS_ERR, 5713 "Thrown object must be an INVALID_ACCESS_ERR, so its .code and .INVALID_ACCESS_ERR attributes must be equal"); 5714 } else if ((i == 2 || i == 5) 5715 && (command == "backcolor" || command == "forecolor" || command == "hilitecolor") 5716 && typeof actualQueryResults[command][i] == "string") { 5717 assert_false(i in actualQueryExceptions[command], 5718 "An exception must not be thrown in this case"); 5719 // We don't return the format that the color should be in: 5720 // that's up to CSSOM. Thus we normalize before comparing. 5721 assert_equals(normalizeColor(actualQueryResults[command][i]), 5722 expectedQueryResults[command][i], 5723 "Wrong result returned (after color normalization)"); 5724 } else { 5725 assert_false(i in actualQueryExceptions[command], 5726 "An exception must not be thrown in this case"); 5727 assert_equals(actualQueryResults[command][i], 5728 expectedQueryResults[command][i], 5729 "Wrong result returned"); 5730 } 5731 }, testName + " " + descriptions[i]); 5732 } 5733 } 5734 5735 // Silly Firefox 5736 document.body.removeAttribute("bgcolor"); 5737 } 5738 //@} 5739 5740 /** 5741 * Return a string like '<body bgcolor="#FFFFFF">'. 5742 */ 5743 function formatStartTag(el) { 5744 //@{ 5745 var ret = "<" + el.tagName.toLowerCase(); 5746 for (var i = 0; i < el.attributes.length; i++) { 5747 ret += " " + el.attributes[i].name + '="'; 5748 ret += el.attributes[i].value.replace(/\&/g, "&") 5749 .replace(/"/g, """); 5750 ret += '"'; 5751 } 5752 return ret + ">"; 5753 } 5754 //@} 5755 5756 // vim: foldmarker=@{,@} foldmethod=marker