Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
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 //@}
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>";
37 document.body.appendChild(toolbarDiv);
38 })();
39 //@}
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";
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();
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 }
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>}',
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>',
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>}',
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',
129 'foo{<b></b>}baz',
130 'foo{<i></i>}baz',
131 'foo{<b><i></i></b>}baz',
132 'foo{<i><b></b></i>}baz',
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 'foo<span style="font-weight: bold">[bar</span>]baz',
143 '<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>',
144 '<b><p>foo[<i>bar</i>}</p><p>baz</p></b>',
146 'foo [bar <b>baz] qoz</b> quz sic',
147 'foo bar <b>baz [qoz</b> quz] sic',
149 '<b id=purple>bar [baz] qoz</b>',
151 'foo<span style="font-weight: 100">[bar]</span>baz',
152 'foo<span style="font-weight: 200">[bar]</span>baz',
153 'foo<span style="font-weight: 300">[bar]</span>baz',
154 'foo<span style="font-weight: 400">[bar]</span>baz',
155 'foo<span style="font-weight: 500">[bar]</span>baz',
156 'foo<span style="font-weight: 600">[bar]</span>baz',
157 'foo<span style="font-weight: 700">[bar]</span>baz',
158 'foo<span style="font-weight: 800">[bar]</span>baz',
159 'foo<span style="font-weight: 900">[bar]</span>baz',
160 'foo<span style="font-weight: 400">[bar</span>]baz',
161 'foo<span style="font-weight: 700">[bar</span>]baz',
162 'foo[<span style="font-weight: 400">bar]</span>baz',
163 'foo[<span style="font-weight: 700">bar]</span>baz',
164 'foo[<span style="font-weight: 400">bar</span>]baz',
165 'foo[<span style="font-weight: 700">bar</span>]baz',
166 '<span style="font-weight: 100">foo[bar]baz</span>',
167 '<span style="font-weight: 400">foo[bar]baz</span>',
168 '<span style="font-weight: 700">foo[bar]baz</span>',
169 '<span style="font-weight: 900">foo[bar]baz</span>',
170 '{<span style="font-weight: 100">foobar]baz</span>',
171 '{<span style="font-weight: 400">foobar]baz</span>',
172 '{<span style="font-weight: 700">foobar]baz</span>',
173 '{<span style="font-weight: 900">foobar]baz</span>',
174 '<span style="font-weight: 100">foo[barbaz</span>}',
175 '<span style="font-weight: 400">foo[barbaz</span>}',
176 '<span style="font-weight: 700">foo[barbaz</span>}',
177 '<span style="font-weight: 900">foo[barbaz</span>}',
179 '<h3>foo[bar]baz</h3>',
180 '{<h3>foobar]baz</h3>',
181 '<h3>foo[barbaz</h3>}',
182 '<h3>[foobarbaz]</h3>',
183 '{<h3>foobarbaz]</h3>',
184 '<h3>[foobarbaz</h3>}',
185 '{<h3>foobarbaz</h3>}',
187 '<b>foo<span style="font-weight: normal">bar<b>[baz]</b>quz</span>qoz</b>',
188 '<b>foo<span style="font-weight: normal">[bar]</span>baz</b>',
190 '{<b>foo</b> <b>bar</b>}',
191 '{<h3>foo</h3><b>bar</b>}',
193 '<i><b>foo</b></i>[bar]<i><b>baz</b></i>',
194 '<i><b>foo</b></i>[bar]<b>baz</b>',
195 '<b>foo</b>[bar]<i><b>baz</b></i>',
196 '<font color=blue face=monospace><b>foo</b></font>[bar]',
198 'foo<span style="font-weight: normal"><b>{bar}</b></span>baz',
199 '[foo<span class=notbold>bar</span>baz]',
200 '<b><span class=notbold>[foo]</span></b>',
201 '<b><span class=notbold>foo[bar]baz</span></b>',
203 '<p style="font-weight: bold">foo[bar]baz</p>',
205 // Tests for queryCommandIndeterm() and queryCommandState()
206 'fo[o<b>b]ar</b>baz',
207 'foo<b>ba[r</b>b]az',
208 'fo[o<b>bar</b>b]az',
209 'foo[<b>b]ar</b>baz',
210 'foo<b>ba[r</b>]baz',
211 'foo[<b>bar</b>]baz',
212 'foo<b>[bar]</b>baz',
213 'foo{<b>bar</b>}baz',
214 'fo[o<span style=font-weight:bold>b]ar</span>baz',
215 '<span style=font-weight:800>fo[o</span><span style=font-weight:900>b]ar</span>',
216 '<span style=font-weight:700>fo[o</span><span style=font-weight:800>b]ar</span>',
217 '<span style=font-weight:600>fo[o</span><span style=font-weight:700>b]ar</span>',
218 '<span style=font-weight:500>fo[o</span><span style=font-weight:600>b]ar</span>',
219 '<span style=font-weight:400>fo[o</span><span style=font-weight:500>b]ar</span>',
220 '<span style=font-weight:300>fo[o</span><span style=font-weight:400>b]ar</span>',
221 '<span style=font-weight:200>fo[o</span><span style=font-weight:300>b]ar</span>',
222 '<span style=font-weight:100>fo[o</span><span style=font-weight:200>b]ar</span>',
223 ],
224 //@}
225 createlink: [
226 //@{
227 'foo[]bar',
228 '<p>[foo</p> <p>bar]</p>',
229 '<span>[foo</span> <span>bar]</span>',
230 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
231 '<p>[foo<p><br><p>bar]',
232 '<b>foo[]bar</b>',
233 '<i>foo[]bar</i>',
234 '<span>foo</span>{}<span>bar</span>',
235 '<span>foo[</span><span>]bar</span>',
236 'foo[bar]baz',
237 'foo[bar<b>baz]qoz</b>quz',
238 'foo[bar<i>baz]qoz</i>quz',
239 '{<p><p> <p>foo</p>}',
241 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
242 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
243 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
244 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
245 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
246 '{<table><tr><td>foo<td>bar<td>baz</table>}',
248 '<a href=http://www.google.com/>foo[bar]baz</a>',
249 '<a href=http://www.google.com/>foo[barbaz</a>}',
250 '{<a href=http://www.google.com/>foobar]baz</a>',
251 '{<a href=http://www.google.com/>foobarbaz</a>}',
252 '<a href=http://www.google.com/>[foobarbaz]</a>',
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 'foo<a href=http://www.google.com/>[bar</a>baz]',
259 '[foo<a href=http://www.google.com/>bar]</a>baz',
260 '[foo<a href=http://www.google.com/>bar</a>baz]',
262 '<a href=otherurl>foo[bar]baz</a>',
263 '<a href=otherurl>foo[barbaz</a>}',
264 '{<a href=otherurl>foobar]baz</a>',
265 '{<a href=otherurl>foobarbaz</a>}',
266 '<a href=otherurl>[foobarbaz]</a>',
268 'foo<a href=otherurl>[bar]</a>baz',
269 'foo[<a href=otherurl>bar</a>]baz',
270 'foo<a href=otherurl>[bar</a>baz]',
271 '[foo<a href=otherurl>bar]</a>baz',
272 '[foo<a href=otherurl>bar</a>baz]',
274 '<a href=otherurl><b>foo[bar]baz</b></a>',
275 '<a href=otherurl><b>foo[barbaz</b></a>}',
276 '{<a href=otherurl><b>foobar]baz</b></a>',
277 '<a href=otherurl><b>[foobarbaz]</b></a>',
279 '<a name=abc>foo[bar]baz</a>',
280 '<a name=abc><b>foo[bar]baz</b></a>',
282 ['', 'foo[bar]baz'],
283 ],
284 //@}
285 // Opera requires this to be quoted, contrary to ES5 11.1.5 which allows
286 // PropertyName to be any IdentifierName, and see 7.6 which defines
287 // IdentifierName to include ReservedWord; Identifier excludes it.
288 "delete": [
289 //@{
290 // Collapsed selection
291 //
292 // These three commented-out test call Firefox 5.0a2 to blow up, not
293 // just throwing exceptions on the tests themselves but on many
294 // subsequent tests too.
295 //'[]foo',
296 //'<span>[]foo</span>',
297 //'<p>[]foo</p>',
298 'foo[]bar',
299 '<span>foo</span>{}<span>bar</span>',
300 '<span>foo[</span><span>]bar</span>',
301 'foo<span style=display:none>bar</span>[]baz',
302 'foo<script>bar</script>[]baz',
304 'foö[]bar',
305 'foö[]bar',
306 'foö̧[]bar',
307 'ö[]bar',
308 'ö[]bar',
309 'ö̧[]bar',
311 'שָׁ[]לוֹם',
312 'שָׁלוֹ[]ם',
314 '<p>foo</p><p>[]bar</p>',
315 '<p>foo</p>[]bar',
316 'foo<p>[]bar</p>',
317 '<p>foo<br></p><p>[]bar</p>',
318 '<p>foo<br></p>[]bar',
319 'foo<br><p>[]bar</p>',
320 '<p>foo<br><br></p><p>[]bar</p>',
321 '<p>foo<br><br></p>[]bar',
322 'foo<br><br><p>[]bar</p>',
324 '<div><p>foo</p></div><p>[]bar</p>',
325 '<p>foo</p><div><p>[]bar</p></div>',
326 '<div><p>foo</p></div><div><p>[]bar</p></div>',
327 '<div><p>foo</p></div>[]bar',
328 'foo<div><p>[]bar</p></div>',
330 '<div>foo</div><div>[]bar</div>',
331 '<pre>foo</pre>[]bar',
333 'foo<br>[]bar',
334 'foo<br><b>[]bar</b>',
335 'foo<hr>[]bar',
336 '<p>foo<hr><p>[]bar',
337 '<p>foo</p><br><p>[]bar</p>',
338 '<p>foo</p><br><br><p>[]bar</p>',
339 '<p>foo</p><img src=/img/lion.svg><p>[]bar',
340 'foo<img src=/img/lion.svg>[]bar',
342 '<a>foo</a>[]bar',
343 '<a href=/>foo</a>[]bar',
344 '<a name=abc>foo</a>[]bar',
345 '<a href=/ name=abc>foo</a>[]bar',
346 '<span><a>foo</a></span>[]bar',
347 '<span><a href=/>foo</a></span>[]bar',
348 '<span><a name=abc>foo</a></span>[]bar',
349 '<span><a href=/ name=abc>foo</a></span>[]bar',
350 'foo<a>[]bar</a>',
351 'foo<a href=/>[]bar</a>',
352 'foo<a name=abc>[]bar</a>',
353 'foo<a href=/ name=abc>[]bar</a>',
355 'foo []',
356 ' [] foo',
357 'foo []bar',
358 'foo []bar',
359 'foo []bar',
360 'foo []bar',
361 'foo [] bar',
362 'foo [] bar',
363 'foo []bar',
364 'foo []<span> </span> bar',
365 'foo <span> </span>[] bar',
366 'foo <span> </span> []bar',
367 '<b>foo </b> []bar',
368 '<b>foo </b> []bar',
369 '<b>foo </b> []bar',
370 '<b>foo </b> []bar',
371 '<p>foo </p><p>[] bar</p>',
373 '<pre>foo []</pre>',
374 '<pre> [] foo</pre>',
375 '<pre>foo []bar</pre>',
376 '<pre>foo []bar</pre>',
377 '<pre>foo []bar</pre>',
379 '<div style=white-space:pre>foo []</div>',
380 '<div style=white-space:pre> [] foo</div>',
381 '<div style=white-space:pre>foo []bar</div>',
382 '<div style=white-space:pre>foo []bar</div>',
383 '<div style=white-space:pre>foo []bar</div>',
385 '<div style=white-space:pre-wrap>foo []</div>',
386 '<div style=white-space:pre-wrap> [] foo</div>',
387 '<div style=white-space:pre-wrap>foo []bar</div>',
388 '<div style=white-space:pre-wrap>foo []bar</div>',
389 '<div style=white-space:pre-wrap>foo []bar</div>',
391 '<div style=white-space:pre-line>foo []</div>',
392 '<div style=white-space:pre-line> [] foo</div>',
393 '<div style=white-space:pre-line>foo []bar</div>',
394 '<div style=white-space:pre-line>foo []bar</div>',
395 '<div style=white-space:pre-line>foo []bar</div>',
397 '<div style=white-space:nowrap>foo []</div>',
398 '<div style=white-space:nowrap> [] foo</div>',
399 '<div style=white-space:nowrap>foo []bar</div>',
400 '<div style=white-space:nowrap>foo []bar</div>',
401 '<div style=white-space:nowrap>foo []bar</div>',
403 // Tables with collapsed selection
404 'foo<table><tr><td>[]bar</table>baz',
405 'foo<table><tr><td>bar</table>[]baz',
406 '<p>foo<table><tr><td>[]bar</table><p>baz',
407 '<p>foo<table><tr><td>bar</table><p>[]baz',
408 '<table><tr><td>foo<td>[]bar</table>',
409 '<table><tr><td>foo<tr><td>[]bar</table>',
411 'foo<br><table><tr><td>[]bar</table>baz',
412 'foo<table><tr><td>bar<br></table>[]baz',
413 '<p>foo<br><table><tr><td>[]bar</table><p>baz',
414 '<p>foo<table><tr><td>bar<br></table><p>[]baz',
415 '<table><tr><td>foo<br><td>[]bar</table>',
416 '<table><tr><td>foo<br><tr><td>[]bar</table>',
418 'foo<br><br><table><tr><td>[]bar</table>baz',
419 'foo<table><tr><td>bar<br><br></table>[]baz',
420 '<p>foo<br><br><table><tr><td>[]bar</table><p>baz',
421 '<p>foo<table><tr><td>bar<br><br></table><p>[]baz',
422 '<table><tr><td>foo<br><br><td>[]bar</table>',
423 '<table><tr><td>foo<br><br><tr><td>[]bar</table>',
425 'foo<hr><table><tr><td>[]bar</table>baz',
426 'foo<table><tr><td>bar<hr></table>[]baz',
427 '<table><tr><td>foo<hr><td>[]bar</table>',
428 '<table><tr><td>foo<hr><tr><td>[]bar</table>',
430 // Lists with collapsed selection
431 'foo<ol><li>[]bar<li>baz</ol>',
432 'foo<br><ol><li>[]bar<li>baz</ol>',
433 'foo<br><br><ol><li>[]bar<li>baz</ol>',
434 '<ol><li>foo<li>[]bar</ol>',
435 '<ol><li>foo<br><li>[]bar</ol>',
436 '<ol><li>foo<br><br><li>[]bar</ol>',
437 '<ol><li>foo<li>[]bar<br>baz</ol>',
438 '<ol><li>foo<br>bar<li>[]baz</ol>',
440 '<ol><li><p>foo</p>{}bar</ol>',
442 '<ol><li><p>foo<li>[]bar</ol>',
443 '<ol><li>foo<li><p>[]bar</ol>',
444 '<ol><li><p>foo<li><p>[]bar</ol>',
446 '<ol><li>foo<ul><li>[]bar</ul></ol>',
447 'foo<ol><ol><li>[]bar</ol></ol>',
448 'foo<div><ol><li>[]bar</ol></div>',
450 'foo<dl><dt>[]bar<dd>baz</dl>',
451 'foo<dl><dd>[]bar</dl>',
452 '<dl><dt>foo<dd>[]bar</dl>',
453 '<dl><dt>foo<dt>[]bar<dd>baz</dl>',
454 '<dl><dt>foo<dd>bar<dd>[]baz</dl>',
456 '<ol><li>foo</ol>[]bar',
457 '<ol><li>foo<br></ol>[]bar',
458 '<ol><li>foo<br><br></ol>[]bar',
459 '<ol><li><br></ol>[]bar',
460 '<ol><li>foo<li><br></ol>[]bar',
462 '<ol><li>foo</ol><p>[]bar',
463 '<ol><li>foo<br></ol><p>[]bar',
464 '<ol><li>foo<br><br></ol><p>[]bar',
465 '<ol><li><br></ol><p>[]bar',
466 '<ol><li>foo<li><br></ol><p>[]bar',
468 '<ol><li>foo</ol>{}<br>',
469 '<ol><li>foo<br></ol>{}<br>',
470 '<ol><li>foo<br><br></ol>{}<br>',
471 '<ol><li><br></ol>{}<br>',
472 '<ol><li>foo<li><br></ol>{}<br>',
474 '<ol><li>foo</ol><p>{}<br>',
475 '<ol><li>foo<br></ol><p>{}<br>',
476 '<ol><li>foo<br><br></ol><p>{}<br>',
477 '<ol><li><br></ol><p>{}<br>',
478 '<ol><li>foo<li><br></ol><p>{}<br>',
480 // Indented stuff with collapsed selection
481 'foo<blockquote>[]bar</blockquote>',
482 'foo<blockquote><blockquote>[]bar</blockquote></blockquote>',
483 'foo<blockquote><div>[]bar</div></blockquote>',
484 'foo<blockquote style="color: blue">[]bar</blockquote>',
486 'foo<blockquote><blockquote><p>[]bar<p>baz</blockquote></blockquote>',
487 'foo<blockquote><div><p>[]bar<p>baz</div></blockquote>',
488 'foo<blockquote style="color: blue"><p>[]bar<p>baz</blockquote>',
490 'foo<blockquote><p><b>[]bar</b><p>baz</blockquote>',
491 'foo<blockquote><p><strong>[]bar</strong><p>baz</blockquote>',
492 'foo<blockquote><p><span>[]bar</span><p>baz</blockquote>',
494 'foo<blockquote><ol><li>[]bar</ol></blockquote><p>extra',
495 'foo<blockquote>bar<ol><li>[]baz</ol>quz</blockquote><p>extra',
496 'foo<blockquote><ol><li>bar</li><ol><li>[]baz</ol><li>quz</ol></blockquote><p>extra',
498 // Invisible stuff with collapsed selection
499 'foo<span></span>[]bar',
500 'foo<span><span></span></span>[]bar',
501 'foo<quasit></quasit>[]bar',
502 'foo<br><span></span>[]bar',
503 '<span>foo<span></span></span>[]bar',
504 'foo<span></span><span>[]bar</span>',
505 'foo<div><div><p>[]bar</div></div>',
506 'foo<div><div><p><!--abc-->[]bar</div></div>',
507 'foo<div><div><!--abc--><p>[]bar</div></div>',
508 'foo<div><!--abc--><div><p>[]bar</div></div>',
509 'foo<!--abc--><div><div><p>[]bar</div></div>',
510 '<div><div><p>foo</div></div>[]bar',
511 '<div><div><p>foo</div></div><!--abc-->[]bar',
512 '<div><div><p>foo</div><!--abc--></div>[]bar',
513 '<div><div><p>foo</p><!--abc--></div></div>[]bar',
514 '<div><div><p>foo<!--abc--></div></div>[]bar',
515 '<div><div><p>foo</p></div></div><div><div><div>[]bar</div></div></div>',
516 '<div><div><p>foo<!--abc--></p></div></div><div><div><div>[]bar</div></div></div>',
517 '<div><div><p>foo</p><!--abc--></div></div><div><div><div>[]bar</div></div></div>',
518 '<div><div><p>foo</p></div><!--abc--></div><div><div><div>[]bar</div></div></div>',
519 '<div><div><p>foo</p></div></div><!--abc--><div><div><div>[]bar</div></div></div>',
520 '<div><div><p>foo</p></div></div><div><!--abc--><div><div>[]bar</div></div></div>',
521 '<div><div><p>foo</p></div></div><div><div><!--abc--><div>[]bar</div></div></div>',
522 '<div><div><p>foo</p></div></div><div><div><div><!--abc-->[]bar</div></div></div>',
524 // Styled stuff with collapsed selection
525 '<p style=color:blue>foo<p>[]bar',
526 '<p style=color:blue>foo<p style=color:brown>[]bar',
527 '<p style=color:blue>foo<p style=color:rgba(0,0,255,1)>[]bar',
528 '<p style=color:transparent>foo<p style=color:rgba(0,0,0,0)>[]bar',
529 '<p>foo<p style=color:brown>[]bar',
530 '<p><font color=blue>foo</font><p>[]bar',
531 '<p><font color=blue>foo</font><p><font color=brown>[]bar</font>',
532 '<p>foo<p><font color=brown>[]bar</font>',
533 '<p><span style=color:blue>foo</font><p>[]bar',
534 '<p><span style=color:blue>foo</font><p><span style=color:brown>[]bar</font>',
535 '<p>foo<p><span style=color:brown>[]bar</font>',
537 '<p style=background-color:aqua>foo<p>[]bar',
538 '<p style=background-color:aqua>foo<p style=background-color:tan>[]bar',
539 '<p>foo<p style=background-color:tan>[]bar',
540 '<p><span style=background-color:aqua>foo</font><p>[]bar',
541 '<p><span style=background-color:aqua>foo</font><p><span style=background-color:tan>[]bar</font>',
542 '<p>foo<p><span style=background-color:tan>[]bar</font>',
544 '<p style=text-decoration:underline>foo<p>[]bar',
545 '<p style=text-decoration:underline>foo<p style=text-decoration:line-through>[]bar',
546 '<p>foo<p style=text-decoration:line-through>[]bar',
547 '<p><u>foo</u><p>[]bar',
548 '<p><u>foo</u><p><s>[]bar</s>',
549 '<p>foo<p><s>[]bar</s>',
551 '<p style=color:blue>foo</p>[]bar',
552 'foo<p style=color:brown>[]bar',
553 '<div style=color:blue><p style=color:green>foo</div>[]bar',
554 '<div style=color:blue><p style=color:green>foo</div><p style=color:brown>[]bar',
555 '<p style=color:blue>foo<div style=color:brown><p style=color:green>[]bar',
557 // Uncollapsed selection
558 'foo[bar]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>baz',
564 '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
565 '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
566 '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
568 'foo<b>[bar]</b>baz',
569 'foo<b>{bar}</b>baz',
570 'foo{<b>bar</b>}baz',
571 'foo<span>[bar]</span>baz',
572 'foo<span>{bar}</span>baz',
573 'foo{<span>bar</span>}baz',
574 '<b>foo[bar</b><i>baz]quz</i>',
575 '<p>foo</p><p>[bar]</p><p>baz</p>',
576 '<p>foo</p><p>{bar}</p><p>baz</p>',
577 '<p>foo</p><p>{bar</p>}<p>baz</p>',
578 '<p>foo</p>{<p>bar}</p><p>baz</p>',
579 '<p>foo</p>{<p>bar</p>}<p>baz</p>',
581 '<p>foo[bar<p>baz]quz',
582 '<p>foo[bar<div>baz]quz</div>',
583 '<p>foo[bar<h1>baz]quz</h1>',
584 '<div>foo[bar</div><p>baz]quz',
585 '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',
587 '<p><b>foo[bar</b><p>baz]quz',
588 '<div><p>foo[bar</div><p>baz]quz',
589 '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
590 '<p>foo[bar<p style=color:blue>baz]quz',
591 '<p>foo[bar<p><b>baz]quz</b>',
593 '<div><p>foo<p>[bar<p>baz]</div>',
595 'foo[<br>]bar',
596 '<p>foo[</p><p>]bar</p>',
597 '<p>foo[</p><p>]bar<br>baz</p>',
598 'foo[<p>]bar</p>',
599 'foo{<p>}bar</p>',
600 'foo[<p>]bar<br>baz</p>',
601 'foo[<p>]bar</p>baz',
602 'foo{<p>bar</p>}baz',
603 'foo<p>{bar</p>}baz',
604 'foo{<p>bar}</p>baz',
605 '<p>foo[</p>]bar',
606 '<p>foo{</p>}bar',
607 '<p>foo[</p>]bar<br>baz',
608 '<p>foo[</p>]bar<p>baz</p>',
609 'foo[<div><p>]bar</div>',
610 '<div><p>foo[</p></div>]bar',
611 'foo[<div><p>]bar</p>baz</div>',
612 'foo[<div>]bar<p>baz</p></div>',
613 '<div><p>foo</p>bar[</div>]baz',
614 '<div>foo<p>bar[</p></div>]baz',
616 '<p>foo<br>{</p>]bar',
617 '<p>foo<br><br>{</p>]bar',
618 'foo<br>{<p>]bar</p>',
619 'foo<br><br>{<p>]bar</p>',
620 '<p>foo<br>{</p><p>}bar</p>',
621 '<p>foo<br><br>{</p><p>}bar</p>',
623 '<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>',
624 '<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
625 '<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
626 '<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>',
627 '<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>',
628 '<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>',
629 '{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}',
630 '<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>',
631 '<p>fo[o<table><tr><td>b]ar</table><p>baz',
632 '<p>foo<table><tr><td>ba[r</table><p>b]az',
633 '<p>fo[o<table><tr><td>bar</table><p>b]az',
635 '<p>foo<ol><li>ba[r<li>b]az</ol><p>quz',
636 '<p>foo<ol><li>bar<li>[baz]</ol><p>quz',
637 '<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz',
638 '<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz',
639 '<p>fo[o<ol><li>bar<li>b]az</ol><p>quz',
640 '<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz',
642 '<ol><li>fo[o</ol><ol><li>b]ar</ol>',
643 '<ol><li>fo[o</ol><ul><li>b]ar</ul>',
645 'foo[<ol><li>]bar</ol>',
646 '<ol><li>foo[<li>]bar</ol>',
647 'foo[<dl><dt>]bar<dd>baz</dl>',
648 'foo[<dl><dd>]bar</dl>',
649 '<dl><dt>foo[<dd>]bar</dl>',
650 '<dl><dt>foo[<dt>]bar<dd>baz</dl>',
651 '<dl><dt>foo<dd>bar[<dd>]baz</dl>',
653 '<b>foo [ </b>bar]',
654 'foo<b> [ bar]</b>',
655 '<b>[foo ] </b>bar',
656 '[foo<b> ] bar</b>',
658 // Do we merge based on element names or the display property?
659 '<p style=display:inline>fo[o<p style=display:inline>b]ar',
660 '<span style=display:block>fo[o</span><span style=display:block>b]ar</span>',
661 '<span style=display:inline-block>fo[o</span><span style=display:inline-block>b]ar</span>',
662 '<span style=display:inline-table>fo[o</span><span style=display:inline-table>b]ar</span>',
663 '<span style=display:none>fo[o</span><span style=display:none>b]ar</span>',
664 '<quasit style=display:block>fo[o</quasit><quasit style=display:block>b]ar</quasit>',
666 // https://bugs.webkit.org/show_bug.cgi?id=35281
667 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13976
668 '<ol><li>foo</ol>{}<br><ol><li>bar</ol>',
669 '<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>',
670 '<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>',
671 '<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>',
672 '<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
673 '<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
674 '<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>',
675 // Broken test: http://www.w3.org/Bugs/Public/show_bug.cgi?id=14727
676 '!<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>',
677 '<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>',
678 '<ol><li>foo[</ol>bar]<ol><li>baz</ol>',
679 '<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>',
680 '<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>',
681 '<ol><li>foo[]</ol><ol><li>bar</ol>',
682 '<ol><li>foo</ol>[bar<ol><li>]baz</ol>',
683 '<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>',
684 '<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>',
685 '<ol><li>foo</ol><ol><li>b[]ar</ol>',
686 '<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>',
687 '<ul><li>foo</ul>{}<br><ul><li>bar</ul>',
688 '<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>',
689 '<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>',
690 '<ol><li>foo</ol>{}<br><ul><li>bar</ul>',
691 '<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>',
692 '<ul><li>foo</ul>{}<br><ol><li>bar</ol>',
693 '<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>',
695 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13831
696 '<p><b>[foo]</b>',
697 '<p><quasit>[foo]</quasit>',
698 '<p><b><i>[foo]</i></b>',
699 '<p><b>{foo}</b>',
700 '<p>{<b>foo</b>}',
701 '<p><b>f[]</b>',
702 '<b>[foo]</b>',
703 '<div><b>[foo]</b></div>',
704 ],
705 //@}
706 fontname: [
707 //@{
708 'foo[]bar',
709 '<p>[foo</p> <p>bar]</p>',
710 '<span>[foo</span> <span>bar]</span>',
711 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
712 '<p>[foo<p><br><p>bar]',
713 '<b>foo[]bar</b>',
714 '<i>foo[]bar</i>',
715 '<span>foo</span>{}<span>bar</span>',
716 '<span>foo[</span><span>]bar</span>',
717 'foo[bar]baz',
718 'foo[bar<b>baz]qoz</b>quz',
719 'foo[bar<i>baz]qoz</i>quz',
720 '{<p><p> <p>foo</p>}',
722 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
723 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
724 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
725 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
726 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
727 '{<table><tr><td>foo<td>bar<td>baz</table>}',
729 'foo<code>[bar]</code>baz',
730 'foo<kbd>[bar]</kbd>baz',
731 'foo<listing>[bar]</listing>baz',
732 'foo<pre>[bar]</pre>baz',
733 'foo<samp>[bar]</samp>baz',
734 'foo<tt>[bar]</tt>baz',
736 'foo<code>b[a]r</code>baz',
737 'foo<kbd>b[a]r</kbd>baz',
738 'foo<listing>b[a]r</listing>baz',
739 'foo<pre>b[a]r</pre>baz',
740 'foo<samp>b[a]r</samp>baz',
741 'foo<tt>b[a]r</tt>baz',
743 '[foo<code>bar</code>baz]',
744 '[foo<kbd>bar</kbd>baz]',
745 '[foo<listing>bar</listing>baz]',
746 '[foo<pre>bar</pre>baz]',
747 '[foo<samp>bar</samp>baz]',
748 '[foo<tt>bar</tt>baz]',
750 '[foo<code>ba]r</code>baz',
751 '[foo<kbd>ba]r</kbd>baz',
752 '[foo<listing>ba]r</listing>baz',
753 '[foo<pre>ba]r</pre>baz',
754 '[foo<samp>ba]r</samp>baz',
755 '[foo<tt>ba]r</tt>baz',
757 'foo<code>b[ar</code>baz]',
758 'foo<kbd>b[ar</kbd>baz]',
759 'foo<listing>b[ar</listing>baz]',
760 'foo<pre>b[ar</pre>baz]',
761 'foo<samp>b[ar</samp>baz]',
762 'foo<tt>b[ar</tt>baz]',
764 'foo<span style="font-family: sans-serif">[bar]</span>baz',
765 'foo<span style="font-family: sans-serif">b[a]r</span>baz',
766 'foo<span style="font-family: monospace">[bar]</span>baz',
767 'foo<span style="font-family: monospace">b[a]r</span>baz',
769 'foo<tt contenteditable=false>ba[r</tt>b]az',
770 'fo[o<tt contenteditable=false>b]ar</tt>baz',
771 'foo<tt>{}<br></tt>bar',
772 'foo<tt>{<br></tt>}bar',
773 'foo<tt>{<br></tt>b]ar',
775 // Tests for queryCommandIndeterm() and queryCommandState()
776 'fo[o<span style=font-family:monospace>b]ar</span>baz',
777 'foo<span style=font-family:monospace>ba[r</span>b]az',
778 'fo[o<span style=font-family:monospace>bar</span>b]az',
779 'foo[<span style=font-family:monospace>b]ar</span>baz',
780 'foo<span style=font-family:monospace>ba[r</span>]baz',
781 'foo[<span style=font-family:monospace>bar</span>]baz',
782 'foo<span style=font-family:monospace>[bar]</span>baz',
783 'foo{<span style=font-family:monospace>bar</span>}baz',
784 'fo[o<code>b]ar</code>',
785 'fo[o<kbd>b]ar</kbd>',
786 'fo[o<listing>b]ar</listing>',
787 'fo[o<pre>b]ar</pre>',
788 'fo[o<samp>b]ar</samp>',
789 'fo[o<tt>b]ar</tt>',
790 '<tt>fo[o</tt><code>b]ar</code>',
791 '<pre>fo[o</pre><samp>b]ar</samp>',
792 '<span style=font-family:monospace>fo[o</span><kbd>b]ar</kbd>',
793 ],
794 //@}
795 fontsize: [
796 //@{
797 'foo[]bar',
798 '<p>[foo</p> <p>bar]</p>',
799 '<span>[foo</span> <span>bar]</span>',
800 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
801 '<p>[foo<p><br><p>bar]',
802 '<b>foo[]bar</b>',
803 '<i>foo[]bar</i>',
804 '<span>foo</span>{}<span>bar</span>',
805 '<span>foo[</span><span>]bar</span>',
806 'foo[bar]baz',
807 'foo[bar<b>baz]qoz</b>quz',
808 'foo[bar<i>baz]qoz</i>quz',
809 '{<p><p> <p>foo</p>}',
811 ["1", 'foo[bar]baz'],
812 ["0", 'foo[bar]baz'],
813 ["-5", 'foo[bar]baz'],
814 ["6", 'foo[bar]baz'],
815 ["7", 'foo[bar]baz'],
816 ["8", 'foo[bar]baz'],
817 ["100", 'foo[bar]baz'],
818 ["2em", 'foo[bar]baz'],
819 ["20pt", 'foo[bar]baz'],
820 ["xx-large", 'foo[bar]baz'],
821 [" 1 ", 'foo[bar]baz'],
822 ["1.", 'foo[bar]baz'],
823 ["1.0", 'foo[bar]baz'],
824 ["1.0e2", 'foo[bar]baz'],
825 ["1.1", 'foo[bar]baz'],
826 ["1.9", 'foo[bar]baz'],
827 ["+0", 'foo[bar]baz'],
828 ["+1", 'foo[bar]baz'],
829 ["+9", 'foo[bar]baz'],
830 ["-0", 'foo[bar]baz'],
831 ["-1", 'foo[bar]baz'],
832 ["-9", 'foo[bar]baz'],
833 ["", 'foo[bar]baz'],
835 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
836 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
837 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
838 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
839 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
840 '{<table><tr><td>foo<td>bar<td>baz</table>}',
842 'foo<font size=1>[bar]</font>baz',
843 '<font size=1>foo[bar]baz</font>',
844 'foo<font size=3>[bar]</font>baz',
845 '<font size=3>foo[bar]baz</font>',
846 'foo<font size=4>[bar]</font>baz',
847 '<font size=4>foo[bar]baz</font>',
848 'foo<font size=+1>[bar]</font>baz',
849 '<font size=+1>foo[bar]baz</font>',
850 '<font size=4>foo<font size=1>b[a]r</font>baz</font>',
852 'foo<span style="font-size: xx-small">[bar]</span>baz',
853 '<span style="font-size: xx-small">foo[bar]baz</span>',
854 'foo<span style="font-size: medium">[bar]</span>baz',
855 '<span style="font-size: medium">foo[bar]baz</span>',
856 'foo<span style="font-size: large">[bar]</span>baz',
857 '<span style="font-size: large">foo[bar]baz</span>',
858 '<span style="font-size: large">foo<span style="font-size: xx-small">b[a]r</span>baz</span>',
860 'foo<span style="font-size: 2em">[bar]</span>baz',
861 '<span style="font-size: 2em">foo[bar]baz</span>',
863 '<p style="font-size: xx-small">foo[bar]baz</p>',
864 '<p style="font-size: medium">foo[bar]baz</p>',
865 '<p style="font-size: large">foo[bar]baz</p>',
866 '<p style="font-size: 2em">foo[bar]baz</p>',
868 ["3", '<p style="font-size: xx-small">foo[bar]baz</p>'],
869 ["3", '<p style="font-size: medium">foo[bar]baz</p>'],
870 ["3", '<p style="font-size: large">foo[bar]baz</p>'],
871 ["3", '<p style="font-size: 2em">foo[bar]baz</p>'],
873 // Minor algorithm bug: this changes the size of the "b" and "r" in
874 // "bar" when we pull down styles
875 ["3", '<font size=6>foo <span style="font-size: 2em">b[a]r</span> baz</font>'],
877 ["3", 'foo<big>[bar]</big>baz'],
878 ["3", 'foo<big>b[a]r</big>baz'],
879 ["3", 'foo<small>[bar]</small>baz'],
880 ["3", 'foo<small>b[a]r</small>baz'],
882 // Tests for queryCommandIndeterm() and queryCommandState()
883 'fo[o<font size=2>b]ar</font>baz',
884 'foo<font size=2>ba[r</font>b]az',
885 'fo[o<font size=2>bar</font>b]az',
886 'foo[<font size=2>b]ar</font>baz',
887 'foo<font size=2>ba[r</font>]baz',
888 'foo[<font size=2>bar</font>]baz',
889 'foo<font size=2>[bar]</font>baz',
890 'foo{<font size=2>bar</font>}baz',
891 '<font size=1>fo[o</font><span style=font-size:xx-small>b]ar</span>',
892 '<font size=2>fo[o</font><span style=font-size:small>b]ar</span>',
893 '<font size=3>fo[o</font><span style=font-size:medium>b]ar</span>',
894 '<font size=4>fo[o</font><span style=font-size:large>b]ar</span>',
895 '<font size=5>fo[o</font><span style=font-size:x-large>b]ar</span>',
896 '<font size=6>fo[o</font><span style=font-size:xx-large>b]ar</span>',
898 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13829
899 ["!6", '<span style=background-color:aqua>[foo]</span>'],
900 ["!6", '<span style=background-color:aqua>foo[bar]baz</span>'],
901 ["!6", '[foo<span style=background-color:aqua>bar</span>baz]'],
902 ],
903 //@}
904 forecolor: [
905 //@{
906 'foo[]bar',
907 '<p>[foo</p> <p>bar]</p>',
908 '<span>[foo</span> <span>bar]</span>',
909 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
910 '<p>[foo<p><br><p>bar]',
911 '<b>foo[]bar</b>',
912 '<i>foo[]bar</i>',
913 '<span>foo</span>{}<span>bar</span>',
914 '<span>foo[</span><span>]bar</span>',
915 'foo[bar]baz',
916 'foo[bar<b>baz]qoz</b>quz',
917 'foo[bar<i>baz]qoz</i>quz',
918 '{<p><p> <p>foo</p>}',
920 ['blue', 'foo[bar]baz'],
921 ['f', 'foo[bar]baz'],
922 ['#f', 'foo[bar]baz'],
923 ['00f', 'foo[bar]baz'],
924 ['#00f', 'foo[bar]baz'],
925 ['0000ff', 'foo[bar]baz'],
926 ['#0000ff', 'foo[bar]baz'],
927 ['000000fff', 'foo[bar]baz'],
928 ['#000000fff', 'foo[bar]baz'],
929 ['rgb(0, 0, 255)', 'foo[bar]baz'],
930 ['rgb(0%, 0%, 100%)', 'foo[bar]baz'],
931 ['rgb( 0 ,0 ,255)', 'foo[bar]baz'],
932 ['rgba(0, 0, 255, 0.0)', 'foo[bar]baz'],
933 ['rgb(15, -10, 375)', 'foo[bar]baz'],
934 ['rgba(0, 0, 0, 1)', 'foo[bar]baz'],
935 ['rgba(255, 255, 255, 1)', 'foo[bar]baz'],
936 ['rgba(0, 0, 255, 0.5)', 'foo[bar]baz'],
937 ['hsl(240, 100%, 50%)', 'foo[bar]baz'],
938 ['cornsilk', 'foo[bar]baz'],
939 ['potato quiche', 'foo[bar]baz'],
940 ['transparent', 'foo[bar]baz'],
941 ['currentColor', 'foo[bar]baz'],
943 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
944 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
945 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
946 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
947 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
948 '{<table><tr><td>foo<td>bar<td>baz</table>}',
950 'foo<font color=blue>[bar]</font>baz',
951 'foo{<font color=blue>bar</font>}baz',
952 '<span style="color: blue">foo<span style="color: brown">[bar]</span>baz</span>',
953 '<span style="color: #00f">foo<span style="color: brown">[bar]</span>baz</span>',
954 '<span style="color: #0000ff">foo<span style="color: brown">[bar]</span>baz</span>',
955 '<span style="color: rgb(0, 0, 255)">foo<span style="color: brown">[bar]</span>baz</span>',
956 '<font color=blue>foo<font color=brown>[bar]</font>baz</font>',
957 '<span style="color: rgb(0, 0, 255)">foo<span style="color: brown">b[ar]</span>baz</span>',
958 'foo<span id=purple>ba[r</span>ba]z',
959 '<span style="color: rgb(0, 0, 255)">foo<span id=purple>b[a]r</span>baz</span>',
961 ['blue', '<a href=http://www.google.com>foo[bar]baz</a>'],
962 ['#0000ff', '<a href=http://www.google.com>foo[bar]baz</a>'],
963 ['rgb(0,0,255)', '<a href=http://www.google.com>foo[bar]baz</a>'],
965 // Tests for queryCommandValue()
966 '<font color="blue">[foo]</font>',
967 '<font color="0000ff">[foo]</font>',
968 '<font color="#0000ff">[foo]</font>',
969 '<span style="color: blue">[foo]</span>',
970 '<span style="color: #0000ff">[foo]</span>',
971 '<span style="color: rgb(0, 0, 255)">[foo]</span>',
972 '<span style="color: rgb(0%, 0%, 100%)">[foo]</span>',
973 '<span style="color: rgb( 0 ,0 ,255)">[foo]</span>',
974 '<span style="color: rgba(0, 0, 255, 0.0)">[foo]</span>',
975 '<span style="color: rgb(15, -10, 375)">[foo]</span>',
976 '<span style="color: rgba(0, 0, 0, 1)">[foo]</span>',
977 '<span style="color: rgba(255, 255, 255, 1)">[foo]</span>',
978 '<span style="color: rgba(0, 0, 255, 0.5)">[foo]</span>',
979 '<span style="color: hsl(240, 100%, 50%)">[foo]</span>',
980 '<span style="color: cornsilk">[foo]</span>',
981 '<span style="color: transparent">[foo]</span>',
982 '<span style="color: currentColor">[foo]</span>',
984 // Tests for queryCommandIndeterm() and queryCommandState()
985 'fo[o<font color=brown>b]ar</font>baz',
986 'foo<font color=brown>ba[r</font>b]az',
987 'fo[o<font color=brown>bar</font>b]az',
988 'foo[<font color=brown>b]ar</font>baz',
989 'foo<font color=brown>ba[r</font>]baz',
990 'foo[<font color=brown>bar</font>]baz',
991 'foo<font color=brown>[bar]</font>baz',
992 'foo{<font color=brown>bar</font>}baz',
993 '<font color=brown>fo[o</font><span style=color:brown>b]ar</span>',
994 '<span style=color:brown>fo[o</span><span style=color:#0000ff>b]ar</span>',
995 ],
996 //@}
997 formatblock: [
998 //@{
999 'foo[]bar<p>extra',
1000 '<span>foo</span>{}<span>bar</span><p>extra',
1001 '<span>foo[</span><span>]bar</span><p>extra',
1002 'foo[bar]baz<p>extra',
1003 'foo]bar[baz<p>extra',
1004 '{<p><p> <p>foo</p>}',
1005 'foo[bar<i>baz]qoz</i>quz<p>extra',
1007 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
1008 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
1009 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
1010 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
1011 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
1012 '{<table><tr><td>foo<td>bar<td>baz</table>}',
1014 '<div>[foobar]</div>',
1015 '<p>[foobar]</p>',
1016 '<blockquote>[foobar]</blockquote>',
1017 '<h1>[foobar]</h1>',
1018 '<h2>[foobar]</h2>',
1019 '<h3>[foobar]</h3>',
1020 '<h4>[foobar]</h4>',
1021 '<h5>[foobar]</h5>',
1022 '<h6>[foobar]</h6>',
1023 '<dl><dt>[foo]<dd>bar</dl>',
1024 '<dl><dt>foo<dd>[bar]</dl>',
1025 '<dl><dt>[foo<dd>bar]</dl>',
1026 '<ol><li>[foobar]</ol>',
1027 '<ul><li>[foobar]</ul>',
1028 '<address>[foobar]</address>',
1029 '<pre>[foobar]</pre>',
1030 '<article>[foobar]</article>',
1031 '<ins>[foobar]</ins>',
1032 '<del>[foobar]</del>',
1033 '<quasit>[foobar]</quasit>',
1034 '<quasit style="display: block">[foobar]</quasit>',
1036 ['<p>', 'foo[]bar<p>extra'],
1037 ['<p>', '<span>foo</span>{}<span>bar</span><p>extra'],
1038 ['<p>', '<span>foo[</span><span>]bar</span><p>extra'],
1039 ['<p>', 'foo[bar]baz<p>extra'],
1040 ['<p>', 'foo]bar[baz<p>extra'],
1041 ['<p>', '{<p><p> <p>foo</p>}'],
1042 ['<p>', 'foo[bar<i>baz]qoz</i>quz<p>extra'],
1044 ['<p>', '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>'],
1045 ['<p>', '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>'],
1046 ['<p>', '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>'],
1047 ['<p>', '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>'],
1048 ['<p>', '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>'],
1049 ['<p>', '{<table><tr><td>foo<td>bar<td>baz</table>}'],
1051 ['<p>', '<div>[foobar]</div>'],
1052 ['<p>', '<p>[foobar]</p>'],
1053 ['<p>', '<blockquote>[foobar]</blockquote>'],
1054 ['<p>', '<h1>[foobar]</h1>'],
1055 ['<p>', '<h2>[foobar]</h2>'],
1056 ['<p>', '<h3>[foobar]</h3>'],
1057 ['<p>', '<h4>[foobar]</h4>'],
1058 ['<p>', '<h5>[foobar]</h5>'],
1059 ['<p>', '<h6>[foobar]</h6>'],
1060 ['<p>', '<dl><dt>[foo]<dd>bar</dl>'],
1061 ['<p>', '<dl><dt>foo<dd>[bar]</dl>'],
1062 ['<p>', '<dl><dt>[foo<dd>bar]</dl>'],
1063 ['<p>', '<ol><li>[foobar]</ol>'],
1064 ['<p>', '<ul><li>[foobar]</ul>'],
1065 ['<p>', '<address>[foobar]</address>'],
1066 ['<p>', '<pre>[foobar]</pre>'],
1067 ['<p>', '<listing>[foobar]</listing>'],
1068 ['<p>', '<xmp>[foobar]</xmp>'],
1069 ['<p>', '<article>[foobar]</article>'],
1070 ['<p>', '<ins>[foobar]</ins>'],
1071 ['<p>', '<del>[foobar]</del>'],
1072 ['<p>', '<quasit>[foobar]</quasit>'],
1073 ['<p>', '<quasit style="display: block">[foobar]</quasit>'],
1075 ['<blockquote>', '<blockquote>[foo]</blockquote><p>extra'],
1076 ['<blockquote>', '<blockquote><p>[foo]<p>bar</blockquote><p>extra'],
1077 ['<blockquote>', '[foo]<blockquote>bar</blockquote><p>extra'],
1078 ['<blockquote>', '<p>[foo<p>bar]<p>baz'],
1079 ['<blockquote>', '<section>[foo]</section>'],
1080 ['<blockquote>', '<section><p>[foo]</section>'],
1081 ['<blockquote>', '<section><hgroup><h1>[foo]</h1><h2>bar</h2></hgroup><p>baz</section>'],
1082 ['<article>', '<section>[foo]</section>'],
1084 ['<address>', '<div>[foobar]</div>'],
1085 ['<article>', '<div>[foobar]</div>'],
1086 ['<blockquote>', '<div>[foobar]</div>'],
1087 ['<dd>', '<div>[foobar]</div>'],
1088 ['<del>', '<div>[foobar]</div>'],
1089 ['<dl>', '<div>[foobar]</div>'],
1090 ['<dt>', '<div>[foobar]</div>'],
1091 ['<h1>', '<div>[foobar]</div>'],
1092 ['<h2>', '<div>[foobar]</div>'],
1093 ['<h3>', '<div>[foobar]</div>'],
1094 ['<h4>', '<div>[foobar]</div>'],
1095 ['<h5>', '<div>[foobar]</div>'],
1096 ['<h6>', '<div>[foobar]</div>'],
1097 ['<ins>', '<div>[foobar]</div>'],
1098 ['<li>', '<div>[foobar]</div>'],
1099 ['<ol>', '<div>[foobar]</div>'],
1100 ['<p>', '<div>[foobar]</div>'],
1101 ['<pre>', '<div>[foobar]</div>'],
1102 ['<ul>', '<div>[foobar]</div>'],
1103 ['<quasit>', '<div>[foobar]</div>'],
1105 ['<address>', '<p>[foobar]</p>'],
1106 ['<article>', '<p>[foobar]</p>'],
1107 ['<aside>', '<p>[foobar]</p>'],
1108 ['<blockquote>', '<p>[foobar]</p>'],
1109 ['<body>', '<p>[foobar]</p>'],
1110 ['<dd>', '<p>[foobar]</p>'],
1111 ['<del>', '<p>[foobar]</p>'],
1112 ['<details>', '<p>[foobar]</p>'],
1113 ['<dir>', '<p>[foobar]</p>'],
1114 ['<div>', '<p>[foobar]</p>'],
1115 ['<dl>', '<p>[foobar]</p>'],
1116 ['<dt>', '<p>[foobar]</p>'],
1117 ['<fieldset>', '<p>[foobar]</p>'],
1118 ['<figcaption>', '<p>[foobar]</p>'],
1119 ['<figure>', '<p>[foobar]</p>'],
1120 ['<footer>', '<p>[foobar]</p>'],
1121 ['<form>', '<p>[foobar]</p>'],
1122 ['<h1>', '<p>[foobar]</p>'],
1123 ['<h2>', '<p>[foobar]</p>'],
1124 ['<h3>', '<p>[foobar]</p>'],
1125 ['<h4>', '<p>[foobar]</p>'],
1126 ['<h5>', '<p>[foobar]</p>'],
1127 ['<h6>', '<p>[foobar]</p>'],
1128 ['<header>', '<p>[foobar]</p>'],
1129 ['<head>', '<p>[foobar]</p>'],
1130 ['<hgroup>', '<p>[foobar]</p>'],
1131 ['<hr>', '<p>[foobar]</p>'],
1132 ['<html>', '<p>[foobar]</p>'],
1133 ['<ins>', '<p>[foobar]</p>'],
1134 ['<li>', '<p>[foobar]</p>'],
1135 ['<listing>', '<p>[foobar]</p>'],
1136 ['<menu>', '<p>[foobar]</p>'],
1137 ['<nav>', '<p>[foobar]</p>'],
1138 ['<ol>', '<p>[foobar]</p>'],
1139 ['<p>', '<p>[foobar]</p>'],
1140 ['<plaintext>', '<p>[foobar]</p>'],
1141 ['<pre>', '<p>[foobar]</p>'],
1142 ['<section>', '<p>[foobar]</p>'],
1143 ['<ul>', '<p>[foobar]</p>'],
1144 ['<xmp>', '<p>[foobar]</p>'],
1145 ['<quasit>', '<p>[foobar]</p>'],
1147 ['<address>', '<p>[foo<p>bar]'],
1148 ['<article>', '<p>[foo<p>bar]'],
1149 ['<aside>', '<p>[foo<p>bar]'],
1150 ['<blockquote>', '<p>[foo<p>bar]'],
1151 ['<body>', '<p>[foo<p>bar]'],
1152 ['<dd>', '<p>[foo<p>bar]'],
1153 ['<del>', '<p>[foo<p>bar]'],
1154 ['<details>', '<p>[foo<p>bar]'],
1155 ['<dir>', '<p>[foo<p>bar]'],
1156 ['<div>', '<p>[foo<p>bar]'],
1157 ['<dl>', '<p>[foo<p>bar]'],
1158 ['<dt>', '<p>[foo<p>bar]'],
1159 ['<fieldset>', '<p>[foo<p>bar]'],
1160 ['<figcaption>', '<p>[foo<p>bar]'],
1161 ['<figure>', '<p>[foo<p>bar]'],
1162 ['<footer>', '<p>[foo<p>bar]'],
1163 ['<form>', '<p>[foo<p>bar]'],
1164 ['<h1>', '<p>[foo<p>bar]'],
1165 ['<h2>', '<p>[foo<p>bar]'],
1166 ['<h3>', '<p>[foo<p>bar]'],
1167 ['<h4>', '<p>[foo<p>bar]'],
1168 ['<h5>', '<p>[foo<p>bar]'],
1169 ['<h6>', '<p>[foo<p>bar]'],
1170 ['<header>', '<p>[foo<p>bar]'],
1171 ['<head>', '<p>[foo<p>bar]'],
1172 ['<hgroup>', '<p>[foo<p>bar]'],
1173 ['<hr>', '<p>[foo<p>bar]'],
1174 ['<html>', '<p>[foo<p>bar]'],
1175 ['<ins>', '<p>[foo<p>bar]'],
1176 ['<li>', '<p>[foo<p>bar]'],
1177 ['<listing>', '<p>[foo<p>bar]'],
1178 ['<menu>', '<p>[foo<p>bar]'],
1179 ['<nav>', '<p>[foo<p>bar]'],
1180 ['<ol>', '<p>[foo<p>bar]'],
1181 ['<p>', '<p>[foo<p>bar]'],
1182 ['<plaintext>', '<p>[foo<p>bar]'],
1183 ['<pre>', '<p>[foo<p>bar]'],
1184 ['<section>', '<p>[foo<p>bar]'],
1185 ['<ul>', '<p>[foo<p>bar]'],
1186 ['<xmp>', '<p>[foo<p>bar]'],
1187 ['<quasit>', '<p>[foo<p>bar]'],
1189 ['p', '<div>[foobar]</div>'],
1191 '<ol><li>[foo]<li>bar</ol>',
1193 ['<p>', '<h1>[foo]<br>bar</h1>'],
1194 ['<p>', '<h1>foo<br>[bar]</h1>'],
1195 ['<p>', '<h1>[foo<br>bar]</h1>'],
1196 ['<address>', '<h1>[foo]<br>bar</h1>'],
1197 ['<address>', '<h1>foo<br>[bar]</h1>'],
1198 ['<address>', '<h1>[foo<br>bar]</h1>'],
1199 ['<pre>', '<h1>[foo]<br>bar</h1>'],
1200 ['<pre>', '<h1>foo<br>[bar]</h1>'],
1201 ['<pre>', '<h1>[foo<br>bar]</h1>'],
1202 ['<h2>', '<h1>[foo]<br>bar</h1>'],
1203 ['<h2>', '<h1>foo<br>[bar]</h1>'],
1204 ['<h2>', '<h1>[foo<br>bar]</h1>'],
1206 ['<h1>', '<p>[foo]<br>bar</p>'],
1207 ['<h1>', '<p>foo<br>[bar]</p>'],
1208 ['<h1>', '<p>[foo<br>bar]</p>'],
1209 ['<address>', '<p>[foo]<br>bar</p>'],
1210 ['<address>', '<p>foo<br>[bar]</p>'],
1211 ['<address>', '<p>[foo<br>bar]</p>'],
1212 ['<pre>', '<p>[foo]<br>bar</p>'],
1213 ['<pre>', '<p>foo<br>[bar]</p>'],
1214 ['<pre>', '<p>[foo<br>bar]</p>'],
1216 ['<p>', '<address>[foo]<br>bar</address>'],
1217 ['<p>', '<address>foo<br>[bar]</address>'],
1218 ['<p>', '<address>[foo<br>bar]</address>'],
1219 ['<pre>', '<address>[foo]<br>bar</address>'],
1220 ['<pre>', '<address>foo<br>[bar]</address>'],
1221 ['<pre>', '<address>[foo<br>bar]</address>'],
1222 ['<h1>', '<address>[foo]<br>bar</address>'],
1223 ['<h1>', '<address>foo<br>[bar]</address>'],
1224 ['<h1>', '<address>[foo<br>bar]</address>'],
1226 ['<p>', '<pre>[foo]<br>bar</pre>'],
1227 ['<p>', '<pre>foo<br>[bar]</pre>'],
1228 ['<p>', '<pre>[foo<br>bar]</pre>'],
1229 ['<address>', '<pre>[foo]<br>bar</pre>'],
1230 ['<address>', '<pre>foo<br>[bar]</pre>'],
1231 ['<address>', '<pre>[foo<br>bar]</pre>'],
1232 ['<h1>', '<pre>[foo]<br>bar</pre>'],
1233 ['<h1>', '<pre>foo<br>[bar]</pre>'],
1234 ['<h1>', '<pre>[foo<br>bar]</pre>'],
1236 ['<h1>', '<p>[foo</p>bar]'],
1237 ['<h1>', '[foo<p>bar]</p>'],
1238 ['<p>', '<div>[foo<p>bar]</p></div>'],
1239 ['<p>', '<xmp>[foo]</xmp>'],
1240 ['<div>', '<xmp>[foo]</xmp>'],
1242 '<div><ol><li>[foo]</ol></div>',
1243 '<div><table><tr><td>[foo]</table></div>',
1244 '<p>[foo<h1>bar]</h1>',
1245 '<h1>[foo</h1><h2>bar]</h2>',
1246 '<div>[foo</div>bar]',
1248 // https://bugs.webkit.org/show_bug.cgi?id=47054
1249 ['<p>', '<div style=color:blue>[foo]</div>'],
1250 // https://bugs.webkit.org/show_bug.cgi?id=47574
1251 ['<h1>', '{<p>foo</p>ba]r'],
1252 ['<pre>', ' [foo<p>bar]</p>'],
1253 // From https://bugs.webkit.org/show_bug.cgi?id=47300
1254 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14009
1255 ['!<p>', '{<pre> foo bar </pre>}'],
1256 ],
1257 //@}
1258 forwarddelete: [
1259 //@{
1260 // Collapsed selection
1261 'foo[]',
1262 '<span>foo[]</span>',
1263 '<p>foo[]</p>',
1264 'foo[]bar',
1265 '<span>foo</span>{}<span>bar</span>',
1266 '<span>foo[</span><span>]bar</span>',
1267 'foo[]<span style=display:none>bar</span>baz',
1268 'foo[]<script>bar</script>baz',
1269 'fo[]öbar',
1270 'fo[]öbar',
1271 'fo[]ö̧bar',
1272 '[]öbar',
1273 '[]öbar',
1274 '[]ö̧bar',
1276 '[]שָׁלוֹם',
1277 'שָׁל[]וֹם',
1279 '<p>foo[]</p><p>bar</p>',
1280 '<p>foo[]</p>bar',
1281 'foo[]<p>bar</p>',
1282 '<p>foo[]<br></p><p>bar</p>',
1283 '<p>foo[]<br></p>bar',
1284 'foo[]<br><p>bar</p>',
1286 '<p>{}<br></p>foo',
1287 '<p>{}<span><br></span></p>foo',
1288 'foo{}<p><br>',
1289 'foo{}<p><span><br></span>',
1290 'foo{}<br><p><br>',
1291 'foo{}<span><br></span><p><br>',
1292 'foo{}<br><p><span><br></span>',
1293 'foo{}<span><br></span><p><span><br></span>',
1294 'foo{}<p>',
1295 '<table><tr><td>{}</table>foo',
1296 '<table><tr><td>{}<br></table>foo',
1297 '<table><tr><td>{}<span><br></span></table>foo',
1299 '<div><p>foo[]</p></div><p>bar</p>',
1300 '<p>foo[]</p><div><p>bar</p></div>',
1301 '<div><p>foo[]</p></div><div><p>bar</p></div>',
1302 '<div><p>foo[]</p></div>bar',
1303 'foo[]<div><p>bar</p></div>',
1305 '<div>foo[]</div><div>bar</div>',
1306 '<pre>foo[]</pre>bar',
1308 'foo[]<br>bar',
1309 '<b>foo[]</b><br>bar',
1310 'foo[]<hr>bar',
1311 '<p>foo[]<hr><p>bar',
1312 '<p>foo[]</p><br><p>bar</p>',
1313 '<p>foo[]</p><br><br><p>bar</p>',
1314 '<p>foo[]</p><img src=/img/lion.svg><p>bar',
1315 'foo[]<img src=/img/lion.svg>bar',
1317 'foo[]<a>bar</a>',
1318 'foo[]<a href=/>bar</a>',
1319 'foo[]<a name=abc>bar</a>',
1320 'foo[]<a href=/ name=abc>bar</a>',
1321 'foo[]<span><a>bar</a></span>',
1322 'foo[]<span><a href=/>bar</a></span>',
1323 'foo[]<span><a name=abc>bar</a></span>',
1324 'foo[]<span><a href=/ name=abc>bar</a></span>',
1325 '<a>foo[]</a>bar',
1326 '<a href=/>foo[]</a>bar',
1327 '<a name=abc>foo[]</a>bar',
1328 '<a href=/ name=abc>foo[]</a>bar',
1330 'foo [] ',
1331 '[] foo',
1332 'foo[] bar',
1333 'foo[] bar',
1334 'foo[] bar',
1335 'foo[] bar',
1336 'foo[] bar',
1337 'foo [] bar',
1338 'foo [] bar',
1339 'foo[] <span> </span> bar',
1340 'foo []<span> </span> bar',
1341 'foo <span> </span>[] bar',
1342 '<b>foo[] </b> bar',
1343 '<b>foo[] </b> bar',
1344 '<b>foo[] </b> bar',
1345 '<b>foo[] </b> bar',
1347 '<pre>foo [] </pre>',
1348 '<pre>[] foo</pre>',
1349 '<pre>foo[] bar</pre>',
1350 '<pre>foo[] bar</pre>',
1351 '<pre>foo[] bar</pre>',
1353 '<div style=white-space:pre>foo [] </div>',
1354 '<div style=white-space:pre>[] foo</div>',
1355 '<div style=white-space:pre>foo[] bar</div>',
1356 '<div style=white-space:pre>foo[] bar</div>',
1357 '<div style=white-space:pre>foo[] bar</div>',
1359 '<div style=white-space:pre-wrap>foo [] </div>',
1360 '<div style=white-space:pre-wrap>[] foo</div>',
1361 '<div style=white-space:pre-wrap>foo[] bar</div>',
1362 '<div style=white-space:pre-wrap>foo[] bar</div>',
1363 '<div style=white-space:pre-wrap>foo[] bar</div>',
1365 '<div style=white-space:pre-line>foo [] </div>',
1366 '<div style=white-space:pre-line>[] foo</div>',
1367 '<div style=white-space:pre-line>foo[] bar</div>',
1368 '<div style=white-space:pre-line>foo[] bar</div>',
1369 '<div style=white-space:pre-line>foo[] bar</div>',
1371 '<div style=white-space:nowrap>foo [] </div>',
1372 '<div style=white-space:nowrap>[] foo</div>',
1373 '<div style=white-space:nowrap>foo[] bar</div>',
1374 '<div style=white-space:nowrap>foo[] bar</div>',
1375 '<div style=white-space:nowrap>foo[] bar</div>',
1377 // Tables with collapsed selection
1378 'foo[]<table><tr><td>bar</table>baz',
1379 'foo<table><tr><td>bar[]</table>baz',
1380 '<p>foo[]<table><tr><td>bar</table><p>baz',
1381 '<table><tr><td>foo[]<td>bar</table>',
1382 '<table><tr><td>foo[]<tr><td>bar</table>',
1384 'foo[]<br><table><tr><td>bar</table>baz',
1385 'foo<table><tr><td>bar[]<br></table>baz',
1386 '<p>foo[]<br><table><tr><td>bar</table><p>baz',
1387 '<p>foo<table><tr><td>bar[]<br></table><p>baz',
1388 '<table><tr><td>foo[]<br><td>bar</table>',
1389 '<table><tr><td>foo[]<br><tr><td>bar</table>',
1391 'foo<table><tr><td>bar[]</table><br>baz',
1392 'foo[]<table><tr><td><hr>bar</table>baz',
1393 '<table><tr><td>foo[]<td><hr>bar</table>',
1394 '<table><tr><td>foo[]<tr><td><hr>bar</table>',
1396 // Lists with collapsed selection
1397 'foo[]<ol><li>bar<li>baz</ol>',
1398 'foo[]<br><ol><li>bar<li>baz</ol>',
1399 '<ol><li>foo[]<li>bar</ol>',
1400 '<ol><li>foo[]<br><li>bar</ol>',
1401 '<ol><li>foo[]<li>bar<br>baz</ol>',
1403 '<ol><li><p>foo[]<li>bar</ol>',
1404 '<ol><li>foo[]<li><p>bar</ol>',
1405 '<ol><li><p>foo[]<li><p>bar</ol>',
1407 '<ol><li>foo[]<ul><li>bar</ul></ol>',
1408 'foo[]<ol><ol><li>bar</ol></ol>',
1409 'foo[]<div><ol><li>bar</ol></div>',
1411 'foo[]<dl><dt>bar<dd>baz</dl>',
1412 'foo[]<dl><dd>bar</dl>',
1413 '<dl><dt>foo[]<dd>bar</dl>',
1414 '<dl><dt>foo[]<dt>bar<dd>baz</dl>',
1415 '<dl><dt>foo<dd>bar[]<dd>baz</dl>',
1417 '<ol><li>foo[]</ol>bar',
1418 '<ol><li>foo[]<br></ol>bar',
1419 '<ol><li>{}<br></ol>bar',
1420 '<ol><li>foo<li>{}<br></ol>bar',
1422 '<ol><li>foo[]</ol><p>bar',
1423 '<ol><li>foo[]<br></ol><p>bar',
1424 '<ol><li>{}<br></ol><p>bar',
1425 '<ol><li>foo<li>{}<br></ol><p>bar',
1427 '<ol><li>foo[]</ol><br>',
1428 '<ol><li>foo[]<br></ol><br>',
1429 '<ol><li>{}<br></ol><br>',
1430 '<ol><li>foo<li>{}<br></ol><br>',
1432 '<ol><li>foo[]</ol><p><br>',
1433 '<ol><li>foo[]<br></ol><p><br>',
1434 '<ol><li>{}<br></ol><p><br>',
1435 '<ol><li>foo<li>{}<br></ol><p><br>',
1437 // Indented stuff with collapsed selection
1438 'foo[]<blockquote>bar</blockquote>',
1439 'foo[]<blockquote><blockquote>bar</blockquote></blockquote>',
1440 'foo[]<blockquote><div>bar</div></blockquote>',
1441 'foo[]<blockquote style="color: blue">bar</blockquote>',
1443 'foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>',
1444 'foo[]<blockquote><div><p>bar<p>baz</div></blockquote>',
1445 'foo[]<blockquote style="color: blue"><p>bar<p>baz</blockquote>',
1447 'foo[]<blockquote><p><b>bar</b><p>baz</blockquote>',
1448 'foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>',
1449 'foo[]<blockquote><p><span>bar</span><p>baz</blockquote>',
1451 'foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra',
1452 'foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra',
1453 'foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra',
1455 // Invisible stuff with collapsed selection
1456 'foo[]<span></span>bar',
1457 'foo[]<span><span></span></span>bar',
1458 'foo[]<quasit></quasit>bar',
1459 'foo[]<span></span><br>bar',
1460 '<span>foo[]<span></span></span>bar',
1461 'foo[]<span></span><span>bar</span>',
1462 'foo[]<div><div><p>bar</div></div>',
1463 'foo[]<div><div><p><!--abc-->bar</div></div>',
1464 'foo[]<div><div><!--abc--><p>bar</div></div>',
1465 'foo[]<div><!--abc--><div><p>bar</div></div>',
1466 'foo[]<!--abc--><div><div><p>bar</div></div>',
1467 '<div><div><p>foo[]</div></div>bar',
1468 '<div><div><p>foo[]</div></div><!--abc-->bar',
1469 '<div><div><p>foo[]</div><!--abc--></div>bar',
1470 '<div><div><p>foo[]</p><!--abc--></div></div>bar',
1471 '<div><div><p>foo[]<!--abc--></div></div>bar',
1472 '<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>',
1473 '<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>',
1474 '<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>',
1475 '<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>',
1476 '<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>',
1477 '<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>',
1478 '<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>',
1479 '<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>',
1481 // Styled stuff with collapsed selection
1482 '<p style=color:blue>foo[]<p>bar',
1483 '<p style=color:blue>foo[]<p style=color:brown>bar',
1484 '<p>foo[]<p style=color:brown>bar',
1485 '<p><font color=blue>foo[]</font><p>bar',
1486 '<p><font color=blue>foo[]</font><p><font color=brown>bar</font>',
1487 '<p>foo[]<p><font color=brown>bar</font>',
1488 '<p><span style=color:blue>foo[]</font><p>bar',
1489 '<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>',
1490 '<p>foo[]<p><span style=color:brown>bar</font>',
1492 '<p style=background-color:aqua>foo[]<p>bar',
1493 '<p style=background-color:aqua>foo[]<p style=background-color:tan>bar',
1494 '<p>foo[]<p style=background-color:tan>bar',
1495 '<p><span style=background-color:aqua>foo[]</font><p>bar',
1496 '<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>',
1497 '<p>foo[]<p><span style=background-color:tan>bar</font>',
1499 '<p style=text-decoration:underline>foo[]<p>bar',
1500 '<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar',
1501 '<p>foo[]<p style=text-decoration:line-through>bar',
1502 '<p><u>foo[]</u><p>bar',
1503 '<p><u>foo[]</u><p><s>bar</s>',
1504 '<p>foo[]<p><s>bar</s>',
1506 '<p style=color:blue>foo[]</p>bar',
1507 'foo[]<p style=color:brown>bar',
1508 '<div style=color:blue><p style=color:green>foo[]</div>bar',
1509 '<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar',
1510 '<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar',
1512 // Uncollapsed selection (should be same as delete command)
1513 'foo[bar]baz',
1514 '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
1515 '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
1516 '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
1517 '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
1518 '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
1519 '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
1520 '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
1521 '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
1523 'foo<b>[bar]</b>baz',
1524 'foo<b>{bar}</b>baz',
1525 'foo{<b>bar</b>}baz',
1526 'foo<span>[bar]</span>baz',
1527 'foo<span>{bar}</span>baz',
1528 'foo{<span>bar</span>}baz',
1529 '<b>foo[bar</b><i>baz]quz</i>',
1530 '<p>foo</p><p>[bar]</p><p>baz</p>',
1531 '<p>foo</p><p>{bar}</p><p>baz</p>',
1532 '<p>foo</p><p>{bar</p>}<p>baz</p>',
1533 '<p>foo</p>{<p>bar}</p><p>baz</p>',
1534 '<p>foo</p>{<p>bar</p>}<p>baz</p>',
1536 '<p>foo[bar<p>baz]quz',
1537 '<p>foo[bar<div>baz]quz</div>',
1538 '<p>foo[bar<h1>baz]quz</h1>',
1539 '<div>foo[bar</div><p>baz]quz',
1540 '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',
1542 '<p><b>foo[bar</b><p>baz]quz',
1543 '<div><p>foo[bar</div><p>baz]quz',
1544 '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
1545 '<p>foo[bar<p style=color:blue>baz]quz',
1546 '<p>foo[bar<p><b>baz]quz</b>',
1548 '<div><p>foo<p>[bar<p>baz]</div>',
1550 'foo[<br>]bar',
1551 '<p>foo[</p><p>]bar</p>',
1552 '<p>foo[</p><p>]bar<br>baz</p>',
1553 'foo[<p>]bar</p>',
1554 'foo{<p>}bar</p>',
1555 'foo[<p>]bar<br>baz</p>',
1556 'foo[<p>]bar</p>baz',
1557 'foo{<p>bar</p>}baz',
1558 'foo<p>{bar</p>}baz',
1559 'foo{<p>bar}</p>baz',
1560 '<p>foo[</p>]bar',
1561 '<p>foo{</p>}bar',
1562 '<p>foo[</p>]bar<br>baz',
1563 '<p>foo[</p>]bar<p>baz</p>',
1564 'foo[<div><p>]bar</div>',
1565 '<div><p>foo[</p></div>]bar',
1566 'foo[<div><p>]bar</p>baz</div>',
1567 'foo[<div>]bar<p>baz</p></div>',
1568 '<div><p>foo</p>bar[</div>]baz',
1569 '<div>foo<p>bar[</p></div>]baz',
1571 '<p>foo<br>{</p>]bar',
1572 '<p>foo<br><br>{</p>]bar',
1573 'foo<br>{<p>]bar</p>',
1574 'foo<br><br>{<p>]bar</p>',
1575 '<p>foo<br>{</p><p>}bar</p>',
1576 '<p>foo<br><br>{</p><p>}bar</p>',
1578 '<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>',
1579 '<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
1580 '<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
1581 '<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>',
1582 '<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>',
1583 '<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>',
1584 '{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}',
1585 '<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>',
1586 '<p>fo[o<table><tr><td>b]ar</table><p>baz',
1587 '<p>foo<table><tr><td>ba[r</table><p>b]az',
1588 '<p>fo[o<table><tr><td>bar</table><p>b]az',
1590 '<p>foo<ol><li>ba[r<li>b]az</ol><p>quz',
1591 '<p>foo<ol><li>bar<li>[baz]</ol><p>quz',
1592 '<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz',
1593 '<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz',
1594 '<p>fo[o<ol><li>bar<li>b]az</ol><p>quz',
1595 '<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz',
1597 '<ol><li>fo[o</ol><ol><li>b]ar</ol>',
1598 '<ol><li>fo[o</ol><ul><li>b]ar</ul>',
1600 'foo[<ol><li>]bar</ol>',
1601 '<ol><li>foo[<li>]bar</ol>',
1602 'foo[<dl><dt>]bar<dd>baz</dl>',
1603 'foo[<dl><dd>]bar</dl>',
1604 '<dl><dt>foo[<dd>]bar</dl>',
1605 '<dl><dt>foo[<dt>]bar<dd>baz</dl>',
1606 '<dl><dt>foo<dd>bar[<dd>]baz</dl>',
1608 // https://bugs.webkit.org/show_bug.cgi?id=35281
1609 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13976
1610 '<ol><li>foo</ol>{}<br><ol><li>bar</ol>',
1611 '<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>',
1612 '<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>',
1613 '<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>',
1614 '<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
1615 '<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
1616 '<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>',
1617 '<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>',
1618 '<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>',
1619 '<ol><li>foo[</ol>bar]<ol><li>baz</ol>',
1620 '<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>',
1621 '<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>',
1622 '<ol><li>fo[]o</ol><ol><li>bar</ol>',
1623 '<ol><li>foo</ol>[bar<ol><li>]baz</ol>',
1624 '<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>',
1625 '<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>',
1626 '<ol><li>foo</ol><ol><li>[]bar</ol>',
1627 '<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>',
1628 '<ul><li>foo</ul>{}<br><ul><li>bar</ul>',
1629 '<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>',
1630 '<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>',
1631 '<ol><li>foo</ol>{}<br><ul><li>bar</ul>',
1632 '<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>',
1633 '<ul><li>foo</ul>{}<br><ol><li>bar</ol>',
1634 '<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>',
1636 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13831
1637 '<p><b>[foo]</b>',
1638 '<p><quasit>[foo]</quasit>',
1639 '<p><b><i>[foo]</i></b>',
1640 '<p><b>{foo}</b>',
1641 '<p>{<b>foo</b>}',
1642 '<p><b>[]f</b>',
1643 '<b>[foo]</b>',
1644 '<div><b>[foo]</b></div>',
1645 ],
1646 //@}
1647 hilitecolor: [
1648 //@{
1649 'foo[]bar',
1650 '<p>[foo</p> <p>bar]</p>',
1651 '<span>[foo</span> <span>bar]</span>',
1652 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
1653 '<p>[foo<p><br><p>bar]',
1654 '<b>foo[]bar</b>',
1655 '<i>foo[]bar</i>',
1656 '<span>foo</span>{}<span>bar</span>',
1657 '<span>foo[</span><span>]bar</span>',
1658 'foo[bar]baz',
1659 'foo[bar<b>baz]qoz</b>quz',
1660 'foo[bar<i>baz]qoz</i>quz',
1661 '{<p><p> <p>foo</p>}',
1663 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
1664 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
1665 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
1666 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
1667 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
1668 '{<table><tr><td>foo<td>bar<td>baz</table>}',
1670 '<p style="background-color: rgb(0, 255, 255)">foo[bar]baz</p>',
1671 '<p style="background-color: #00ffff">foo[bar]baz</p>',
1672 '<p style="background-color: aqua">foo[bar]baz</p>',
1673 '{<p style="background-color: aqua">foo</p><p>bar</p>}',
1674 '<span style="background-color: aqua">foo<span style="background-color: tan">[bar]</span>baz</span>',
1675 '<span style="background-color: #00ffff">foo<span style="background-color: tan">[bar]</span>baz</span>',
1676 '<span style="background-color: #0ff">foo<span style="background-color: tan">[bar]</span>baz</span>',
1677 '<span style="background-color: rgb(0, 255, 255)">foo<span style="background-color: tan">[bar]</span>baz</span>',
1678 '<span style="background-color: aqua">foo<span style="background-color: tan">b[ar]</span>baz</span>',
1679 '<p style="background-color: aqua">foo<span style="background-color: tan">b[ar]</span>baz</p>',
1680 '<div style="background-color: aqua"><p style="background-color: tan">b[ar]</p></div>',
1681 '<span style="display: block; background-color: aqua"><span style="display: block; background-color: tan">b[ar]</span></span>',
1683 // Tests for queryCommandIndeterm() and queryCommandState()
1684 'fo[o<span style=background-color:tan>b]ar</span>baz',
1685 'foo<span style=background-color:tan>ba[r</span>b]az',
1686 'fo[o<span style=background-color:tan>bar</span>b]az',
1687 'foo[<span style=background-color:tan>b]ar</span>baz',
1688 'foo<span style=background-color:tan>ba[r</span>]baz',
1689 'foo[<span style=background-color:tan>bar</span>]baz',
1690 'foo<span style=background-color:tan>[bar]</span>baz',
1691 'foo{<span style=background-color:tan>bar</span>}baz',
1692 '<span style=background-color:tan>fo[o</span><span style=background-color:yellow>b]ar</span>',
1693 '<span style=background-color:tan>fo[o</span><span style=background-color:tan>b]ar</span>',
1694 '<span style=background-color:tan>fo[o<span style=background-color:transparent>b]ar</span></span>',
1696 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13829
1697 '!<font size=6>[foo]</font>',
1698 '!<span style=font-size:xx-large>[foo]</span>',
1699 '!<font size=6>foo[bar]baz</font>',
1700 '!<span style=font-size:xx-large>foo[bar]baz</span>',
1701 '![foo<font size=6>bar</font>baz]',
1702 '![foo<span style=font-size:xx-large>bar</span>baz]',
1703 ],
1704 //@}
1705 indent: [
1706 //@{
1707 // All these have a trailing unselected paragraph, because otherwise
1708 // Gecko is unhappy: it throws exceptions in non-CSS mode, and in CSS
1709 // mode it adds the indentation invisibly to the wrapper div in many
1710 // cases.
1711 'foo[]bar<p>extra',
1712 '<span>foo</span>{}<span>bar</span><p>extra',
1713 '<span>foo[</span><span>]bar</span><p>extra',
1714 'foo[bar]baz<p>extra',
1715 '<p dir=rtl>פו[בר]בז<p dir=rtl>נוםף',
1716 '<p dir=rtl>פו[ברבז<p>Foobar]baz<p>Extra',
1717 '<p>Foo[barbaz<p dir=rtl>פובר]בז<p>Extra',
1718 '<div><p>Foo[barbaz<p dir=rtl>פובר]בז</div><p>Extra',
1719 'foo]bar[baz<p>extra',
1720 '{<p><p> <p>foo</p>}<p>extra',
1721 'foo[bar<i>baz]qoz</i>quz<p>extra',
1722 '[]foo<p>extra',
1723 'foo[]<p>extra',
1724 '<p>[]foo<p>extra',
1725 '<p>foo[]<p>extra',
1726 '<p>{}<br>foo</p><p>extra',
1727 '<p>foo<br>{}</p><p>extra',
1728 '<span>{}<br>foo</span>bar<p>extra',
1729 '<span>foo<br>{}</span>bar<p>extra',
1730 '<p>foo</p>{}<p>bar</p>',
1732 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
1733 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
1734 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
1735 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
1736 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
1737 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
1739 '<p>foo[bar]</p><p>baz</p><p>extra',
1740 '<p>[foobar</p><p>ba]z</p><p>extra',
1741 'foo[bar]<br>baz<p>extra',
1742 'foo[bar]<br><br><br><br>baz<p>extra',
1743 'foobar<br>[ba]z<p>extra',
1744 'foobar<br><br><br><br>[ba]z<p>extra',
1745 'foo[bar<br>ba]z<p>extra',
1746 '<div>foo<p>[bar]</p>baz</div><p>extra',
1748 // These mimic existing indentation in various browsers, to see how
1749 // they cope with indenting twice. This is spec, Gecko non-CSS, and
1750 // Opera:
1751 '<blockquote><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
1752 '<blockquote><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
1753 '<blockquote><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
1754 '<blockquote><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
1755 '<p>[foo]<blockquote><p>bar</blockquote><p>extra',
1756 '<p>[foo<blockquote><p>b]ar</blockquote><p>extra',
1757 '<p>foo<blockquote><p>bar</blockquote><p>[baz]<p>extra',
1758 '<p>foo<blockquote><p>[bar</blockquote><p>baz]<p>extra',
1759 '<p>[foo<blockquote><p>bar</blockquote><p>baz]<p>extra',
1760 '<blockquote><p>foo</blockquote><p>[bar]<blockquote><p>baz</blockquote><p>extra',
1762 '<blockquote>foo[bar]<br>baz</blockquote><p>extra',
1763 '<blockquote>foo[bar<br>b]az</blockquote><p>extra',
1764 '<blockquote>foo[bar]</blockquote>baz<p>extra',
1765 '<blockquote>foo[bar</blockquote>b]az<p>extra',
1766 '[foo]<blockquote>bar</blockquote><p>extra',
1767 '[foo<blockquote>b]ar</blockquote><p>extra',
1768 'foo<blockquote>bar</blockquote>[baz]<p>extra',
1769 '[foo<blockquote>bar</blockquote>baz]<p>extra',
1770 '<blockquote>foo</blockquote>[bar]<blockquote>baz</blockquote><p>extra',
1772 // IE:
1773 '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
1774 '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
1775 '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
1776 '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
1777 '<p>[foo]<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>extra',
1778 '<p>[foo<blockquote style="margin-right: 0" dir="ltr"><p>b]ar</blockquote><p>extra',
1779 '<p>foo<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>[baz]<p>extra',
1780 '<p>foo<blockquote style="margin-right: 0" dir="ltr"><p>[bar</blockquote><p>baz]<p>extra',
1781 '<p>[foo<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>baz]<p>extra',
1782 '<blockquote style="margin-right: 0" dir="ltr"><p>foo</blockquote><p>[bar]<blockquote style="margin-right: 0" dir="ltr"><p>baz</blockquote><p>extra',
1784 // Firefox CSS mode:
1785 '<p style="margin-left: 40px">foo[bar]</p><p style="margin-left: 40px">baz</p><p>extra',
1786 '<p style="margin-left: 40px">foo[bar</p><p style="margin-left: 40px">b]az</p><p>extra',
1787 '<p style="margin-left: 40px">foo[bar]</p><p>baz</p><p>extra',
1788 '<p style="margin-left: 40px">foo[bar</p><p>b]az</p><p>extra',
1789 '<p>[foo]<p style="margin-left: 40px">bar<p>extra',
1790 '<p>[foo<p style="margin-left: 40px">b]ar<p>extra',
1791 '<p>foo<p style="margin-left: 40px">bar<p>[baz]<p>extra',
1792 '<p>foo<p style="margin-left: 40px">[bar<p>baz]<p>extra',
1793 '<p>[foo<p style="margin-left: 40px">bar<p>baz]<p>extra',
1794 '<p style="margin-left: 40px">foo<p>[bar]<p style="margin-left: 40px">baz<p>extra',
1796 // WebKit:
1797 '<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',
1798 '<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',
1799 '<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',
1800 '<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',
1801 '<p>[foo]<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>extra',
1802 '<p>[foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>b]ar</blockquote><p>extra',
1803 '<p>foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>[baz]<p>extra',
1804 '<p>foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>[bar</blockquote><p>baz]<p>extra',
1805 '<p>[foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>baz]<p>extra',
1806 '<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',
1808 // MDC says "In Firefox, if the selection spans multiple lines at
1809 // different levels of indentation, only the least indented lines in
1810 // the selection will be indented." Let's test that.
1811 '<blockquote>f[oo<blockquote>b]ar</blockquote></blockquote><p>extra',
1813 // Lists!
1814 '<ol><li>foo<li>[bar]<li>baz</ol>',
1815 '<ol data-start=1 data-end=2><li>foo<li>bar<li>baz</ol>',
1816 '<ol><li>foo</ol>[bar]',
1817 '<ol><li>[foo]<br>bar<li>baz</ol>',
1818 '<ol><li>foo<br>[bar]<li>baz</ol>',
1819 '<ol><li><div>[foo]</div>bar<li>baz</ol>',
1820 '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
1821 '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
1822 '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
1823 '<ol><li>foo</li><ol data-start=0 data-end=1><li>bar<li>baz</ol><li>quz</ol>',
1824 '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
1825 '<ol><li>foo</li><ol data-start=1 data-end=2><li>bar<li>baz</ol><li>quz</ol>',
1826 '<ol><li>foo<ol><li>b[a]r</ol><li>baz</ol>',
1827 '<ol><li>foo</li><ol><li>b[a]r</ol><li>baz</ol>',
1828 '<ol><li>foo{<ol><li>bar</ol>}<li>baz</ol>',
1829 '<ol><li>foo</li>{<ol><li>bar</ol>}<li>baz</ol>',
1830 '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
1831 '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
1832 '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
1833 '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
1834 '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
1835 '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
1837 // Lists with id's:
1838 // http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2009-July/020721.html
1839 '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>',
1840 '<ol><ol><li id=i1>foo</ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>',
1841 '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</li><ol><li id=i3>baz</ol></ol>',
1842 '<ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>',
1843 '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</ol>',
1845 // Try indenting multiple items at once.
1846 '<ol><li>foo<li>b[ar<li>baz]</ol>',
1847 '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
1848 '<ol><li>[foo</li><ol><li>bar]</ol><li>baz</ol>',
1849 '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
1850 '<ol><li>foo</li><ol><li>b[ar</ol><li>b]az</ol>',
1851 '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
1852 '<ol><li>[foo</li><ol><li>bar</ol><li>baz]</ol><p>extra',
1854 // We probably can't actually get this DOM . . .
1855 '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
1856 '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
1857 '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
1858 '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
1860 'foo<!--bar-->[baz]<p>extra',
1861 '[foo]<!--bar-->baz<p>extra',
1862 '<p>foo<!--bar-->{}<p>extra',
1863 '<p>{}<!--foo-->bar<p>extra',
1865 // Whitespace nodes
1866 '<blockquote><p>foo</blockquote> <p>[bar]',
1867 '<p>[foo]</p> <blockquote><p>bar</blockquote>',
1868 '<blockquote><p>foo</blockquote> <p>[bar]</p> <blockquote><p>baz</blockquote>',
1869 '<ol><li>foo</li><ol><li>bar</li> </ol><li>[baz]</ol>',
1870 '<ol><li>foo</li><ol><li>bar</li></ol> <li>[baz]</ol>',
1871 '<ol><li>foo</li><ol><li>bar</li> </ol> <li>[baz]</ol>',
1872 '<ol><li>foo<ol><li>bar</li> </ol></li><li>[baz]</ol>',
1873 '<ol><li>foo<ol><li>bar</li></ol></li> <li>[baz]</ol>',
1874 '<ol><li>foo<ol><li>bar</li> </ol></li> <li>[baz]</ol>',
1875 '<ol><li>foo<li>[bar]</li> <ol><li>baz</ol></ol>',
1876 '<ol><li>foo<li>[bar]</li><ol> <li>baz</ol></ol>',
1877 '<ol><li>foo<li>[bar]</li> <ol> <li>baz</ol></ol>',
1878 '<ol><li>foo<li>[bar] <ol><li>baz</ol></ol>',
1879 '<ol><li>foo<li>[bar]<ol> <li>baz</ol></ol>',
1880 '<ol><li>foo<li>[bar] <ol> <li>baz</ol></ol>',
1882 // https://bugs.webkit.org/show_bug.cgi?id=32003
1883 '<ul><li>a<br>{<br>}</li><li>b</li></ul>',
1884 ],
1885 //@}
1886 inserthorizontalrule: [
1887 //@{
1888 'foo[]bar',
1889 '<span>foo</span>{}<span>bar</span>',
1890 '<span>foo[</span><span>]bar</span>',
1891 '<p>foo[bar<p>baz]quz',
1892 '<div><b>foo</b>{}<b>bar</b></div>',
1893 '<div><b>foo[</b><b>]bar</b></div>',
1894 '<div><b>foo</b>{<b>bar</b>}<b>baz</b></div>',
1895 '<b>foo[]bar</b>',
1896 '<b id=abc>foo[]bar</b>',
1897 ["abc", 'foo[bar]baz'],
1898 'foo[bar]baz',
1900 'foo<b>[bar]</b>baz',
1901 'foo<b>{bar}</b>baz',
1902 'foo{<b>bar</b>}baz',
1903 '<p>foo<p>[bar]<p>baz',
1904 '<p>foo<p>{bar}<p>baz',
1905 '<p>foo{<p>bar</p>}<p>baz',
1907 '<p>foo[bar]baz</p>',
1908 '<p id=abc>foo[bar]baz</p>',
1909 '<h1>foo[bar]baz</h1>',
1910 '<p>foo<b>b[a]r</b>baz</p>',
1912 '<a>foo[bar]baz</a>',
1913 '<a href=/>foo[bar]baz</a>',
1914 '<abbr>foo[bar]baz</abbr>',
1915 '<address>foo[bar]baz</address>',
1916 '<article>foo[bar]baz</article>',
1917 '<aside>foo[bar]baz</aside>',
1918 '<b>foo[bar]baz</b>',
1919 '<bdi>foo[bar]baz</bdi>',
1920 '<bdo dir=rtl>foo[bar]baz</bdo>',
1921 '<blockquote>foo[bar]baz</blockquote>',
1922 '<table><caption>foo[bar]baz</caption><tr><td>quz</table>',
1923 '<cite>foo[bar]baz</cite>',
1924 '<code>foo[bar]baz</code>',
1925 '<dl><dd>foo[bar]baz</dd></dl>',
1926 '<del>foo[bar]baz</del>',
1927 '<details>foo[bar]baz</details>',
1928 '<dfn>foo[bar]baz</dfn>',
1929 '<div>foo[bar]baz</div>',
1930 '<dl><dt>foo[bar]baz</dt></dl>',
1931 '<em>foo[bar]baz</em>',
1932 '<figure><figcaption>foo[bar]baz</figcaption>quz</figure>',
1933 '<figure>foo[bar]baz</figure>',
1934 '<footer>foo[bar]baz</footer>',
1935 '<h1>foo[bar]baz</h1>',
1936 '<h2>foo[bar]baz</h2>',
1937 '<h3>foo[bar]baz</h3>',
1938 '<h4>foo[bar]baz</h4>',
1939 '<h5>foo[bar]baz</h5>',
1940 '<h6>foo[bar]baz</h6>',
1941 '<header>foo[bar]baz</header>',
1942 '<hgroup>foo[bar]baz</hgroup>',
1943 '<hgroup><h1>foo[bar]baz</h1></hgroup>',
1944 '<i>foo[bar]baz</i>',
1945 '<ins>foo[bar]baz</ins>',
1946 '<kbd>foo[bar]baz</kbd>',
1947 '<mark>foo[bar]baz</mark>',
1948 '<nav>foo[bar]baz</nav>',
1949 '<ol><li>foo[bar]baz</li></ol>',
1950 '<p>foo[bar]baz</p>',
1951 '<pre>foo[bar]baz</pre>',
1952 '<q>foo[bar]baz</q>',
1953 '<ruby>foo[bar]baz<rt>quz</rt></ruby>',
1954 '<ruby>foo<rt>bar[baz]quz</rt></ruby>',
1955 '<ruby>foo<rp>bar[baz]quz</rp><rt>qoz</rt><rp>qiz</rp></ruby>',
1956 '<s>foo[bar]baz</s>',
1957 '<samp>foo[bar]baz</samp>',
1958 '<section>foo[bar]baz</section>',
1959 '<small>foo[bar]baz</small>',
1960 '<span>foo[bar]baz</span>',
1961 '<strong>foo[bar]baz</strong>',
1962 '<sub>foo[bar]baz</sub>',
1963 '<sup>foo[bar]baz</sup>',
1964 '<table><tr><td>foo[bar]baz</td></table>',
1965 '<table><tr><th>foo[bar]baz</th></table>',
1966 '<u>foo[bar]baz</u>',
1967 '<ul><li>foo[bar]baz</li></ul>',
1968 '<var>foo[bar]baz</var>',
1970 '<acronym>foo[bar]baz</acronym>',
1971 '<big>foo[bar]baz</big>',
1972 '<blink>foo[bar]baz</blink>',
1973 '<center>foo[bar]baz</center>',
1974 '<dir>foo[bar]baz</dir>',
1975 '<dir><li>foo[bar]baz</li></dir>',
1976 '<font>foo[bar]baz</font>',
1977 '<listing>foo[bar]baz</listing>',
1978 '<marquee>foo[bar]baz</marquee>',
1979 '<nobr>foo[bar]baz</nobr>',
1980 '<strike>foo[bar]baz</strike>',
1981 '<tt>foo[bar]baz</tt>',
1982 '<xmp>foo[bar]baz</xmp>',
1984 '<quasit>foo[bar]baz</quasit>',
1986 '<table><tr><td>fo[o<td>b]ar</table>',
1987 'fo[o<span contenteditable=false>bar</span>b]az',
1988 ],
1989 //@}
1990 inserthtml: [
1991 //@{
1992 'foo[]bar',
1993 'foo[bar]baz',
1994 'foo<span style=color:#aBcDeF>[bar]</span>baz',
1995 'foo<span style=color:#aBcDeF>{bar}</span>baz',
1996 'foo{<span style=color:#aBcDeF>bar</span>}baz',
1997 '[foo<span style=color:#aBcDeF>bar]</span>baz',
1998 '{foo<span style=color:#aBcDeF>bar}</span>baz',
1999 'foo<span style=color:#aBcDeF>[bar</span>baz]',
2000 'foo<span style=color:#aBcDeF>{bar</span>baz}',
2001 'foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
2003 ['', 'foo[bar]baz'],
2004 ['\0', 'foo[bar]baz'],
2005 ['\x07', 'foo[bar]baz'],
2006 // The following line makes Firefox 7.0a2 go into an infinite loop on
2007 // my machine.
2008 //['\ud800', 'foo[bar]baz'],
2010 ['<b>', 'foo[bar]baz'],
2011 ['<b>abc', 'foo[bar]baz'],
2012 ['<p>abc', '<p>foo[bar]baz'],
2013 ['<li>abc', '<p>foo[bar]baz'],
2014 ['<p>abc', '<ol>{<li>foo</li>}<li>bar</ol>'],
2015 ['<p>abc', '<ol><li>foo</li>{<li>bar</li>}<li>baz</ol>'],
2016 ['<p>abc', '<ol><li>[foo]</li><li>bar</ol>'],
2018 ['abc', '<xmp>f[o]o</xmp>'],
2019 ['<b>abc</b>', '<xmp>f[o]o</xmp>'],
2020 ['abc', '<script>f[o]o</script>bar'],
2021 ['<b>abc</b>', '<script>f[o]o</script>bar'],
2023 ['<a>abc</a>', '<a>f[o]o</a>'],
2024 ['<a href=/>abc</a>', '<a href=.>f[o]o</a>'],
2025 ['<hr>', '<p>f[o]o'],
2026 ['<hr>', '<b>f[o]o</b>'],
2027 ['<h2>abc</h2>', '<h1>f[o]o</h1>'],
2028 ['<td>abc</td>', '<table><tr><td>f[o]o</table>'],
2029 ['<td>abc</td>', 'f[o]o'],
2031 ['<dt>abc</dt>', '<dl><dt>f[o]o<dd>bar</dl>'],
2032 ['<dt>abc</dt>', '<dl><dt>foo<dd>b[a]r</dl>'],
2033 ['<dd>abc</dd>', '<dl><dt>f[o]o<dd>bar</dl>'],
2034 ['<dd>abc</dd>', '<dl><dt>foo<dd>b[a]r</dl>'],
2035 ['<dt>abc</dt>', 'f[o]o'],
2036 ['<dt>abc</dt>', '<ol><li>f[o]o</ol>'],
2037 ['<dd>abc</dd>', 'f[o]o'],
2038 ['<dd>abc</dd>', '<ol><li>f[o]o</ol>'],
2040 ['<li>abc</li>', '<dir><li>f[o]o</dir>'],
2041 ['<li>abc</li>', '<ol><li>f[o]o</ol>'],
2042 ['<li>abc</li>', '<ul><li>f[o]o</ul>'],
2043 ['<dir><li>abc</dir>', '<dir><li>f[o]o</dir>'],
2044 ['<dir><li>abc</dir>', '<ol><li>f[o]o</ol>'],
2045 ['<dir><li>abc</dir>', '<ul><li>f[o]o</ul>'],
2046 ['<ol><li>abc</ol>', '<dir><li>f[o]o</dir>'],
2047 ['<ol><li>abc</ol>', '<ol><li>f[o]o</ol>'],
2048 ['<ol><li>abc</ol>', '<ul><li>f[o]o</ul>'],
2049 ['<ul><li>abc</ul>', '<dir><li>f[o]o</dir>'],
2050 ['<ul><li>abc</ul>', '<ol><li>f[o]o</ol>'],
2051 ['<ul><li>abc</ul>', '<ul><li>f[o]o</ul>'],
2052 ['<li>abc</li>', 'f[o]o'],
2054 ['<nobr>abc</nobr>', '<nobr>f[o]o</nobr>'],
2055 ['<nobr>abc</nobr>', 'f[o]o'],
2057 ['<p>abc', '<font color=blue>foo[]bar</font>'],
2058 ['<p>abc', '<span style=color:blue>foo[]bar</span>'],
2059 ['<p>abc', '<span style=font-variant:small-caps>foo[]bar</span>'],
2060 [' ', '<p>[foo]</p>'],
2061 ['<span style=display:none></span>', '<p>[foo]</p>'],
2062 ['<!--abc-->', '<p>[foo]</p>'],
2064 ['abc', '<p>{}<br></p>'],
2065 ['<!--abc-->', '<p>{}<br></p>'],
2066 ['abc', '<p><!--foo-->{}<span><br></span><!--bar--></p>'],
2067 ['<!--abc-->', '<p><!--foo-->{}<span><br></span><!--bar--></p>'],
2068 ['abc', '<p>{}<span><!--foo--><br><!--bar--></span></p>'],
2069 ['<!--abc-->', '<p>{}<span><!--foo--><br><!--bar--></span></p>'],
2071 ['abc', '<p><br>{}</p>'],
2072 ['<!--abc-->', '<p><br>{}</p>'],
2073 ['abc', '<p><!--foo--><span><br></span>{}<!--bar--></p>'],
2074 ['<!--abc-->', '<p><!--foo--><span><br></span>{}<!--bar--></p>'],
2075 ['abc', '<p><span><!--foo--><br><!--bar--></span>{}</p>'],
2076 ['<!--abc-->', '<p><span><!--foo--><br><!--bar--></span>{}</p>'],
2077 ],
2078 //@}
2079 insertimage: [
2080 //@{
2081 'foo[]bar',
2082 '<span>foo</span>{}<span>bar</span>',
2083 '<span>foo[</span><span>]bar</span>',
2084 ["", 'foo[bar]baz'],
2085 'foo[bar]baz',
2086 'foo<span style=color:#aBcDeF>[bar]</span>baz',
2087 'foo<span style=color:#aBcDeF>{bar}</span>baz',
2088 'foo{<span style=color:#aBcDeF>bar</span>}baz',
2089 '[foo<span style=color:#aBcDeF>bar]</span>baz',
2090 '{foo<span style=color:#aBcDeF>bar}</span>baz',
2091 'foo<span style=color:#aBcDeF>[bar</span>baz]',
2092 'foo<span style=color:#aBcDeF>{bar</span>baz}',
2093 'foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
2095 'foo<b>[bar]</b>baz',
2096 'foo<b>{bar}</b>baz',
2097 'foo{<b>bar</b>}baz',
2098 'foo<span>[bar]</span>baz',
2099 'foo<span>{bar}</span>baz',
2100 'foo{<span>bar</span>}baz',
2101 '<b>foo[bar</b><i>baz]quz</i>',
2102 '<p>foo</p><p>[bar]</p><p>baz</p>',
2103 '<p>foo</p><p>{bar}</p><p>baz</p>',
2104 '<p>foo</p>{<p>bar</p>}<p>baz</p>',
2106 '<p>foo[bar<p>baz]quz',
2107 '<p>foo[bar<div>baz]quz</div>',
2108 '<p>foo[bar<h1>baz]quz</h1>',
2109 '<div>foo[bar</div><p>baz]quz',
2110 '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',
2112 '<p><b>foo[bar</b><p>baz]quz',
2113 '<div><p>foo[bar</div><p>baz]quz',
2114 '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
2115 '<p>foo[bar<p style=color:blue>baz]quz',
2116 '<p>foo[bar<p><b>baz]quz</b>',
2118 '<div><p>foo<p>[bar<p>baz]</div>',
2120 'foo[<br>]bar',
2121 '<p>foo[</p><p>]bar</p>',
2122 '<p>foo[</p><p>]bar<br>baz</p>',
2123 'foo[<p>]bar</p>',
2124 'foo[<p>]bar<br>baz</p>',
2125 'foo[<p>]bar</p>baz',
2126 '<p>foo[</p>]bar',
2127 '<p>foo[</p>]bar<br>baz',
2128 '<p>foo[</p>]bar<p>baz</p>',
2129 'foo[<div><p>]bar</div>',
2130 '<div><p>foo[</p></div>]bar',
2131 'foo[<div><p>]bar</p>baz</div>',
2132 'foo[<div>]bar<p>baz</p></div>',
2133 '<div><p>foo</p>bar[</div>]baz',
2134 '<div>foo<p>bar[</p></div>]baz',
2135 ],
2136 //@}
2137 insertlinebreak: [
2138 //@{ Same as insertparagraph (set below)
2139 ],
2140 //@}
2141 insertorderedlist: [
2142 //@{
2143 'foo[]bar',
2144 'foo[bar]baz',
2145 'foo<br>[bar]',
2146 'f[oo<br>b]ar<br>baz',
2147 '<p>[foo]<br>bar</p>',
2148 '[foo<ol><li>bar]</ol>baz',
2149 'foo<ol><li>[bar</ol>baz]',
2150 '[foo<ul><li>bar]</ul>baz',
2151 'foo<ul><li>[bar</ul>baz]',
2152 'foo<ul><li>[bar</ul><ol><li>baz]</ol>quz',
2153 'foo<ol><li>[bar</ol><ul><li>baz]</ul>quz',
2155 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
2156 '<table><tbody><tr><td>fo[o<td>b]ar<td>baz</table>',
2157 '{<table><tr><td>foo<td>bar<td>baz</table>}',
2159 '<p>foo<p>[bar]<p>baz',
2160 '<p>foo<blockquote>[bar]</blockquote><p>baz',
2161 '<dl><dt>foo<dd>[bar]<dt>baz<dd>quz</dl>',
2162 '<dl><dt>foo<dd>bar<dt>[baz]<dd>quz</dl>',
2164 '<p>[foo<p>bar]<p>baz',
2165 '<p>[foo<blockquote>bar]</blockquote><p>baz',
2166 '<dl><dt>[foo<dd>bar]<dt>baz<dd>quz</dl>',
2167 '<dl><dt>foo<dd>[bar<dt>baz]<dd>quz</dl>',
2169 '<p>[foo<blockquote><p>bar]<p>baz</blockquote>',
2172 // Various <ol> stuff
2173 '<ol><li>foo<li>[bar]<li>baz</ol>',
2174 '<ol><li>foo</ol>[bar]',
2175 '[foo]<ol><li>bar</ol>',
2176 '<ol><li>foo</ol>[bar]<ol><li>baz</ol>',
2177 '<ol><ol><li>[foo]</ol></ol>',
2178 '<ol><li>[foo]<br>bar<li>baz</ol>',
2179 '<ol><li>foo<br>[bar]<li>baz</ol>',
2180 '<ol><li><div>[foo]</div>bar<li>baz</ol>',
2181 '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
2182 '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
2183 '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
2184 '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
2185 '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
2186 '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
2187 '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
2188 '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
2189 '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
2190 '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
2192 // Multiple items at once.
2193 '<ol><li>foo<li>[bar<li>baz]</ol>',
2194 '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
2195 '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
2196 '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
2198 // We probably can't actually get this DOM . . .
2199 '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
2200 '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
2201 '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
2202 '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
2205 // Same stuff but with <ul>
2206 '<ul><li>foo<li>[bar]<li>baz</ul>',
2207 '<ul><li>foo</ul>[bar]',
2208 '[foo]<ul><li>bar</ul>',
2209 '<ul><li>foo</ul>[bar]<ul><li>baz</ul>',
2210 '<ul><ul><li>[foo]</ul></ul>',
2211 '<ul><li>[foo]<br>bar<li>baz</ul>',
2212 '<ul><li>foo<br>[bar]<li>baz</ul>',
2213 '<ul><li><div>[foo]</div>bar<li>baz</ul>',
2214 '<ul><li>foo<ul><li>[bar]<li>baz</ul><li>quz</ul>',
2215 '<ul><li>foo<ul><li>bar<li>[baz]</ul><li>quz</ul>',
2216 '<ul><li>foo</li><ul><li>[bar]<li>baz</ul><li>quz</ul>',
2217 '<ul><li>foo</li><ul><li>bar<li>[baz]</ul><li>quz</ul>',
2218 '<ul><li>[foo]<ul><li>bar</ul><li>baz</ul>',
2219 '<ul><li>[foo]</li><ul><li>bar</ul><li>baz</ul>',
2220 '<ul><li>foo<li>[bar]<ul><li>baz</ul><li>quz</ul>',
2221 '<ul><li>foo<li>[bar]</li><ul><li>baz</ul><li>quz</ul>',
2222 '<ul><li>foo<ul><li>bar<li>baz</ul><li>[quz]</ul>',
2223 '<ul><li>foo</li><ul><li>bar<li>baz</ul><li>[quz]</ul>',
2225 // Multiple items at once.
2226 '<ul><li>foo<li>[bar<li>baz]</ul>',
2227 '<ul><li>[foo<ul><li>bar]</ul><li>baz</ul>',
2228 '<ul><li>foo<ul><li>b[ar</ul><li>b]az</ul>',
2229 '<ul><li>[foo<ul><li>bar</ul><li>baz]</ul><p>extra',
2231 // We probably can't actually get this DOM . . .
2232 '<ul><li>[foo]<ul><li>bar</ul>baz</ul>',
2233 '<ul><li>foo<ul><li>[bar]</ul>baz</ul>',
2234 '<ul><li>foo<ul><li>bar</ul>[baz]</ul>',
2235 '<ul><li>[foo<ul><li>bar]</ul>baz</ul>',
2238 // Mix of <ol> and <ul>
2239 'foo<ol><li>bar</ol><ul><li>[baz]</ul>quz',
2240 'foo<ol><li>bar</ol><ul><li>[baz</ul>quz]',
2241 'foo<ul><li>[bar]</ul><ol><li>baz</ol>quz',
2242 '[foo<ul><li>bar]</ul><ol><li>baz</ol>quz',
2244 // Interaction with indentation
2245 '[foo]<blockquote>bar</blockquote>baz',
2246 'foo<blockquote>[bar]</blockquote>baz',
2247 '[foo<blockquote>bar]</blockquote>baz',
2248 '<ol><li>foo</ol><blockquote>[bar]</blockquote>baz',
2249 '[foo]<blockquote><ol><li>bar</ol></blockquote>baz',
2250 'foo<blockquote>[bar]<br>baz</blockquote>',
2251 '[foo<blockquote>bar]<br>baz</blockquote>',
2252 '<ol><li>foo</ol><blockquote>[bar]<br>baz</blockquote>',
2254 '<p>[foo]<blockquote><p>bar</blockquote><p>baz',
2255 '<p>foo<blockquote><p>[bar]</blockquote><p>baz',
2256 '<p>[foo<blockquote><p>bar]</blockquote><p>baz',
2257 '<ol><li>foo</ol><blockquote><p>[bar]</blockquote><p>baz',
2259 // Attributes
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 '<ul id=abc><li>[foo]<li>bar<li>baz</ul>',
2264 '<ul style=color:blue><li>[foo]<li>bar<li>baz</ul>',
2265 '<ul style=text-indent:1em><li>[foo]<li>bar<li>baz</ul>',
2266 '<ul id=abc><li>foo<li>bar<li>[baz]</ul>',
2267 '<ul style=color:blue><li>foo<li>bar<li>[baz]</ul>',
2268 '<ul style=text-indent:1em><li>foo<li>bar<li>[baz]</ul>',
2270 // Whitespace nodes
2271 '<ol><li>foo</ol> <p>[bar]',
2272 '<p>[foo]</p> <ol><li>bar</ol>',
2273 '<ol><li>foo</ol> <p>[bar]</p> <ol><li>baz</ol>',
2275 // This caused an infinite loop at one point due to a bug in "fix
2276 // disallowed ancestors". Disabled because I'm not sure how we want it
2277 // to behave:
2278 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14578
2279 '!<span contenteditable=true>foo[]</span>',
2280 ],
2281 //@}
2282 insertparagraph: [
2283 //@{
2284 'foo[bar]baz',
2285 'fo[o<table><tr><td>b]ar</table>',
2286 '<table><tr><td>[foo<td>bar]<tr><td>baz<td>quz</table>',
2287 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<tr><td>baz<td>quz</table>',
2288 '<table><tr><td>fo[o</table>b]ar',
2289 '<table><tr><td>fo[o<td>b]ar<td>baz</table>',
2290 '{<table><tr><td>foo</table>}',
2291 '<table><tr><td>[foo]</table>',
2292 '<ol><li>[foo]<li>bar</ol>',
2293 '<ol><li>f[o]o<li>bar</ol>',
2295 '[]foo',
2296 'foo[]',
2297 '<span>foo[]</span>',
2298 'foo[]<br>',
2299 'foo[]bar',
2300 '<address>[]foo</address>',
2301 '<address>foo[]</address>',
2302 '<address>foo[]<br></address>',
2303 '<address>foo[]bar</address>',
2304 '<div>[]foo</div>',
2305 '<div>foo[]</div>',
2306 '<div>foo[]<br></div>',
2307 '<div>foo[]bar</div>',
2308 '<dl><dt>[]foo<dd>bar</dl>',
2309 '<dl><dt>foo[]<dd>bar</dl>',
2310 '<dl><dt>foo[]<br><dd>bar</dl>',
2311 '<dl><dt>foo[]bar<dd>baz</dl>',
2312 '<dl><dt>foo<dd>[]bar</dl>',
2313 '<dl><dt>foo<dd>bar[]</dl>',
2314 '<dl><dt>foo<dd>bar[]<br></dl>',
2315 '<dl><dt>foo<dd>bar[]baz</dl>',
2316 '<h1>[]foo</h1>',
2317 '<h1>foo[]</h1>',
2318 '<h1>foo[]<br></h1>',
2319 '<h1>foo[]bar</h1>',
2320 '<ol><li>[]foo</ol>',
2321 '<ol><li>foo[]</ol>',
2322 '<ol><li>foo[]<br></ol>',
2323 '<ol><li>foo[]bar</ol>',
2324 '<p>[]foo</p>',
2325 '<p>foo[]</p>',
2326 '<p>foo[]<br></p>',
2327 '<p>foo[]bar</p>',
2328 '<pre>[]foo</pre>',
2329 '<pre>foo[]</pre>',
2330 '<pre>foo[]<br></pre>',
2331 '<pre>foo[]bar</pre>',
2333 '<pre>foo[]<br><br></pre>',
2334 '<pre>foo<br>{}<br></pre>',
2335 '<pre>foo []</pre>',
2336 '<pre>foo[] </pre>',
2337 '<pre>foo [] </pre>',
2339 '<xmp>foo[]bar</xmp>',
2340 '<script>foo[]bar</script>baz',
2341 '<div style=display:none>foo[]bar</div>baz',
2342 '<listing>foo[]bar</listing>',
2344 '<ol><li>{}<br></li></ol>',
2345 'foo<ol><li>{}<br></li></ol>',
2346 '<ol><li>{}<br></li></ol>foo',
2347 '<ol><li>foo<li>{}<br></ol>',
2348 '<ol><li>{}<br><li>bar</ol>',
2349 '<ol><li>foo</li><ul><li>{}<br></ul></ol>',
2351 '<dl><dt>{}<br></dt></dl>',
2352 '<dl><dt>foo<dd>{}<br></dl>',
2353 '<dl><dt>{}<br><dd>bar</dl>',
2354 '<dl><dt>foo<dd>bar<dl><dt>{}<br><dd>baz</dl></dl>',
2355 '<dl><dt>foo<dd>bar<dl><dt>baz<dd>{}<br></dl></dl>',
2357 '<h1>foo[bar</h1><p>baz]quz</p>',
2358 '<p>foo[bar</p><h1>baz]quz</h1>',
2359 '<p>foo</p>{}<br>',
2360 '{}<br><p>foo</p>',
2361 '<p>foo</p>{}<br><h1>bar</h1>',
2362 '<h1>foo</h1>{}<br><p>bar</p>',
2363 '<h1>foo</h1>{}<br><h2>bar</h2>',
2364 '<p>foo</p><h1>[bar]</h1><p>baz</p>',
2365 '<p>foo</p>{<h1>bar</h1>}<p>baz</p>',
2367 '<table><tr><td>foo[]bar</table>',
2368 '<table><tr><td><p>foo[]bar</table>',
2370 '<blockquote>[]foo</blockquote>',
2371 '<blockquote>foo[]</blockquote>',
2372 '<blockquote>foo[]<br></blockquote>',
2373 '<blockquote>foo[]bar</blockquote>',
2374 '<blockquote><p>[]foo</blockquote>',
2375 '<blockquote><p>foo[]</blockquote>',
2376 '<blockquote><p>foo[]bar</blockquote>',
2377 '<blockquote><p>foo[]<p>bar</blockquote>',
2378 '<blockquote><p>foo[]bar<p>baz</blockquote>',
2380 '<span>foo[]bar</span>',
2381 '<span>foo[]bar</span>baz',
2382 '<b>foo[]bar</b>',
2383 '<b>foo[]bar</b>baz',
2384 '<b>foo[]</b>bar',
2385 'foo<b>[]bar</b>',
2386 '<b>foo[]</b><i>bar</i>',
2387 '<b id=x class=y>foo[]bar</b>',
2388 '<i><b>foo[]bar</b>baz</i>',
2390 '<p><b>foo[]bar</b></p>',
2391 '<p><b>[]foo</b></p>',
2392 '<p><b id=x class=y>foo[]bar</b></p>',
2393 '<div><b>foo[]bar</b></div>',
2395 '<a href=foo>foo[]bar</a>',
2396 '<a href=foo>foo[]bar</a>baz',
2397 '<a href=foo>foo[]</a>bar',
2398 'foo<a href=foo>[]bar</a>',
2400 '<p>foo[]<!--bar-->',
2401 '<p><!--foo-->[]bar',
2403 '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
2404 '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
2405 '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
2406 '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
2407 '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
2408 '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
2409 '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
2410 '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
2412 // https://bugs.webkit.org/show_bug.cgi?id=5036
2413 '<ul contenteditable><li>{}<br></ul>',
2414 '<ul contenteditable><li>foo[]</ul>',
2415 '<div contenteditable=false><ul contenteditable><li>{}<br></ul></div>',
2416 '<div contenteditable=false><ul contenteditable><li>foo[]</ul></div>',
2418 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13841
2419 // https://bugs.webkit.org/show_bug.cgi?id=23507
2420 '<address><p>foo[]</address>',
2421 '<dl><dt><p>foo[]</dl>',
2422 '<dl><dd><p>foo[]</dl>',
2423 '<ol><li><p>foo[]</ol>',
2424 '<ul><li><p>foo[]</ul>',
2425 '<address><div>foo[]</address>',
2426 '<dl><dt><div>foo[]</dl>',
2427 '<dl><dd><div>foo[]</dl>',
2428 '<ol><li><div>foo[]</ol>',
2429 '<ul><li><div>foo[]</ul>',
2430 '<div><p>foo[]</div>',
2431 '<div><div>foo[]</div>',
2433 '<address><p>[]foo</address>',
2434 '<dl><dt><p>[]foo</dl>',
2435 '<dl><dd><p>[]foo</dl>',
2436 '<ol><li><p>[]foo</ol>',
2437 '<ul><li><p>[]foo</ul>',
2438 '<address><div>[]foo</address>',
2439 '<dl><dt><div>[]foo</dl>',
2440 '<dl><dd><div>[]foo</dl>',
2441 '<ol><li><div>[]foo</ol>',
2442 '<ul><li><div>[]foo</ul>',
2443 '<div><p>[]foo</div>',
2444 '<div><div>[]foo</div>',
2446 '<address><p>foo[]bar</address>',
2447 '<dl><dt><p>foo[]bar</dl>',
2448 '<dl><dd><p>foo[]bar</dl>',
2449 '<ol><li><p>foo[]bar</ol>',
2450 '<ul><li><p>foo[]bar</ul>',
2451 '<address><div>foo[]bar</address>',
2452 '<dl><dt><div>foo[]bar</dl>',
2453 '<dl><dd><div>foo[]bar</dl>',
2454 '<ol><li><div>foo[]bar</ol>',
2455 '<ul><li><div>foo[]bar</ul>',
2456 '<div><p>foo[]bar</div>',
2457 '<div><div>foo[]bar</div>',
2459 '<ol><li class=a id=x><p class=b id=y>foo[]</ol>',
2460 '<div class=a id=x><div class=b id=y>foo[]</div></div>',
2461 '<div class=a id=x><p class=b id=y>foo[]</div>',
2462 '<ol><li class=a id=x><p class=b id=y>[]foo</ol>',
2463 '<div class=a id=x><div class=b id=y>[]foo</div></div>',
2464 '<div class=a id=x><p class=b id=y>[]foo</div>',
2465 '<ol><li class=a id=x><p class=b id=y>foo[]bar</ol>',
2466 '<div class=a id=x><div class=b id=y>foo[]bar</div></div>',
2467 '<div class=a id=x><p class=b id=y>foo[]bar</div>',
2468 ],
2469 //@}
2470 inserttext: [
2471 //@{
2472 'foo[bar]baz',
2473 ['', 'foo[bar]baz'],
2475 ['\t', 'foo[]bar'],
2476 ['&', 'foo[]bar'],
2477 ['\n', 'foo[]bar'],
2478 ['abc\ndef', 'foo[]bar'],
2479 ['\x07', 'foo[]bar'],
2481 ['<b>hi</b>', 'foo[]bar'],
2482 ['<', 'foo[]bar'],
2483 ['&', 'foo[]bar'],
2485 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14254
2486 ['!\r', 'foo[]bar'],
2487 ['!\r\n', 'foo[]bar'],
2488 ['!\0', 'foo[]bar'],
2489 ['!\ud800', 'foo[]bar'],
2491 // Whitespace tests! The following two bugs are relevant to some of
2492 // these:
2493 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14119
2494 // https://bugzilla.mozilla.org/show_bug.cgi?id=681626
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 [' ', 'foo []bar'],
2505 [' ', 'foo [] bar'],
2506 [' ', 'foo[] bar'],
2507 [' ', 'foo [] bar'],
2508 [' ', 'foo []bar'],
2509 [' ', 'foo [] bar'],
2511 [' ', '[]foo'],
2512 [' ', '{}foo'],
2513 [' ', 'foo[]'],
2514 [' ', 'foo{}'],
2515 [' ', 'foo []'],
2516 [' ', 'foo {}'],
2517 [' ', 'foo []'],
2518 [' ', 'foo {}'],
2519 [' ', '<b>foo[]</b>bar'],
2520 [' ', 'foo[]<b>bar</b>'],
2522 [' ', 'foo[] '],
2523 [' ', ' foo [] '],
2524 [' ', 'foo[]<span> </span>'],
2525 [' ', 'foo[]<span> </span> '],
2526 [' ', ' []foo'],
2527 [' ', ' [] foo '],
2528 [' ', '<span> </span>[]foo'],
2529 [' ', ' <span> </span>[]foo'],
2531 [' ', '{}<br>'],
2532 [' ', '<p>{}<br>'],
2534 [' ', '<p>foo[]<p>bar'],
2535 [' ', '<p>foo []<p>bar'],
2536 [' ', '<p>foo[]<p> bar'],
2538 // Some of the same tests as above, repeated with various values of
2539 // white-space.
2540 [' ', '<pre>foo[]bar</pre>'],
2541 [' ', '<pre>foo []bar</pre>'],
2542 [' ', '<pre>foo[] bar</pre>'],
2543 [' ', '<pre>foo []bar</pre>'],
2544 [' ', '<pre>[]foo</pre>'],
2545 [' ', '<pre>foo[]</pre>'],
2546 [' ', '<pre>foo []</pre>'],
2547 [' ', '<pre> foo [] </pre>'],
2549 [' ', '<div style=white-space:pre>foo[]bar</div>'],
2550 [' ', '<div style=white-space:pre>foo []bar</div>'],
2551 [' ', '<div style=white-space:pre>foo[] bar</div>'],
2552 [' ', '<div style=white-space:pre>foo []bar</div>'],
2553 [' ', '<div style=white-space:pre>[]foo</div>'],
2554 [' ', '<div style=white-space:pre>foo[]</div>'],
2555 [' ', '<div style=white-space:pre>foo []</div>'],
2556 [' ', '<div style=white-space:pre> foo [] </div>'],
2558 [' ', '<div style=white-space:pre-wrap>foo[]bar</div>'],
2559 [' ', '<div style=white-space:pre-wrap>foo []bar</div>'],
2560 [' ', '<div style=white-space:pre-wrap>foo[] bar</div>'],
2561 [' ', '<div style=white-space:pre-wrap>foo []bar</div>'],
2562 [' ', '<div style=white-space:pre-wrap>[]foo</div>'],
2563 [' ', '<div style=white-space:pre-wrap>foo[]</div>'],
2564 [' ', '<div style=white-space:pre-wrap>foo []</div>'],
2565 [' ', '<div style=white-space:pre-wrap> foo [] </div>'],
2567 [' ', '<div style=white-space:pre-line>foo[]bar</div>'],
2568 [' ', '<div style=white-space:pre-line>foo []bar</div>'],
2569 [' ', '<div style=white-space:pre-line>foo[] bar</div>'],
2570 [' ', '<div style=white-space:pre-line>foo []bar</div>'],
2571 [' ', '<div style=white-space:pre-line>[]foo</div>'],
2572 [' ', '<div style=white-space:pre-line>foo[]</div>'],
2573 [' ', '<div style=white-space:pre-line>foo []</div>'],
2574 [' ', '<div style=white-space:pre-line> foo [] </div>'],
2576 [' ', '<div style=white-space:nowrap>foo[]bar</div>'],
2577 [' ', '<div style=white-space:nowrap>foo []bar</div>'],
2578 [' ', '<div style=white-space:nowrap>foo[] bar</div>'],
2579 [' ', '<div style=white-space:nowrap>foo []bar</div>'],
2580 [' ', '<div style=white-space:nowrap>[]foo</div>'],
2581 [' ', '<div style=white-space:nowrap>foo[]</div>'],
2582 [' ', '<div style=white-space:nowrap>foo []</div>'],
2583 [' ', '<div style=white-space:nowrap> foo [] </div>'],
2585 // End whitespace tests
2587 // Autolinking tests
2588 [' ', 'http://a[]'],
2589 [' ', 'ftp://a[]'],
2590 [' ', 'quasit://a[]'],
2591 [' ', '.x-++-.://a[]'],
2592 [' ', '(http://a)[]'],
2593 [' ', '<http://a>[]'],
2594 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14744
2595 ['! ', '[http://a][]'],
2596 ['! ', '{http://a}[]'],
2597 [' ', 'http://a![]'],
2598 [' ', '!"#$%&\'()*+,-./:;<=>?\^_`|~http://a!"#$%&\'()*+,-./:;<=>?\^_`|~[]'],
2599 [' ', 'http://a!"\'(),-.:;<>`[]'],
2600 [' ', 'http://a#$%&*+/=?\^_|~[]'],
2601 [' ', 'mailto:a[]'],
2602 [' ', 'a@b[]'],
2603 [' ', 'a@[]'],
2604 [' ', '@b[]'],
2605 [' ', '#@x[]'],
2606 [' ', 'a@.[]'],
2607 [' ', '!"#$%&\'()*+,-./:;<=>?\^_`|~a@b!"#$%&\'()*+,-./:;<=>?\^_`|~[]'],
2608 [' ', '<b>a@b</b>{}'],
2609 [' ', '<b>a</b><i>@</i><u>b</u>{}'],
2610 [' ', 'a@b<b>[]c</b>'],
2611 [' ', '<p>a@b</p><p>[]c</p>'],
2612 ['a', 'http://a[]'],
2613 ['\t', 'http://a[]'],
2614 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14254
2615 ['!\r', 'http://a[]'],
2616 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14745
2617 ['!\n', 'http://a[]'],
2618 ['\f', 'http://a[]'],
2619 ['\u00A0', 'http://a[]'],
2621 [' ', 'foo[]'],
2623 'foo[]bar',
2624 'foo []',
2625 'foo\xa0[]',
2626 '<p>foo[]',
2627 '<p>foo</p>{}',
2628 '<p>[]foo',
2629 '<p>{}foo',
2630 '{}<p>foo',
2631 '<p>foo</p>{}<p>bar</p>',
2632 '<b>foo[]</b>bar',
2633 '<b>foo</b>[]bar',
2634 'foo<b>{}</b>bar',
2635 '<a>foo[]</a>bar',
2636 '<a>foo</a>[]bar',
2637 '<a href=/>foo[]</a>bar',
2638 '<a href=/>foo</a>[]bar',
2639 '<p>fo[o<p>b]ar',
2640 '<p>fo[o<p>bar<p>b]az',
2641 '{}<br>',
2642 '<p>{}<br>',
2643 '<p><span>{}<br></span>',
2644 '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
2645 '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
2646 '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
2647 '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
2648 '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
2649 '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
2650 '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
2651 '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
2654 // These are like the corresponding tests in the multitest section, but
2655 // because the selection isn't collapsed, we don't need to do
2656 // multitests to set overrides.
2657 'foo<b>[bar]</b>baz',
2658 'foo<i>[bar]</i>baz',
2659 'foo<s>[bar]</s>baz',
2660 'foo<sub>[bar]</sub>baz',
2661 'foo<sup>[bar]</sup>baz',
2662 'foo<u>[bar]</u>baz',
2663 'foo<a href=http://www.google.com>[bar]</a>baz',
2664 'foo<font face=sans-serif>[bar]</font>baz',
2665 'foo<font size=4>[bar]</font>baz',
2666 'foo<font color=#0000FF>[bar]</font>baz',
2667 'foo<span style=background-color:#00FFFF>[bar]</span>baz',
2668 'foo<a href=http://www.google.com><font color=blue>[bar]</font></a>baz',
2669 'foo<font color=blue><a href=http://www.google.com>[bar]</a></font>baz',
2670 'foo<a href=http://www.google.com><font color=brown>[bar]</font></a>baz',
2671 'foo<font color=brown><a href=http://www.google.com>[bar]</a></font>baz',
2672 'foo<a href=http://www.google.com><font color=black>[bar]</font></a>baz',
2673 'foo<a href=http://www.google.com><u>[bar]</u></a>baz',
2674 'foo<u><a href=http://www.google.com>[bar]</a></u>baz',
2675 'foo<sub><font size=2>[bar]</font></sub>baz',
2676 'foo<font size=2><sub>[bar]</sub></font>baz',
2677 'foo<sub><font size=3>[bar]</font></sub>baz',
2678 'foo<font size=3><sub>[bar]</sub></font>baz',
2680 // Now repeat but with different selections.
2681 '[foo<b>bar]</b>baz',
2682 '[foo<i>bar]</i>baz',
2683 '[foo<s>bar]</s>baz',
2684 '[foo<sub>bar]</sub>baz',
2685 '[foo<sup>bar]</sup>baz',
2686 '[foo<u>bar]</u>baz',
2687 '[foo<a href=http://www.google.com>bar]</a>baz',
2688 '[foo<font face=sans-serif>bar]</font>baz',
2689 '[foo<font size=4>bar]</font>baz',
2690 '[foo<font color=#0000FF>bar]</font>baz',
2691 '[foo<span style=background-color:#00FFFF>bar]</span>baz',
2692 '[foo<a href=http://www.google.com><font color=blue>bar]</font></a>baz',
2693 '[foo<font color=blue><a href=http://www.google.com>bar]</a></font>baz',
2694 '[foo<a href=http://www.google.com><font color=brown>bar]</font></a>baz',
2695 '[foo<font color=brown><a href=http://www.google.com>bar]</a></font>baz',
2696 '[foo<a href=http://www.google.com><font color=black>bar]</font></a>baz',
2697 '[foo<a href=http://www.google.com><u>bar]</u></a>baz',
2698 '[foo<u><a href=http://www.google.com>bar]</a></u>baz',
2699 '[foo<sub><font size=2>bar]</font></sub>baz',
2700 '[foo<font size=2><sub>bar]</sub></font>baz',
2701 '[foo<sub><font size=3>bar]</font></sub>baz',
2702 '[foo<font size=3><sub>bar]</sub></font>baz',
2704 'foo<b>[bar</b>baz]',
2705 'foo<i>[bar</i>baz]',
2706 'foo<s>[bar</s>baz]',
2707 'foo<sub>[bar</sub>baz]',
2708 'foo<sup>[bar</sup>baz]',
2709 'foo<u>[bar</u>baz]',
2710 'foo<a href=http://www.google.com>[bar</a>baz]',
2711 'foo<font face=sans-serif>[bar</font>baz]',
2712 'foo<font size=4>[bar</font>baz]',
2713 'foo<font color=#0000FF>[bar</font>baz]',
2714 'foo<span style=background-color:#00FFFF>[bar</span>baz]',
2715 'foo<a href=http://www.google.com><font color=blue>[bar</font></a>baz]',
2716 'foo<font color=blue><a href=http://www.google.com>[bar</a></font>baz]',
2717 'foo<a href=http://www.google.com><font color=brown>[bar</font></a>baz]',
2718 'foo<font color=brown><a href=http://www.google.com>[bar</a></font>baz]',
2719 'foo<a href=http://www.google.com><font color=black>[bar</font></a>baz]',
2720 'foo<a href=http://www.google.com><u>[bar</u></a>baz]',
2721 'foo<u><a href=http://www.google.com>[bar</a></u>baz]',
2722 'foo<sub><font size=2>[bar</font></sub>baz]',
2723 'foo<font size=2><sub>[bar</sub></font>baz]',
2724 'foo<sub><font size=3>[bar</font></sub>baz]',
2725 'foo<font size=3><sub>[bar</sub></font>baz]',
2727 // https://bugs.webkit.org/show_bug.cgi?id=19702
2728 '<blockquote><font color=blue>[foo]</font></blockquote>',
2729 ],
2730 //@}
2731 insertunorderedlist: [
2732 //@{
2733 'foo[]bar',
2734 'foo[bar]baz',
2735 'foo<br>[bar]',
2736 'f[oo<br>b]ar<br>baz',
2737 '<p>[foo]<br>bar</p>',
2738 '[foo<ol><li>bar]</ol>baz',
2739 'foo<ol><li>[bar</ol>baz]',
2740 '[foo<ul><li>bar]</ul>baz',
2741 'foo<ul><li>[bar</ul>baz]',
2742 'foo<ul><li>[bar</ul><ol><li>baz]</ol>quz',
2743 'foo<ol><li>[bar</ol><ul><li>baz]</ul>quz',
2745 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
2746 '<table><tbody><tr><td>fo[o<td>b]ar<td>baz</table>',
2747 '{<table><tr><td>foo<td>bar<td>baz</table>}',
2749 '<p>foo<p>[bar]<p>baz',
2750 '<p>foo<blockquote>[bar]</blockquote><p>baz',
2751 '<dl><dt>foo<dd>[bar]<dt>baz<dd>quz</dl>',
2752 '<dl><dt>foo<dd>bar<dt>[baz]<dd>quz</dl>',
2754 '<p>[foo<p>bar]<p>baz',
2755 '<p>[foo<blockquote>bar]</blockquote><p>baz',
2756 '<dl><dt>[foo<dd>bar]<dt>baz<dd>quz</dl>',
2757 '<dl><dt>foo<dd>[bar<dt>baz]<dd>quz</dl>',
2759 '<p>[foo<blockquote><p>bar]<p>baz</blockquote>',
2762 // Various <ol> stuff
2763 '<ol><li>foo<li>[bar]<li>baz</ol>',
2764 '<ol><li>foo</ol>[bar]',
2765 '[foo]<ol><li>bar</ol>',
2766 '<ol><li>foo</ol>[bar]<ol><li>baz</ol>',
2767 '<ol><ol><li>[foo]</ol></ol>',
2768 '<ol><li>[foo]<br>bar<li>baz</ol>',
2769 '<ol><li>foo<br>[bar]<li>baz</ol>',
2770 '<ol><li><div>[foo]</div>bar<li>baz</ol>',
2771 '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
2772 '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
2773 '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
2774 '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
2775 '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
2776 '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
2777 '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
2778 '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
2779 '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
2780 '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
2782 // Multiple items at once.
2783 '<ol><li>foo<li>[bar<li>baz]</ol>',
2784 '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
2785 '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
2786 '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
2788 // We probably can't actually get this DOM . . .
2789 '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
2790 '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
2791 '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
2792 '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
2795 // Same stuff but with <ul>
2796 '<ul><li>foo<li>[bar]<li>baz</ul>',
2797 '<ul><li>foo</ul>[bar]',
2798 '[foo]<ul><li>bar</ul>',
2799 '<ul><li>foo</ul>[bar]<ul><li>baz</ul>',
2800 '<ul><ul><li>[foo]</ul></ul>',
2801 '<ul><li>[foo]<br>bar<li>baz</ul>',
2802 '<ul><li>foo<br>[bar]<li>baz</ul>',
2803 '<ul><li><div>[foo]</div>bar<li>baz</ul>',
2804 '<ul><li>foo<ul><li>[bar]<li>baz</ul><li>quz</ul>',
2805 '<ul><li>foo<ul><li>bar<li>[baz]</ul><li>quz</ul>',
2806 '<ul><li>foo</li><ul><li>[bar]<li>baz</ul><li>quz</ul>',
2807 '<ul><li>foo</li><ul><li>bar<li>[baz]</ul><li>quz</ul>',
2808 '<ul><li>[foo]<ul><li>bar</ul><li>baz</ul>',
2809 '<ul><li>[foo]</li><ul><li>bar</ul><li>baz</ul>',
2810 '<ul><li>foo<li>[bar]<ul><li>baz</ul><li>quz</ul>',
2811 '<ul><li>foo<li>[bar]</li><ul><li>baz</ul><li>quz</ul>',
2812 '<ul><li>foo<ul><li>bar<li>baz</ul><li>[quz]</ul>',
2813 '<ul><li>foo</li><ul><li>bar<li>baz</ul><li>[quz]</ul>',
2815 // Multiple items at once.
2816 '<ul><li>foo<li>[bar<li>baz]</ul>',
2817 '<ul><li>[foo<ul><li>bar]</ul><li>baz</ul>',
2818 '<ul><li>foo<ul><li>b[ar</ul><li>b]az</ul>',
2819 '<ul><li>[foo<ul><li>bar</ul><li>baz]</ul><p>extra',
2821 // We probably can't actually get this DOM . . .
2822 '<ul><li>[foo]<ul><li>bar</ul>baz</ul>',
2823 '<ul><li>foo<ul><li>[bar]</ul>baz</ul>',
2824 '<ul><li>foo<ul><li>bar</ul>[baz]</ul>',
2825 '<ul><li>[foo<ul><li>bar]</ul>baz</ul>',
2828 // Mix of <ol> and <ul>
2829 'foo<ol><li>bar</ol><ul><li>[baz]</ul>quz',
2830 'foo<ol><li>bar</ol><ul><li>[baz</ul>quz]',
2831 'foo<ul><li>[bar]</ul><ol><li>baz</ol>quz',
2832 '[foo<ul><li>bar]</ul><ol><li>baz</ol>quz',
2834 // Interaction with indentation
2835 '[foo]<blockquote>bar</blockquote>baz',
2836 'foo<blockquote>[bar]</blockquote>baz',
2837 '[foo<blockquote>bar]</blockquote>baz',
2838 '<ol><li>foo</ol><blockquote>[bar]</blockquote>baz',
2839 '[foo]<blockquote><ol><li>bar</ol></blockquote>baz',
2840 'foo<blockquote>[bar]<br>baz</blockquote>',
2841 '[foo<blockquote>bar]<br>baz</blockquote>',
2842 '<ol><li>foo</ol><blockquote>[bar]<br>baz</blockquote>',
2844 '<p>[foo]<blockquote><p>bar</blockquote><p>baz',
2845 '<p>foo<blockquote><p>[bar]</blockquote><p>baz',
2846 '<p>[foo<blockquote><p>bar]</blockquote><p>baz',
2847 '<ol><li>foo</ol><blockquote><p>[bar]</blockquote><p>baz',
2849 // Attributes
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 '<ul id=abc><li>[foo]<li>bar<li>baz</ul>',
2854 '<ul style=color:blue><li>[foo]<li>bar<li>baz</ul>',
2855 '<ul style=text-indent:1em><li>[foo]<li>bar<li>baz</ul>',
2856 '<ul id=abc><li>foo<li>bar<li>[baz]</ul>',
2857 '<ul style=color:blue><li>foo<li>bar<li>[baz]</ul>',
2858 '<ul style=text-indent:1em><li>foo<li>bar<li>[baz]</ul>',
2860 // Whitespace nodes
2861 '<ul><li>foo</ul> <p>[bar]',
2862 '<p>[foo]</p> <ul><li>bar</ul>',
2863 '<ul><li>foo</ul> <p>[bar]</p> <ul><li>baz</ul>',
2865 // https://bugs.webkit.org/show_bug.cgi?id=24167
2866 '{<div style="font-size: 1.3em">1</div><div style="font-size: 1.1em">2</div>}',
2867 ],
2868 //@}
2869 italic: [
2870 //@{
2871 'foo[]bar',
2872 '<p>[foo</p> <p>bar]</p>',
2873 '<span>[foo</span> <span>bar]</span>',
2874 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
2875 '<p>[foo<p><br><p>bar]',
2876 '<b>foo[]bar</b>',
2877 '<i>foo[]bar</i>',
2878 '<span>foo</span>{}<span>bar</span>',
2879 '<span>foo[</span><span>]bar</span>',
2880 'foo[bar]baz',
2881 'foo[bar<b>baz]qoz</b>quz',
2882 'foo[bar<i>baz]qoz</i>quz',
2883 '{<p><p> <p>foo</p>}',
2885 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
2886 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
2887 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
2888 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
2889 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
2890 '{<table><tr><td>foo<td>bar<td>baz</table>}',
2892 'foo<span style="font-style: italic">[bar]</span>baz',
2893 'foo<address>[bar]</address>baz',
2894 'foo<cite>[bar]</cite>baz',
2895 'foo<dfn>[bar]</dfn>baz',
2896 'foo<em>[bar]</em>baz',
2897 'foo<i>[bar]</i>baz',
2898 'foo<var>[bar]</var>baz',
2900 'foo{<address>bar</address>}baz',
2901 'foo{<cite>bar</cite>}baz',
2902 'foo{<dfn>bar</dfn>}baz',
2903 'foo{<em>bar</em>}baz',
2904 'foo{<i>bar</i>}baz',
2905 'foo{<var>bar</var>}baz',
2907 'foo<address>b[a]r</address>baz',
2908 'foo<cite>b[a]r</cite>baz',
2909 'foo<dfn>b[a]r</dfn>baz',
2910 'foo<em>b[a]r</em>baz',
2911 'foo<i>b[a]r</i>baz',
2912 'foo<var>b[a]r</var>baz',
2914 'fo[o<address>bar</address>b]az',
2915 'fo[o<cite>bar</cite>b]az',
2916 'fo[o<dfn>bar</dfn>b]az',
2917 'fo[o<em>bar</em>b]az',
2918 'fo[o<i>bar</i>b]az',
2919 'fo[o<var>bar</var>b]az',
2921 'foo[<address>bar</address>baz]',
2922 'foo[<cite>bar</cite>baz]',
2923 'foo[<dfn>bar</dfn>baz]',
2924 'foo[<em>bar</em>baz]',
2925 'foo[<i>bar</i>baz]',
2926 'foo[<var>bar</var>baz]',
2928 '[foo<address>bar</address>]baz',
2929 '[foo<cite>bar</cite>]baz',
2930 '[foo<dfn>bar</dfn>]baz',
2931 '[foo<em>bar</em>]baz',
2932 '[foo<i>bar</i>]baz',
2933 '[foo<var>bar</var>]baz',
2935 'foo<span style="font-style: italic">[bar]</span>baz',
2936 'foo<span style="font-style: oblique">[bar]</span>baz',
2937 'foo<span style="font-style: oblique">b[a]r</span>baz',
2939 '<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>',
2940 '<i><p>foo[<b>bar</b>}</p><p>baz</p></i>',
2941 'foo [bar <b>baz] qoz</b> quz sic',
2942 'foo bar <b>baz [qoz</b> quz] sic',
2943 'foo [bar <i>baz] qoz</i> quz sic',
2944 'foo bar <i>baz [qoz</i> quz] sic',
2946 // Tests for queryCommandIndeterm() and queryCommandState()
2947 'fo[o<i>b]ar</i>baz',
2948 'foo<i>ba[r</i>b]az',
2949 'fo[o<i>bar</i>b]az',
2950 'foo[<i>b]ar</i>baz',
2951 'foo<i>ba[r</i>]baz',
2952 'foo[<i>bar</i>]baz',
2953 'foo<i>[bar]</i>baz',
2954 'foo{<i>bar</i>}baz',
2955 'fo[o<span style=font-style:italic>b]ar</span>baz',
2956 'fo[o<span style=font-style:oblique>b]ar</span>baz',
2957 '<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b]ar</span>',
2958 '<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b]ar</span>',
2959 '<i>fo[o</i><address>b]ar</address>',
2960 ],
2961 //@}
2962 justifycenter: [
2963 //@{
2964 'foo[]bar<p>extra',
2965 '<span>foo</span>{}<span>bar</span><p>extra',
2966 '<span>foo[</span><span>]bar</span><p>extra',
2967 'foo[bar]baz<p>extra',
2968 'foo[bar<b>baz]qoz</b>quz<p>extra',
2969 '<p>foo[]bar<p>extra',
2970 '<p>foo[bar]baz<p>extra',
2971 '<h1>foo[bar]baz</h1><p>extra',
2972 '<pre>foo[bar]baz</pre><p>extra',
2973 '<xmp>foo[bar]baz</xmp><p>extra',
2974 '<center><p>[foo]<p>bar</center><p>extra',
2975 '<center><p>[foo<p>bar]</center><p>extra',
2977 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
2978 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
2979 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
2980 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
2981 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
2982 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
2984 '<table align=center><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
2985 '<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
2986 '<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
2987 '<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
2988 '<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
2989 '{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra',
2991 '<table><tbody align=center><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
2992 '<table><tbody align=center><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
2993 '<table><tbody align=center><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
2994 '<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
2995 '<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra',
2996 '{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra',
2998 '<table><tbody><tr align=center><td>foo<td>b[a]r<td>baz</table><p>extra',
2999 '<table><tbody><tr align=center data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3000 '<table><tbody><tr align=center data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3001 '<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra',
3002 '<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra',
3003 '{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra',
3005 '<div align=center><p>[foo]<p>bar</div><p>extra',
3006 '<div align=center><p>[foo<p>bar}</div><p>extra',
3007 '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
3008 '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
3010 '<div align=justify><p>[foo]<p>bar</div><p>extra',
3011 '<div align=justify><p>[foo<p>bar}</div><p>extra',
3012 '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
3013 '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
3015 '<div align=left><p>[foo]<p>bar</div><p>extra',
3016 '<div align=left><p>[foo<p>bar}</div><p>extra',
3017 '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
3018 '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
3020 '<div align=right><p>[foo]<p>bar</div><p>extra',
3021 '<div align=right><p>[foo<p>bar}</div><p>extra',
3022 '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
3023 '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
3025 '<center>foo</center>[bar]<p>extra',
3026 '[foo]<center>bar</center><p>extra',
3027 '<center>foo</center>[bar]<center>baz</center><p>extra',
3028 '<div align=center>foo</div>[bar]<p>extra',
3029 '[foo]<div align=center>bar</div><p>extra',
3030 '<div align=center>foo</div>[bar]<div align=center>baz</div><p>extra',
3031 '<div align=center><p>foo</div><p>[bar]<p>extra',
3032 '<p>[foo]<div align=center><p>bar</div><p>extra',
3033 '<div align=center><p>foo</div><p>[bar]<div align=center><p>baz</div><p>extra',
3034 '<div style=text-align:center>foo</div>[bar]<p>extra',
3035 '[foo]<div style=text-align:center>bar</div><p>extra',
3036 '<div style=text-align:center>foo</div>[bar]<div style=text-align:center>baz</div><p>extra',
3037 '<div style=text-align:center><p>foo</div><p>[bar]<p>extra',
3038 '<p>[foo]<div style=text-align:center><p>bar</div><p>extra',
3039 '<div style=text-align:center><p>foo</div><p>[bar]<div style=text-align:center><p>baz</div><p>extra',
3040 '<p align=center>foo<p>[bar]<p>extra',
3041 '<p>[foo]<p align=center>bar<p>extra',
3042 '<p align=center>foo<p>[bar]<p align=center>baz<p>extra',
3044 '<center>[foo</center>bar]<p>extra',
3045 '<center>fo[o</center>b]ar<p>extra',
3046 '<div align=center>[foo</div>bar]<p>extra',
3047 '<div align=center>fo[o</div>b]ar<p>extra',
3048 '<div style=text-align:center>[foo</div>bar]<p>extra',
3049 '<div style=text-align:center>fo[o</div>b]ar<p>extra',
3050 '<span style=text-align:center>[foo]</span><p>extra',
3051 '<span style=text-align:center>f[o]o</span><p>extra',
3053 '<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
3055 '<div align=nonsense><p>[foo]</div><p>extra',
3056 '<div style=text-align:inherit><p>[foo]</div><p>extra',
3057 '<quasit align=right><p>[foo]</p></quasit><p>extra',
3059 '<div align=center>{<div align=left>foo</div>}</div>',
3060 '<div align=left>{<div align=center>foo</div>}</div>',
3061 '<div align=center>{<div align=left>foo</div>bar}</div>',
3062 '<div align=left>{<div align=center>foo</div>bar}</div>',
3063 '<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>',
3064 '<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>',
3065 '<div align=center>{<div align=left>foo</div><!-- bar -->}</div>',
3066 '<div align=left>{<div align=center>foo</div><!-- bar -->}</div>',
3068 '<div style=text-align:start>[foo]</div><p>extra',
3069 '<div style=text-align:end>[foo]</div><p>extra',
3070 '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
3071 '<div dir=rtl style=text-align:end>[foo]</div><p>extra',
3073 // Whitespace nodes
3074 '<div style=text-align:center><p>foo</div> <p>[bar]',
3075 '<div align=center><p>foo</div> <p>[bar]',
3076 '<center><p>foo</center> <p>[bar]',
3077 '<p>[foo]</p> <div style=text-align:center><p>bar</div>',
3078 '<p>[foo]</p> <div align=center><p>bar</div>',
3079 '<p>[foo]</p> <center><p>bar</center>',
3080 '<div style=text-align:center><p>foo</div> <p>[bar]</p> <div style=text-align:center><p>baz</div>',
3081 '<div align=center><p>foo</div> <p>[bar]</p> <div align=center><p>baz</div>',
3082 '<center><p>foo</center> <p>[bar]</p> <center><p>baz</center>',
3083 ],
3084 //@}
3085 justifyfull: [
3086 //@{
3087 'foo[]bar<p>extra',
3088 '<span>foo</span>{}<span>bar</span><p>extra',
3089 '<span>foo[</span><span>]bar</span><p>extra',
3090 'foo[bar]baz<p>extra',
3091 'foo[bar<b>baz]qoz</b>quz<p>extra',
3092 '<p>foo[]bar<p>extra',
3093 '<p>foo[bar]baz<p>extra',
3094 '<h1>foo[bar]baz</h1><p>extra',
3095 '<pre>foo[bar]baz</pre><p>extra',
3096 '<xmp>foo[bar]baz</xmp><p>extra',
3097 '<center><p>[foo]<p>bar</center><p>extra',
3098 '<center><p>[foo<p>bar]</center><p>extra',
3100 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3101 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3102 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3103 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
3104 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
3105 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3107 '<table align=justify><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3108 '<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3109 '<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3110 '<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
3111 '<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
3112 '{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3114 '<table><tbody align=justify><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3115 '<table><tbody align=justify><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3116 '<table><tbody align=justify><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3117 '<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
3118 '<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra',
3119 '{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3121 '<table><tbody><tr align=justify><td>foo<td>b[a]r<td>baz</table><p>extra',
3122 '<table><tbody><tr align=justify data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3123 '<table><tbody><tr align=justify data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3124 '<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra',
3125 '<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra',
3126 '{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra',
3128 '<div align=center><p>[foo]<p>bar</div><p>extra',
3129 '<div align=center><p>[foo<p>bar}</div><p>extra',
3130 '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
3131 '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
3133 '<div align=justify><p>[foo]<p>bar</div><p>extra',
3134 '<div align=justify><p>[foo<p>bar}</div><p>extra',
3135 '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
3136 '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
3138 '<div align=left><p>[foo]<p>bar</div><p>extra',
3139 '<div align=left><p>[foo<p>bar}</div><p>extra',
3140 '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
3141 '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
3143 '<div align=right><p>[foo]<p>bar</div><p>extra',
3144 '<div align=right><p>[foo<p>bar}</div><p>extra',
3145 '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
3146 '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
3148 '<div align=justify>foo</div>[bar]<p>extra',
3149 '[foo]<div align=justify>bar</div><p>extra',
3150 '<div align=justify>foo</div>[bar]<div align=justify>baz</div><p>extra',
3151 '<div align=justify><p>foo</div><p>[bar]<p>extra',
3152 '<p>[foo]<div align=justify><p>bar</div><p>extra',
3153 '<div align=justify><p>foo</div><p>[bar]<div align=justify><p>baz</div><p>extra',
3154 '<div style=text-align:justify>foo</div>[bar]<p>extra',
3155 '[foo]<div style=text-align:justify>bar</div><p>extra',
3156 '<div style=text-align:justify>foo</div>[bar]<div style=text-align:justify>baz</div><p>extra',
3157 '<div style=text-align:justify><p>foo</div><p>[bar]<p>extra',
3158 '<p>[foo]<div style=text-align:justify><p>bar</div><p>extra',
3159 '<div style=text-align:justify><p>foo</div><p>[bar]<div style=text-align:justify><p>baz</div><p>extra',
3160 '<p align=justify>foo<p>[bar]<p>extra',
3161 '<p>[foo]<p align=justify>bar<p>extra',
3162 '<p align=justify>foo<p>[bar]<p align=justify>baz<p>extra',
3164 '<div align=justify>[foo</div>bar]<p>extra',
3165 '<div align=justify>fo[o</div>b]ar<p>extra',
3166 '<div style=text-align:justify>[foo</div>bar]<p>extra',
3167 '<div style=text-align:justify>fo[o</div>b]ar<p>extra',
3168 '<span style=text-align:justify>[foo]</span><p>extra',
3169 '<span style=text-align:justify>f[o]o</span><p>extra',
3171 '<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
3173 '<div align=nonsense><p>[foo]</div><p>extra',
3174 '<div style=text-align:inherit><p>[foo]</div><p>extra',
3175 '<quasit align=center><p>[foo]</p></quasit><p>extra',
3177 '<div style=text-align:start>[foo]</div><p>extra',
3178 '<div style=text-align:end>[foo]</div><p>extra',
3179 '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
3180 '<div dir=rtl style=text-align:end>[foo]</div><p>extra',
3182 // Whitespace nodes
3183 '<div style=text-align:justify><p>foo</div> <p>[bar]',
3184 '<div align=justify><p>foo</div> <p>[bar]',
3185 '<p>[foo]</p> <div style=text-align:justify><p>bar</div>',
3186 '<p>[foo]</p> <div align=justify><p>bar</div>',
3187 '<div style=text-align:justify><p>foo</div> <p>[bar]</p> <div style=text-align:justify><p>baz</div>',
3188 '<div align=justify><p>foo</div> <p>[bar]</p> <div align=justify><p>baz</div>',
3189 ],
3190 //@}
3191 justifyleft: [
3192 //@{
3193 'foo[]bar<p>extra',
3194 '<span>foo</span>{}<span>bar</span><p>extra',
3195 '<span>foo[</span><span>]bar</span><p>extra',
3196 'foo[bar]baz<p>extra',
3197 'foo[bar<b>baz]qoz</b>quz<p>extra',
3198 '<p>foo[]bar<p>extra',
3199 '<p>foo[bar]baz<p>extra',
3200 '<h1>foo[bar]baz</h1><p>extra',
3201 '<pre>foo[bar]baz</pre><p>extra',
3202 '<xmp>foo[bar]baz</xmp><p>extra',
3203 '<center><p>[foo]<p>bar</center><p>extra',
3204 '<center><p>[foo<p>bar]</center><p>extra',
3206 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3207 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3208 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3209 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
3210 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
3211 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3213 '<table align=left><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3214 '<table align=left><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3215 '<table align=left><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3216 '<table align=left><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
3217 '<table align=left data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
3218 '{<table align=left><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3220 '<table><tbody align=left><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3221 '<table><tbody align=left><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3222 '<table><tbody align=left><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3223 '<table><tbody align=left data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
3224 '<table data-start=0 data-end=1><tbody align=left><tr><td>foo<td>bar<td>baz</table><p>extra',
3225 '{<table><tbody align=left><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3227 '<table><tbody><tr align=left><td>foo<td>b[a]r<td>baz</table><p>extra',
3228 '<table><tbody><tr align=left data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3229 '<table><tbody><tr align=left data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3230 '<table><tbody data-start=0 data-end=1><tr align=left><td>foo<td>bar<td>baz</table><p>extra',
3231 '<table data-start=0 data-end=1><tbody><tr align=left><td>foo<td>bar<td>baz</table><p>extra',
3232 '{<table><tr align=left><td>foo<td>bar<td>baz</table>}<p>extra',
3234 '<div align=center><p>[foo]<p>bar</div><p>extra',
3235 '<div align=center><p>[foo<p>bar}</div><p>extra',
3236 '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
3237 '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
3239 '<div align=justify><p>[foo]<p>bar</div><p>extra',
3240 '<div align=justify><p>[foo<p>bar}</div><p>extra',
3241 '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
3242 '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
3244 '<div align=left><p>[foo]<p>bar</div><p>extra',
3245 '<div align=left><p>[foo<p>bar}</div><p>extra',
3246 '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
3247 '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
3249 '<div align=right><p>[foo]<p>bar</div><p>extra',
3250 '<div align=right><p>[foo<p>bar}</div><p>extra',
3251 '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
3252 '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
3254 '<div align=left>foo</div>[bar]<p>extra',
3255 '[foo]<div align=left>bar</div><p>extra',
3256 '<div align=left>foo</div>[bar]<div align=left>baz</div><p>extra',
3257 '<div align=left><p>foo</div><p>[bar]<p>extra',
3258 '<p>[foo]<div align=left><p>bar</div><p>extra',
3259 '<div align=left><p>foo</div><p>[bar]<div align=left><p>baz</div><p>extra',
3260 '<div style=text-align:left>foo</div>[bar]<p>extra',
3261 '[foo]<div style=text-align:left>bar</div><p>extra',
3262 '<div style=text-align:left>foo</div>[bar]<div style=text-align:left>baz</div><p>extra',
3263 '<div style=text-align:left><p>foo</div><p>[bar]<p>extra',
3264 '<p>[foo]<div style=text-align:left><p>bar</div><p>extra',
3265 '<div style=text-align:left><p>foo</div><p>[bar]<div style=text-align:left><p>baz</div><p>extra',
3266 '<p align=left>foo<p>[bar]<p>extra',
3267 '<p>[foo]<p align=left>bar<p>extra',
3268 '<p align=left>foo<p>[bar]<p align=left>baz<p>extra',
3270 '<div align=left>[foo</div>bar]<p>extra',
3271 '<div align=left>fo[o</div>b]ar<p>extra',
3272 '<div style=text-align:left>[foo</div>bar]<p>extra',
3273 '<div style=text-align:left>fo[o</div>b]ar<p>extra',
3274 '<span style=text-align:left>[foo]</span><p>extra',
3275 '<span style=text-align:left>f[o]o</span><p>extra',
3277 '<div style=text-align:left>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
3279 '<div align=nonsense><p>[foo]</div><p>extra',
3280 '<div style=text-align:inherit><p>[foo]</div><p>extra',
3281 '<quasit align=center><p>[foo]</p></quasit><p>extra',
3283 '<div style=text-align:start>[foo]</div><p>extra',
3284 '<div style=text-align:end>[foo]</div><p>extra',
3285 '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
3286 '<div dir=rtl style=text-align:end>[foo]</div><p>extra',
3288 // Whitespace nodes
3289 '<div style=text-align:left><p>foo</div> <p>[bar]',
3290 '<div align=left><p>foo</div> <p>[bar]',
3291 '<p>[foo]</p> <div style=text-align:left><p>bar</div>',
3292 '<p>[foo]</p> <div align=left><p>bar</div>',
3293 '<div style=text-align:left><p>foo</div> <p>[bar]</p> <div style=text-align:left><p>baz</div>',
3294 '<div align=left><p>foo</div> <p>[bar]</p> <div align=left><p>baz</div>',
3295 ],
3296 //@}
3297 justifyright: [
3298 //@{
3299 'foo[]bar<p>extra',
3300 '<span>foo</span>{}<span>bar</span><p>extra',
3301 '<span>foo[</span><span>]bar</span><p>extra',
3302 'foo[bar]baz<p>extra',
3303 'foo[bar<b>baz]qoz</b>quz<p>extra',
3304 '<p>foo[]bar<p>extra',
3305 '<p>foo[bar]baz<p>extra',
3306 '<h1>foo[bar]baz</h1><p>extra',
3307 '<pre>foo[bar]baz</pre><p>extra',
3308 '<xmp>foo[bar]baz</xmp><p>extra',
3309 '<center><p>[foo]<p>bar</center><p>extra',
3310 '<center><p>[foo<p>bar]</center><p>extra',
3312 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3313 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3314 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3315 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
3316 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
3317 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3319 '<table align=right><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3320 '<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3321 '<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3322 '<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
3323 '<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
3324 '{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3326 '<table><tbody align=right><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3327 '<table><tbody align=right><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3328 '<table><tbody align=right><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3329 '<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
3330 '<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra',
3331 '{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3333 '<table><tbody><tr align=right><td>foo<td>b[a]r<td>baz</table><p>extra',
3334 '<table><tbody><tr align=right data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3335 '<table><tbody><tr align=right data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
3336 '<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra',
3337 '<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra',
3338 '{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra',
3340 '<div align=center><p>[foo]<p>bar</div><p>extra',
3341 '<div align=center><p>[foo<p>bar}</div><p>extra',
3342 '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
3343 '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
3345 '<div align=justify><p>[foo]<p>bar</div><p>extra',
3346 '<div align=justify><p>[foo<p>bar}</div><p>extra',
3347 '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
3348 '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
3350 '<div align=left><p>[foo]<p>bar</div><p>extra',
3351 '<div align=left><p>[foo<p>bar}</div><p>extra',
3352 '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
3353 '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
3355 '<div align=right><p>[foo]<p>bar</div><p>extra',
3356 '<div align=right><p>[foo<p>bar}</div><p>extra',
3357 '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
3358 '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
3360 '<div align=right>foo</div>[bar]<p>extra',
3361 '[foo]<div align=right>bar</div><p>extra',
3362 '<div align=right>foo</div>[bar]<div align=right>baz</div><p>extra',
3363 '<div align=right><p>foo</div><p>[bar]<p>extra',
3364 '<p>[foo]<div align=right><p>bar</div><p>extra',
3365 '<div align=right><p>foo</div><p>[bar]<div align=right><p>baz</div><p>extra',
3366 '<div style=text-align:right>foo</div>[bar]<p>extra',
3367 '[foo]<div style=text-align:right>bar</div><p>extra',
3368 '<div style=text-align:right>foo</div>[bar]<div style=text-align:right>baz</div><p>extra',
3369 '<div style=text-align:right><p>foo</div><p>[bar]<p>extra',
3370 '<p>[foo]<div style=text-align:right><p>bar</div><p>extra',
3371 '<div style=text-align:right><p>foo</div><p>[bar]<div style=text-align:right><p>baz</div><p>extra',
3372 '<p align=right>foo<p>[bar]<p>extra',
3373 '<p>[foo]<p align=right>bar<p>extra',
3374 '<p align=right>foo<p>[bar]<p align=right>baz<p>extra',
3376 '<div align=right>[foo</div>bar]<p>extra',
3377 '<div align=right>fo[o</div>b]ar<p>extra',
3378 '<div style=text-align:right>[foo</div>bar]<p>extra',
3379 '<div style=text-align:right>fo[o</div>b]ar<p>extra',
3380 '<span style=text-align:right>[foo]</span><p>extra',
3381 '<span style=text-align:right>f[o]o</span><p>extra',
3383 '<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
3385 '<div align=nonsense><p>[foo]</div><p>extra',
3386 '<div style=text-align:inherit><p>[foo]</div><p>extra',
3387 '<quasit align=center><p>[foo]</p></quasit><p>extra',
3389 '<div style=text-align:start>[foo]</div><p>extra',
3390 '<div style=text-align:end>[foo]</div><p>extra',
3391 '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
3392 '<div dir=rtl style=text-align:end>[foo]</div><p>extra',
3394 // Whitespace nodes
3395 '<div style=text-align:right><p>foo</div> <p>[bar]',
3396 '<div align=right><p>foo</div> <p>[bar]',
3397 '<p>[foo]</p> <div style=text-align:right><p>bar</div>',
3398 '<p>[foo]</p> <div align=right><p>bar</div>',
3399 '<div style=text-align:right><p>foo</div> <p>[bar]</p> <div style=text-align:right><p>baz</div>',
3400 '<div align=right><p>foo</div> <p>[bar]</p> <div align=right><p>baz</div>',
3401 ],
3402 //@}
3403 outdent: [
3404 //@{
3405 // These mimic existing indentation in various browsers, to see how
3406 // they cope with outdenting various things. This is spec, Gecko
3407 // non-CSS, and Opera:
3408 '<blockquote><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
3409 '<blockquote><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
3410 '<blockquote><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
3411 '<blockquote><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
3413 // IE:
3414 '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
3415 '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
3416 '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
3417 '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
3419 // Firefox CSS mode:
3420 '<p style="margin-left: 40px">foo[bar]</p><p style="margin-left: 40px">baz</p><p>extra',
3421 '<p style="margin-left: 40px">foo[bar</p><p style="margin-left: 40px">b]az</p><p>extra',
3422 '<p style="margin-left: 40px">foo[bar]</p><p>baz</p><p>extra',
3423 '<p style="margin-left: 40px">foo[bar</p><p>b]az</p><p>extra',
3425 // WebKit:
3426 '<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',
3427 '<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',
3428 '<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',
3429 '<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',
3431 // Now let's try nesting lots of stuff and see what happens.
3432 '<blockquote><blockquote>foo[bar]baz</blockquote></blockquote>',
3433 '<blockquote><blockquote data-abc=def>foo[bar]baz</blockquote></blockquote>',
3434 '<blockquote data-abc=def><blockquote>foo[bar]baz</blockquote></blockquote>',
3435 '<blockquote><div>foo[bar]baz</div></blockquote>',
3436 '<blockquote><div id=abc>foo[bar]baz</div></blockquote>',
3437 '<blockquote id=abc>foo[bar]baz</blockquote>',
3438 '<blockquote style="color: blue">foo[bar]baz</blockquote>',
3440 '<blockquote><blockquote><p>foo[bar]<p>baz</blockquote></blockquote>',
3441 '<blockquote><blockquote data-abc=def><p>foo[bar]<p>baz</blockquote></blockquote>',
3442 '<blockquote data-abc=def><blockquote><p>foo[bar]<p>baz</blockquote></blockquote>',
3443 '<blockquote><div><p>foo[bar]<p>baz</div></blockquote>',
3444 '<blockquote><div id=abc><p>foo[bar]<p>baz</div></blockquote>',
3445 '<blockquote id=abc><p>foo[bar]<p>baz</blockquote>',
3446 '<blockquote style="color: blue"><p>foo[bar]<p>baz</blockquote>',
3448 '<blockquote><p><b>foo[bar]</b><p>baz</blockquote>',
3449 '<blockquote><p><strong>foo[bar]</strong><p>baz</blockquote>',
3450 '<blockquote><p><span>foo[bar]</span><p>baz</blockquote>',
3451 '<blockquote><blockquote style="color: blue"><p>foo[bar]</blockquote><p>baz</blockquote>',
3452 '<blockquote style="color: blue"><blockquote><p>foo[bar]</blockquote><p>baz</blockquote>',
3454 // Lists!
3455 '<ol><li>foo<li>[bar]<li>baz</ol>',
3456 '<ol data-start=1 data-end=2><li>foo<li>bar<li>baz</ol>',
3457 '<ol><li>foo</ol>[bar]',
3458 '<ol><li>[foo]<br>bar<li>baz</ol>',
3459 '<ol><li>foo<br>[bar]<li>baz</ol>',
3460 '<ol><li><div>[foo]</div>bar<li>baz</ol>',
3461 '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
3462 '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
3463 '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
3464 '<ol><li>foo</li><ol data-start=0 data-end=1><li>bar<li>baz</ol><li>quz</ol>',
3465 '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
3466 '<ol><li>foo</li><ol data-start=1 data-end=2><li>bar<li>baz</ol><li>quz</ol>',
3467 '<ol><li>foo<ol><li>b[a]r</ol><li>baz</ol>',
3468 '<ol><li>foo</li><ol><li>b[a]r</ol><li>baz</ol>',
3469 '<ol><li>foo{<ol><li>bar</ol>}<li>baz</ol>',
3470 '<ol><li>foo</li>{<ol><li>bar</ol>}<li>baz</ol>',
3471 '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
3472 '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
3473 '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
3474 '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
3475 '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
3476 '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
3478 // Try outdenting multiple items at once.
3479 '<ol><li>foo<li>b[ar<li>baz]</ol>',
3480 '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
3481 '<ol><li>[foo</li><ol><li>bar]</ol><li>baz</ol>',
3482 '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
3483 '<ol><li>foo</li><ol><li>b[ar</ol><li>b]az</ol>',
3484 '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
3485 '<ol><li>[foo</li><ol><li>bar</ol><li>baz]</ol><p>extra',
3487 // We probably can't actually get this DOM . . .
3488 '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
3489 '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
3490 '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
3491 '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
3493 // Attribute handling on lists
3494 'foo<ol start=5><li>[bar]</ol>baz',
3495 'foo<ol id=abc><li>[bar]</ol>baz',
3496 'foo<ol style=color:blue><li>[bar]</ol>baz',
3497 'foo<ol><li value=5>[bar]</ol>baz',
3498 'foo<ol><li id=abc>[bar]</ol>baz',
3499 'foo<ol><li style=color:blue>[bar]</ol>baz',
3500 '<ol><li>foo</li><ol><li value=5>[bar]</ol></ol>',
3501 '<ul><li>foo</li><ol><li value=5>[bar]</ol></ul>',
3502 '<ol><li>foo</li><ol start=5><li>[bar]</ol><li>baz</ol>',
3503 '<ol><li>foo</li><ol id=abc><li>[bar]</ol><li>baz</ol>',
3504 '<ol><li>foo</li><ol style=color:blue><li>[bar]</ol><li>baz</ol>',
3505 '<ol><li>foo</li><ol style=text-indent:1em><li>[bar]</ol><li>baz</ol>',
3506 '<ol><li>foo</li><ol start=5><li>[bar<li>baz]</ol><li>quz</ol>',
3507 '<ol><li>foo</li><ol id=abc><li>[bar<li>baz]</ol><li>quz</ol>',
3508 '<ol><li>foo</li><ol style=color:blue><li>[bar<li>baz]</ol><li>quz</ol>',
3509 '<ol><li>foo</li><ol style=text-indent:1em><li>[bar<li>baz]</ol><li>quz</ol>',
3511 // List inside indentation element
3512 '<blockquote><ol><li>[foo]</ol></blockquote><p>extra',
3513 '<blockquote>foo<ol><li>[bar]</ol>baz</blockquote><p>extra',
3514 '<blockquote><ol><li>foo</li><ol><li>[bar]</ol><li>baz</ol></blockquote><p>extra',
3516 '<ol><li><h1>[foo]</h1></ol>',
3517 '<ol><li><xmp>[foo]</xmp></li></ol>',
3518 '<blockquote><ol><li>foo<div><ol><li>[bar]</ol></div><li>baz</ol></blockquote>',
3520 // Whitespace nodes
3521 '<blockquote> <p>[foo]</p></blockquote>',
3522 '<blockquote><p>[foo]</p> </blockquote>',
3523 '<blockquote> <p>[foo]</p> </blockquote>',
3524 '<ol> <li>[foo]</li></ol>',
3525 '<ol><li>[foo]</li> </ol>',
3526 '<ol> <li>[foo]</li> </ol>',
3527 '<ul> <li>[foo]</li></ul>',
3528 '<ul><li>[foo]</li> </ul>',
3529 '<ul> <li>[foo]</li> </ul>',
3530 '<blockquote> <p>[foo]</p> <p>bar</p> <p>baz</p></blockquote>',
3531 '<blockquote> <p>foo</p> <p>[bar]</p> <p>baz</p></blockquote>',
3532 '<blockquote> <p>foo</p> <p>bar</p> <p>[baz]</p></blockquote>',
3533 '<ol> <li>[foo]</li> <li>bar</li> <li>baz</li></ol>',
3534 '<ol> <li>foo</li> <li>[bar]</li> <li>baz</li></ol>',
3535 '<ol> <li>foo</li> <li>bar</li> <li>[baz]</li></ol>',
3536 '<ul> <li>[foo]</li> <li>bar</li> <li>baz</li></ul>',
3537 '<ul> <li>foo</li> <li>[bar]</li> <li>baz</li></ul>',
3538 '<ul> <li>foo</li> <li>bar</li> <li>[baz]</li></ul>',
3540 // https://bugs.webkit.org/show_bug.cgi?id=24249
3541 '<ol><li>[]a<table><tr><td><br></table></ol>',
3542 // https://bugs.webkit.org/show_bug.cgi?id=43447
3543 '<blockquote><span>foo<br>[bar]</span></blockquote>',
3544 ],
3545 //@}
3546 removeformat: [
3547 //@{
3548 'foo[]bar',
3549 '<span>foo</span>{}<span>bar</span>',
3550 '<span>foo[</span><span>]bar</span>',
3551 '[foo<b>bar</b>baz]',
3552 'foo[<b>bar</b>baz]',
3553 'foo[<b>bar</b>]baz',
3554 'foo<b>[bar]</b>baz',
3555 'foo<b>b[a]r</b>baz',
3556 '[foo<strong>bar</strong>baz]',
3557 '[foo<span style="font-weight: bold">bar</span>baz]',
3558 'foo<span style="font-weight: bold">b[a]r</span>baz',
3559 '[foo<span style="font-variant: small-caps">bar</span>baz]',
3560 'foo<span style="font-variant: small-caps">b[a]r</span>baz',
3561 '[foo<b id=foo>bar</b>baz]',
3562 'foo<b id=foo>b[a]r</b>baz',
3564 // HTML has lots of inline elements, doesn't it?
3565 '[foo<a>bar</a>baz]',
3566 'foo<a>b[a]r</a>baz',
3567 '[foo<a href=foo>bar</a>baz]',
3568 'foo<a href=foo>b[a]r</a>baz',
3569 '[foo<abbr>bar</abbr>baz]',
3570 'foo<abbr>b[a]r</abbr>baz',
3571 '[foo<acronym>bar</acronym>baz]',
3572 'foo<acronym>b[a]r</acronym>baz',
3573 '[foo<b>bar</b>baz]',
3574 'foo<b>b[a]r</b>baz',
3575 '[foo<bdi dir=rtl>bar</bdi>baz]',
3576 'foo<bdi dir=rtl>b[a]r</bdi>baz',
3577 '[foo<bdo dir=rtl>bar</bdo>baz]',
3578 'foo<bdo dir=rtl>b[a]r</bdo>baz',
3579 '[foo<big>bar</big>baz]',
3580 'foo<big>b[a]r</big>baz',
3581 '[foo<blink>bar</blink>baz]',
3582 'foo<blink>b[a]r</blink>baz',
3583 '[foo<cite>bar</cite>baz]',
3584 'foo<cite>b[a]r</cite>baz',
3585 '[foo<code>bar</code>baz]',
3586 'foo<code>b[a]r</code>baz',
3587 '[foo<del>bar</del>baz]',
3588 'foo<del>b[a]r</del>baz',
3589 '[foo<dfn>bar</dfn>baz]',
3590 'foo<dfn>b[a]r</dfn>baz',
3591 '[foo<em>bar</em>baz]',
3592 'foo<em>b[a]r</em>baz',
3593 '[foo<font>bar</font>baz]',
3594 'foo<font>b[a]r</font>baz',
3595 '[foo<font color=blue>bar</font>baz]',
3596 'foo<font color=blue>b[a]r</font>baz',
3597 '[foo<i>bar</i>baz]',
3598 'foo<i>b[a]r</i>baz',
3599 '[foo<ins>bar</ins>baz]',
3600 'foo<ins>b[a]r</ins>baz',
3601 '[foo<kbd>bar</kbd>baz]',
3602 'foo<kbd>b[a]r</kbd>baz',
3603 '[foo<mark>bar</mark>baz]',
3604 'foo<mark>b[a]r</mark>baz',
3605 '[foo<nobr>bar</nobr>baz]',
3606 'foo<nobr>b[a]r</nobr>baz',
3607 '[foo<q>bar</q>baz]',
3608 'foo<q>b[a]r</q>baz',
3609 '[foo<samp>bar</samp>baz]',
3610 'foo<samp>b[a]r</samp>baz',
3611 '[foo<s>bar</s>baz]',
3612 'foo<s>b[a]r</s>baz',
3613 '[foo<small>bar</small>baz]',
3614 'foo<small>b[a]r</small>baz',
3615 '[foo<span>bar</span>baz]',
3616 'foo<span>b[a]r</span>baz',
3617 '[foo<strike>bar</strike>baz]',
3618 'foo<strike>b[a]r</strike>baz',
3619 '[foo<strong>bar</strong>baz]',
3620 'foo<strong>b[a]r</strong>baz',
3621 '[foo<sub>bar</sub>baz]',
3622 'foo<sub>b[a]r</sub>baz',
3623 '[foo<sup>bar</sup>baz]',
3624 'foo<sup>b[a]r</sup>baz',
3625 '[foo<tt>bar</tt>baz]',
3626 'foo<tt>b[a]r</tt>baz',
3627 '[foo<u>bar</u>baz]',
3628 'foo<u>b[a]r</u>baz',
3629 '[foo<var>bar</var>baz]',
3630 'foo<var>b[a]r</var>baz',
3632 // Empty and replaced elements
3633 '[foo<br>bar]',
3634 '[foo<hr>bar]',
3635 '[foo<wbr>bar]',
3636 '[foo<img>bar]',
3637 '[foo<img src=abc>bar]',
3638 '[foo<video></video>bar]',
3639 '[foo<video src=abc></video>bar]',
3640 '[foo<svg><circle fill=blue r=20 cx=20 cy=20 /></svg>bar]',
3642 // Unrecognized elements
3643 '[foo<nonexistentelement>bar</nonexistentelement>baz]',
3644 'foo<nonexistentelement>b[a]r</nonexistentelement>baz',
3645 '[foo<nonexistentelement style="display: block">bar</nonexistentelement>baz]',
3646 'foo<nonexistentelement style="display: block">b[a]r</nonexistentelement>baz',
3648 // Random stuff
3649 '[foo<span id=foo>bar</span>baz]',
3650 'foo<span id=foo>b[a]r</span>baz',
3651 '[foo<span class=foo>bar</span>baz]',
3652 'foo<span class=foo>b[a]r</span>baz',
3653 '[foo<b style="font-weight: normal">bar</b>baz]',
3654 'foo<b style="font-weight: normal">b[a]r</b>baz',
3655 '<p style="background-color: aqua">foo[bar]baz</p>',
3656 '<p><span style="background-color: aqua">foo[bar]baz</span></p>',
3657 '<p style="font-weight: bold">foo[bar]baz</p>',
3658 '<b><p style="font-weight: bold">foo[bar]baz</p></b>',
3659 '<p style="font-variant: small-caps">foo[bar]baz</p>',
3660 '{<p style="font-variant: small-caps">foobarbaz</p>}',
3661 '<p style="text-indent: 2em">foo[bar]baz</p>',
3662 '{<p style="text-indent: 2em">foobarbaz</p>}',
3664 // https://bugzilla.mozilla.org/show_bug.cgi?id=649138
3665 // Chrome 15 dev fails this for some unclear reason.
3666 '<table data-start=0 data-end=1><tr><td><b>foo</b></table>',
3667 ],
3668 //@}
3669 strikethrough: [
3670 //@{
3671 'foo[]bar',
3672 '<p>[foo</p> <p>bar]</p>',
3673 '<span>[foo</span> <span>bar]</span>',
3674 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
3675 '<p>[foo<p><br><p>bar]',
3676 '<b>foo[]bar</b>',
3677 '<i>foo[]bar</i>',
3678 '<span>foo</span>{}<span>bar</span>',
3679 '<span>foo[</span><span>]bar</span>',
3680 'foo[bar]baz',
3681 'foo[bar<b>baz]qoz</b>quz',
3682 'foo[bar<i>baz]qoz</i>quz',
3683 '{<p><p> <p>foo</p>}',
3685 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
3686 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
3687 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
3688 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
3689 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
3690 '{<table><tr><td>foo<td>bar<td>baz</table>}',
3692 'foo<u>[bar]</u>baz',
3693 'foo<span style="text-decoration: underline">[bar]</span>baz',
3694 '<u>foo[bar]baz</u>',
3695 '<u>foo[b<span style="color:blue">ar]ba</span>z</u>',
3696 '<u>foo[b<span style="color:blue" id=foo>ar]ba</span>z</u>',
3697 '<u>foo[b<span style="font-size:3em">ar]ba</span>z</u>',
3698 '<u>foo[b<i>ar]ba</i>z</u>',
3699 '<p style="text-decoration: underline">foo[bar]baz</p>',
3701 'foo<s>[bar]</s>baz',
3702 'foo<span style="text-decoration: line-through">[bar]</span>baz',
3703 '<s>foo[bar]baz</s>',
3704 '<s>foo[b<span style="color:blue">ar]ba</span>z</s>',
3705 '<s>foo[b<span style="color:blue" id=foo>ar]ba</span>z</s>',
3706 '<s>foo[b<span style="font-size:3em">ar]ba</span>z</s>',
3707 '<s>foo[b<i>ar]ba</i>z</s>',
3708 '<p style="text-decoration: line-through">foo[bar]baz</p>',
3710 'foo<strike>[bar]</strike>baz',
3711 '<strike>foo[bar]baz</strike>',
3712 '<strike>foo[b<span style="color:blue">ar]ba</span>z</strike>',
3713 '<strike>foo[b<span style="color:blue" id=foo>ar]ba</span>z</strike>',
3714 '<strike>foo[b<span style="font-size:3em">ar]ba</span>z</strike>',
3715 '<strike>foo[b<i>ar]ba</i>z</strike>',
3717 'foo<ins>[bar]</ins>baz',
3718 '<ins>foo[bar]baz</ins>',
3719 '<ins>foo[b<span style="color:blue">ar]ba</span>z</ins>',
3720 '<ins>foo[b<span style="color:blue" id=foo>ar]ba</span>z</ins>',
3721 '<ins>foo[b<span style="font-size:3em">ar]ba</span>z</ins>',
3722 '<ins>foo[b<i>ar]ba</i>z</ins>',
3724 'foo<del>[bar]</del>baz',
3725 '<del>foo[bar]baz</del>',
3726 '<del>foo[b<span style="color:blue">ar]ba</span>z</del>',
3727 '<del>foo[b<span style="color:blue" id=foo>ar]ba</span>z</del>',
3728 '<del>foo[b<span style="font-size:3em">ar]ba</span>z</del>',
3729 '<del>foo[b<i>ar]ba</i>z</del>',
3731 'foo<span style="text-decoration: underline line-through">[bar]</span>baz',
3732 'foo<span style="text-decoration: underline line-through">b[a]r</span>baz',
3733 'foo<s style="text-decoration: underline">[bar]</s>baz',
3734 'foo<s style="text-decoration: underline">b[a]r</s>baz',
3735 'foo<u style="text-decoration: line-through">[bar]</u>baz',
3736 'foo<u style="text-decoration: line-through">b[a]r</u>baz',
3737 'foo<s style="text-decoration: overline">[bar]</s>baz',
3738 'foo<s style="text-decoration: overline">b[a]r</s>baz',
3739 'foo<u style="text-decoration: overline">[bar]</u>baz',
3740 'foo<u style="text-decoration: overline">b[a]r</u>baz',
3742 '<p style="text-decoration: line-through">foo[bar]baz</p>',
3743 '<p style="text-decoration: overline">foo[bar]baz</p>',
3745 'foo<span class="underline">[bar]</span>baz',
3746 'foo<span class="underline">b[a]r</span>baz',
3747 'foo<span class="line-through">[bar]</span>baz',
3748 'foo<span class="line-through">b[a]r</span>baz',
3749 'foo<span class="underline-and-line-through">[bar]</span>baz',
3750 'foo<span class="underline-and-line-through">b[a]r</span>baz',
3752 // Tests for queryCommandIndeterm() and queryCommandState()
3753 'fo[o<s>b]ar</s>baz',
3754 'foo<s>ba[r</s>b]az',
3755 'fo[o<s>bar</s>b]az',
3756 'foo[<s>b]ar</s>baz',
3757 'foo<s>ba[r</s>]baz',
3758 'foo[<s>bar</s>]baz',
3759 'foo<s>[bar]</s>baz',
3760 'foo{<s>bar</s>}baz',
3761 'fo[o<span style=text-decoration:line-through>b]ar</span>baz',
3762 '<strike>fo[o</strike><s>b]ar</s>',
3763 '<s>fo[o</s><del>b]ar</del>',
3764 ],
3765 //@}
3766 subscript: [
3767 //@{
3768 'foo[]bar',
3769 '<p>[foo</p> <p>bar]</p>',
3770 '<span>[foo</span> <span>bar]</span>',
3771 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
3772 '<p>[foo<p><br><p>bar]',
3773 '<b>foo[]bar</b>',
3774 '<i>foo[]bar</i>',
3775 '<span>foo</span>{}<span>bar</span>',
3776 '<span>foo[</span><span>]bar</span>',
3777 'foo[bar]baz',
3778 'foo[bar<b>baz]qoz</b>quz',
3779 'foo[bar<i>baz]qoz</i>quz',
3780 '{<p><p> <p>foo</p>}',
3782 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
3783 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
3784 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
3785 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
3786 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
3787 '{<table><tr><td>foo<td>bar<td>baz</table>}',
3789 'foo<sub>[bar]</sub>baz',
3790 'foo<sub>b[a]r</sub>baz',
3791 'foo<sup>[bar]</sup>baz',
3792 'foo<sup>b[a]r</sup>baz',
3794 'foo<span style=vertical-align:sub>[bar]</span>baz',
3795 'foo<span style=vertical-align:super>[bar]</span>baz',
3797 'foo<sub><sub>[bar]</sub></sub>baz',
3798 'foo<sub><sub>b[a]r</sub></sub>baz',
3799 'foo<sub>b<sub>[a]</sub>r</sub>baz',
3800 'foo<sup><sup>[bar]</sup></sup>baz',
3801 'foo<sup><sup>b[a]r</sup></sup>baz',
3802 'foo<sup>b<sup>[a]</sup>r</sup>baz',
3803 'foo<sub><sup>[bar]</sup></sub>baz',
3804 'foo<sub><sup>b[a]r</sup></sub>baz',
3805 'foo<sub>b<sup>[a]</sup>r</sub>baz',
3806 'foo<sup><sub>[bar]</sub></sup>baz',
3807 'foo<sup><sub>b[a]r</sub></sup>baz',
3808 'foo<sup>b<sub>[a]</sub>r</sup>baz',
3810 // Tests for queryCommandIndeterm() and queryCommandState()
3811 'fo[o<sub>b]ar</sub>baz',
3812 'foo<sub>ba[r</sub>b]az',
3813 'fo[o<sub>bar</sub>b]az',
3814 'foo[<sub>b]ar</sub>baz',
3815 'foo<sub>ba[r</sub>]baz',
3816 'foo[<sub>bar</sub>]baz',
3817 'foo<sub>[bar]</sub>baz',
3818 'foo{<sub>bar</sub>}baz',
3819 '<sub>fo[o</sub><sup>b]ar</sup>',
3820 '<sub>fo[o</sub><span style=vertical-align:sub>b]ar</span>',
3821 'foo<span style=vertical-align:top>[bar]</span>baz',
3822 '<sub>fo[o</sub><span style=vertical-align:top>b]ar</span>',
3823 ],
3824 //@}
3825 superscript: [
3826 //@{
3827 'foo[]bar',
3828 '<p>[foo</p> <p>bar]</p>',
3829 '<span>[foo</span> <span>bar]</span>',
3830 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
3831 '<p>[foo<p><br><p>bar]',
3832 '<b>foo[]bar</b>',
3833 '<i>foo[]bar</i>',
3834 '<span>foo</span>{}<span>bar</span>',
3835 '<span>foo[</span><span>]bar</span>',
3836 'foo[bar]baz',
3837 'foo[bar<b>baz]qoz</b>quz',
3838 'foo[bar<i>baz]qoz</i>quz',
3839 '{<p><p> <p>foo</p>}',
3841 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
3842 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
3843 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
3844 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
3845 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
3846 '{<table><tr><td>foo<td>bar<td>baz</table>}',
3848 'foo<sub>[bar]</sub>baz',
3849 'foo<sub>b[a]r</sub>baz',
3850 'foo<sup>[bar]</sup>baz',
3851 'foo<sup>b[a]r</sup>baz',
3853 'foo<span style=vertical-align:sub>[bar]</span>baz',
3854 'foo<span style=vertical-align:super>[bar]</span>baz',
3856 'foo<sub><sub>[bar]</sub></sub>baz',
3857 'foo<sub><sub>b[a]r</sub></sub>baz',
3858 'foo<sub>b<sub>[a]</sub>r</sub>baz',
3859 'foo<sup><sup>[bar]</sup></sup>baz',
3860 'foo<sup><sup>b[a]r</sup></sup>baz',
3861 'foo<sup>b<sup>[a]</sup>r</sup>baz',
3862 'foo<sub><sup>[bar]</sup></sub>baz',
3863 'foo<sub><sup>b[a]r</sup></sub>baz',
3864 'foo<sub>b<sup>[a]</sup>r</sub>baz',
3865 'foo<sup><sub>[bar]</sub></sup>baz',
3866 'foo<sup><sub>b[a]r</sub></sup>baz',
3867 'foo<sup>b<sub>[a]</sub>r</sup>baz',
3869 // Tests for queryCommandIndeterm() and queryCommandState()
3870 'fo[o<sup>b]ar</sup>baz',
3871 'foo<sup>ba[r</sup>b]az',
3872 'fo[o<sup>bar</sup>b]az',
3873 'foo[<sup>b]ar</sup>baz',
3874 'foo<sup>ba[r</sup>]baz',
3875 'foo[<sup>bar</sup>]baz',
3876 'foo<sup>[bar]</sup>baz',
3877 'foo{<sup>bar</sup>}baz',
3878 '<sup>fo[o</sup><sub>b]ar</sub>',
3879 '<sup>fo[o</sup><span style=vertical-align:super>b]ar</span>',
3880 'foo<span style=vertical-align:bottom>[bar]</span>baz',
3881 '<sup>fo[o</sup><span style=vertical-align:bottom>b]ar</span>',
3883 // https://bugs.webkit.org/show_bug.cgi?id=28472
3884 'foo<sup>[bar]<br></sup>',
3885 ],
3886 //@}
3887 underline: [
3888 //@{
3889 'foo[]bar',
3890 '<p>[foo</p> <p>bar]</p>',
3891 '<span>[foo</span> <span>bar]</span>',
3892 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
3893 '<p>[foo<p><br><p>bar]',
3894 '<b>foo[]bar</b>',
3895 '<i>foo[]bar</i>',
3896 '<span>foo</span>{}<span>bar</span>',
3897 '<span>foo[</span><span>]bar</span>',
3898 'foo[bar]baz',
3899 'foo[bar<b>baz]qoz</b>quz',
3900 'foo[bar<i>baz]qoz</i>quz',
3901 '{<p><p> <p>foo</p>}',
3903 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
3904 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
3905 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
3906 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
3907 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
3908 '{<table><tr><td>foo<td>bar<td>baz</table>}',
3910 'foo<u>[bar]</u>baz',
3911 'foo<span style="text-decoration: underline">[bar]</span>baz',
3912 '<u>foo[bar]baz</u>',
3913 '<u>foo[b<span style="color:blue">ar]ba</span>z</u>',
3914 '<u>foo[b<span style="color:blue" id=foo>ar]ba</span>z</u>',
3915 '<u>foo[b<span style="font-size:3em">ar]ba</span>z</u>',
3916 '<u>foo[b<i>ar]ba</i>z</u>',
3917 '<p style="text-decoration: underline">foo[bar]baz</p>',
3919 'foo<s>[bar]</s>baz',
3920 'foo<span style="text-decoration: line-through">[bar]</span>baz',
3921 '<s>foo[bar]baz</s>',
3922 '<s>foo[b<span style="color:blue">ar]ba</span>z</s>',
3923 '<s>foo[b<span style="color:blue" id=foo>ar]ba</span>z</s>',
3924 '<s>foo[b<span style="font-size:3em">ar]ba</span>z</s>',
3925 '<s>foo[b<i>ar]ba</i>z</s>',
3926 '<p style="text-decoration: line-through">foo[bar]baz</p>',
3928 'foo<strike>[bar]</strike>baz',
3929 '<strike>foo[bar]baz</strike>',
3930 '<strike>foo[b<span style="color:blue">ar]ba</span>z</strike>',
3931 '<strike>foo[b<span style="color:blue" id=foo>ar]ba</span>z</strike>',
3932 '<strike>foo[b<span style="font-size:3em">ar]ba</span>z</strike>',
3933 '<strike>foo[b<i>ar]ba</i>z</strike>',
3935 'foo<ins>[bar]</ins>baz',
3936 '<ins>foo[bar]baz</ins>',
3937 '<ins>foo[b<span style="color:blue">ar]ba</span>z</ins>',
3938 '<ins>foo[b<span style="color:blue" id=foo>ar]ba</span>z</ins>',
3939 '<ins>foo[b<span style="font-size:3em">ar]ba</span>z</ins>',
3940 '<ins>foo[b<i>ar]ba</i>z</ins>',
3942 'foo<del>[bar]</del>baz',
3943 '<del>foo[bar]baz</del>',
3944 '<del>foo[b<span style="color:blue">ar]ba</span>z</del>',
3945 '<del>foo[b<span style="color:blue" id=foo>ar]ba</span>z</del>',
3946 '<del>foo[b<span style="font-size:3em">ar]ba</span>z</del>',
3947 '<del>foo[b<i>ar]ba</i>z</del>',
3949 'foo<span style="text-decoration: underline line-through">[bar]</span>baz',
3950 'foo<span style="text-decoration: underline line-through">b[a]r</span>baz',
3951 'foo<s style="text-decoration: underline">[bar]</s>baz',
3952 'foo<s style="text-decoration: underline">b[a]r</s>baz',
3953 'foo<u style="text-decoration: line-through">[bar]</u>baz',
3954 'foo<u style="text-decoration: line-through">b[a]r</u>baz',
3955 'foo<s style="text-decoration: overline">[bar]</s>baz',
3956 'foo<s style="text-decoration: overline">b[a]r</s>baz',
3957 'foo<u style="text-decoration: overline">[bar]</u>baz',
3958 'foo<u style="text-decoration: overline">b[a]r</u>baz',
3960 '<p style="text-decoration: line-through">foo[bar]baz</p>',
3961 '<p style="text-decoration: overline">foo[bar]baz</p>',
3963 'foo<span class="underline">[bar]</span>baz',
3964 'foo<span class="underline">b[a]r</span>baz',
3965 'foo<span class="line-through">[bar]</span>baz',
3966 'foo<span class="line-through">b[a]r</span>baz',
3967 'foo<span class="underline-and-line-through">[bar]</span>baz',
3968 'foo<span class="underline-and-line-through">b[a]r</span>baz',
3970 // Tests for queryCommandIndeterm() and queryCommandState()
3971 'fo[o<u>b]ar</u>baz',
3972 'foo<u>ba[r</u>b]az',
3973 'fo[o<u>bar</u>b]az',
3974 'foo[<u>b]ar</u>baz',
3975 'foo<u>ba[r</u>]baz',
3976 'foo[<u>bar</u>]baz',
3977 'foo<u>[bar]</u>baz',
3978 'foo{<u>bar</u>}baz',
3979 'fo[o<span style=text-decoration:underline>b]ar</span>baz',
3980 '<ins>fo[o</ins><u>b]ar</u>',
3981 '<u>fo[o</u><ins>b]ar</ins>',
3982 ],
3983 //@}
3984 unlink: [
3985 //@{
3986 'foo[]bar',
3987 '<p>[foo</p> <p>bar]</p>',
3988 '<span>[foo</span> <span>bar]</span>',
3989 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
3990 '<b>foo[]bar</b>',
3991 '<i>foo[]bar</i>',
3992 '<span>foo</span>{}<span>bar</span>',
3993 '<span>foo[</span><span>]bar</span>',
3994 'foo[bar]baz',
3995 'foo[bar<b>baz]qoz</b>quz',
3996 'foo[bar<i>baz]qoz</i>quz',
3997 '{<p><p> <p>foo</p>}',
3999 '<a href=http://www.google.com/>foo[bar]baz</a>',
4000 '<a href=http://www.google.com/>foo[barbaz</a>}',
4001 '{<a href=http://www.google.com/>foobar]baz</a>',
4002 '{<a href=http://www.google.com/>foobarbaz</a>}',
4003 '<a href=http://www.google.com/>[foobarbaz]</a>',
4005 'foo<a href=http://www.google.com/>b[]ar</a>baz',
4006 'foo<a href=http://www.google.com/>[bar]</a>baz',
4007 'foo[<a href=http://www.google.com/>bar</a>]baz',
4008 'foo<a href=http://www.google.com/>[bar</a>baz]',
4009 '[foo<a href=http://www.google.com/>bar]</a>baz',
4010 '[foo<a href=http://www.google.com/>bar</a>baz]',
4012 '<a id=foo href=http://www.google.com/>foobar[]baz</a>',
4013 '<a id=foo href=http://www.google.com/>foo[bar]baz</a>',
4014 '<a id=foo href=http://www.google.com/>[foobarbaz]</a>',
4015 'foo<a id=foo href=http://www.google.com/>[bar]</a>baz',
4016 'foo[<a id=foo href=http://www.google.com/>bar</a>]baz',
4017 '[foo<a id=foo href=http://www.google.com/>bar</a>baz]',
4019 '<a name=foo>foobar[]baz</a>',
4020 '<a name=foo>foo[bar]baz</a>',
4021 '<a name=foo>[foobarbaz]</a>',
4022 'foo<a name=foo>[bar]</a>baz',
4023 'foo[<a name=foo>bar</a>]baz',
4024 '[foo<a name=foo>bar</a>baz]',
4025 ],
4026 //@}
4027 copy: ['!foo[bar]baz'],
4028 cut: ['!foo[bar]baz'],
4029 defaultparagraphseparator: [
4030 //@{
4031 ['', 'foo[bar]baz'],
4032 ['div', 'foo[bar]baz'],
4033 ['p', 'foo[bar]baz'],
4034 ['DIV', 'foo[bar]baz'],
4035 ['P', 'foo[bar]baz'],
4036 [' div ', 'foo[bar]baz'],
4037 [' p ', 'foo[bar]baz'],
4038 ['<div>', 'foo[bar]baz'],
4039 ['<p>', 'foo[bar]baz'],
4040 ['li', 'foo[bar]baz'],
4041 ['blockquote', 'foo[bar]baz'],
4042 ],
4043 //@}
4044 paste: ['!foo[bar]baz'],
4045 selectall: ['foo[bar]baz'],
4046 stylewithcss: [
4047 //@{
4048 ['true', 'foo[bar]baz'],
4049 ['TRUE', 'foo[bar]baz'],
4050 ['TrUe', 'foo[bar]baz'],
4051 ['true ', 'foo[bar]baz'],
4052 [' true', 'foo[bar]baz'],
4053 ['truer', 'foo[bar]baz'],
4054 [' true ', 'foo[bar]baz'],
4055 [' TrUe', 'foo[bar]baz'],
4056 ['', 'foo[bar]baz'],
4057 [' ', 'foo[bar]baz'],
4058 ['false', 'foo[bar]baz'],
4059 ['FALSE', 'foo[bar]baz'],
4060 ['FaLsE', 'foo[bar]baz'],
4061 [' false', 'foo[bar]baz'],
4062 ['false ', 'foo[bar]baz'],
4063 ['falser', 'foo[bar]baz'],
4064 ['falsé', 'foo[bar]baz'],
4065 ],
4066 //@}
4067 usecss: [
4068 //@{
4069 ['true', 'foo[bar]baz'],
4070 ['TRUE', 'foo[bar]baz'],
4071 ['TrUe', 'foo[bar]baz'],
4072 ['true ', 'foo[bar]baz'],
4073 [' true', 'foo[bar]baz'],
4074 ['truer', 'foo[bar]baz'],
4075 [' true ', 'foo[bar]baz'],
4076 [' TrUe', 'foo[bar]baz'],
4077 ['', 'foo[bar]baz'],
4078 [' ', 'foo[bar]baz'],
4079 ['false', 'foo[bar]baz'],
4080 ['FALSE', 'foo[bar]baz'],
4081 ['FaLsE', 'foo[bar]baz'],
4082 [' false', 'foo[bar]baz'],
4083 ['false ', 'foo[bar]baz'],
4084 ['falser', 'foo[bar]baz'],
4085 ['falsé', 'foo[bar]baz'],
4086 ],
4087 //@}
4088 quasit: ['foo[bar]baz'],
4089 multitest: [
4090 //@{
4091 // Insertion-affecting state. Test that insertText works right, and
4092 // test that various block commands preserve (or don't preserve) the
4093 // state.
4094 ['foo[]bar', 'bold', 'inserttext'],
4095 ['foo[]bar', 'bold', 'delete'],
4096 ['foo[]bar', 'bold', 'delete', 'inserttext'],
4097 ['foo[]bar', 'bold', 'formatblock'],
4098 ['foo[]bar', 'bold', 'formatblock', 'inserttext'],
4099 ['foo[]bar', 'bold', 'forwarddelete'],
4100 ['foo[]bar', 'bold', 'forwarddelete', 'inserttext'],
4101 ['foo[]bar', 'bold', 'indent'],
4102 ['foo[]bar', 'bold', 'indent', 'inserttext'],
4103 ['foo[]bar', 'bold', 'inserthorizontalrule'],
4104 ['foo[]bar', 'bold', 'inserthorizontalrule', 'inserttext'],
4105 ['foo[]bar', 'bold', 'inserthtml'],
4106 ['foo[]bar', 'bold', 'inserthtml', 'inserttext'],
4107 ['foo[]bar', 'bold', 'insertimage'],
4108 ['foo[]bar', 'bold', 'insertimage', 'inserttext'],
4109 ['foo[]bar', 'bold', 'insertlinebreak'],
4110 ['foo[]bar', 'bold', 'insertlinebreak', 'inserttext'],
4111 ['foo[]bar', 'bold', 'insertorderedlist'],
4112 ['foo[]bar', 'bold', 'insertorderedlist', 'inserttext'],
4113 ['foo[]bar', 'bold', 'insertparagraph'],
4114 ['foo[]bar', 'bold', 'insertparagraph', 'inserttext'],
4115 ['foo[]bar', 'bold', 'insertunorderedlist'],
4116 ['foo[]bar', 'bold', 'insertunorderedlist', 'inserttext'],
4117 ['foo[]bar', 'bold', 'justifycenter'],
4118 ['foo[]bar', 'bold', 'justifycenter', 'inserttext'],
4119 ['foo[]bar', 'bold', 'justifyfull'],
4120 ['foo[]bar', 'bold', 'justifyfull', 'inserttext'],
4121 ['foo[]bar', 'bold', 'justifyleft'],
4122 ['foo[]bar', 'bold', 'justifyleft', 'inserttext'],
4123 ['foo[]bar', 'bold', 'justifyright'],
4124 ['foo[]bar', 'bold', 'justifyright', 'inserttext'],
4125 ['foo[]bar', 'bold', 'outdent'],
4126 ['foo[]bar', 'bold', 'outdent', 'inserttext'],
4128 ['foo[]bar', 'italic', 'inserttext'],
4129 ['foo[]bar', 'italic', 'delete'],
4130 ['foo[]bar', 'italic', 'delete', 'inserttext'],
4131 ['foo[]bar', 'italic', 'formatblock'],
4132 ['foo[]bar', 'italic', 'formatblock', 'inserttext'],
4133 ['foo[]bar', 'italic', 'forwarddelete'],
4134 ['foo[]bar', 'italic', 'forwarddelete', 'inserttext'],
4135 ['foo[]bar', 'italic', 'indent'],
4136 ['foo[]bar', 'italic', 'indent', 'inserttext'],
4137 ['foo[]bar', 'italic', 'inserthorizontalrule'],
4138 ['foo[]bar', 'italic', 'inserthorizontalrule', 'inserttext'],
4139 ['foo[]bar', 'italic', 'inserthtml'],
4140 ['foo[]bar', 'italic', 'inserthtml', 'inserttext'],
4141 ['foo[]bar', 'italic', 'insertimage'],
4142 ['foo[]bar', 'italic', 'insertimage', 'inserttext'],
4143 ['foo[]bar', 'italic', 'insertlinebreak'],
4144 ['foo[]bar', 'italic', 'insertlinebreak', 'inserttext'],
4145 ['foo[]bar', 'italic', 'insertorderedlist'],
4146 ['foo[]bar', 'italic', 'insertorderedlist', 'inserttext'],
4147 ['foo[]bar', 'italic', 'insertparagraph'],
4148 ['foo[]bar', 'italic', 'insertparagraph', 'inserttext'],
4149 ['foo[]bar', 'italic', 'insertunorderedlist'],
4150 ['foo[]bar', 'italic', 'insertunorderedlist', 'inserttext'],
4151 ['foo[]bar', 'italic', 'justifycenter'],
4152 ['foo[]bar', 'italic', 'justifycenter', 'inserttext'],
4153 ['foo[]bar', 'italic', 'justifyfull'],
4154 ['foo[]bar', 'italic', 'justifyfull', 'inserttext'],
4155 ['foo[]bar', 'italic', 'justifyleft'],
4156 ['foo[]bar', 'italic', 'justifyleft', 'inserttext'],
4157 ['foo[]bar', 'italic', 'justifyright'],
4158 ['foo[]bar', 'italic', 'justifyright', 'inserttext'],
4159 ['foo[]bar', 'italic', 'outdent'],
4160 ['foo[]bar', 'italic', 'outdent', 'inserttext'],
4162 ['foo[]bar', 'strikethrough', 'inserttext'],
4163 ['foo[]bar', 'strikethrough', 'delete'],
4164 ['foo[]bar', 'strikethrough', 'delete', 'inserttext'],
4165 ['foo[]bar', 'strikethrough', 'formatblock'],
4166 ['foo[]bar', 'strikethrough', 'formatblock', 'inserttext'],
4167 ['foo[]bar', 'strikethrough', 'forwarddelete'],
4168 ['foo[]bar', 'strikethrough', 'forwarddelete', 'inserttext'],
4169 ['foo[]bar', 'strikethrough', 'indent'],
4170 ['foo[]bar', 'strikethrough', 'indent', 'inserttext'],
4171 ['foo[]bar', 'strikethrough', 'inserthorizontalrule'],
4172 ['foo[]bar', 'strikethrough', 'inserthorizontalrule', 'inserttext'],
4173 ['foo[]bar', 'strikethrough', 'inserthtml'],
4174 ['foo[]bar', 'strikethrough', 'inserthtml', 'inserttext'],
4175 ['foo[]bar', 'strikethrough', 'insertimage'],
4176 ['foo[]bar', 'strikethrough', 'insertimage', 'inserttext'],
4177 ['foo[]bar', 'strikethrough', 'insertlinebreak'],
4178 ['foo[]bar', 'strikethrough', 'insertlinebreak', 'inserttext'],
4179 ['foo[]bar', 'strikethrough', 'insertorderedlist'],
4180 ['foo[]bar', 'strikethrough', 'insertorderedlist', 'inserttext'],
4181 ['foo[]bar', 'strikethrough', 'insertparagraph'],
4182 ['foo[]bar', 'strikethrough', 'insertparagraph', 'inserttext'],
4183 ['foo[]bar', 'strikethrough', 'insertunorderedlist'],
4184 ['foo[]bar', 'strikethrough', 'insertunorderedlist', 'inserttext'],
4185 ['foo[]bar', 'strikethrough', 'justifycenter'],
4186 ['foo[]bar', 'strikethrough', 'justifycenter', 'inserttext'],
4187 ['foo[]bar', 'strikethrough', 'justifyfull'],
4188 ['foo[]bar', 'strikethrough', 'justifyfull', 'inserttext'],
4189 ['foo[]bar', 'strikethrough', 'justifyleft'],
4190 ['foo[]bar', 'strikethrough', 'justifyleft', 'inserttext'],
4191 ['foo[]bar', 'strikethrough', 'justifyright'],
4192 ['foo[]bar', 'strikethrough', 'justifyright', 'inserttext'],
4193 ['foo[]bar', 'strikethrough', 'outdent'],
4194 ['foo[]bar', 'strikethrough', 'outdent', 'inserttext'],
4196 ['foo[]bar', 'subscript', 'inserttext'],
4197 ['foo[]bar', 'subscript', 'delete'],
4198 ['foo[]bar', 'subscript', 'delete', 'inserttext'],
4199 ['foo[]bar', 'subscript', 'formatblock'],
4200 ['foo[]bar', 'subscript', 'formatblock', 'inserttext'],
4201 ['foo[]bar', 'subscript', 'forwarddelete'],
4202 ['foo[]bar', 'subscript', 'forwarddelete', 'inserttext'],
4203 ['foo[]bar', 'subscript', 'indent'],
4204 ['foo[]bar', 'subscript', 'indent', 'inserttext'],
4205 ['foo[]bar', 'subscript', 'inserthorizontalrule'],
4206 ['foo[]bar', 'subscript', 'inserthorizontalrule', 'inserttext'],
4207 ['foo[]bar', 'subscript', 'inserthtml'],
4208 ['foo[]bar', 'subscript', 'inserthtml', 'inserttext'],
4209 ['foo[]bar', 'subscript', 'insertimage'],
4210 ['foo[]bar', 'subscript', 'insertimage', 'inserttext'],
4211 ['foo[]bar', 'subscript', 'insertlinebreak'],
4212 ['foo[]bar', 'subscript', 'insertlinebreak', 'inserttext'],
4213 ['foo[]bar', 'subscript', 'insertorderedlist'],
4214 ['foo[]bar', 'subscript', 'insertorderedlist', 'inserttext'],
4215 ['foo[]bar', 'subscript', 'insertparagraph'],
4216 ['foo[]bar', 'subscript', 'insertparagraph', 'inserttext'],
4217 ['foo[]bar', 'subscript', 'insertunorderedlist'],
4218 ['foo[]bar', 'subscript', 'insertunorderedlist', 'inserttext'],
4219 ['foo[]bar', 'subscript', 'justifycenter'],
4220 ['foo[]bar', 'subscript', 'justifycenter', 'inserttext'],
4221 ['foo[]bar', 'subscript', 'justifyfull'],
4222 ['foo[]bar', 'subscript', 'justifyfull', 'inserttext'],
4223 ['foo[]bar', 'subscript', 'justifyleft'],
4224 ['foo[]bar', 'subscript', 'justifyleft', 'inserttext'],
4225 ['foo[]bar', 'subscript', 'justifyright'],
4226 ['foo[]bar', 'subscript', 'justifyright', 'inserttext'],
4227 ['foo[]bar', 'subscript', 'outdent'],
4228 ['foo[]bar', 'subscript', 'outdent', 'inserttext'],
4230 ['foo[]bar', 'superscript', 'inserttext'],
4231 ['foo[]bar', 'superscript', 'delete'],
4232 ['foo[]bar', 'superscript', 'delete', 'inserttext'],
4233 ['foo[]bar', 'superscript', 'formatblock'],
4234 ['foo[]bar', 'superscript', 'formatblock', 'inserttext'],
4235 ['foo[]bar', 'superscript', 'forwarddelete'],
4236 ['foo[]bar', 'superscript', 'forwarddelete', 'inserttext'],
4237 ['foo[]bar', 'superscript', 'indent'],
4238 ['foo[]bar', 'superscript', 'indent', 'inserttext'],
4239 ['foo[]bar', 'superscript', 'inserthorizontalrule'],
4240 ['foo[]bar', 'superscript', 'inserthorizontalrule', 'inserttext'],
4241 ['foo[]bar', 'superscript', 'inserthtml'],
4242 ['foo[]bar', 'superscript', 'inserthtml', 'inserttext'],
4243 ['foo[]bar', 'superscript', 'insertimage'],
4244 ['foo[]bar', 'superscript', 'insertimage', 'inserttext'],
4245 ['foo[]bar', 'superscript', 'insertlinebreak'],
4246 ['foo[]bar', 'superscript', 'insertlinebreak', 'inserttext'],
4247 ['foo[]bar', 'superscript', 'insertorderedlist'],
4248 ['foo[]bar', 'superscript', 'insertorderedlist', 'inserttext'],
4249 ['foo[]bar', 'superscript', 'insertparagraph'],
4250 ['foo[]bar', 'superscript', 'insertparagraph', 'inserttext'],
4251 ['foo[]bar', 'superscript', 'insertunorderedlist'],
4252 ['foo[]bar', 'superscript', 'insertunorderedlist', 'inserttext'],
4253 ['foo[]bar', 'superscript', 'justifycenter'],
4254 ['foo[]bar', 'superscript', 'justifycenter', 'inserttext'],
4255 ['foo[]bar', 'superscript', 'justifyfull'],
4256 ['foo[]bar', 'superscript', 'justifyfull', 'inserttext'],
4257 ['foo[]bar', 'superscript', 'justifyleft'],
4258 ['foo[]bar', 'superscript', 'justifyleft', 'inserttext'],
4259 ['foo[]bar', 'superscript', 'justifyright'],
4260 ['foo[]bar', 'superscript', 'justifyright', 'inserttext'],
4261 ['foo[]bar', 'superscript', 'outdent'],
4262 ['foo[]bar', 'superscript', 'outdent', 'inserttext'],
4264 ['foo[]bar', 'underline', 'inserttext'],
4265 ['foo[]bar', 'underline', 'delete'],
4266 ['foo[]bar', 'underline', 'delete', 'inserttext'],
4267 ['foo[]bar', 'underline', 'formatblock'],
4268 ['foo[]bar', 'underline', 'formatblock', 'inserttext'],
4269 ['foo[]bar', 'underline', 'forwarddelete'],
4270 ['foo[]bar', 'underline', 'forwarddelete', 'inserttext'],
4271 ['foo[]bar', 'underline', 'indent'],
4272 ['foo[]bar', 'underline', 'indent', 'inserttext'],
4273 ['foo[]bar', 'underline', 'inserthorizontalrule'],
4274 ['foo[]bar', 'underline', 'inserthorizontalrule', 'inserttext'],
4275 ['foo[]bar', 'underline', 'inserthtml'],
4276 ['foo[]bar', 'underline', 'inserthtml', 'inserttext'],
4277 ['foo[]bar', 'underline', 'insertimage'],
4278 ['foo[]bar', 'underline', 'insertimage', 'inserttext'],
4279 ['foo[]bar', 'underline', 'insertlinebreak'],
4280 ['foo[]bar', 'underline', 'insertlinebreak', 'inserttext'],
4281 ['foo[]bar', 'underline', 'insertorderedlist'],
4282 ['foo[]bar', 'underline', 'insertorderedlist', 'inserttext'],
4283 ['foo[]bar', 'underline', 'insertparagraph'],
4284 ['foo[]bar', 'underline', 'insertparagraph', 'inserttext'],
4285 ['foo[]bar', 'underline', 'insertunorderedlist'],
4286 ['foo[]bar', 'underline', 'insertunorderedlist', 'inserttext'],
4287 ['foo[]bar', 'underline', 'justifycenter'],
4288 ['foo[]bar', 'underline', 'justifycenter', 'inserttext'],
4289 ['foo[]bar', 'underline', 'justifyfull'],
4290 ['foo[]bar', 'underline', 'justifyfull', 'inserttext'],
4291 ['foo[]bar', 'underline', 'justifyleft'],
4292 ['foo[]bar', 'underline', 'justifyleft', 'inserttext'],
4293 ['foo[]bar', 'underline', 'justifyright'],
4294 ['foo[]bar', 'underline', 'justifyright', 'inserttext'],
4295 ['foo[]bar', 'underline', 'outdent'],
4296 ['foo[]bar', 'underline', 'outdent', 'inserttext'],
4298 // Insertion-affecting value. Test that insertText works right, and
4299 // test that various block commands preserve (or don't preserve) the
4300 // value.
4301 ['foo[]bar', 'backcolor', 'inserttext'],
4302 ['foo[]bar', 'backcolor', 'delete'],
4303 ['foo[]bar', 'backcolor', 'delete', 'inserttext'],
4304 ['foo[]bar', 'backcolor', 'formatblock'],
4305 ['foo[]bar', 'backcolor', 'formatblock', 'inserttext'],
4306 ['foo[]bar', 'backcolor', 'forwarddelete'],
4307 ['foo[]bar', 'backcolor', 'forwarddelete', 'inserttext'],
4308 ['foo[]bar', 'backcolor', 'indent'],
4309 ['foo[]bar', 'backcolor', 'indent', 'inserttext'],
4310 ['foo[]bar', 'backcolor', 'inserthorizontalrule'],
4311 ['foo[]bar', 'backcolor', 'inserthorizontalrule', 'inserttext'],
4312 ['foo[]bar', 'backcolor', 'inserthtml'],
4313 ['foo[]bar', 'backcolor', 'inserthtml', 'inserttext'],
4314 ['foo[]bar', 'backcolor', 'insertimage'],
4315 ['foo[]bar', 'backcolor', 'insertimage', 'inserttext'],
4316 ['foo[]bar', 'backcolor', 'insertlinebreak'],
4317 ['foo[]bar', 'backcolor', 'insertlinebreak', 'inserttext'],
4318 ['foo[]bar', 'backcolor', 'insertorderedlist'],
4319 ['foo[]bar', 'backcolor', 'insertorderedlist', 'inserttext'],
4320 ['foo[]bar', 'backcolor', 'insertparagraph'],
4321 ['foo[]bar', 'backcolor', 'insertparagraph', 'inserttext'],
4322 ['foo[]bar', 'backcolor', 'insertunorderedlist'],
4323 ['foo[]bar', 'backcolor', 'insertunorderedlist', 'inserttext'],
4324 ['foo[]bar', 'backcolor', 'justifycenter'],
4325 ['foo[]bar', 'backcolor', 'justifycenter', 'inserttext'],
4326 ['foo[]bar', 'backcolor', 'justifyfull'],
4327 ['foo[]bar', 'backcolor', 'justifyfull', 'inserttext'],
4328 ['foo[]bar', 'backcolor', 'justifyleft'],
4329 ['foo[]bar', 'backcolor', 'justifyleft', 'inserttext'],
4330 ['foo[]bar', 'backcolor', 'justifyright'],
4331 ['foo[]bar', 'backcolor', 'justifyright', 'inserttext'],
4332 ['foo[]bar', 'backcolor', 'outdent'],
4333 ['foo[]bar', 'backcolor', 'outdent', 'inserttext'],
4335 ['foo[]bar', 'createlink', 'inserttext'],
4336 ['foo[]bar', 'createlink', 'delete'],
4337 ['foo[]bar', 'createlink', 'delete', 'inserttext'],
4338 ['foo[]bar', 'createlink', 'formatblock'],
4339 ['foo[]bar', 'createlink', 'formatblock', 'inserttext'],
4340 ['foo[]bar', 'createlink', 'forwarddelete'],
4341 ['foo[]bar', 'createlink', 'forwarddelete', 'inserttext'],
4342 ['foo[]bar', 'createlink', 'indent'],
4343 ['foo[]bar', 'createlink', 'indent', 'inserttext'],
4344 ['foo[]bar', 'createlink', 'inserthorizontalrule'],
4345 ['foo[]bar', 'createlink', 'inserthorizontalrule', 'inserttext'],
4346 ['foo[]bar', 'createlink', 'inserthtml'],
4347 ['foo[]bar', 'createlink', 'inserthtml', 'inserttext'],
4348 ['foo[]bar', 'createlink', 'insertimage'],
4349 ['foo[]bar', 'createlink', 'insertimage', 'inserttext'],
4350 ['foo[]bar', 'createlink', 'insertlinebreak'],
4351 ['foo[]bar', 'createlink', 'insertlinebreak', 'inserttext'],
4352 ['foo[]bar', 'createlink', 'insertorderedlist'],
4353 ['foo[]bar', 'createlink', 'insertorderedlist', 'inserttext'],
4354 ['foo[]bar', 'createlink', 'insertparagraph'],
4355 ['foo[]bar', 'createlink', 'insertparagraph', 'inserttext'],
4356 ['foo[]bar', 'createlink', 'insertunorderedlist'],
4357 ['foo[]bar', 'createlink', 'insertunorderedlist', 'inserttext'],
4358 ['foo[]bar', 'createlink', 'justifycenter'],
4359 ['foo[]bar', 'createlink', 'justifycenter', 'inserttext'],
4360 ['foo[]bar', 'createlink', 'justifyfull'],
4361 ['foo[]bar', 'createlink', 'justifyfull', 'inserttext'],
4362 ['foo[]bar', 'createlink', 'justifyleft'],
4363 ['foo[]bar', 'createlink', 'justifyleft', 'inserttext'],
4364 ['foo[]bar', 'createlink', 'justifyright'],
4365 ['foo[]bar', 'createlink', 'justifyright', 'inserttext'],
4366 ['foo[]bar', 'createlink', 'outdent'],
4367 ['foo[]bar', 'createlink', 'outdent', 'inserttext'],
4369 ['foo[]bar', 'fontname', 'inserttext'],
4370 ['foo[]bar', 'fontname', 'delete'],
4371 ['foo[]bar', 'fontname', 'delete', 'inserttext'],
4372 ['foo[]bar', 'fontname', 'formatblock'],
4373 ['foo[]bar', 'fontname', 'formatblock', 'inserttext'],
4374 ['foo[]bar', 'fontname', 'forwarddelete'],
4375 ['foo[]bar', 'fontname', 'forwarddelete', 'inserttext'],
4376 ['foo[]bar', 'fontname', 'indent'],
4377 ['foo[]bar', 'fontname', 'indent', 'inserttext'],
4378 ['foo[]bar', 'fontname', 'inserthorizontalrule'],
4379 ['foo[]bar', 'fontname', 'inserthorizontalrule', 'inserttext'],
4380 ['foo[]bar', 'fontname', 'inserthtml'],
4381 ['foo[]bar', 'fontname', 'inserthtml', 'inserttext'],
4382 ['foo[]bar', 'fontname', 'insertimage'],
4383 ['foo[]bar', 'fontname', 'insertimage', 'inserttext'],
4384 ['foo[]bar', 'fontname', 'insertlinebreak'],
4385 ['foo[]bar', 'fontname', 'insertlinebreak', 'inserttext'],
4386 ['foo[]bar', 'fontname', 'insertorderedlist'],
4387 ['foo[]bar', 'fontname', 'insertorderedlist', 'inserttext'],
4388 ['foo[]bar', 'fontname', 'insertparagraph'],
4389 ['foo[]bar', 'fontname', 'insertparagraph', 'inserttext'],
4390 ['foo[]bar', 'fontname', 'insertunorderedlist'],
4391 ['foo[]bar', 'fontname', 'insertunorderedlist', 'inserttext'],
4392 ['foo[]bar', 'fontname', 'justifycenter'],
4393 ['foo[]bar', 'fontname', 'justifycenter', 'inserttext'],
4394 ['foo[]bar', 'fontname', 'justifyfull'],
4395 ['foo[]bar', 'fontname', 'justifyfull', 'inserttext'],
4396 ['foo[]bar', 'fontname', 'justifyleft'],
4397 ['foo[]bar', 'fontname', 'justifyleft', 'inserttext'],
4398 ['foo[]bar', 'fontname', 'justifyright'],
4399 ['foo[]bar', 'fontname', 'justifyright', 'inserttext'],
4400 ['foo[]bar', 'fontname', 'outdent'],
4401 ['foo[]bar', 'fontname', 'outdent', 'inserttext'],
4403 ['foo[]bar', 'fontsize', 'inserttext'],
4404 ['foo[]bar', 'fontsize', 'delete'],
4405 ['foo[]bar', 'fontsize', 'delete', 'inserttext'],
4406 ['foo[]bar', 'fontsize', 'formatblock'],
4407 ['foo[]bar', 'fontsize', 'formatblock', 'inserttext'],
4408 ['foo[]bar', 'fontsize', 'forwarddelete'],
4409 ['foo[]bar', 'fontsize', 'forwarddelete', 'inserttext'],
4410 ['foo[]bar', 'fontsize', 'indent'],
4411 ['foo[]bar', 'fontsize', 'indent', 'inserttext'],
4412 ['foo[]bar', 'fontsize', 'inserthorizontalrule'],
4413 ['foo[]bar', 'fontsize', 'inserthorizontalrule', 'inserttext'],
4414 ['foo[]bar', 'fontsize', 'inserthtml'],
4415 ['foo[]bar', 'fontsize', 'inserthtml', 'inserttext'],
4416 ['foo[]bar', 'fontsize', 'insertimage'],
4417 ['foo[]bar', 'fontsize', 'insertimage', 'inserttext'],
4418 ['foo[]bar', 'fontsize', 'insertlinebreak'],
4419 ['foo[]bar', 'fontsize', 'insertlinebreak', 'inserttext'],
4420 ['foo[]bar', 'fontsize', 'insertorderedlist'],
4421 ['foo[]bar', 'fontsize', 'insertorderedlist', 'inserttext'],
4422 ['foo[]bar', 'fontsize', 'insertparagraph'],
4423 ['foo[]bar', 'fontsize', 'insertparagraph', 'inserttext'],
4424 ['foo[]bar', 'fontsize', 'insertunorderedlist'],
4425 ['foo[]bar', 'fontsize', 'insertunorderedlist', 'inserttext'],
4426 ['foo[]bar', 'fontsize', 'justifycenter'],
4427 ['foo[]bar', 'fontsize', 'justifycenter', 'inserttext'],
4428 ['foo[]bar', 'fontsize', 'justifyfull'],
4429 ['foo[]bar', 'fontsize', 'justifyfull', 'inserttext'],
4430 ['foo[]bar', 'fontsize', 'justifyleft'],
4431 ['foo[]bar', 'fontsize', 'justifyleft', 'inserttext'],
4432 ['foo[]bar', 'fontsize', 'justifyright'],
4433 ['foo[]bar', 'fontsize', 'justifyright', 'inserttext'],
4434 ['foo[]bar', 'fontsize', 'outdent'],
4435 ['foo[]bar', 'fontsize', 'outdent', 'inserttext'],
4437 ['foo[]bar', 'forecolor', 'inserttext'],
4438 ['foo[]bar', 'forecolor', 'delete'],
4439 ['foo[]bar', 'forecolor', 'delete', 'inserttext'],
4440 ['foo[]bar', 'forecolor', 'formatblock'],
4441 ['foo[]bar', 'forecolor', 'formatblock', 'inserttext'],
4442 ['foo[]bar', 'forecolor', 'forwarddelete'],
4443 ['foo[]bar', 'forecolor', 'forwarddelete', 'inserttext'],
4444 ['foo[]bar', 'forecolor', 'indent'],
4445 ['foo[]bar', 'forecolor', 'indent', 'inserttext'],
4446 ['foo[]bar', 'forecolor', 'inserthorizontalrule'],
4447 ['foo[]bar', 'forecolor', 'inserthorizontalrule', 'inserttext'],
4448 ['foo[]bar', 'forecolor', 'inserthtml'],
4449 ['foo[]bar', 'forecolor', 'inserthtml', 'inserttext'],
4450 ['foo[]bar', 'forecolor', 'insertimage'],
4451 ['foo[]bar', 'forecolor', 'insertimage', 'inserttext'],
4452 ['foo[]bar', 'forecolor', 'insertlinebreak'],
4453 ['foo[]bar', 'forecolor', 'insertlinebreak', 'inserttext'],
4454 ['foo[]bar', 'forecolor', 'insertorderedlist'],
4455 ['foo[]bar', 'forecolor', 'insertorderedlist', 'inserttext'],
4456 ['foo[]bar', 'forecolor', 'insertparagraph'],
4457 ['foo[]bar', 'forecolor', 'insertparagraph', 'inserttext'],
4458 ['foo[]bar', 'forecolor', 'insertunorderedlist'],
4459 ['foo[]bar', 'forecolor', 'insertunorderedlist', 'inserttext'],
4460 ['foo[]bar', 'forecolor', 'justifycenter'],
4461 ['foo[]bar', 'forecolor', 'justifycenter', 'inserttext'],
4462 ['foo[]bar', 'forecolor', 'justifyfull'],
4463 ['foo[]bar', 'forecolor', 'justifyfull', 'inserttext'],
4464 ['foo[]bar', 'forecolor', 'justifyleft'],
4465 ['foo[]bar', 'forecolor', 'justifyleft', 'inserttext'],
4466 ['foo[]bar', 'forecolor', 'justifyright'],
4467 ['foo[]bar', 'forecolor', 'justifyright', 'inserttext'],
4468 ['foo[]bar', 'forecolor', 'outdent'],
4469 ['foo[]bar', 'forecolor', 'outdent', 'inserttext'],
4471 ['foo[]bar', 'hilitecolor', 'inserttext'],
4472 ['foo[]bar', 'hilitecolor', 'delete'],
4473 ['foo[]bar', 'hilitecolor', 'delete', 'inserttext'],
4474 ['foo[]bar', 'hilitecolor', 'formatblock'],
4475 ['foo[]bar', 'hilitecolor', 'formatblock', 'inserttext'],
4476 ['foo[]bar', 'hilitecolor', 'forwarddelete'],
4477 ['foo[]bar', 'hilitecolor', 'forwarddelete', 'inserttext'],
4478 ['foo[]bar', 'hilitecolor', 'indent'],
4479 ['foo[]bar', 'hilitecolor', 'indent', 'inserttext'],
4480 ['foo[]bar', 'hilitecolor', 'inserthorizontalrule'],
4481 ['foo[]bar', 'hilitecolor', 'inserthorizontalrule', 'inserttext'],
4482 ['foo[]bar', 'hilitecolor', 'inserthtml'],
4483 ['foo[]bar', 'hilitecolor', 'inserthtml', 'inserttext'],
4484 ['foo[]bar', 'hilitecolor', 'insertimage'],
4485 ['foo[]bar', 'hilitecolor', 'insertimage', 'inserttext'],
4486 ['foo[]bar', 'hilitecolor', 'insertlinebreak'],
4487 ['foo[]bar', 'hilitecolor', 'insertlinebreak', 'inserttext'],
4488 ['foo[]bar', 'hilitecolor', 'insertorderedlist'],
4489 ['foo[]bar', 'hilitecolor', 'insertorderedlist', 'inserttext'],
4490 ['foo[]bar', 'hilitecolor', 'insertparagraph'],
4491 ['foo[]bar', 'hilitecolor', 'insertparagraph', 'inserttext'],
4492 ['foo[]bar', 'hilitecolor', 'insertunorderedlist'],
4493 ['foo[]bar', 'hilitecolor', 'insertunorderedlist', 'inserttext'],
4494 ['foo[]bar', 'hilitecolor', 'justifycenter'],
4495 ['foo[]bar', 'hilitecolor', 'justifycenter', 'inserttext'],
4496 ['foo[]bar', 'hilitecolor', 'justifyfull'],
4497 ['foo[]bar', 'hilitecolor', 'justifyfull', 'inserttext'],
4498 ['foo[]bar', 'hilitecolor', 'justifyleft'],
4499 ['foo[]bar', 'hilitecolor', 'justifyleft', 'inserttext'],
4500 ['foo[]bar', 'hilitecolor', 'justifyright'],
4501 ['foo[]bar', 'hilitecolor', 'justifyright', 'inserttext'],
4502 ['foo[]bar', 'hilitecolor', 'outdent'],
4503 ['foo[]bar', 'hilitecolor', 'outdent', 'inserttext'],
4505 // Test things that interfere with each other
4506 ['foo[]bar', 'superscript', 'subscript', 'inserttext'],
4507 ['foo[]bar', 'subscript', 'superscript', 'inserttext'],
4509 ['foo[]bar', 'createlink', ['forecolor', '#0000FF'], 'inserttext'],
4510 ['foo[]bar', ['forecolor', '#0000FF'], 'createlink', 'inserttext'],
4511 ['foo[]bar', 'createlink', ['forecolor', 'blue'], 'inserttext'],
4512 ['foo[]bar', ['forecolor', 'blue'], 'createlink', 'inserttext'],
4513 ['foo[]bar', 'createlink', ['forecolor', 'brown'], 'inserttext'],
4514 ['foo[]bar', ['forecolor', 'brown'], 'createlink', 'inserttext'],
4515 ['foo[]bar', 'createlink', ['forecolor', 'black'], 'inserttext'],
4516 ['foo[]bar', ['forecolor', 'black'], 'createlink', 'inserttext'],
4517 ['foo[]bar', 'createlink', 'underline', 'inserttext'],
4518 ['foo[]bar', 'underline', 'createlink', 'inserttext'],
4519 ['foo[]bar', 'createlink', 'underline', 'underline', 'inserttext'],
4520 ['foo[]bar', 'underline', 'underline', 'createlink', 'inserttext'],
4522 ['foo[]bar', 'subscript', ['fontsize', '2'], 'inserttext'],
4523 ['foo[]bar', ['fontsize', '2'], 'subscript', 'inserttext'],
4524 ['foo[]bar', 'subscript', ['fontsize', '3'], 'inserttext'],
4525 ['foo[]bar', ['fontsize', '3'], 'subscript', 'inserttext'],
4527 ['foo[]bar', ['hilitecolor', 'aqua'], ['backcolor', 'tan'], 'inserttext'],
4528 ['foo[]bar', ['backcolor', 'tan'], ['hilitecolor', 'aqua'], 'inserttext'],
4531 // The following are all just inserttext tests that we took from there,
4532 // but we first backspace the selected text instead of letting
4533 // inserttext handle it. This tests that deletion correctly sets
4534 // overrides.
4535 ['foo<b>[bar]</b>baz', 'delete', 'inserttext'],
4536 ['foo<i>[bar]</i>baz', 'delete', 'inserttext'],
4537 ['foo<s>[bar]</s>baz', 'delete', 'inserttext'],
4538 ['foo<sub>[bar]</sub>baz', 'delete', 'inserttext'],
4539 ['foo<sup>[bar]</sup>baz', 'delete', 'inserttext'],
4540 ['foo<u>[bar]</u>baz', 'delete', 'inserttext'],
4541 ['foo<a href=http://www.google.com>[bar]</a>baz', 'delete', 'inserttext'],
4542 ['foo<font face=sans-serif>[bar]</font>baz', 'delete', 'inserttext'],
4543 ['foo<font size=4>[bar]</font>baz', 'delete', 'inserttext'],
4544 ['foo<font color=#0000FF>[bar]</font>baz', 'delete', 'inserttext'],
4545 ['foo<span style=background-color:#00FFFF>[bar]</span>baz', 'delete', 'inserttext'],
4546 ['foo<a href=http://www.google.com><font color=blue>[bar]</font></a>baz', 'delete', 'inserttext'],
4547 ['foo<font color=blue><a href=http://www.google.com>[bar]</a></font>baz', 'delete', 'inserttext'],
4548 ['foo<a href=http://www.google.com><font color=brown>[bar]</font></a>baz', 'delete', 'inserttext'],
4549 ['foo<font color=brown><a href=http://www.google.com>[bar]</a></font>baz', 'delete', 'inserttext'],
4550 ['foo<a href=http://www.google.com><font color=black>[bar]</font></a>baz', 'delete', 'inserttext'],
4551 ['foo<a href=http://www.google.com><u>[bar]</u></a>baz', 'delete', 'inserttext'],
4552 ['foo<u><a href=http://www.google.com>[bar]</a></u>baz', 'delete', 'inserttext'],
4553 ['foo<sub><font size=2>[bar]</font></sub>baz', 'delete', 'inserttext'],
4554 ['foo<font size=2><sub>[bar]</sub></font>baz', 'delete', 'inserttext'],
4555 ['foo<sub><font size=3>[bar]</font></sub>baz', 'delete', 'inserttext'],
4556 ['foo<font size=3><sub>[bar]</sub></font>baz', 'delete', 'inserttext'],
4558 // Now repeat but with different selections.
4559 ['[foo<b>bar]</b>baz', 'delete', 'inserttext'],
4560 ['[foo<i>bar]</i>baz', 'delete', 'inserttext'],
4561 ['[foo<s>bar]</s>baz', 'delete', 'inserttext'],
4562 ['[foo<sub>bar]</sub>baz', 'delete', 'inserttext'],
4563 ['[foo<sup>bar]</sup>baz', 'delete', 'inserttext'],
4564 ['[foo<u>bar]</u>baz', 'delete', 'inserttext'],
4565 ['[foo<a href=http://www.google.com>bar]</a>baz', 'delete', 'inserttext'],
4566 ['[foo<font face=sans-serif>bar]</font>baz', 'delete', 'inserttext'],
4567 ['[foo<font size=4>bar]</font>baz', 'delete', 'inserttext'],
4568 ['[foo<font color=#0000FF>bar]</font>baz', 'delete', 'inserttext'],
4569 ['[foo<span style=background-color:#00FFFF>bar]</span>baz', 'delete', 'inserttext'],
4570 ['[foo<a href=http://www.google.com><font color=blue>bar]</font></a>baz', 'delete', 'inserttext'],
4571 ['[foo<font color=blue><a href=http://www.google.com>bar]</a></font>baz', 'delete', 'inserttext'],
4572 ['[foo<a href=http://www.google.com><font color=brown>bar]</font></a>baz', 'delete', 'inserttext'],
4573 ['[foo<font color=brown><a href=http://www.google.com>bar]</a></font>baz', 'delete', 'inserttext'],
4574 ['[foo<a href=http://www.google.com><font color=black>bar]</font></a>baz', 'delete', 'inserttext'],
4575 ['[foo<a href=http://www.google.com><u>bar]</u></a>baz', 'delete', 'inserttext'],
4576 ['[foo<u><a href=http://www.google.com>bar]</a></u>baz', 'delete', 'inserttext'],
4577 ['[foo<sub><font size=2>bar]</font></sub>baz', 'delete', 'inserttext'],
4578 ['[foo<font size=2><sub>bar]</sub></font>baz', 'delete', 'inserttext'],
4579 ['[foo<sub><font size=3>bar]</font></sub>baz', 'delete', 'inserttext'],
4580 ['[foo<font size=3><sub>bar]</sub></font>baz', 'delete', 'inserttext'],
4582 ['foo<b>[bar</b>baz]', 'delete', 'inserttext'],
4583 ['foo<i>[bar</i>baz]', 'delete', 'inserttext'],
4584 ['foo<s>[bar</s>baz]', 'delete', 'inserttext'],
4585 ['foo<sub>[bar</sub>baz]', 'delete', 'inserttext'],
4586 ['foo<sup>[bar</sup>baz]', 'delete', 'inserttext'],
4587 ['foo<u>[bar</u>baz]', 'delete', 'inserttext'],
4588 ['foo<a href=http://www.google.com>[bar</a>baz]', 'delete', 'inserttext'],
4589 ['foo<font face=sans-serif>[bar</font>baz]', 'delete', 'inserttext'],
4590 ['foo<font size=4>[bar</font>baz]', 'delete', 'inserttext'],
4591 ['foo<font color=#0000FF>[bar</font>baz]', 'delete', 'inserttext'],
4592 ['foo<span style=background-color:#00FFFF>[bar</span>baz]', 'delete', 'inserttext'],
4593 ['foo<a href=http://www.google.com><font color=blue>[bar</font></a>baz]', 'delete', 'inserttext'],
4594 ['foo<font color=blue><a href=http://www.google.com>[bar</a></font>baz]', 'delete', 'inserttext'],
4595 ['foo<a href=http://www.google.com><font color=brown>[bar</font></a>baz]', 'delete', 'inserttext'],
4596 ['foo<font color=brown><a href=http://www.google.com>[bar</a></font>baz]', 'delete', 'inserttext'],
4597 ['foo<a href=http://www.google.com><font color=black>[bar</font></a>baz]', 'delete', 'inserttext'],
4598 ['foo<a href=http://www.google.com><u>[bar</u></a>baz]', 'delete', 'inserttext'],
4599 ['foo<u><a href=http://www.google.com>[bar</a></u>baz]', 'delete', 'inserttext'],
4600 ['foo<sub><font size=2>[bar</font></sub>baz]', 'delete', 'inserttext'],
4601 ['foo<font size=2><sub>[bar</sub></font>baz]', 'delete', 'inserttext'],
4602 ['foo<sub><font size=3>[bar</font></sub>baz]', 'delete', 'inserttext'],
4603 ['foo<font size=3><sub>[bar</sub></font>baz]', 'delete', 'inserttext'],
4605 // https://bugs.webkit.org/show_bug.cgi?id=19702
4606 ['<blockquote><font color=blue>[foo]</font></blockquote>', 'delete', 'inserttext'],
4607 ],
4608 //@}
4609 };
4610 tests.backcolor = tests.hilitecolor;
4611 tests.insertlinebreak = tests.insertparagraph;
4613 // Tests that start with "!" are believed to have bogus results and should be
4614 // skipped until the relevant bugs are fixed.
4615 var badTests = {};
4616 (function(){
4617 for (var command in tests) {
4618 badTests[command] = [];
4619 for (var i = 0; i < tests[command].length; i++) {
4620 var test = tests[command][i];
4621 if (typeof test == "string" && test[0] == "!") {
4622 test = test.slice(1);
4623 tests[command][i] = test;
4624 badTests[command].push(test);
4625 }
4626 if (typeof test == "object" && test[0][0] == "!") {
4627 test = [test[0].slice(1)].concat(test.slice(1));
4628 tests[command][i] = test;
4629 badTests[command].push(test);
4630 }
4631 }
4632 }
4633 })();
4635 var defaultValues = {
4636 //@{
4637 backcolor: "#00FFFF",
4638 createlink: "http://www.google.com/",
4639 fontname: "sans-serif",
4640 fontsize: "4",
4641 forecolor: "#0000FF",
4642 formatblock: "<div>",
4643 hilitecolor: "#00FFFF",
4644 inserthorizontalrule: "",
4645 inserthtml: "ab<b>c</b>d",
4646 insertimage: "/img/lion.svg",
4647 inserttext: "a",
4648 defaultparagraphseparator: "p",
4649 stylewithcss: "true",
4650 usecss: "true",
4651 };
4652 //@}
4654 var notes = {
4655 //@{
4656 fontname: 'Note that the body\'s font-family is "serif".',
4657 };
4658 //@}
4660 var doubleTestingCommands = [
4661 //@{
4662 "backcolor",
4663 "bold",
4664 "fontname",
4665 "fontsize",
4666 "forecolor",
4667 "italic",
4668 "justifycenter",
4669 "justifyfull",
4670 "justifyleft",
4671 "justifyright",
4672 "strikethrough",
4673 "stylewithcss",
4674 "subscript",
4675 "superscript",
4676 "underline",
4677 "usecss",
4678 ];
4679 //@}
4681 function prettyPrint(value) {
4682 //@{
4683 // Partly stolen from testharness.js
4684 if (typeof value != "string") {
4685 return String(value);
4686 }
4688 value = value.replace(/\\/g, "\\\\")
4689 .replace(/"/g, '\\"');
4691 for (var i = 0; i < 32; i++) {
4692 var replace = "\\";
4693 switch (i) {
4694 case 0: replace += "0"; break;
4695 case 1: replace += "x01"; break;
4696 case 2: replace += "x02"; break;
4697 case 3: replace += "x03"; break;
4698 case 4: replace += "x04"; break;
4699 case 5: replace += "x05"; break;
4700 case 6: replace += "x06"; break;
4701 case 7: replace += "x07"; break;
4702 case 8: replace += "b"; break;
4703 case 9: replace += "t"; break;
4704 case 10: replace += "n"; break;
4705 case 11: replace += "v"; break;
4706 case 12: replace += "f"; break;
4707 case 13: replace += "r"; break;
4708 case 14: replace += "x0e"; break;
4709 case 15: replace += "x0f"; break;
4710 case 16: replace += "x10"; break;
4711 case 17: replace += "x11"; break;
4712 case 18: replace += "x12"; break;
4713 case 19: replace += "x13"; break;
4714 case 20: replace += "x14"; break;
4715 case 21: replace += "x15"; break;
4716 case 22: replace += "x16"; break;
4717 case 23: replace += "x17"; break;
4718 case 24: replace += "x18"; break;
4719 case 25: replace += "x19"; break;
4720 case 26: replace += "x1a"; break;
4721 case 27: replace += "x1b"; break;
4722 case 28: replace += "x1c"; break;
4723 case 29: replace += "x1d"; break;
4724 case 30: replace += "x1e"; break;
4725 case 31: replace += "x1f"; break;
4726 }
4727 value = value.replace(new RegExp(String.fromCharCode(i), "g"), replace);
4728 }
4729 return '"' + value + '"';
4730 }
4731 //@}
4733 function doSetup(selector, idx) {
4734 //@{
4735 var table = document.querySelectorAll(selector)[idx];
4737 var tr = document.createElement("tr");
4738 table.firstChild.appendChild(tr);
4739 tr.className = (tr.className + " active").trim();
4741 return tr;
4742 }
4743 //@}
4745 function queryOutputHelper(beforeIndeterm, beforeState, beforeValue,
4746 afterIndeterm, afterState, afterValue,
4747 command, value) {
4748 //@{
4749 var frag = document.createDocumentFragment();
4750 var beforeDiv = document.createElement("div");
4751 var afterDiv = document.createElement("div");
4752 frag.appendChild(beforeDiv);
4753 frag.appendChild(afterDiv);
4754 beforeDiv.className = afterDiv.className = "extra-results";
4755 beforeDiv.textContent = "Before: ";
4756 afterDiv.textContent = "After: ";
4758 beforeDiv.appendChild(document.createElement("span"));
4759 afterDiv.appendChild(document.createElement("span"));
4760 if ("indeterm" in commands[command]) {
4761 // We only know it has to be either true or false.
4762 if (beforeIndeterm !== true && beforeIndeterm !== false) {
4763 beforeDiv.lastChild.className = "bad-result";
4764 }
4765 } else {
4766 // It always has to be false.
4767 beforeDiv.lastChild.className = beforeIndeterm === false
4768 ? "good-result"
4769 : "bad-result";
4770 }
4771 // After running the command, indeterminate must always be false, except if
4772 // it's an exception, or if it's insert*list and the state was true to
4773 // begin with. And we can't help strikethrough/underline.
4774 if ((/^insert(un)?orderedlist$/.test(command) && beforeState)
4775 || command == "strikethrough"
4776 || command == "underline") {
4777 if (afterIndeterm !== true && afterIndeterm !== false) {
4778 afterDiv.lastChild.className = "bad-result";
4779 }
4780 } else {
4781 afterDiv.lastChild.className =
4782 afterIndeterm === false
4783 ? "good-result"
4784 : "bad-result";
4785 }
4786 beforeDiv.lastChild.textContent = "indeterm " + prettyPrint(beforeIndeterm);
4787 afterDiv.lastChild.textContent = "indeterm " + prettyPrint(afterIndeterm);
4789 beforeDiv.appendChild(document.createTextNode(", "));
4790 afterDiv.appendChild(document.createTextNode(", "));
4792 beforeDiv.appendChild(document.createElement("span"));
4793 afterDiv.appendChild(document.createElement("span"));
4794 if (/^insert(un)?orderedlist$/.test(command)) {
4795 // If the before state is true, the after state could be either true or
4796 // false. But if the before state is false, the after state has to be
4797 // true.
4798 if (beforeState !== true && beforeState !== false) {
4799 beforeDiv.lastChild.className = "bad-result";
4800 }
4801 if (!beforeState) {
4802 afterDiv.lastChild.className = afterState === true
4803 ? "good-result"
4804 : "bad-result";
4805 } else if (afterState !== true && afterState !== false) {
4806 afterDiv.lastChild.className = "bad-result";
4807 }
4808 } else if (/^justify(center|full|left|right)$/.test(command)) {
4809 // We don't know about the before state, but the after state is always
4810 // supposed to be true.
4811 if (beforeState !== true && beforeState !== false) {
4812 beforeDiv.lastChild.className = "bad-result";
4813 }
4814 afterDiv.lastChild.className = afterState === true
4815 ? "good-result"
4816 : "bad-result";
4817 } else if (command == "strikethrough" || command == "underline") {
4818 // The only thing we can say is the before/after states need to be
4819 // either true or false.
4820 if (beforeState !== true && beforeState !== false) {
4821 beforeDiv.lastChild.className = "bad-result";
4822 }
4823 if (afterState !== true && afterState !== false) {
4824 afterDiv.lastChild.className = "bad-result";
4825 }
4826 } else {
4827 // The general rule is it must flip the state, unless there's no state
4828 // defined, in which case it should always be false.
4829 beforeDiv.lastChild.className =
4830 afterDiv.lastChild.className =
4831 ("state" in commands[command] && typeof beforeState == "boolean" && typeof afterState == "boolean" && beforeState === !afterState)
4832 || (!("state" in commands[command]) && beforeState === false && afterState === false)
4833 ? "good-result"
4834 : "bad-result";
4835 }
4836 beforeDiv.lastChild.textContent = "state " + prettyPrint(beforeState);
4837 afterDiv.lastChild.textContent = "state " + prettyPrint(afterState);
4839 beforeDiv.appendChild(document.createTextNode(", "));
4840 afterDiv.appendChild(document.createTextNode(", "));
4842 beforeDiv.appendChild(document.createElement("span"));
4843 afterDiv.appendChild(document.createElement("span"));
4845 // Direct equality comparison doesn't make sense in a bunch of cases.
4846 if (command == "backcolor" || command == "forecolor" || command == "hilitecolor") {
4847 if (/^([0-9a-fA-F]{3}){1,2}$/.test(value)) {
4848 value = "#" + value;
4849 }
4850 } else if (command == "fontsize") {
4851 value = normalizeFontSize(value);
4852 if (value !== null) {
4853 value = String(cssSizeToLegacy(value));
4854 }
4855 } else if (command == "formatblock") {
4856 value = value.replace(/^<(.*)>$/, "$1").toLowerCase();
4857 } else if (command == "defaultparagraphseparator") {
4858 value = value.toLowerCase();
4859 if (value != "p" && value != "div") {
4860 value = "";
4861 }
4862 }
4864 if (((command == "backcolor" || command == "forecolor" || command == "hilitecolor") && value.toLowerCase() == "currentcolor")
4865 || (command == "fontsize" && value === null)
4866 || (command == "formatblock" && formattableBlockNames.indexOf(value.replace(/^<(.*)>$/, "$1").trim()) == -1)
4867 || (command == "defaultparagraphseparator" && value == "")) {
4868 afterDiv.lastChild.className = beforeValue === afterValue
4869 ? "good-result"
4870 : "bad-result";
4871 } else if (/^justify(center|full|left|right)$/.test(command)) {
4872 // We know there are only four correct values beforehand, and afterward
4873 // the value has to be the one we set.
4874 if (!/^(center|justify|left|right)$/.test(beforeValue)) {
4875 beforeDiv.lastChild.className = "bad-result";
4876 }
4877 var expectedValue = command == "justifyfull"
4878 ? "justify"
4879 : command.replace("justify", "");
4880 afterDiv.lastChild.className = afterValue === expectedValue
4881 ? "good-result"
4882 : "bad-result";
4883 } else if (!("value" in commands[command])) {
4884 // If it's not defined we want "".
4885 beforeDiv.lastChild.className = beforeValue === ""
4886 ? "good-result"
4887 : "bad-result";
4888 afterDiv.lastChild.className = afterValue === ""
4889 ? "good-result"
4890 : "bad-result";
4891 } else {
4892 // And in all other cases, the value afterwards has to be the one we
4893 // set.
4894 afterDiv.lastChild.className =
4895 areEquivalentValues(command, afterValue, value)
4896 ? "good-result"
4897 : "bad-result";
4898 }
4899 beforeDiv.lastChild.textContent = "value " + prettyPrint(beforeValue);
4900 afterDiv.lastChild.textContent = "value " + prettyPrint(afterValue);
4902 return frag;
4903 }
4904 //@}
4906 function normalizeTest(command, test, styleWithCss) {
4907 //@{
4908 // Our standard format for test processing is:
4909 // [input HTML, [command1, value1], [command2, value2], ...]
4910 // But this is verbose, so we actually use three different formats in the
4911 // tests and multiTests arrays:
4912 //
4913 // 1) Plain string giving the input HTML. The command is implicit from the
4914 // key of the tests array. If the command takes values, the value is given
4915 // by defaultValues, otherwise it's "". Has to be converted to
4916 // [input HTML, [command, value].
4917 //
4918 // 2) Two-element array [value, input HTML]. Has to be converted to
4919 // [input HTML, [command, value]].
4920 //
4921 // 3) An element of multiTests. This just has to have values filled in.
4922 //
4923 // Optionally, a styleWithCss argument can be passed, either true or false.
4924 // If it is, we'll prepend a styleWithCss invocation.
4925 if (command == "multitest") {
4926 if (typeof test == "string") {
4927 test = JSON.parse(test);
4928 }
4929 for (var i = 1; i < test.length; i++) {
4930 if (typeof test[i] == "string"
4931 && test[i] in defaultValues) {
4932 test[i] = [test[i], defaultValues[test[i]]];
4933 } else if (typeof test[i] == "string") {
4934 test[i] = [test[i], ""];
4935 }
4936 }
4937 return test;
4938 }
4940 if (typeof test == "string") {
4941 if (command in defaultValues) {
4942 test = [test, [command, defaultValues[command]]];
4943 } else {
4944 test = [test, [command, ""]];
4945 }
4946 } else if (test.length == 2) {
4947 test = [test[1], [command, String(test[0])]];
4948 }
4950 if (styleWithCss !== undefined) {
4951 test.splice(1, 0, ["stylewithcss", String(styleWithCss)]);
4952 }
4954 return test;
4955 }
4956 //@}
4958 function doInputCell(tr, test, command) {
4959 //@{
4960 var testHtml = test[0];
4962 var msg = null;
4963 if (command in defaultValues) {
4964 // Single command with a value, possibly with a styleWithCss stuck
4965 // before. We don't need to specify the command itself, since this
4966 // presumably isn't in multiTests, so the command is already given by
4967 // the section header.
4968 msg = 'value: ' + prettyPrint(test[test.length - 1][1]);
4969 } else if (command == "multitest") {
4970 // Uses a different input format
4971 msg = JSON.stringify(test);
4972 }
4973 var inputCell = document.createElement("td");
4974 inputCell.innerHTML = "<div></div><div></div>";
4975 inputCell.firstChild.innerHTML = testHtml;
4976 inputCell.lastChild.textContent = inputCell.firstChild.innerHTML;
4977 if (msg !== null) {
4978 inputCell.lastChild.textContent += " (" + msg + ")";
4979 }
4981 tr.appendChild(inputCell);
4982 }
4983 //@}
4985 function doSpecCell(tr, test, command) {
4986 //@{
4987 var specCell = document.createElement("td");
4988 tr.appendChild(specCell);
4989 try {
4990 var points = setupCell(specCell, test[0]);
4991 var range = document.createRange();
4992 range.setStart(points[0], points[1]);
4993 range.setEnd(points[2], points[3]);
4994 // The points might be backwards
4995 if (range.collapsed) {
4996 range.setEnd(points[0], points[1]);
4997 }
4998 specCell.firstChild.contentEditable = "true";
4999 specCell.firstChild.spellcheck = false;
5001 if (command != "multitest") {
5002 try { var beforeIndeterm = myQueryCommandIndeterm(command, range) }
5003 catch(e) { beforeIndeterm = "Exception" }
5004 try { var beforeState = myQueryCommandState(command, range) }
5005 catch(e) { beforeState = "Exception" }
5006 try { var beforeValue = myQueryCommandValue(command, range) }
5007 catch(e) { beforeValue = "Exception" }
5008 }
5010 for (var i = 1; i < test.length; i++) {
5011 myExecCommand(test[i][0], false, test[i][1], range);
5012 }
5014 if (command != "multitest") {
5015 try { var afterIndeterm = myQueryCommandIndeterm(command, range) }
5016 catch(e) { afterIndeterm = "Exception" }
5017 try { var afterState = myQueryCommandState(command, range) }
5018 catch(e) { afterState = "Exception" }
5019 try { var afterValue = myQueryCommandValue(command, range) }
5020 catch(e) { afterValue = "Exception" }
5021 }
5023 specCell.firstChild.contentEditable = "inherit";
5024 specCell.firstChild.removeAttribute("spellcheck");
5025 var compareDiv1 = specCell.firstChild.cloneNode(true);
5027 // Now do various sanity checks, and throw if they're violated. First
5028 // just count children:
5029 if (specCell.childNodes.length != 2) {
5030 throw "The cell didn't have two children. Did something spill outside the test div?";
5031 }
5033 // Now verify that the DOM serializes.
5034 compareDiv1.normalize();
5035 var compareDiv2 = compareDiv1.cloneNode(false);
5036 compareDiv2.innerHTML = compareDiv1.innerHTML;
5037 // Oddly, IE9 sometimes produces two nodes that return true for
5038 // isEqualNode but have different innerHTML (omitting closing tags vs.
5039 // not).
5040 if (!compareDiv1.isEqualNode(compareDiv2)
5041 && compareDiv1.innerHTML != compareDiv2.innerHTML) {
5042 throw "DOM does not round-trip through serialization! "
5043 + compareDiv1.innerHTML + " vs. " + compareDiv2.innerHTML;
5044 }
5045 if (!compareDiv1.isEqualNode(compareDiv2)) {
5046 throw "DOM does not round-trip through serialization (although innerHTML is the same)! "
5047 + compareDiv1.innerHTML;
5048 }
5050 // Check for attributes
5051 if (specCell.firstChild.attributes.length) {
5052 throw "Wrapper div has attributes! " +
5053 specCell.innerHTML.replace(/<div><\/div>$/, "");
5054 }
5056 // Final sanity check: make sure everything isAllowedChild() of its
5057 // parent.
5058 getDescendants(specCell.firstChild).forEach(function(descendant) {
5059 if (!isAllowedChild(descendant, descendant.parentNode)) {
5060 throw "Something here is not an allowed child of its parent: " + descendant;
5061 }
5062 });
5064 addBrackets(range);
5066 specCell.lastChild.textContent = specCell.firstChild.innerHTML;
5067 if (command != "multitest") {
5068 specCell.lastChild.appendChild(queryOutputHelper(
5069 beforeIndeterm, beforeState, beforeValue,
5070 afterIndeterm, afterState, afterValue,
5071 command, test[test.length - 1][1]));
5072 if (specCell.querySelector(".bad-result")) {
5073 specCell.parentNode.className = "alert";
5074 }
5075 }
5076 } catch (e) {
5077 specCell.firstChild.contentEditable = "inherit";
5078 specCell.firstChild.removeAttribute("spellcheck");
5079 specCell.lastChild.textContent = "Exception: " + formatException(e);
5081 specCell.parentNode.className = "alert";
5082 specCell.lastChild.className = "alert";
5084 // Don't bother comparing to localStorage, this is always wrong no
5085 // matter what.
5086 return;
5087 }
5089 if (command != "multitest") {
5090 // Old storage format
5091 var key = "execcommand-" + command
5092 + "-" + (test.length == 2 || test[1][1] == "false" ? "0" : "1")
5093 + "-" + tr.firstChild.lastChild.textContent;
5094 } else {
5095 var key = "execcommand-" + JSON.stringify(test);
5096 }
5098 // Use getItem() instead of direct property access to work around Firefox
5099 // bug: https://bugzilla.mozilla.org/show_bug.cgi?id=532062
5100 var oldValue = localStorage.getItem(key);
5101 var newValue = specCell.lastChild.firstChild.textContent;
5103 // Ignore differences between {} and [].
5104 if (oldValue === null
5105 || oldValue.replace("{}", "[]") !== newValue.replace("{}", "[]")) {
5106 specCell.parentNode.className = "alert";
5107 var alertDiv = document.createElement("div");
5108 specCell.lastChild.appendChild(alertDiv);
5109 alertDiv.className = "alert";
5110 if (oldValue === null) {
5111 alertDiv.textContent = "Newly added test result";
5112 } else if (oldValue.replace(/[\[\]{}]/g, "") == newValue.replace(/[\[\]{}]/g, "")) {
5113 alertDiv.textContent = "Last run produced a different selection: " + oldValue;
5114 } else {
5115 alertDiv.textContent = "Last run produced different markup: " + oldValue;
5116 }
5118 var button = document.createElement("button");
5119 alertDiv.appendChild(button);
5120 button.textContent = "Store new result";
5121 button.className = "store-new-result";
5122 button.onclick = (function(key, val, alertDiv) { return function() {
5123 localStorage[key] = val;
5124 // Make it easier to do mass updates, and also to jump to the next
5125 // new result
5126 var buttons = document.getElementsByClassName("store-new-result");
5127 for (var i = 0; i < buttons.length; i++) {
5128 if (isDescendant(buttons[i], alertDiv)
5129 && i + 1 < buttons.length) {
5130 buttons[i + 1].focus();
5131 break;
5132 }
5133 }
5134 var td = alertDiv;
5135 while (td.tagName != "TD") {
5136 td = td.parentNode;
5137 }
5138 alertDiv.parentNode.removeChild(alertDiv);
5139 if (!td.querySelector(".alert")) {
5140 td.parentNode.className = (" " + td.parentNode.className + " ")
5141 .replace(/ alert /g, "")
5142 .replace(/^ | $/g, "");
5143 }
5144 } })(key, newValue, alertDiv);
5145 }
5146 }
5147 //@}
5149 function browserCellException(e, testDiv, browserCell) {
5150 //@{
5151 if (testDiv) {
5152 testDiv.contenteditable = "inherit";
5153 testDiv.removeAttribute("spellcheck");
5154 }
5155 browserCell.lastChild.className = "alert";
5156 browserCell.lastChild.textContent = "Exception: " + formatException(e);
5157 if (testDiv && testDiv.parentNode != browserCell) {
5158 browserCell.insertBefore(testDiv, browserCell.firstChild);
5159 }
5160 }
5161 //@}
5163 function formatException(e) {
5164 //@{
5165 if (typeof e == "object" && "stack" in e) {
5166 return e + " (stack: " + e.stack + ")";
5167 }
5168 return String(e);
5169 }
5170 //@}
5172 function doSameCell(tr) {
5173 //@{
5174 tr.className = (" " + tr.className + " ").replace(" active ", "").trim();
5175 if (tr.className == "") {
5176 tr.removeAttribute("class");
5177 }
5179 var sameCell = document.createElement("td");
5180 if (!document.querySelector("#browser-checkbox").checked) {
5181 sameCell.className = "maybe";
5182 sameCell.textContent = "?";
5183 } else {
5184 var exception = false;
5185 try {
5186 // Ad hoc normalization to avoid basically spurious mismatches. For
5187 // now this includes ignoring where the selection goes.
5188 var normalizedSpecCell = tr.childNodes[1].lastChild.firstChild.textContent
5189 .replace(/[[\]{}]/g, "")
5190 .replace(/ style="margin: 0 0 0 40px; border: none; padding: 0px;"/g, '')
5191 .replace(/ style="margin-right: 0px;" dir="ltr"/g, '')
5192 .replace(/ style="margin-left: 0px;" dir="rtl"/g, '')
5193 .replace(/ style="margin-(left|right): 40px;"/g, '')
5194 .replace(/: /g, ":")
5195 .replace(/;? ?"/g, '"')
5196 .replace(/<(\/?)strong/g, '<$1b')
5197 .replace(/<(\/?)strike/g, '<$1s')
5198 .replace(/<(\/?)em/g, '<$1i')
5199 .replace(/#[0-9a-fA-F]{6}/g, function(match) { return match.toUpperCase(); });
5200 var normalizedBrowserCell = tr.childNodes[2].lastChild.firstChild.textContent
5201 .replace(/[[\]{}]/g, "")
5202 .replace(/ style="margin: 0 0 0 40px; border: none; padding: 0px;"/g, '')
5203 .replace(/ style="margin-right: 0px;" dir="ltr"/g, '')
5204 .replace(/ style="margin-left: 0px;" dir="rtl"/g, '')
5205 .replace(/ style="margin-(left|right): 40px;"/g, '')
5206 .replace(/: /g, ":")
5207 .replace(/;? ?"/g, '"')
5208 .replace(/<(\/?)strong/g, '<$1b')
5209 .replace(/<(\/?)strike/g, '<$1s')
5210 .replace(/<(\/?)em/g, '<$1i')
5211 .replace(/#[0-9a-fA-F]{6}/g, function(match) { return match.toUpperCase(); })
5212 .replace(/ size="2" width="100%"/g, '');
5213 if (navigator.userAgent.indexOf("MSIE") != -1) {
5214 // IE produces <font style> instead of <span style>, so let's
5215 // translate all <span>s to <font>s.
5216 normalizedSpecCell = normalizedSpecCell
5217 .replace(/<(\/?)span/g, '<$1font');
5218 normalizedBrowserCell = normalizedBrowserCell
5219 .replace(/<(\/?)span/g, '<$1font');
5220 }
5221 } catch (e) {
5222 exception = true;
5223 }
5224 if (!exception && normalizedSpecCell == normalizedBrowserCell) {
5225 sameCell.className = "yes";
5226 sameCell.textContent = "\u2713";
5227 } else {
5228 sameCell.className = "no";
5229 sameCell.textContent = "\u2717";
5230 }
5231 }
5232 tr.appendChild(sameCell);
5234 for (var i = 0; i <= 2; i++) {
5235 // Insert <wbr> so IE doesn't stretch the screen. This is considerably
5236 // more complicated than it has to be, thanks to Firefox's lack of
5237 // support for outerHTML.
5238 var div = tr.childNodes[i].lastChild;
5239 if (div.firstChild) {
5240 var text = div.firstChild.textContent;
5241 div.removeChild(div.firstChild);
5242 div.insertBefore(document.createElement("div"), div.firstChild);
5243 div.firstChild.innerHTML = text
5244 .replace(/&/g, "&")
5245 .replace(/</g, "<")
5246 .replace(/>/g, "><wbr>")
5247 .replace(/</g, "<wbr><");
5248 while (div.firstChild.hasChildNodes()) {
5249 div.insertBefore(div.firstChild.lastChild, div.firstChild.nextSibling);
5250 }
5251 div.removeChild(div.firstChild);
5252 }
5254 // Add position: absolute span to not affect vertical layout
5255 getDescendants(tr.childNodes[i].firstChild)
5256 .filter(function(node) {
5257 return node.nodeType == Node.TEXT_NODE
5258 && /^(\{\}?|\})$/.test(node.data);
5259 }).forEach(function(node) {
5260 var span = document.createElement("span");
5261 span.style.position = "absolute";
5262 span.textContent = node.data;
5263 node.parentNode.insertBefore(span, node);
5264 node.parentNode.removeChild(node);
5265 });
5266 }
5267 }
5268 //@}
5270 function doTearDown(command) {
5271 //@{
5272 getSelection().removeAllRanges();
5273 }
5274 //@}
5276 function setupCell(cell, html) {
5277 //@{
5278 cell.innerHTML = "<div></div><div></div>";
5280 return setupDiv(cell.firstChild, html);
5281 }
5282 //@}
5284 function setupDiv(node, html) {
5285 //@{
5286 // A variety of checks to avoid simple errors. Not foolproof, of course.
5287 var re = /\{|\[|data-start/g;
5288 var markers = [];
5289 var marker;
5290 while (marker = re.exec(html)) {
5291 markers.push(marker);
5292 }
5293 if (markers.length != 1) {
5294 throw "Need exactly one start marker ([ or { or data-start), found " + markers.length;
5295 }
5297 var re = /\}|\]|data-end/g;
5298 var markers = [];
5299 var marker;
5300 while (marker = re.exec(html)) {
5301 markers.push(marker);
5302 }
5303 if (markers.length != 1) {
5304 throw "Need exactly one end marker (] or } or data-end), found " + markers.length;
5305 }
5307 node.innerHTML = html;
5309 var startNode, startOffset, endNode, endOffset;
5311 // For braces that don't lie inside text nodes, we can't just set
5312 // innerHTML, because that might disturb the DOM. For instance, if the
5313 // brace is right before a <tr>, it could get moved outside the table
5314 // entirely, which messes everything up pretty badly. So we instead
5315 // allow using data attributes: data-start and data-end on the start and
5316 // end nodes, with a numeric value indicating the offset. This format
5317 // doesn't allow the parent div to be a start or end node, but in that case
5318 // you can always use the curly braces.
5319 if (node.querySelector("[data-start]")) {
5320 startNode = node.querySelector("[data-start]");
5321 startOffset = startNode.getAttribute("data-start");
5322 startNode.removeAttribute("data-start");
5323 }
5324 if (node.querySelector("[data-end]")) {
5325 endNode = node.querySelector("[data-end]");
5326 endOffset = endNode.getAttribute("data-end");
5327 endNode.removeAttribute("data-end");
5328 }
5330 var cur = node;
5331 while (true) {
5332 if (!cur || (cur != node && !(cur.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINS))) {
5333 break;
5334 }
5336 if (cur.nodeType != Node.TEXT_NODE) {
5337 cur = nextNode(cur);
5338 continue;
5339 }
5341 var data = cur.data.replace(/\]/g, "");
5342 var startIdx = data.indexOf("[");
5344 data = cur.data.replace(/\[/g, "");
5345 var endIdx = data.indexOf("]");
5347 cur.data = cur.data.replace(/[\[\]]/g, "");
5349 if (startIdx != -1) {
5350 startNode = cur;
5351 startOffset = startIdx;
5352 }
5354 if (endIdx != -1) {
5355 endNode = cur;
5356 endOffset = endIdx;
5357 }
5359 // These are only legal as the first or last
5360 data = cur.data.replace(/\}/g, "");
5361 var elStartIdx = data.indexOf("{");
5363 data = cur.data.replace(/\{/g, "");
5364 var elEndIdx = data.indexOf("}");
5366 if (elStartIdx == 0) {
5367 startNode = cur.parentNode;
5368 startOffset = getNodeIndex(cur);
5369 } else if (elStartIdx != -1) {
5370 startNode = cur.parentNode;
5371 startOffset = getNodeIndex(cur) + 1;
5372 }
5373 if (elEndIdx == 0) {
5374 endNode = cur.parentNode;
5375 endOffset = getNodeIndex(cur);
5376 } else if (elEndIdx != -1) {
5377 endNode = cur.parentNode;
5378 endOffset = getNodeIndex(cur) + 1;
5379 }
5381 cur.data = cur.data.replace(/[{}]/g, "");
5382 if (!cur.data.length) {
5383 if (cur == startNode || cur == endNode) {
5384 throw "You put a square bracket where there was no text node . . .";
5385 }
5386 var oldCur = cur;
5387 cur = nextNode(cur);
5388 oldCur.parentNode.removeChild(oldCur);
5389 } else {
5390 cur = nextNode(cur);
5391 }
5392 }
5394 return [startNode, startOffset, endNode, endOffset];
5395 }
5396 //@}
5398 function setSelection(startNode, startOffset, endNode, endOffset) {
5399 //@{
5400 if (navigator.userAgent.indexOf("Opera") != -1) {
5401 // Yes, browser sniffing is evil, but I can't be bothered to debug
5402 // Opera.
5403 var range = document.createRange();
5404 range.setStart(startNode, startOffset);
5405 range.setEnd(endNode, endOffset);
5406 if (range.collapsed) {
5407 range.setEnd(startNode, startOffset);
5408 }
5409 getSelection().removeAllRanges();
5410 getSelection().addRange(range);
5411 } else if ("extend" in getSelection()) {
5412 // WebKit behaves unreasonably for collapse(), so do that manually.
5413 /*
5414 var range = document.createRange();
5415 range.setStart(startNode, startOffset);
5416 getSelection().removeAllRanges();
5417 getSelection().addRange(range);
5418 */
5419 getSelection().collapse(startNode, startOffset);
5420 getSelection().extend(endNode, endOffset);
5421 } else {
5422 // IE9. Selections have no direction, so we just make the selection
5423 // always forwards.
5424 var range;
5425 if (getSelection().rangeCount) {
5426 range = getSelection().getRangeAt(0);
5427 } else {
5428 range = document.createRange();
5429 }
5430 range.setStart(startNode, startOffset);
5431 range.setEnd(endNode, endOffset);
5432 if (range.collapsed) {
5433 // Phooey, we got them backwards.
5434 range.setEnd(startNode, startOffset);
5435 }
5436 if (!getSelection().rangeCount) {
5437 getSelection().addRange(range);
5438 }
5439 }
5440 }
5441 //@}
5443 /**
5444 * Add brackets at the start and end points of the given range, so that they're
5445 * visible.
5446 */
5447 function addBrackets(range) {
5448 //@{
5449 // Handle the collapsed case specially, to avoid confusingly getting the
5450 // markers backwards in some cases
5451 if (range.startContainer.nodeType == Node.TEXT_NODE
5452 || range.startContainer.nodeType == Node.COMMENT_NODE) {
5453 if (range.collapsed) {
5454 range.startContainer.insertData(range.startOffset, "[]");
5455 } else {
5456 range.startContainer.insertData(range.startOffset, "[");
5457 }
5458 } else {
5459 var marker = range.collapsed ? "{}" : "{";
5460 if (range.startOffset != range.startContainer.childNodes.length
5461 && range.startContainer.childNodes[range.startOffset].nodeType == Node.TEXT_NODE) {
5462 range.startContainer.childNodes[range.startOffset].insertData(0, marker);
5463 } else if (range.startOffset != 0
5464 && range.startContainer.childNodes[range.startOffset - 1].nodeType == Node.TEXT_NODE) {
5465 range.startContainer.childNodes[range.startOffset - 1].appendData(marker);
5466 } else {
5467 // Seems to serialize as I'd want even for tables . . . IE doesn't
5468 // allow undefined to be passed as the second argument (it throws
5469 // an exception), so we have to explicitly check the number of
5470 // children and pass null.
5471 range.startContainer.insertBefore(document.createTextNode(marker),
5472 range.startContainer.childNodes.length == range.startOffset
5473 ? null
5474 : range.startContainer.childNodes[range.startOffset]);
5475 }
5476 }
5477 if (range.collapsed) {
5478 return;
5479 }
5480 if (range.endContainer.nodeType == Node.TEXT_NODE
5481 || range.endContainer.nodeType == Node.COMMENT_NODE) {
5482 range.endContainer.insertData(range.endOffset, "]");
5483 } else {
5484 if (range.endOffset != range.endContainer.childNodes.length
5485 && range.endContainer.childNodes[range.endOffset].nodeType == Node.TEXT_NODE) {
5486 range.endContainer.childNodes[range.endOffset].insertData(0, "}");
5487 } else if (range.endOffset != 0
5488 && range.endContainer.childNodes[range.endOffset - 1].nodeType == Node.TEXT_NODE) {
5489 range.endContainer.childNodes[range.endOffset - 1].appendData("}");
5490 } else {
5491 range.endContainer.insertBefore(document.createTextNode("}"),
5492 range.endContainer.childNodes.length == range.endOffset
5493 ? null
5494 : range.endContainer.childNodes[range.endOffset]);
5495 }
5496 }
5497 }
5498 //@}
5500 function normalizeSerializedStyle(wrapper) {
5501 //@{
5502 // Inline CSS attribute serialization has terrible interop, so we fix
5503 // things up a bit to avoid spurious mismatches. This needs to be removed
5504 // once CSSOM defines this stuff properly, but for now there's just no
5505 // standard for any of it. This only normalizes descendants of wrapper,
5506 // not wrapper itself.
5507 [].forEach.call(wrapper.querySelectorAll("[style]"), function(node) {
5508 if (node.style.color != "") {
5509 var newColor = normalizeColor(node.style.color);
5510 node.style.color = "";
5511 node.style.color = newColor;
5512 }
5513 if (node.style.backgroundColor != "") {
5514 var newBackgroundColor = normalizeColor(node.style.backgroundColor);
5515 node.style.backgroundColor = "";
5516 node.style.backgroundColor = newBackgroundColor;
5517 }
5518 node.setAttribute("style", node.getAttribute("style")
5519 // Random spacing differences
5520 .replace(/; ?$/, "")
5521 .replace(/: /g, ":")
5522 // Gecko likes "transparent"
5523 .replace(/transparent/g, "rgba(0, 0, 0, 0)")
5524 // WebKit likes to look overly precise
5525 .replace(/, 0.496094\)/g, ", 0.5)")
5526 // Gecko converts anything with full alpha to "transparent" which
5527 // then becomes "rgba(0, 0, 0, 0)", so we have to make other
5528 // browsers match
5529 .replace(/rgba\([0-9]+, [0-9]+, [0-9]+, 0\)/g, "rgba(0, 0, 0, 0)")
5530 );
5531 });
5532 }
5533 //@}
5535 /**
5536 * Input is the same format as output of generateTest in gentest.html.
5537 */
5538 function runConformanceTest(browserTest) {
5539 //@{
5540 document.getElementById("test-container").innerHTML = "<div contenteditable></div><p>test";
5541 var testName = JSON.stringify(browserTest[1]) + " " + format_value(browserTest[0]);
5542 var testDiv = document.querySelector("div[contenteditable]");
5543 var originalRootElement, newRootElement;
5544 var exception = null;
5545 var expectedExecCommandReturnValues = browserTest[3];
5546 var expectedQueryResults = browserTest[4];
5547 var actualQueryResults = {};
5548 var actualQueryExceptions = {};
5550 try {
5551 var points = setupDiv(testDiv, browserTest[0]);
5553 var range = document.createRange();
5554 range.setStart(points[0], points[1]);
5555 range.setEnd(points[2], points[3]);
5556 // The points might be backwards
5557 if (range.collapsed) {
5558 range.setEnd(points[0], points[1]);
5559 }
5560 getSelection().removeAllRanges();
5561 getSelection().addRange(range);
5563 var originalRootElement = document.documentElement.cloneNode(true);
5564 originalRootElement.querySelector("[contenteditable]").parentNode
5565 .removeChild(originalRootElement.querySelector("[contenteditable]"));
5566 originalRootElement.querySelector("#log").parentNode
5567 .removeChild(originalRootElement.querySelector("#log"));
5569 for (var command in expectedQueryResults) {
5570 var results = [];
5571 var exceptions = {};
5572 try { results[0] = document.queryCommandIndeterm(command) }
5573 catch(e) { exceptions[0] = e }
5574 try { results[1] = document.queryCommandState(command) }
5575 catch(e) { exceptions[1] = e }
5576 try { results[2] = document.queryCommandValue(command) }
5577 catch(e) { exceptions[2] = e }
5578 actualQueryResults[command] = results;
5579 actualQueryExceptions[command] = exceptions;
5580 }
5581 } catch(e) {
5582 exception = e;
5583 }
5585 for (var i = 0; i < browserTest[1].length; i++) {
5586 test(function() {
5587 assert_equals(exception, null, "Setup must not throw an exception");
5589 assert_equals(document.execCommand(browserTest[1][i][0], false, browserTest[1][i][1]),
5590 expectedExecCommandReturnValues[i]);
5591 }, testName + ": execCommand(" + format_value(browserTest[1][i][0]) + ", false, " + format_value(browserTest[1][i][1]) + ") return value");
5592 }
5594 if (exception === null) {
5595 try {
5596 for (var command in expectedQueryResults) {
5597 var results = actualQueryResults[command];
5598 var exceptions = actualQueryExceptions[command];
5599 try { results[3] = document.queryCommandIndeterm(command) }
5600 catch(e) { exceptions[3] = e }
5601 try { results[4] = document.queryCommandState(command) }
5602 catch(e) { exceptions[4] = e }
5603 try { results[5] = document.queryCommandValue(command) }
5604 catch(e) { exceptions[5] = e }
5605 }
5607 var newRootElement = document.documentElement.cloneNode(true);
5608 newRootElement.querySelector("[contenteditable]").parentNode
5609 .removeChild(newRootElement.querySelector("[contenteditable]"));
5610 newRootElement.querySelector("#log").parentNode
5611 .removeChild(newRootElement.querySelector("#log"));
5613 normalizeSerializedStyle(testDiv);
5614 } catch(e) {
5615 exception = e;
5616 }
5617 }
5619 test(function() {
5620 assert_equals(exception, null, "Setup must not throw an exception");
5622 // Now test for modifications to non-editable content. First just
5623 // count children:
5624 assert_equals(testDiv.parentNode.childNodes.length, 2,
5625 "The parent div must have two children. Did something spill outside the test div?");
5627 // Check for attributes
5628 assert_equals(testDiv.attributes.length, 1,
5629 'Wrapper div must have only one attribute (<div contenteditable="">), but has more (' +
5630 formatStartTag(testDiv) + ")");
5632 assert_equals(document.body.attributes.length, 0,
5633 "Body element must have no attributes (<body>), but has more (" +
5634 formatStartTag(document.body) + ")");
5636 // Check that in general, nothing outside the test div was modified.
5637 // TODO: Less verbose error reporting, the way some of the range tests
5638 // do?
5639 assert_equals(newRootElement.innerHTML, originalRootElement.innerHTML,
5640 "Everything outside the editable div must be unchanged, but some change did occur");
5641 }, testName + " checks for modifications to non-editable content");
5643 test(function() {
5644 assert_equals(exception, null, "Setup must not throw an exception");
5646 assert_equals(testDiv.innerHTML,
5647 browserTest[2].replace(/[\[\]{}]/g, ""),
5648 "Unexpected innerHTML (after normalizing inline style)");
5649 }, testName + " compare innerHTML");
5651 for (var command in expectedQueryResults) {
5652 var descriptions = [
5653 'queryCommandIndeterm("' + command + '") before',
5654 'queryCommandState("' + command + '") before',
5655 'queryCommandValue("' + command + '") before',
5656 'queryCommandIndeterm("' + command + '") after',
5657 'queryCommandState("' + command + '") after',
5658 'queryCommandValue("' + command + '") after',
5659 ];
5660 for (var i = 0; i < 6; i++) {
5661 test(function() {
5662 assert_equals(exception, null, "Setup must not throw an exception");
5664 if (expectedQueryResults[command][i] === null) {
5665 // Some ad hoc tests to verify that we have a real
5666 // DOMException. FIXME: This should be made more rigorous,
5667 // with clear steps specified for checking that something
5668 // is really a DOMException.
5669 assert_true(i in actualQueryExceptions[command],
5670 "An exception must be thrown in this case");
5671 var e = actualQueryExceptions[command][i];
5672 assert_equals(typeof e, "object",
5673 "typeof thrown object");
5674 assert_idl_attribute(e, "code",
5675 "Thrown object must be a DOMException");
5676 assert_idl_attribute(e, "INVALID_ACCESS_ERR",
5677 "Thrown object must be a DOMException");
5678 assert_equals(e.code, e.INVALID_ACCESS_ERR,
5679 "Thrown object must be an INVALID_ACCESS_ERR, so its .code and .INVALID_ACCESS_ERR attributes must be equal");
5680 } else if ((i == 2 || i == 5)
5681 && (command == "backcolor" || command == "forecolor" || command == "hilitecolor")
5682 && typeof actualQueryResults[command][i] == "string") {
5683 assert_false(i in actualQueryExceptions[command],
5684 "An exception must not be thrown in this case");
5685 // We don't return the format that the color should be in:
5686 // that's up to CSSOM. Thus we normalize before comparing.
5687 assert_equals(normalizeColor(actualQueryResults[command][i]),
5688 expectedQueryResults[command][i],
5689 "Wrong result returned (after color normalization)");
5690 } else {
5691 assert_false(i in actualQueryExceptions[command],
5692 "An exception must not be thrown in this case");
5693 assert_equals(actualQueryResults[command][i],
5694 expectedQueryResults[command][i],
5695 "Wrong result returned");
5696 }
5697 }, testName + " " + descriptions[i]);
5698 }
5699 }
5701 // Silly Firefox
5702 document.body.removeAttribute("bgcolor");
5703 }
5704 //@}
5706 /**
5707 * Return a string like '<body bgcolor="#FFFFFF">'.
5708 */
5709 function formatStartTag(el) {
5710 //@{
5711 var ret = "<" + el.tagName.toLowerCase();
5712 for (var i = 0; i < el.attributes.length; i++) {
5713 ret += " " + el.attributes[i].name + '="';
5714 ret += el.attributes[i].value.replace(/\&/g, "&")
5715 .replace(/"/g, """);
5716 ret += '"';
5717 }
5718 return ret + ">";
5719 }
5720 //@}
5722 // vim: foldmarker=@{,@} foldmethod=marker