dom/imptests/editing/tests.js

branch
TOR_BUG_3246
changeset 7
129ffea94266
equal deleted inserted replaced
-1:000000000000 0:6b0204e60733
1 // For the original (development) tests, we want to make a bunch of changes to
2 // the page as it loads. We don't want this for the conformance tests, so let
3 // them opt out.
4 if (typeof testsJsLibraryOnly == "undefined" || !testsJsLibraryOnly) {
5 // Alert the reader of egregious Opera bug that will make the specced
6 // implementation horribly buggy
7 //@{
8 (function() {
9 var div = document.createElement("div");
10 div.appendChild(document.createElement("br"));
11 document.body.insertBefore(div, document.body.firstChild);
12 var range = document.createRange();
13 range.setStart(div, 1);
14 div.insertBefore(document.createElement("p"), div.firstChild);
15 if (range.startOffset > range.startContainer.childNodes.length) {
16 var warningDiv = document.createElement("p");
17 document.body.insertBefore(warningDiv, document.body.firstChild);
18 warningDiv.style.fontWeight = "bold";
19 warningDiv.style.fontSize = "2em";
20 warningDiv.style.color = "red";
21 warningDiv.innerHTML = 'Your browser suffers from an <a href="http://software.hixie.ch/utilities/js/live-dom-viewer/saved/1028">egregious bug</a> in range mutation that will give incorrect results for the spec columns in many cases. To ensure that the spec column contains the output actually required by the spec, use a different browser.';
22 }
23 div.parentNode.removeChild(div);
24 })();
25 //@}
26
27 // Insert the toolbar thingie as soon as the script file is loaded
28 //@{
29 (function() {
30 var toolbarDiv = document.createElement("div");
31 toolbarDiv.id = "toolbar";
32 // Note: this is completely not a hack at all.
33 toolbarDiv.innerHTML = "<style id=alerts>body > div > table > tbody > tr:not(.alert):not(:first-child):not(.active) { display: none }</style>"
34 + "<label><input id=alert-checkbox type=checkbox accesskey=a checked onclick='updateAlertRowStyle()'> Display rows without spec <u>a</u>lerts</label>"
35 + "<label><input id=browser-checkbox type=checkbox accesskey=b checked onclick='localStorage[\"display-browser-tests\"] = event.target.checked'> Run <u>b</u>rowser tests as well as spec tests</label>";
36
37 document.body.appendChild(toolbarDiv);
38 })();
39 //@}
40
41 // Confusingly, we're storing a string here, not a boolean.
42 document.querySelector("#alert-checkbox").checked = localStorage["display-alerts"] != "false";
43 document.querySelector("#browser-checkbox").checked = localStorage["display-browser-tests"] != "false";
44
45 function updateAlertRowStyle() {
46 //@{
47 var checked = document.querySelector("#alert-checkbox").checked;
48 document.querySelector("#alerts").disabled = checked;
49 localStorage["display-alerts"] = checked;
50 }
51 //@}
52 updateAlertRowStyle();
53
54 // Feature-test whether the browser wraps at <wbr> or not, and set word-wrap:
55 // break-word where necessary if not. (IE and Opera don't wrap, Gecko and
56 // WebKit do.) word-wrap: break-word will break anywhere at all, so it looks
57 // significantly uglier.
58 //@{
59 (function() {
60 var wordWrapTestDiv = document.createElement("div");
61 wordWrapTestDiv.style.width = "5em";
62 document.body.appendChild(wordWrapTestDiv);
63 wordWrapTestDiv.innerHTML = "abc";
64 var height1 = getComputedStyle(wordWrapTestDiv).height;
65 wordWrapTestDiv.innerHTML = "abc<wbr>abc<wbr>abc<wbr>abc<wbr>abc<wbr>abc";
66 var height2 = getComputedStyle(wordWrapTestDiv).height;
67 document.body.removeChild(wordWrapTestDiv);
68 if (height1 == height2) {
69 document.body.className = (document.body.className + " wbr-workaround").trim();
70 }
71 })();
72 //@}
73 }
74
75 // Now for the meat of the file.
76 var tests = {
77 backcolor: [
78 //@{ Same as hilitecolor (set below)
79 ],
80 //@}
81 bold: [
82 //@{
83 'foo[]bar',
84 '<p>[foo</p> <p>bar]</p>',
85 '<span>[foo</span> <span>bar]</span>',
86 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
87 '<p>[foo<p><br><p>bar]',
88 '<b>foo[]bar</b>',
89 '<i>foo[]bar</i>',
90 '<span>foo</span>{}<span>bar</span>',
91 '<span>foo[</span><span>]bar</span>',
92 'foo[bar]baz',
93 'foo[bar<b>baz]qoz</b>quz',
94 'foo[bar<i>baz]qoz</i>quz',
95 '{<p><p> <p>foo</p>}',
96
97 'foo<span contenteditable=false>[bar]</span>baz',
98 'fo[o<span contenteditable=false>bar</span>b]az',
99 'foo<span contenteditable=false>ba[r</span>b]az',
100 'fo[o<span contenteditable=false>b]ar</span>baz',
101 'fo[<b>o</b><span contenteditable=false>bar</span><b>b</b>]az',
102 '<span contenteditable=false>foo<span contenteditable=true>[bar]</span>baz</span>',
103 '<span contenteditable=false>fo[o<span contenteditable=true>bar</span>b]az</span>',
104 '<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b]az</span>',
105 '<span contenteditable=false>fo[o<span contenteditable=true>b]ar</span>baz</span>',
106 '<span contenteditable=false>fo[<b>o<span contenteditable=true>bar</span>b</b>]az</span>',
107
108 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
109 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
110 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
111 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
112 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
113 '{<table><tr><td>foo<td>bar<td>baz</table>}',
114
115 'foo<span style="font-weight: bold">[bar]</span>baz',
116 'foo<b>[bar]</b>baz',
117 'foo<b>bar</b>[baz]',
118 '[foo]<b>bar</b>baz',
119 '<b>foo</b>[bar]<b>baz</b>',
120 'foo<strong>bar</strong>[baz]',
121 '[foo]<strong>bar</strong>baz',
122 '<strong>foo</strong>[bar]<strong>baz</strong>',
123 '<b>foo</b>[bar]<strong>baz</strong>',
124 '<strong>foo</strong>[bar]<b>baz</b>',
125 'foo[<b>bar</b>]baz',
126 'foo[<b>bar]</b>baz',
127 'foo<b>[bar</b>]baz',
128
129 'foo{<b></b>}baz',
130 'foo{<i></i>}baz',
131 'foo{<b><i></i></b>}baz',
132 'foo{<i><b></b></i>}baz',
133
134 'foo<strong>[bar]</strong>baz',
135 'foo[<strong>bar</strong>]baz',
136 'foo[<strong>bar]</strong>baz',
137 'foo<strong>[bar</strong>]baz',
138 'foo<span style="font-weight: bold">[bar]</span>baz',
139 'foo[<span style="font-weight: bold">bar</span>]baz',
140 'foo[<span style="font-weight: bold">bar]</span>baz',
141 'foo<span style="font-weight: bold">[bar</span>]baz',
142
143 '<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>',
144 '<b><p>foo[<i>bar</i>}</p><p>baz</p></b>',
145
146 'foo [bar <b>baz] qoz</b> quz sic',
147 'foo bar <b>baz [qoz</b> quz] sic',
148
149 '<b id=purple>bar [baz] qoz</b>',
150
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>}',
178
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>}',
186
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>',
189
190 '{<b>foo</b> <b>bar</b>}',
191 '{<h3>foo</h3><b>bar</b>}',
192
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]',
197
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>',
202
203 '<p style="font-weight: bold">foo[bar]baz</p>',
204
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>}',
240
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>}',
247
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>',
253
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]',
261
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>',
267
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]',
273
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>',
278
279 '<a name=abc>foo[bar]baz</a>',
280 '<a name=abc><b>foo[bar]baz</b></a>',
281
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',
303
304 'fo&ouml;[]bar',
305 'foo&#x308;[]bar',
306 'foo&#x308;&#x327;[]bar',
307 '&ouml;[]bar',
308 'o&#x308;[]bar',
309 'o&#x308;&#x327;[]bar',
310
311 '&#x5e9;&#x5c1;&#x5b8;[]&#x5dc;&#x5d5;&#x5b9;&#x5dd;',
312 '&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;[]&#x5dd;',
313
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>',
323
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>',
329
330 '<div>foo</div><div>[]bar</div>',
331 '<pre>foo</pre>[]bar',
332
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',
341
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>',
354
355 'foo &nbsp;[]',
356 '&nbsp;[] foo',
357 'foo &nbsp;[]bar',
358 'foo&nbsp; []bar',
359 'foo&nbsp;&nbsp;[]bar',
360 'foo []bar',
361 'foo []&nbsp; bar',
362 'foo &nbsp;[] bar',
363 'foo &nbsp; []bar',
364 'foo []<span>&nbsp;</span> bar',
365 'foo <span>&nbsp;</span>[] bar',
366 'foo <span>&nbsp;</span> []bar',
367 '<b>foo </b>&nbsp;[]bar',
368 '<b>foo&nbsp;</b> []bar',
369 '<b>foo&nbsp;</b>&nbsp;[]bar',
370 '<b>foo </b> []bar',
371 '<p>foo </p><p>[] bar</p>',
372
373 '<pre>foo &nbsp;[]</pre>',
374 '<pre>&nbsp;[] foo</pre>',
375 '<pre>foo &nbsp;[]bar</pre>',
376 '<pre>foo&nbsp; []bar</pre>',
377 '<pre>foo []bar</pre>',
378
379 '<div style=white-space:pre>foo &nbsp;[]</div>',
380 '<div style=white-space:pre>&nbsp;[] foo</div>',
381 '<div style=white-space:pre>foo &nbsp;[]bar</div>',
382 '<div style=white-space:pre>foo&nbsp; []bar</div>',
383 '<div style=white-space:pre>foo []bar</div>',
384
385 '<div style=white-space:pre-wrap>foo &nbsp;[]</div>',
386 '<div style=white-space:pre-wrap>&nbsp;[] foo</div>',
387 '<div style=white-space:pre-wrap>foo &nbsp;[]bar</div>',
388 '<div style=white-space:pre-wrap>foo&nbsp; []bar</div>',
389 '<div style=white-space:pre-wrap>foo []bar</div>',
390
391 '<div style=white-space:pre-line>foo &nbsp;[]</div>',
392 '<div style=white-space:pre-line>&nbsp;[] foo</div>',
393 '<div style=white-space:pre-line>foo &nbsp;[]bar</div>',
394 '<div style=white-space:pre-line>foo&nbsp; []bar</div>',
395 '<div style=white-space:pre-line>foo []bar</div>',
396
397 '<div style=white-space:nowrap>foo &nbsp;[]</div>',
398 '<div style=white-space:nowrap>&nbsp;[] foo</div>',
399 '<div style=white-space:nowrap>foo &nbsp;[]bar</div>',
400 '<div style=white-space:nowrap>foo&nbsp; []bar</div>',
401 '<div style=white-space:nowrap>foo []bar</div>',
402
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>',
410
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>',
417
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>',
424
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>',
429
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>',
439
440 '<ol><li><p>foo</p>{}bar</ol>',
441
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>',
445
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>',
449
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>',
455
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',
461
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',
467
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>',
473
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>',
479
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>',
485
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>',
489
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>',
493
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',
497
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>',
523
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>',
536
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>',
543
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>',
550
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',
556
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',
567
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>',
580
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>',
586
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>',
592
593 '<div><p>foo<p>[bar<p>baz]</div>',
594
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',
615
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>',
622
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',
634
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',
641
642 '<ol><li>fo[o</ol><ol><li>b]ar</ol>',
643 '<ol><li>fo[o</ol><ul><li>b]ar</ul>',
644
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>',
652
653 '<b>foo [&nbsp;</b>bar]',
654 'foo<b> [&nbsp;bar]</b>',
655 '<b>[foo&nbsp;] </b>bar',
656 '[foo<b>&nbsp;] bar</b>',
657
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>',
665
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>',
694
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>}',
721
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>}',
728
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',
735
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',
742
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]',
749
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',
756
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]',
763
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',
768
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',
774
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>}',
810
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'],
834
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>}',
841
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>',
851
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>',
859
860 'foo<span style="font-size: 2em">[bar]</span>baz',
861 '<span style="font-size: 2em">foo[bar]baz</span>',
862
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>',
867
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>'],
872
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>'],
876
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'],
881
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>',
897
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>}',
919
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'],
942
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>}',
949
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>',
960
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>'],
964
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>',
983
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',
1006
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>}',
1013
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>',
1035
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'],
1043
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>}'],
1050
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>'],
1074
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>'],
1083
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>'],
1104
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>'],
1146
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]'],
1188
1189 ['p', '<div>[foobar]</div>'],
1190
1191 '<ol><li>[foo]<li>bar</ol>',
1192
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>'],
1205
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>'],
1215
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>'],
1225
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>'],
1235
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>'],
1241
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]',
1247
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>', '&#10;[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>&#10;foo&#10;&#10;bar&#10;</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[]&ouml;bar',
1270 'fo[]o&#x308;bar',
1271 'fo[]o&#x308;&#x327;bar',
1272 '[]&ouml;bar',
1273 '[]o&#x308;bar',
1274 '[]o&#x308;&#x327;bar',
1275
1276 '[]&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;&#x5dd;',
1277 '&#x5e9;&#x5c1;&#x5b8;&#x5dc;[]&#x5d5;&#x5b9;&#x5dd;',
1278
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>',
1285
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',
1298
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>',
1304
1305 '<div>foo[]</div><div>bar</div>',
1306 '<pre>foo[]</pre>bar',
1307
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',
1316
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',
1329
1330 'foo []&nbsp;',
1331 '[]&nbsp; foo',
1332 'foo[] &nbsp;bar',
1333 'foo[]&nbsp; bar',
1334 'foo[]&nbsp;&nbsp;bar',
1335 'foo[] bar',
1336 'foo[] &nbsp; bar',
1337 'foo []&nbsp; bar',
1338 'foo &nbsp;[] bar',
1339 'foo[] <span>&nbsp;</span> bar',
1340 'foo []<span>&nbsp;</span> bar',
1341 'foo <span>&nbsp;</span>[] bar',
1342 '<b>foo[] </b>&nbsp;bar',
1343 '<b>foo[]&nbsp;</b> bar',
1344 '<b>foo[]&nbsp;</b>&nbsp;bar',
1345 '<b>foo[] </b> bar',
1346
1347 '<pre>foo []&nbsp;</pre>',
1348 '<pre>[]&nbsp; foo</pre>',
1349 '<pre>foo[] &nbsp;bar</pre>',
1350 '<pre>foo[]&nbsp; bar</pre>',
1351 '<pre>foo[] bar</pre>',
1352
1353 '<div style=white-space:pre>foo []&nbsp;</div>',
1354 '<div style=white-space:pre>[]&nbsp; foo</div>',
1355 '<div style=white-space:pre>foo[] &nbsp;bar</div>',
1356 '<div style=white-space:pre>foo[]&nbsp; bar</div>',
1357 '<div style=white-space:pre>foo[] bar</div>',
1358
1359 '<div style=white-space:pre-wrap>foo []&nbsp;</div>',
1360 '<div style=white-space:pre-wrap>[]&nbsp; foo</div>',
1361 '<div style=white-space:pre-wrap>foo[] &nbsp;bar</div>',
1362 '<div style=white-space:pre-wrap>foo[]&nbsp; bar</div>',
1363 '<div style=white-space:pre-wrap>foo[] bar</div>',
1364
1365 '<div style=white-space:pre-line>foo []&nbsp;</div>',
1366 '<div style=white-space:pre-line>[]&nbsp; foo</div>',
1367 '<div style=white-space:pre-line>foo[] &nbsp;bar</div>',
1368 '<div style=white-space:pre-line>foo[]&nbsp; bar</div>',
1369 '<div style=white-space:pre-line>foo[] bar</div>',
1370
1371 '<div style=white-space:nowrap>foo []&nbsp;</div>',
1372 '<div style=white-space:nowrap>[]&nbsp; foo</div>',
1373 '<div style=white-space:nowrap>foo[] &nbsp;bar</div>',
1374 '<div style=white-space:nowrap>foo[]&nbsp; bar</div>',
1375 '<div style=white-space:nowrap>foo[] bar</div>',
1376
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>',
1383
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>',
1390
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>',
1395
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>',
1402
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>',
1406
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>',
1410
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>',
1416
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',
1421
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',
1426
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>',
1431
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>',
1436
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>',
1442
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>',
1446
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>',
1450
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',
1454
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>',
1480
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>',
1491
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>',
1498
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>',
1505
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',
1511
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',
1522
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>',
1535
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>',
1541
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>',
1547
1548 '<div><p>foo<p>[bar<p>baz]</div>',
1549
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',
1570
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>',
1577
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',
1589
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',
1596
1597 '<ol><li>fo[o</ol><ol><li>b]ar</ol>',
1598 '<ol><li>fo[o</ol><ul><li>b]ar</ul>',
1599
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>',
1607
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>',
1635
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>}',
1662
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>}',
1669
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>',
1682
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>',
1695
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>',
1731
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',
1738
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',
1747
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',
1761
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',
1771
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',
1783
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',
1795
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',
1807
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',
1812
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>',
1836
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>',
1844
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',
1853
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>',
1859
1860 'foo<!--bar-->[baz]<p>extra',
1861 '[foo]<!--bar-->baz<p>extra',
1862 '<p>foo<!--bar-->{}<p>extra',
1863 '<p>{}<!--foo-->bar<p>extra',
1864
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>',
1881
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',
1899
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',
1906
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>',
1911
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>',
1969
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>',
1983
1984 '<quasit>foo[bar]baz</quasit>',
1985
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',
2002
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'],
2009
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>'],
2017
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'],
2022
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'],
2030
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>'],
2039
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'],
2053
2054 ['<nobr>abc</nobr>', '<nobr>f[o]o</nobr>'],
2055 ['<nobr>abc</nobr>', 'f[o]o'],
2056
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>'],
2063
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>'],
2070
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',
2094
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>',
2105
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>',
2111
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>',
2117
2118 '<div><p>foo<p>[bar<p>baz]</div>',
2119
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',
2154
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>}',
2158
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>',
2163
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>',
2168
2169 '<p>[foo<blockquote><p>bar]<p>baz</blockquote>',
2170
2171
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>',
2191
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',
2197
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>',
2203
2204
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>',
2224
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',
2230
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>',
2236
2237
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',
2243
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>',
2253
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',
2258
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>',
2269
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>',
2274
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>',
2294
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>',
2332
2333 '<pre>foo[]<br><br></pre>',
2334 '<pre>foo<br>{}<br></pre>',
2335 '<pre>foo&#10;[]</pre>',
2336 '<pre>foo[]&#10;</pre>',
2337 '<pre>foo&#10;[]&#10;</pre>',
2338
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>',
2343
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>',
2350
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>',
2356
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>',
2366
2367 '<table><tr><td>foo[]bar</table>',
2368 '<table><tr><td><p>foo[]bar</table>',
2369
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>',
2379
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>',
2389
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>',
2394
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>',
2399
2400 '<p>foo[]<!--bar-->',
2401 '<p><!--foo-->[]bar',
2402
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',
2411
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>',
2417
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>',
2432
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>',
2445
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>',
2458
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'],
2474
2475 ['\t', 'foo[]bar'],
2476 ['&', 'foo[]bar'],
2477 ['\n', 'foo[]bar'],
2478 ['abc\ndef', 'foo[]bar'],
2479 ['\x07', 'foo[]bar'],
2480
2481 ['<b>hi</b>', 'foo[]bar'],
2482 ['<', 'foo[]bar'],
2483 ['&amp;', 'foo[]bar'],
2484
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'],
2490
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 &nbsp;[]bar'],
2499 [' ', 'foo []&nbsp;bar'],
2500 [' ', 'foo[] &nbsp;bar'],
2501 [' ', 'foo&nbsp; []bar'],
2502 [' ', 'foo&nbsp;[] bar'],
2503 [' ', 'foo[]&nbsp; bar'],
2504 [' ', 'foo&nbsp;&nbsp;[]bar'],
2505 [' ', 'foo&nbsp;[]&nbsp;bar'],
2506 [' ', 'foo[]&nbsp;&nbsp;bar'],
2507 [' ', 'foo []&nbsp; bar'],
2508 [' ', 'foo []bar'],
2509 [' ', 'foo []&nbsp;&nbsp; &nbsp; bar'],
2510
2511 [' ', '[]foo'],
2512 [' ', '{}foo'],
2513 [' ', 'foo[]'],
2514 [' ', 'foo{}'],
2515 [' ', 'foo&nbsp;[]'],
2516 [' ', 'foo&nbsp;{}'],
2517 [' ', 'foo&nbsp;&nbsp;[]'],
2518 [' ', 'foo&nbsp;&nbsp;{}'],
2519 [' ', '<b>foo[]</b>bar'],
2520 [' ', 'foo[]<b>bar</b>'],
2521
2522 [' ', 'foo[] '],
2523 [' ', ' foo [] '],
2524 [' ', 'foo[]<span> </span>'],
2525 [' ', 'foo[]<span> </span> '],
2526 [' ', ' []foo'],
2527 [' ', ' [] foo '],
2528 [' ', '<span> </span>[]foo'],
2529 [' ', ' <span> </span>[]foo'],
2530
2531 [' ', '{}<br>'],
2532 [' ', '<p>{}<br>'],
2533
2534 [' ', '<p>foo[]<p>bar'],
2535 [' ', '<p>foo&nbsp;[]<p>bar'],
2536 [' ', '<p>foo[]<p>&nbsp;bar'],
2537
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 &nbsp;[]bar</pre>'],
2544 [' ', '<pre>[]foo</pre>'],
2545 [' ', '<pre>foo[]</pre>'],
2546 [' ', '<pre>foo&nbsp;[]</pre>'],
2547 [' ', '<pre> foo [] </pre>'],
2548
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 &nbsp;[]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&nbsp;[]</div>'],
2556 [' ', '<div style=white-space:pre> foo [] </div>'],
2557
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 &nbsp;[]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&nbsp;[]</div>'],
2565 [' ', '<div style=white-space:pre-wrap> foo [] </div>'],
2566
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 &nbsp;[]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&nbsp;[]</div>'],
2574 [' ', '<div style=white-space:pre-line> foo [] </div>'],
2575
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 &nbsp;[]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&nbsp;[]</div>'],
2583 [' ', '<div style=white-space:nowrap> foo [] </div>'],
2584
2585 // End whitespace tests
2586
2587 // Autolinking tests
2588 [' ', 'http://a[]'],
2589 [' ', 'ftp://a[]'],
2590 [' ', 'quasit://a[]'],
2591 [' ', '.x-++-.://a[]'],
2592 [' ', '(http://a)[]'],
2593 [' ', '&lt;http://a>[]'],
2594 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14744
2595 ['! ', '&#x5b;http://a&#x5d;[]'],
2596 ['! ', '&#x7b;http://a&#x7d;[]'],
2597 [' ', 'http://a![]'],
2598 [' ', '!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~http://a!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~[]'],
2599 [' ', 'http://a!"\'(),-.:;&lt;>`[]'],
2600 [' ', 'http://a#$%&amp;*+/=?\^_|~[]'],
2601 [' ', 'mailto:a[]'],
2602 [' ', 'a@b[]'],
2603 [' ', 'a@[]'],
2604 [' ', '@b[]'],
2605 [' ', '#@x[]'],
2606 [' ', 'a@.[]'],
2607 [' ', '!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~a@b!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~[]'],
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[]'],
2620
2621 [' ', 'foo[]'],
2622
2623 'foo[]bar',
2624 'foo&nbsp;[]',
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',
2652
2653
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',
2679
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',
2703
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]',
2726
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',
2744
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>}',
2748
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>',
2753
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>',
2758
2759 '<p>[foo<blockquote><p>bar]<p>baz</blockquote>',
2760
2761
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>',
2781
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',
2787
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>',
2793
2794
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>',
2814
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',
2820
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>',
2826
2827
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',
2833
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>',
2843
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',
2848
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>',
2859
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>',
2864
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>}',
2884
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>}',
2891
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',
2899
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',
2906
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',
2913
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',
2920
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]',
2927
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',
2934
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',
2938
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',
2945
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',
2976
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',
2983
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',
2990
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',
2997
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',
3004
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',
3009
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',
3014
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',
3019
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',
3024
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',
3043
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',
3052
3053 '<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
3054
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',
3058
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>',
3067
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',
3072
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',
3099
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',
3106
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',
3113
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',
3120
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',
3127
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',
3132
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',
3137
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',
3142
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',
3147
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',
3163
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',
3170
3171 '<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
3172
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',
3176
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',
3181
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',
3205
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',
3212
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',
3219
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',
3226
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',
3233
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',
3238
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',
3243
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',
3248
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',
3253
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',
3269
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',
3276
3277 '<div style=text-align:left>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
3278
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',
3282
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',
3287
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',
3311
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',
3318
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',
3325
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',
3332
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',
3339
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',
3344
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',
3349
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',
3354
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',
3359
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',
3375
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',
3382
3383 '<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
3384
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',
3388
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',
3393
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',
3412
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',
3418
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',
3424
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',
3430
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>',
3439
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>',
3447
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>',
3453
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>',
3477
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',
3486
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>',
3492
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>',
3510
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',
3515
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>',
3519
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>',
3539
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',
3563
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',
3631
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]',
3641
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',
3647
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>}',
3663
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>}',
3684
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>}',
3691
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>',
3700
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>',
3709
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>',
3716
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>',
3723
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>',
3730
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',
3741
3742 '<p style="text-decoration: line-through">foo[bar]baz</p>',
3743 '<p style="text-decoration: overline">foo[bar]baz</p>',
3744
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',
3751
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>}',
3781
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>}',
3788
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',
3793
3794 'foo<span style=vertical-align:sub>[bar]</span>baz',
3795 'foo<span style=vertical-align:super>[bar]</span>baz',
3796
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',
3809
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>}',
3840
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>}',
3847
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',
3852
3853 'foo<span style=vertical-align:sub>[bar]</span>baz',
3854 'foo<span style=vertical-align:super>[bar]</span>baz',
3855
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',
3868
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>',
3882
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>}',
3902
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>}',
3909
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>',
3918
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>',
3927
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>',
3934
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>',
3941
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>',
3948
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',
3959
3960 '<p style="text-decoration: line-through">foo[bar]baz</p>',
3961 '<p style="text-decoration: overline">foo[bar]baz</p>',
3962
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',
3969
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>}',
3998
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>',
4004
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]',
4011
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]',
4018
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'],
4127
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'],
4161
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'],
4195
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'],
4229
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'],
4263
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'],
4297
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'],
4334
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'],
4368
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'],
4402
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'],
4436
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'],
4470
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'],
4504
4505 // Test things that interfere with each other
4506 ['foo[]bar', 'superscript', 'subscript', 'inserttext'],
4507 ['foo[]bar', 'subscript', 'superscript', 'inserttext'],
4508
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'],
4521
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'],
4526
4527 ['foo[]bar', ['hilitecolor', 'aqua'], ['backcolor', 'tan'], 'inserttext'],
4528 ['foo[]bar', ['backcolor', 'tan'], ['hilitecolor', 'aqua'], 'inserttext'],
4529
4530
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'],
4557
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'],
4581
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'],
4604
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;
4612
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 })();
4634
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 //@}
4653
4654 var notes = {
4655 //@{
4656 fontname: 'Note that the body\'s font-family is "serif".',
4657 };
4658 //@}
4659
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 //@}
4680
4681 function prettyPrint(value) {
4682 //@{
4683 // Partly stolen from testharness.js
4684 if (typeof value != "string") {
4685 return String(value);
4686 }
4687
4688 value = value.replace(/\\/g, "\\\\")
4689 .replace(/"/g, '\\"');
4690
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 //@}
4732
4733 function doSetup(selector, idx) {
4734 //@{
4735 var table = document.querySelectorAll(selector)[idx];
4736
4737 var tr = document.createElement("tr");
4738 table.firstChild.appendChild(tr);
4739 tr.className = (tr.className + " active").trim();
4740
4741 return tr;
4742 }
4743 //@}
4744
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: ";
4757
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);
4788
4789 beforeDiv.appendChild(document.createTextNode(", "));
4790 afterDiv.appendChild(document.createTextNode(", "));
4791
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);
4838
4839 beforeDiv.appendChild(document.createTextNode(", "));
4840 afterDiv.appendChild(document.createTextNode(", "));
4841
4842 beforeDiv.appendChild(document.createElement("span"));
4843 afterDiv.appendChild(document.createElement("span"));
4844
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 }
4863
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);
4901
4902 return frag;
4903 }
4904 //@}
4905
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 }
4939
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 }
4949
4950 if (styleWithCss !== undefined) {
4951 test.splice(1, 0, ["stylewithcss", String(styleWithCss)]);
4952 }
4953
4954 return test;
4955 }
4956 //@}
4957
4958 function doInputCell(tr, test, command) {
4959 //@{
4960 var testHtml = test[0];
4961
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 }
4980
4981 tr.appendChild(inputCell);
4982 }
4983 //@}
4984
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;
5000
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 }
5009
5010 for (var i = 1; i < test.length; i++) {
5011 myExecCommand(test[i][0], false, test[i][1], range);
5012 }
5013
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 }
5022
5023 specCell.firstChild.contentEditable = "inherit";
5024 specCell.firstChild.removeAttribute("spellcheck");
5025 var compareDiv1 = specCell.firstChild.cloneNode(true);
5026
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 }
5032
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 }
5049
5050 // Check for attributes
5051 if (specCell.firstChild.attributes.length) {
5052 throw "Wrapper div has attributes! " +
5053 specCell.innerHTML.replace(/<div><\/div>$/, "");
5054 }
5055
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 });
5063
5064 addBrackets(range);
5065
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);
5080
5081 specCell.parentNode.className = "alert";
5082 specCell.lastChild.className = "alert";
5083
5084 // Don't bother comparing to localStorage, this is always wrong no
5085 // matter what.
5086 return;
5087 }
5088
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 }
5097
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;
5102
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 }
5117
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 //@}
5148
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 //@}
5162
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 //@}
5171
5172 function doSameCell(tr) {
5173 //@{
5174 tr.className = (" " + tr.className + " ").replace(" active ", "").trim();
5175 if (tr.className == "") {
5176 tr.removeAttribute("class");
5177 }
5178
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);
5233
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, "&amp;")
5245 .replace(/</g, "&lt;")
5246 .replace(/>/g, "><wbr>")
5247 .replace(/&lt;/g, "<wbr>&lt;");
5248 while (div.firstChild.hasChildNodes()) {
5249 div.insertBefore(div.firstChild.lastChild, div.firstChild.nextSibling);
5250 }
5251 div.removeChild(div.firstChild);
5252 }
5253
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 //@}
5269
5270 function doTearDown(command) {
5271 //@{
5272 getSelection().removeAllRanges();
5273 }
5274 //@}
5275
5276 function setupCell(cell, html) {
5277 //@{
5278 cell.innerHTML = "<div></div><div></div>";
5279
5280 return setupDiv(cell.firstChild, html);
5281 }
5282 //@}
5283
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 }
5296
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 }
5306
5307 node.innerHTML = html;
5308
5309 var startNode, startOffset, endNode, endOffset;
5310
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 }
5329
5330 var cur = node;
5331 while (true) {
5332 if (!cur || (cur != node && !(cur.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINS))) {
5333 break;
5334 }
5335
5336 if (cur.nodeType != Node.TEXT_NODE) {
5337 cur = nextNode(cur);
5338 continue;
5339 }
5340
5341 var data = cur.data.replace(/\]/g, "");
5342 var startIdx = data.indexOf("[");
5343
5344 data = cur.data.replace(/\[/g, "");
5345 var endIdx = data.indexOf("]");
5346
5347 cur.data = cur.data.replace(/[\[\]]/g, "");
5348
5349 if (startIdx != -1) {
5350 startNode = cur;
5351 startOffset = startIdx;
5352 }
5353
5354 if (endIdx != -1) {
5355 endNode = cur;
5356 endOffset = endIdx;
5357 }
5358
5359 // These are only legal as the first or last
5360 data = cur.data.replace(/\}/g, "");
5361 var elStartIdx = data.indexOf("{");
5362
5363 data = cur.data.replace(/\{/g, "");
5364 var elEndIdx = data.indexOf("}");
5365
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 }
5380
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 }
5393
5394 return [startNode, startOffset, endNode, endOffset];
5395 }
5396 //@}
5397
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 //@}
5442
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 //@}
5499
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 //@}
5534
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 = {};
5549
5550 try {
5551 var points = setupDiv(testDiv, browserTest[0]);
5552
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);
5562
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"));
5568
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 }
5584
5585 for (var i = 0; i < browserTest[1].length; i++) {
5586 test(function() {
5587 assert_equals(exception, null, "Setup must not throw an exception");
5588
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 }
5593
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 }
5606
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"));
5612
5613 normalizeSerializedStyle(testDiv);
5614 } catch(e) {
5615 exception = e;
5616 }
5617 }
5618
5619 test(function() {
5620 assert_equals(exception, null, "Setup must not throw an exception");
5621
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?");
5626
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) + ")");
5631
5632 assert_equals(document.body.attributes.length, 0,
5633 "Body element must have no attributes (<body>), but has more (" +
5634 formatStartTag(document.body) + ")");
5635
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");
5642
5643 test(function() {
5644 assert_equals(exception, null, "Setup must not throw an exception");
5645
5646 assert_equals(testDiv.innerHTML,
5647 browserTest[2].replace(/[\[\]{}]/g, ""),
5648 "Unexpected innerHTML (after normalizing inline style)");
5649 }, testName + " compare innerHTML");
5650
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");
5663
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 }
5700
5701 // Silly Firefox
5702 document.body.removeAttribute("bgcolor");
5703 }
5704 //@}
5705
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, "&amp;")
5715 .replace(/"/g, "&quot;");
5716 ret += '"';
5717 }
5718 return ret + ">";
5719 }
5720 //@}
5721
5722 // vim: foldmarker=@{,@} foldmethod=marker

mercurial