Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: third_party/WebKit/LayoutTests/imported/wpt/editing/include/tests.js

Issue 2630243004: Manually import wpt/editing and wpt/selection/ (Closed)
Patch Set: Add expectation Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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 ca ses. To ensure that the spec column contains the output actually required by th e 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 check ed 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-al erts"] != "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 look s
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-workaroun d").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>b az</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>b az</span>',
106 '<span contenteditable=false>fo[<b>o<span contenteditable=true>bar</span >b</b>]az</span>',
107
108 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
109 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> ',
110 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> ',
111 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> ',
112 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> ',
113 '{<table><tr><td>foo<td>bar<td>baz</table>}',
114
115 'foo<span style="font-weight: bold">[bar]</span>baz',
116 'foo<b>[bar]</b>baz',
117 'foo<b>bar</b>[baz]',
118 '[foo]<b>bar</b>baz',
119 '<b>foo</b>[bar]<b>baz</b>',
120 'foo<strong>bar</strong>[baz]',
121 '[foo]<strong>bar</strong>baz',
122 '<strong>foo</strong>[bar]<strong>baz</strong>',
123 '<b>foo</b>[bar]<strong>baz</strong>',
124 '<strong>foo</strong>[bar]<b>baz</b>',
125 'foo[<b>bar</b>]baz',
126 'foo[<b>bar]</b>baz',
127 'foo<b>[bar</b>]baz',
128
129 'foo{<b></b>}baz',
130 'foo{<i></i>}baz',
131 'foo{<b><i></i></b>}baz',
132 'foo{<i><b></b></i>}baz',
133
134 'foo<strong>[bar]</strong>baz',
135 'foo[<strong>bar</strong>]baz',
136 'foo[<strong>bar]</strong>baz',
137 'foo<strong>[bar</strong>]baz',
138 'foo[<span style="font-weight: bold">bar</span>]baz',
139 'foo[<span style="font-weight: bold">bar]</span>baz',
140 'foo<span style="font-weight: bold">[bar</span>]baz',
141
142 '<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>',
143 '<b><p>foo[<i>bar</i>}</p><p>baz</p></b>',
144
145 'foo [bar <b>baz] qoz</b> quz sic',
146 'foo bar <b>baz [qoz</b> quz] sic',
147
148 '<b id=purple>bar [baz] qoz</b>',
149
150 'foo<span style="font-weight: 100">[bar]</span>baz',
151 'foo<span style="font-weight: 200">[bar]</span>baz',
152 'foo<span style="font-weight: 300">[bar]</span>baz',
153 'foo<span style="font-weight: 400">[bar]</span>baz',
154 'foo<span style="font-weight: 500">[bar]</span>baz',
155 'foo<span style="font-weight: 600">[bar]</span>baz',
156 'foo<span style="font-weight: 700">[bar]</span>baz',
157 'foo<span style="font-weight: 800">[bar]</span>baz',
158 'foo<span style="font-weight: 900">[bar]</span>baz',
159 'foo<span style="font-weight: 400">[bar</span>]baz',
160 'foo<span style="font-weight: 700">[bar</span>]baz',
161 'foo[<span style="font-weight: 400">bar]</span>baz',
162 'foo[<span style="font-weight: 700">bar]</span>baz',
163 'foo[<span style="font-weight: 400">bar</span>]baz',
164 'foo[<span style="font-weight: 700">bar</span>]baz',
165 '<span style="font-weight: 100">foo[bar]baz</span>',
166 '<span style="font-weight: 400">foo[bar]baz</span>',
167 '<span style="font-weight: 700">foo[bar]baz</span>',
168 '<span style="font-weight: 900">foo[bar]baz</span>',
169 '{<span style="font-weight: 100">foobar]baz</span>',
170 '{<span style="font-weight: 400">foobar]baz</span>',
171 '{<span style="font-weight: 700">foobar]baz</span>',
172 '{<span style="font-weight: 900">foobar]baz</span>',
173 '<span style="font-weight: 100">foo[barbaz</span>}',
174 '<span style="font-weight: 400">foo[barbaz</span>}',
175 '<span style="font-weight: 700">foo[barbaz</span>}',
176 '<span style="font-weight: 900">foo[barbaz</span>}',
177
178 '<h3>foo[bar]baz</h3>',
179 '{<h3>foobar]baz</h3>',
180 '<h3>foo[barbaz</h3>}',
181 '<h3>[foobarbaz]</h3>',
182 '{<h3>foobarbaz]</h3>',
183 '<h3>[foobarbaz</h3>}',
184 '{<h3>foobarbaz</h3>}',
185
186 '<b>foo<span style="font-weight: normal">bar<b>[baz]</b>quz</span>qoz</b >',
187 '<b>foo<span style="font-weight: normal">[bar]</span>baz</b>',
188
189 '{<b>foo</b> <b>bar</b>}',
190 '{<h3>foo</h3><b>bar</b>}',
191
192 '<i><b>foo</b></i>[bar]<i><b>baz</b></i>',
193 '<i><b>foo</b></i>[bar]<b>baz</b>',
194 '<b>foo</b>[bar]<i><b>baz</b></i>',
195 '<font color=blue face=monospace><b>foo</b></font>[bar]',
196
197 'foo<span style="font-weight: normal"><b>{bar}</b></span>baz',
198 '[foo<span class=notbold>bar</span>baz]',
199 '<b><span class=notbold>[foo]</span></b>',
200 '<b><span class=notbold>foo[bar]baz</span></b>',
201
202 '<p style="font-weight: bold">foo[bar]baz</p>',
203
204 // Tests for queryCommandIndeterm() and queryCommandState()
205 'fo[o<b>b]ar</b>baz',
206 'foo<b>ba[r</b>b]az',
207 'fo[o<b>bar</b>b]az',
208 'foo[<b>b]ar</b>baz',
209 'foo<b>ba[r</b>]baz',
210 'foo{<b>bar</b>}baz',
211 'fo[o<span style=font-weight:bold>b]ar</span>baz',
212 '<span style=font-weight:800>fo[o</span><span style=font-weight:900>b]ar </span>',
213 '<span style=font-weight:700>fo[o</span><span style=font-weight:800>b]ar </span>',
214 '<span style=font-weight:600>fo[o</span><span style=font-weight:700>b]ar </span>',
215 '<span style=font-weight:500>fo[o</span><span style=font-weight:600>b]ar </span>',
216 '<span style=font-weight:400>fo[o</span><span style=font-weight:500>b]ar </span>',
217 '<span style=font-weight:300>fo[o</span><span style=font-weight:400>b]ar </span>',
218 '<span style=font-weight:200>fo[o</span><span style=font-weight:300>b]ar </span>',
219 '<span style=font-weight:100>fo[o</span><span style=font-weight:200>b]ar </span>',
220 ],
221 //@}
222 createlink: [
223 //@{
224 'foo[]bar',
225 '<p>[foo</p> <p>bar]</p>',
226 '<span>[foo</span> <span>bar]</span>',
227 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
228 '<p>[foo<p><br><p>bar]',
229 '<b>foo[]bar</b>',
230 '<i>foo[]bar</i>',
231 '<span>foo</span>{}<span>bar</span>',
232 '<span>foo[</span><span>]bar</span>',
233 'foo[bar]baz',
234 'foo[bar<b>baz]qoz</b>quz',
235 'foo[bar<i>baz]qoz</i>quz',
236 '{<p><p> <p>foo</p>}',
237
238 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
239 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> ',
240 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> ',
241 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> ',
242 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> ',
243 '{<table><tr><td>foo<td>bar<td>baz</table>}',
244
245 '<a href=http://www.google.com/>foo[bar]baz</a>',
246 '<a href=http://www.google.com/>foo[barbaz</a>}',
247 '{<a href=http://www.google.com/>foobar]baz</a>',
248 '{<a href=http://www.google.com/>foobarbaz</a>}',
249 '<a href=http://www.google.com/>[foobarbaz]</a>',
250
251 'foo<a href=http://www.google.com/>[bar]</a>baz',
252 '[foo]<a href=http://www.google.com/>bar</a>baz',
253 'foo<a href=http://www.google.com/>bar</a>[baz]',
254 'foo[<a href=http://www.google.com/>bar</a>]baz',
255 'foo<a href=http://www.google.com/>[bar</a>baz]',
256 '[foo<a href=http://www.google.com/>bar]</a>baz',
257 '[foo<a href=http://www.google.com/>bar</a>baz]',
258
259 '<a href=otherurl>foo[bar]baz</a>',
260 '<a href=otherurl>foo[barbaz</a>}',
261 '{<a href=otherurl>foobar]baz</a>',
262 '{<a href=otherurl>foobarbaz</a>}',
263 '<a href=otherurl>[foobarbaz]</a>',
264
265 'foo<a href=otherurl>[bar]</a>baz',
266 'foo[<a href=otherurl>bar</a>]baz',
267 'foo<a href=otherurl>[bar</a>baz]',
268 '[foo<a href=otherurl>bar]</a>baz',
269 '[foo<a href=otherurl>bar</a>baz]',
270
271 '<a href=otherurl><b>foo[bar]baz</b></a>',
272 '<a href=otherurl><b>foo[barbaz</b></a>}',
273 '{<a href=otherurl><b>foobar]baz</b></a>',
274 '<a href=otherurl><b>[foobarbaz]</b></a>',
275
276 '<a name=abc>foo[bar]baz</a>',
277 '<a name=abc><b>foo[bar]baz</b></a>',
278
279 ['', 'foo[bar]baz'],
280 ],
281 //@}
282 // Opera requires this to be quoted, contrary to ES5 11.1.5 which allows
283 // PropertyName to be any IdentifierName, and see 7.6 which defines
284 // IdentifierName to include ReservedWord; Identifier excludes it.
285 "delete": [
286 //@{
287 // Collapsed selection
288 //
289 // These three commented-out test call Firefox 5.0a2 to blow up, not
290 // just throwing exceptions on the tests themselves but on many
291 // subsequent tests too.
292 //'[]foo',
293 //'<span>[]foo</span>',
294 //'<p>[]foo</p>',
295 'foo[]bar',
296 '<span>foo</span>{}<span>bar</span>',
297 '<span>foo[</span><span>]bar</span>',
298 'foo<span style=display:none>bar</span>[]baz',
299 'foo<script>bar</script>[]baz',
300
301 'fo&ouml;[]bar',
302 'foo&#x308;[]bar',
303 'foo&#x308;&#x327;[]bar',
304 '&ouml;[]bar',
305 'o&#x308;[]bar',
306 'o&#x308;&#x327;[]bar',
307
308 '&#x5e9;&#x5c1;&#x5b8;[]&#x5dc;&#x5d5;&#x5b9;&#x5dd;',
309 '&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;[]&#x5dd;',
310
311 '<p>foo</p><p>[]bar</p>',
312 '<p>foo</p>[]bar',
313 'foo<p>[]bar</p>',
314 '<p>foo<br></p><p>[]bar</p>',
315 '<p>foo<br></p>[]bar',
316 'foo<br><p>[]bar</p>',
317 '<p>foo<br><br></p><p>[]bar</p>',
318 '<p>foo<br><br></p>[]bar',
319 'foo<br><br><p>[]bar</p>',
320
321 '<div><p>foo</p></div><p>[]bar</p>',
322 '<p>foo</p><div><p>[]bar</p></div>',
323 '<div><p>foo</p></div><div><p>[]bar</p></div>',
324 '<div><p>foo</p></div>[]bar',
325 'foo<div><p>[]bar</p></div>',
326
327 '<div>foo</div><div>[]bar</div>',
328 '<pre>foo</pre>[]bar',
329
330 'foo<br>[]bar',
331 'foo<br><b>[]bar</b>',
332 'foo<hr>[]bar',
333 '<p>foo<hr><p>[]bar',
334 '<p>foo</p><br><p>[]bar</p>',
335 '<p>foo</p><br><br><p>[]bar</p>',
336 '<p>foo</p><img src=/img/lion.svg><p>[]bar',
337 'foo<img src=/img/lion.svg>[]bar',
338
339 '<a>foo</a>[]bar',
340 '<a href=/>foo</a>[]bar',
341 '<a name=abc>foo</a>[]bar',
342 '<a href=/ name=abc>foo</a>[]bar',
343 '<span><a>foo</a></span>[]bar',
344 '<span><a href=/>foo</a></span>[]bar',
345 '<span><a name=abc>foo</a></span>[]bar',
346 '<span><a href=/ name=abc>foo</a></span>[]bar',
347 'foo<a>[]bar</a>',
348 'foo<a href=/>[]bar</a>',
349 'foo<a name=abc>[]bar</a>',
350 'foo<a href=/ name=abc>[]bar</a>',
351
352 'foo &nbsp;[]',
353 '&nbsp;[] foo',
354 'foo &nbsp;[]bar',
355 'foo&nbsp; []bar',
356 'foo&nbsp;&nbsp;[]bar',
357 'foo []bar',
358 'foo []&nbsp; bar',
359 'foo &nbsp;[] bar',
360 'foo &nbsp; []bar',
361 'foo []<span>&nbsp;</span> bar',
362 'foo <span>&nbsp;</span>[] bar',
363 'foo <span>&nbsp;</span> []bar',
364 '<b>foo </b>&nbsp;[]bar',
365 '<b>foo&nbsp;</b> []bar',
366 '<b>foo&nbsp;</b>&nbsp;[]bar',
367 '<b>foo </b> []bar',
368 '<p>foo </p><p>[] bar</p>',
369
370 '<pre>foo &nbsp;[]</pre>',
371 '<pre>&nbsp;[] foo</pre>',
372 '<pre>foo &nbsp;[]bar</pre>',
373 '<pre>foo&nbsp; []bar</pre>',
374 '<pre>foo []bar</pre>',
375
376 '<div style=white-space:pre>foo &nbsp;[]</div>',
377 '<div style=white-space:pre>&nbsp;[] foo</div>',
378 '<div style=white-space:pre>foo &nbsp;[]bar</div>',
379 '<div style=white-space:pre>foo&nbsp; []bar</div>',
380 '<div style=white-space:pre>foo []bar</div>',
381
382 '<div style=white-space:pre-wrap>foo &nbsp;[]</div>',
383 '<div style=white-space:pre-wrap>&nbsp;[] foo</div>',
384 '<div style=white-space:pre-wrap>foo &nbsp;[]bar</div>',
385 '<div style=white-space:pre-wrap>foo&nbsp; []bar</div>',
386 '<div style=white-space:pre-wrap>foo []bar</div>',
387
388 '<div style=white-space:pre-line>foo &nbsp;[]</div>',
389 '<div style=white-space:pre-line>&nbsp;[] foo</div>',
390 '<div style=white-space:pre-line>foo &nbsp;[]bar</div>',
391 '<div style=white-space:pre-line>foo&nbsp; []bar</div>',
392 '<div style=white-space:pre-line>foo []bar</div>',
393
394 '<div style=white-space:nowrap>foo &nbsp;[]</div>',
395 '<div style=white-space:nowrap>&nbsp;[] foo</div>',
396 '<div style=white-space:nowrap>foo &nbsp;[]bar</div>',
397 '<div style=white-space:nowrap>foo&nbsp; []bar</div>',
398 '<div style=white-space:nowrap>foo []bar</div>',
399
400 // Tables with collapsed selection
401 'foo<table><tr><td>[]bar</table>baz',
402 'foo<table><tr><td>bar</table>[]baz',
403 '<p>foo<table><tr><td>[]bar</table><p>baz',
404 '<p>foo<table><tr><td>bar</table><p>[]baz',
405 '<table><tr><td>foo<td>[]bar</table>',
406 '<table><tr><td>foo<tr><td>[]bar</table>',
407
408 'foo<br><table><tr><td>[]bar</table>baz',
409 'foo<table><tr><td>bar<br></table>[]baz',
410 '<p>foo<br><table><tr><td>[]bar</table><p>baz',
411 '<p>foo<table><tr><td>bar<br></table><p>[]baz',
412 '<table><tr><td>foo<br><td>[]bar</table>',
413 '<table><tr><td>foo<br><tr><td>[]bar</table>',
414
415 'foo<br><br><table><tr><td>[]bar</table>baz',
416 'foo<table><tr><td>bar<br><br></table>[]baz',
417 '<p>foo<br><br><table><tr><td>[]bar</table><p>baz',
418 '<p>foo<table><tr><td>bar<br><br></table><p>[]baz',
419 '<table><tr><td>foo<br><br><td>[]bar</table>',
420 '<table><tr><td>foo<br><br><tr><td>[]bar</table>',
421
422 'foo<hr><table><tr><td>[]bar</table>baz',
423 'foo<table><tr><td>bar<hr></table>[]baz',
424 '<table><tr><td>foo<hr><td>[]bar</table>',
425 '<table><tr><td>foo<hr><tr><td>[]bar</table>',
426
427 // Lists with collapsed selection
428 'foo<ol><li>[]bar<li>baz</ol>',
429 'foo<br><ol><li>[]bar<li>baz</ol>',
430 'foo<br><br><ol><li>[]bar<li>baz</ol>',
431 '<ol><li>foo<li>[]bar</ol>',
432 '<ol><li>foo<br><li>[]bar</ol>',
433 '<ol><li>foo<br><br><li>[]bar</ol>',
434 '<ol><li>foo<li>[]bar<br>baz</ol>',
435 '<ol><li>foo<br>bar<li>[]baz</ol>',
436
437 '<ol><li><p>foo</p>{}bar</ol>',
438
439 '<ol><li><p>foo<li>[]bar</ol>',
440 '<ol><li>foo<li><p>[]bar</ol>',
441 '<ol><li><p>foo<li><p>[]bar</ol>',
442
443 '<ol><li>foo<ul><li>[]bar</ul></ol>',
444 'foo<ol><ol><li>[]bar</ol></ol>',
445 'foo<div><ol><li>[]bar</ol></div>',
446
447 'foo<dl><dt>[]bar<dd>baz</dl>',
448 'foo<dl><dd>[]bar</dl>',
449 '<dl><dt>foo<dd>[]bar</dl>',
450 '<dl><dt>foo<dt>[]bar<dd>baz</dl>',
451 '<dl><dt>foo<dd>bar<dd>[]baz</dl>',
452
453 '<ol><li>foo</ol>[]bar',
454 '<ol><li>foo<br></ol>[]bar',
455 '<ol><li>foo<br><br></ol>[]bar',
456 '<ol><li><br></ol>[]bar',
457 '<ol><li>foo<li><br></ol>[]bar',
458
459 '<ol><li>foo</ol><p>[]bar',
460 '<ol><li>foo<br></ol><p>[]bar',
461 '<ol><li>foo<br><br></ol><p>[]bar',
462 '<ol><li><br></ol><p>[]bar',
463 '<ol><li>foo<li><br></ol><p>[]bar',
464
465 '<ol><li>foo</ol>{}<br>',
466 '<ol><li>foo<br></ol>{}<br>',
467 '<ol><li>foo<br><br></ol>{}<br>',
468 '<ol><li><br></ol>{}<br>',
469 '<ol><li>foo<li><br></ol>{}<br>',
470
471 '<ol><li>foo</ol><p>{}<br>',
472 '<ol><li>foo<br></ol><p>{}<br>',
473 '<ol><li>foo<br><br></ol><p>{}<br>',
474 '<ol><li><br></ol><p>{}<br>',
475 '<ol><li>foo<li><br></ol><p>{}<br>',
476
477 // Indented stuff with collapsed selection
478 'foo<blockquote>[]bar</blockquote>',
479 'foo<blockquote><blockquote>[]bar</blockquote></blockquote>',
480 'foo<blockquote><div>[]bar</div></blockquote>',
481 'foo<blockquote style="color: blue">[]bar</blockquote>',
482
483 'foo<blockquote><blockquote><p>[]bar<p>baz</blockquote></blockquote>',
484 'foo<blockquote><div><p>[]bar<p>baz</div></blockquote>',
485 'foo<blockquote style="color: blue"><p>[]bar<p>baz</blockquote>',
486
487 'foo<blockquote><p><b>[]bar</b><p>baz</blockquote>',
488 'foo<blockquote><p><strong>[]bar</strong><p>baz</blockquote>',
489 'foo<blockquote><p><span>[]bar</span><p>baz</blockquote>',
490
491 'foo<blockquote><ol><li>[]bar</ol></blockquote><p>extra',
492 'foo<blockquote>bar<ol><li>[]baz</ol>quz</blockquote><p>extra',
493 'foo<blockquote><ol><li>bar</li><ol><li>[]baz</ol><li>quz</ol></blockquo te><p>extra',
494
495 // Invisible stuff with collapsed selection
496 'foo<span></span>[]bar',
497 'foo<span><span></span></span>[]bar',
498 'foo<quasit></quasit>[]bar',
499 'foo<br><span></span>[]bar',
500 '<span>foo<span></span></span>[]bar',
501 'foo<span></span><span>[]bar</span>',
502 'foo<div><div><p>[]bar</div></div>',
503 'foo<div><div><p><!--abc-->[]bar</div></div>',
504 'foo<div><div><!--abc--><p>[]bar</div></div>',
505 'foo<div><!--abc--><div><p>[]bar</div></div>',
506 'foo<!--abc--><div><div><p>[]bar</div></div>',
507 '<div><div><p>foo</div></div>[]bar',
508 '<div><div><p>foo</div></div><!--abc-->[]bar',
509 '<div><div><p>foo</div><!--abc--></div>[]bar',
510 '<div><div><p>foo</p><!--abc--></div></div>[]bar',
511 '<div><div><p>foo<!--abc--></div></div>[]bar',
512 '<div><div><p>foo</p></div></div><div><div><div>[]bar</div></div></div>' ,
513 '<div><div><p>foo<!--abc--></p></div></div><div><div><div>[]bar</div></d iv></div>',
514 '<div><div><p>foo</p><!--abc--></div></div><div><div><div>[]bar</div></d iv></div>',
515 '<div><div><p>foo</p></div><!--abc--></div><div><div><div>[]bar</div></d iv></div>',
516 '<div><div><p>foo</p></div></div><!--abc--><div><div><div>[]bar</div></d iv></div>',
517 '<div><div><p>foo</p></div></div><div><!--abc--><div><div>[]bar</div></d iv></div>',
518 '<div><div><p>foo</p></div></div><div><div><!--abc--><div>[]bar</div></d iv></div>',
519 '<div><div><p>foo</p></div></div><div><div><div><!--abc-->[]bar</div></d iv></div>',
520
521 // Styled stuff with collapsed selection
522 '<p style=color:blue>foo<p>[]bar',
523 '<p style=color:blue>foo<p style=color:brown>[]bar',
524 '<p style=color:blue>foo<p style=color:rgba(0,0,255,1)>[]bar',
525 '<p style=color:transparent>foo<p style=color:rgba(0,0,0,0)>[]bar',
526 '<p>foo<p style=color:brown>[]bar',
527 '<p><font color=blue>foo</font><p>[]bar',
528 '<p><font color=blue>foo</font><p><font color=brown>[]bar</font>',
529 '<p>foo<p><font color=brown>[]bar</font>',
530 '<p><span style=color:blue>foo</font><p>[]bar',
531 '<p><span style=color:blue>foo</font><p><span style=color:brown>[]bar</f ont>',
532 '<p>foo<p><span style=color:brown>[]bar</font>',
533
534 '<p style=background-color:aqua>foo<p>[]bar',
535 '<p style=background-color:aqua>foo<p style=background-color:tan>[]bar',
536 '<p>foo<p style=background-color:tan>[]bar',
537 '<p><span style=background-color:aqua>foo</font><p>[]bar',
538 '<p><span style=background-color:aqua>foo</font><p><span style=backgroun d-color:tan>[]bar</font>',
539 '<p>foo<p><span style=background-color:tan>[]bar</font>',
540
541 '<p style=text-decoration:underline>foo<p>[]bar',
542 '<p style=text-decoration:underline>foo<p style=text-decoration:line-thr ough>[]bar',
543 '<p>foo<p style=text-decoration:line-through>[]bar',
544 '<p><u>foo</u><p>[]bar',
545 '<p><u>foo</u><p><s>[]bar</s>',
546 '<p>foo<p><s>[]bar</s>',
547
548 '<p style=color:blue>foo</p>[]bar',
549 'foo<p style=color:brown>[]bar',
550 '<div style=color:blue><p style=color:green>foo</div>[]bar',
551 '<div style=color:blue><p style=color:green>foo</div><p style=color:brow n>[]bar',
552 '<p style=color:blue>foo<div style=color:brown><p style=color:green>[]ba r',
553
554 // Uncollapsed selection
555 'foo[bar]baz',
556 '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
557 '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
558 '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
559 '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
560 '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
561 '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
562 '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
563 '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>ba z]</span>quz',
564
565 'foo<b>[bar]</b>baz',
566 'foo<b>{bar}</b>baz',
567 'foo{<b>bar</b>}baz',
568 'foo<span>[bar]</span>baz',
569 'foo<span>{bar}</span>baz',
570 'foo{<span>bar</span>}baz',
571 '<b>foo[bar</b><i>baz]quz</i>',
572 '<p>foo</p><p>[bar]</p><p>baz</p>',
573 '<p>foo</p><p>{bar}</p><p>baz</p>',
574 '<p>foo</p><p>{bar</p>}<p>baz</p>',
575 '<p>foo</p>{<p>bar}</p><p>baz</p>',
576 '<p>foo</p>{<p>bar</p>}<p>baz</p>',
577
578 '<p>foo[bar<p>baz]quz',
579 '<p>foo[bar<div>baz]quz</div>',
580 '<p>foo[bar<h1>baz]quz</h1>',
581 '<div>foo[bar</div><p>baz]quz',
582 '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',
583
584 '<p><b>foo[bar</b><p>baz]quz',
585 '<div><p>foo[bar</div><p>baz]quz',
586 '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
587 '<p>foo[bar<p style=color:blue>baz]quz',
588 '<p>foo[bar<p><b>baz]quz</b>',
589
590 '<div><p>foo<p>[bar<p>baz]</div>',
591
592 'foo[<br>]bar',
593 '<p>foo[</p><p>]bar</p>',
594 '<p>foo[</p><p>]bar<br>baz</p>',
595 'foo[<p>]bar</p>',
596 'foo{<p>}bar</p>',
597 'foo[<p>]bar<br>baz</p>',
598 'foo[<p>]bar</p>baz',
599 'foo{<p>bar</p>}baz',
600 'foo<p>{bar</p>}baz',
601 'foo{<p>bar}</p>baz',
602 '<p>foo[</p>]bar',
603 '<p>foo{</p>}bar',
604 '<p>foo[</p>]bar<br>baz',
605 '<p>foo[</p>]bar<p>baz</p>',
606 'foo[<div><p>]bar</div>',
607 '<div><p>foo[</p></div>]bar',
608 'foo[<div><p>]bar</p>baz</div>',
609 'foo[<div>]bar<p>baz</p></div>',
610 '<div><p>foo</p>bar[</div>]baz',
611 '<div>foo<p>bar[</p></div>]baz',
612
613 '<p>foo<br>{</p>]bar',
614 '<p>foo<br><br>{</p>]bar',
615 'foo<br>{<p>]bar</p>',
616 'foo<br><br>{<p>]bar</p>',
617 '<p>foo<br>{</p><p>}bar</p>',
618 '<p>foo<br><br>{</p><p>}bar</p>',
619
620 '<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</tab le>',
621 '<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</tab le>',
622 '<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</tab le>',
623 '<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</tab le>',
624 '<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</tab le>',
625 '<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</tab le>',
626 '{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</tabl e>}',
627 '<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz< /table>',
628 '<p>fo[o<table><tr><td>b]ar</table><p>baz',
629 '<p>foo<table><tr><td>ba[r</table><p>b]az',
630 '<p>fo[o<table><tr><td>bar</table><p>b]az',
631
632 '<p>foo<ol><li>ba[r<li>b]az</ol><p>quz',
633 '<p>foo<ol><li>bar<li>[baz]</ol><p>quz',
634 '<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz',
635 '<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz',
636 '<p>fo[o<ol><li>bar<li>b]az</ol><p>quz',
637 '<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz',
638
639 '<ol><li>fo[o</ol><ol><li>b]ar</ol>',
640 '<ol><li>fo[o</ol><ul><li>b]ar</ul>',
641
642 'foo[<ol><li>]bar</ol>',
643 '<ol><li>foo[<li>]bar</ol>',
644 'foo[<dl><dt>]bar<dd>baz</dl>',
645 'foo[<dl><dd>]bar</dl>',
646 '<dl><dt>foo[<dd>]bar</dl>',
647 '<dl><dt>foo[<dt>]bar<dd>baz</dl>',
648 '<dl><dt>foo<dd>bar[<dd>]baz</dl>',
649
650 '<b>foo [&nbsp;</b>bar]',
651 'foo<b> [&nbsp;bar]</b>',
652 '<b>[foo&nbsp;] </b>bar',
653 '[foo<b>&nbsp;] bar</b>',
654
655 // Do we merge based on element names or the display property?
656 '<p style=display:inline>fo[o<p style=display:inline>b]ar',
657 '<span style=display:block>fo[o</span><span style=display:block>b]ar</sp an>',
658 '<span style=display:inline-block>fo[o</span><span style=display:inline- block>b]ar</span>',
659 '<span style=display:inline-table>fo[o</span><span style=display:inline- table>b]ar</span>',
660 '<span style=display:none>fo[o</span><span style=display:none>b]ar</span >',
661 '<quasit style=display:block>fo[o</quasit><quasit style=display:block>b] ar</quasit>',
662
663 // https://bugs.webkit.org/show_bug.cgi?id=35281
664 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13976
665 '<ol><li>foo</ol>{}<br><ol><li>bar</ol>',
666 '<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>',
667 '<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>',
668 '<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>',
669 '<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
670 '<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
671 '<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>',
672 // Broken test: http://www.w3.org/Bugs/Public/show_bug.cgi?id=14727
673 '!<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>',
674 '<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>',
675 '<ol><li>foo[</ol>bar]<ol><li>baz</ol>',
676 '<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>',
677 '<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>',
678 '<ol><li>foo[]</ol><ol><li>bar</ol>',
679 '<ol><li>foo</ol>[bar<ol><li>]baz</ol>',
680 '<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>',
681 '<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>',
682 '<ol><li>foo</ol><ol><li>b[]ar</ol>',
683 '<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>',
684 '<ul><li>foo</ul>{}<br><ul><li>bar</ul>',
685 '<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>',
686 '<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>',
687 '<ol><li>foo</ol>{}<br><ul><li>bar</ul>',
688 '<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>',
689 '<ul><li>foo</ul>{}<br><ol><li>bar</ol>',
690 '<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>',
691
692 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13831
693 '<p><b>[foo]</b>',
694 '<p><quasit>[foo]</quasit>',
695 '<p><b><i>[foo]</i></b>',
696 '<p><b>{foo}</b>',
697 '<p>{<b>foo</b>}',
698 '<p><b>f[]</b>',
699 '<b>[foo]</b>',
700 '<div><b>[foo]</b></div>',
701 ],
702 //@}
703 fontname: [
704 //@{
705 'foo[]bar',
706 '<p>[foo</p> <p>bar]</p>',
707 '<span>[foo</span> <span>bar]</span>',
708 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
709 '<p>[foo<p><br><p>bar]',
710 '<b>foo[]bar</b>',
711 '<i>foo[]bar</i>',
712 '<span>foo</span>{}<span>bar</span>',
713 '<span>foo[</span><span>]bar</span>',
714 'foo[bar]baz',
715 'foo[bar<b>baz]qoz</b>quz',
716 'foo[bar<i>baz]qoz</i>quz',
717 '{<p><p> <p>foo</p>}',
718
719 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
720 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> ',
721 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> ',
722 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> ',
723 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> ',
724 '{<table><tr><td>foo<td>bar<td>baz</table>}',
725
726 'foo<code>[bar]</code>baz',
727 'foo<kbd>[bar]</kbd>baz',
728 'foo<listing>[bar]</listing>baz',
729 'foo<pre>[bar]</pre>baz',
730 'foo<samp>[bar]</samp>baz',
731 'foo<tt>[bar]</tt>baz',
732
733 'foo<code>b[a]r</code>baz',
734 'foo<kbd>b[a]r</kbd>baz',
735 'foo<listing>b[a]r</listing>baz',
736 'foo<pre>b[a]r</pre>baz',
737 'foo<samp>b[a]r</samp>baz',
738 'foo<tt>b[a]r</tt>baz',
739
740 '[foo<code>bar</code>baz]',
741 '[foo<kbd>bar</kbd>baz]',
742 '[foo<listing>bar</listing>baz]',
743 '[foo<pre>bar</pre>baz]',
744 '[foo<samp>bar</samp>baz]',
745 '[foo<tt>bar</tt>baz]',
746
747 '[foo<code>ba]r</code>baz',
748 '[foo<kbd>ba]r</kbd>baz',
749 '[foo<listing>ba]r</listing>baz',
750 '[foo<pre>ba]r</pre>baz',
751 '[foo<samp>ba]r</samp>baz',
752 '[foo<tt>ba]r</tt>baz',
753
754 'foo<code>b[ar</code>baz]',
755 'foo<kbd>b[ar</kbd>baz]',
756 'foo<listing>b[ar</listing>baz]',
757 'foo<pre>b[ar</pre>baz]',
758 'foo<samp>b[ar</samp>baz]',
759 'foo<tt>b[ar</tt>baz]',
760
761 'foo<span style="font-family: sans-serif">[bar]</span>baz',
762 'foo<span style="font-family: sans-serif">b[a]r</span>baz',
763 'foo<span style="font-family: monospace">[bar]</span>baz',
764 'foo<span style="font-family: monospace">b[a]r</span>baz',
765
766 'foo<tt contenteditable=false>ba[r</tt>b]az',
767 'fo[o<tt contenteditable=false>b]ar</tt>baz',
768 'foo<tt>{}<br></tt>bar',
769 'foo<tt>{<br></tt>}bar',
770 'foo<tt>{<br></tt>b]ar',
771
772 // Tests for queryCommandIndeterm() and queryCommandState()
773 'fo[o<span style=font-family:monospace>b]ar</span>baz',
774 'foo<span style=font-family:monospace>ba[r</span>b]az',
775 'fo[o<span style=font-family:monospace>bar</span>b]az',
776 'foo[<span style=font-family:monospace>b]ar</span>baz',
777 'foo<span style=font-family:monospace>ba[r</span>]baz',
778 'foo[<span style=font-family:monospace>bar</span>]baz',
779 'foo<span style=font-family:monospace>[bar]</span>baz',
780 'foo{<span style=font-family:monospace>bar</span>}baz',
781 'fo[o<code>b]ar</code>',
782 'fo[o<kbd>b]ar</kbd>',
783 'fo[o<listing>b]ar</listing>',
784 'fo[o<pre>b]ar</pre>',
785 'fo[o<samp>b]ar</samp>',
786 'fo[o<tt>b]ar</tt>',
787 '<tt>fo[o</tt><code>b]ar</code>',
788 '<pre>fo[o</pre><samp>b]ar</samp>',
789 '<span style=font-family:monospace>fo[o</span><kbd>b]ar</kbd>',
790 ],
791 //@}
792 fontsize: [
793 //@{
794 'foo[]bar',
795 '<p>[foo</p> <p>bar]</p>',
796 '<span>[foo</span> <span>bar]</span>',
797 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
798 '<p>[foo<p><br><p>bar]',
799 '<b>foo[]bar</b>',
800 '<i>foo[]bar</i>',
801 '<span>foo</span>{}<span>bar</span>',
802 '<span>foo[</span><span>]bar</span>',
803 'foo[bar]baz',
804 'foo[bar<b>baz]qoz</b>quz',
805 'foo[bar<i>baz]qoz</i>quz',
806 '{<p><p> <p>foo</p>}',
807
808 ["1", 'foo[bar]baz'],
809 ["0", 'foo[bar]baz'],
810 ["-5", 'foo[bar]baz'],
811 ["6", 'foo[bar]baz'],
812 ["7", 'foo[bar]baz'],
813 ["8", 'foo[bar]baz'],
814 ["100", 'foo[bar]baz'],
815 ["2em", 'foo[bar]baz'],
816 ["20pt", 'foo[bar]baz'],
817 ["xx-large", 'foo[bar]baz'],
818 [" 1 ", 'foo[bar]baz'],
819 ["1.", 'foo[bar]baz'],
820 ["1.0", 'foo[bar]baz'],
821 ["1.0e2", 'foo[bar]baz'],
822 ["1.1", 'foo[bar]baz'],
823 ["1.9", 'foo[bar]baz'],
824 ["+0", 'foo[bar]baz'],
825 ["+1", 'foo[bar]baz'],
826 ["+9", 'foo[bar]baz'],
827 ["-0", 'foo[bar]baz'],
828 ["-1", 'foo[bar]baz'],
829 ["-9", 'foo[bar]baz'],
830 ["", 'foo[bar]baz'],
831
832 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
833 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> ',
834 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> ',
835 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> ',
836 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> ',
837 '{<table><tr><td>foo<td>bar<td>baz</table>}',
838
839 'foo<font size=1>[bar]</font>baz',
840 '<font size=1>foo[bar]baz</font>',
841 'foo<font size=3>[bar]</font>baz',
842 '<font size=3>foo[bar]baz</font>',
843 'foo<font size=4>[bar]</font>baz',
844 '<font size=4>foo[bar]baz</font>',
845 'foo<font size=+1>[bar]</font>baz',
846 '<font size=+1>foo[bar]baz</font>',
847 '<font size=4>foo<font size=1>b[a]r</font>baz</font>',
848
849 'foo<span style="font-size: xx-small">[bar]</span>baz',
850 '<span style="font-size: xx-small">foo[bar]baz</span>',
851 'foo<span style="font-size: medium">[bar]</span>baz',
852 '<span style="font-size: medium">foo[bar]baz</span>',
853 'foo<span style="font-size: large">[bar]</span>baz',
854 '<span style="font-size: large">foo[bar]baz</span>',
855 '<span style="font-size: large">foo<span style="font-size: xx-small">b[a ]r</span>baz</span>',
856
857 'foo<span style="font-size: 2em">[bar]</span>baz',
858 '<span style="font-size: 2em">foo[bar]baz</span>',
859
860 '<p style="font-size: xx-small">foo[bar]baz</p>',
861 '<p style="font-size: medium">foo[bar]baz</p>',
862 '<p style="font-size: large">foo[bar]baz</p>',
863 '<p style="font-size: 2em">foo[bar]baz</p>',
864
865 ["3", '<p style="font-size: xx-small">foo[bar]baz</p>'],
866 ["3", '<p style="font-size: medium">foo[bar]baz</p>'],
867 ["3", '<p style="font-size: large">foo[bar]baz</p>'],
868 ["3", '<p style="font-size: 2em">foo[bar]baz</p>'],
869
870 // Minor algorithm bug: this changes the size of the "b" and "r" in
871 // "bar" when we pull down styles
872 ["3", '<font size=6>foo <span style="font-size: 2em">b[a]r</span> baz</f ont>'],
873
874 ["3", 'foo<big>[bar]</big>baz'],
875 ["3", 'foo<big>b[a]r</big>baz'],
876 ["3", 'foo<small>[bar]</small>baz'],
877 ["3", 'foo<small>b[a]r</small>baz'],
878
879 // Tests for queryCommandIndeterm() and queryCommandState()
880 'fo[o<font size=2>b]ar</font>baz',
881 'foo<font size=2>ba[r</font>b]az',
882 'fo[o<font size=2>bar</font>b]az',
883 'foo[<font size=2>b]ar</font>baz',
884 'foo<font size=2>ba[r</font>]baz',
885 'foo[<font size=2>bar</font>]baz',
886 'foo<font size=2>[bar]</font>baz',
887 'foo{<font size=2>bar</font>}baz',
888 '<font size=1>fo[o</font><span style=font-size:xx-small>b]ar</span>',
889 '<font size=2>fo[o</font><span style=font-size:small>b]ar</span>',
890 '<font size=3>fo[o</font><span style=font-size:medium>b]ar</span>',
891 '<font size=4>fo[o</font><span style=font-size:large>b]ar</span>',
892 '<font size=5>fo[o</font><span style=font-size:x-large>b]ar</span>',
893 '<font size=6>fo[o</font><span style=font-size:xx-large>b]ar</span>',
894
895 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13829
896 ["!6", '<span style=background-color:aqua>[foo]</span>'],
897 ["!6", '<span style=background-color:aqua>foo[bar]baz</span>'],
898 ["!6", '[foo<span style=background-color:aqua>bar</span>baz]'],
899 ],
900 //@}
901 forecolor: [
902 //@{
903 'foo[]bar',
904 '<p>[foo</p> <p>bar]</p>',
905 '<span>[foo</span> <span>bar]</span>',
906 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
907 '<p>[foo<p><br><p>bar]',
908 '<b>foo[]bar</b>',
909 '<i>foo[]bar</i>',
910 '<span>foo</span>{}<span>bar</span>',
911 '<span>foo[</span><span>]bar</span>',
912 'foo[bar]baz',
913 'foo[bar<b>baz]qoz</b>quz',
914 'foo[bar<i>baz]qoz</i>quz',
915 '{<p><p> <p>foo</p>}',
916
917 ['blue', 'foo[bar]baz'],
918 ['f', 'foo[bar]baz'],
919 ['#f', 'foo[bar]baz'],
920 ['00f', 'foo[bar]baz'],
921 ['#00f', 'foo[bar]baz'],
922 ['0000ff', 'foo[bar]baz'],
923 ['#0000ff', 'foo[bar]baz'],
924 ['000000fff', 'foo[bar]baz'],
925 ['#000000fff', 'foo[bar]baz'],
926 ['rgb(0, 0, 255)', 'foo[bar]baz'],
927 ['rgb(0%, 0%, 100%)', 'foo[bar]baz'],
928 ['rgb( 0 ,0 ,255)', 'foo[bar]baz'],
929 ['rgba(0, 0, 255, 0.0)', 'foo[bar]baz'],
930 ['rgb(15, -10, 375)', 'foo[bar]baz'],
931 ['rgba(0, 0, 0, 1)', 'foo[bar]baz'],
932 ['rgba(255, 255, 255, 1)', 'foo[bar]baz'],
933 ['rgba(0, 0, 255, 0.5)', 'foo[bar]baz'],
934 ['hsl(240, 100%, 50%)', 'foo[bar]baz'],
935 ['cornsilk', 'foo[bar]baz'],
936 ['potato quiche', 'foo[bar]baz'],
937 ['transparent', 'foo[bar]baz'],
938 ['currentColor', 'foo[bar]baz'],
939
940 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
941 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> ',
942 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> ',
943 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> ',
944 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> ',
945 '{<table><tr><td>foo<td>bar<td>baz</table>}',
946
947 'foo<font color=blue>[bar]</font>baz',
948 'foo{<font color=blue>bar</font>}baz',
949 '<span style="color: blue">foo<span style="color: brown">[bar]</span>baz </span>',
950 '<span style="color: #00f">foo<span style="color: brown">[bar]</span>baz </span>',
951 '<span style="color: #0000ff">foo<span style="color: brown">[bar]</span> baz</span>',
952 '<span style="color: rgb(0, 0, 255)">foo<span style="color: brown">[bar] </span>baz</span>',
953 '<font color=blue>foo<font color=brown>[bar]</font>baz</font>',
954 '<span style="color: rgb(0, 0, 255)">foo<span style="color: brown">b[ar] </span>baz</span>',
955 'foo<span id=purple>ba[r</span>ba]z',
956 '<span style="color: rgb(0, 0, 255)">foo<span id=purple>b[a]r</span>baz< /span>',
957
958 ['blue', '<a href=http://www.google.com>foo[bar]baz</a>'],
959 ['#0000ff', '<a href=http://www.google.com>foo[bar]baz</a>'],
960 ['rgb(0,0,255)', '<a href=http://www.google.com>foo[bar]baz</a>'],
961
962 // Tests for queryCommandValue()
963 '<font color="blue">[foo]</font>',
964 '<font color="0000ff">[foo]</font>',
965 '<font color="#0000ff">[foo]</font>',
966 '<span style="color: blue">[foo]</span>',
967 '<span style="color: #0000ff">[foo]</span>',
968 '<span style="color: rgb(0, 0, 255)">[foo]</span>',
969 '<span style="color: rgb(0%, 0%, 100%)">[foo]</span>',
970 '<span style="color: rgb( 0 ,0 ,255)">[foo]</span>',
971 '<span style="color: rgba(0, 0, 255, 0.0)">[foo]</span>',
972 '<span style="color: rgb(15, -10, 375)">[foo]</span>',
973 '<span style="color: rgba(0, 0, 0, 1)">[foo]</span>',
974 '<span style="color: rgba(255, 255, 255, 1)">[foo]</span>',
975 '<span style="color: rgba(0, 0, 255, 0.5)">[foo]</span>',
976 '<span style="color: hsl(240, 100%, 50%)">[foo]</span>',
977 '<span style="color: cornsilk">[foo]</span>',
978 '<span style="color: transparent">[foo]</span>',
979 '<span style="color: currentColor">[foo]</span>',
980
981 // Tests for queryCommandIndeterm() and queryCommandState()
982 'fo[o<font color=brown>b]ar</font>baz',
983 'foo<font color=brown>ba[r</font>b]az',
984 'fo[o<font color=brown>bar</font>b]az',
985 'foo[<font color=brown>b]ar</font>baz',
986 'foo<font color=brown>ba[r</font>]baz',
987 'foo[<font color=brown>bar</font>]baz',
988 'foo<font color=brown>[bar]</font>baz',
989 'foo{<font color=brown>bar</font>}baz',
990 '<font color=brown>fo[o</font><span style=color:brown>b]ar</span>',
991 '<span style=color:brown>fo[o</span><span style=color:#0000ff>b]ar</span >',
992 ],
993 //@}
994 formatblock: [
995 //@{
996 'foo[]bar<p>extra',
997 '<span>foo</span>{}<span>bar</span><p>extra',
998 '<span>foo[</span><span>]bar</span><p>extra',
999 'foo[bar]baz<p>extra',
1000 'foo]bar[baz<p>extra',
1001 '{<p><p> <p>foo</p>}',
1002 'foo[bar<i>baz]qoz</i>quz<p>extra',
1003
1004 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
1005 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> ',
1006 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> ',
1007 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> ',
1008 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> ',
1009 '{<table><tr><td>foo<td>bar<td>baz</table>}',
1010
1011 '<div>[foobar]</div>',
1012 '<p>[foobar]</p>',
1013 '<blockquote>[foobar]</blockquote>',
1014 '<h1>[foobar]</h1>',
1015 '<h2>[foobar]</h2>',
1016 '<h3>[foobar]</h3>',
1017 '<h4>[foobar]</h4>',
1018 '<h5>[foobar]</h5>',
1019 '<h6>[foobar]</h6>',
1020 '<dl><dt>[foo]<dd>bar</dl>',
1021 '<dl><dt>foo<dd>[bar]</dl>',
1022 '<dl><dt>[foo<dd>bar]</dl>',
1023 '<ol><li>[foobar]</ol>',
1024 '<ul><li>[foobar]</ul>',
1025 '<address>[foobar]</address>',
1026 '<pre>[foobar]</pre>',
1027 '<article>[foobar]</article>',
1028 '<ins>[foobar]</ins>',
1029 '<del>[foobar]</del>',
1030 '<quasit>[foobar]</quasit>',
1031 '<quasit style="display: block">[foobar]</quasit>',
1032
1033 ['<p>', 'foo[]bar<p>extra'],
1034 ['<p>', '<span>foo</span>{}<span>bar</span><p>extra'],
1035 ['<p>', '<span>foo[</span><span>]bar</span><p>extra'],
1036 ['<p>', 'foo[bar]baz<p>extra'],
1037 ['<p>', 'foo]bar[baz<p>extra'],
1038 ['<p>', '{<p><p> <p>foo</p>}'],
1039 ['<p>', 'foo[bar<i>baz]qoz</i>quz<p>extra'],
1040
1041 ['<p>', '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>'],
1042 ['<p>', '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz </table>'],
1043 ['<p>', '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz </table>'],
1044 ['<p>', '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz </table>'],
1045 ['<p>', '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz </table>'],
1046 ['<p>', '{<table><tr><td>foo<td>bar<td>baz</table>}'],
1047
1048 ['<p>', '<div>[foobar]</div>'],
1049 ['<p>', '<p>[foobar]</p>'],
1050 ['<p>', '<blockquote>[foobar]</blockquote>'],
1051 ['<p>', '<h1>[foobar]</h1>'],
1052 ['<p>', '<h2>[foobar]</h2>'],
1053 ['<p>', '<h3>[foobar]</h3>'],
1054 ['<p>', '<h4>[foobar]</h4>'],
1055 ['<p>', '<h5>[foobar]</h5>'],
1056 ['<p>', '<h6>[foobar]</h6>'],
1057 ['<p>', '<dl><dt>[foo]<dd>bar</dl>'],
1058 ['<p>', '<dl><dt>foo<dd>[bar]</dl>'],
1059 ['<p>', '<dl><dt>[foo<dd>bar]</dl>'],
1060 ['<p>', '<ol><li>[foobar]</ol>'],
1061 ['<p>', '<ul><li>[foobar]</ul>'],
1062 ['<p>', '<address>[foobar]</address>'],
1063 ['<p>', '<pre>[foobar]</pre>'],
1064 ['<p>', '<listing>[foobar]</listing>'],
1065 ['<p>', '<xmp>[foobar]</xmp>'],
1066 ['<p>', '<article>[foobar]</article>'],
1067 ['<p>', '<ins>[foobar]</ins>'],
1068 ['<p>', '<del>[foobar]</del>'],
1069 ['<p>', '<quasit>[foobar]</quasit>'],
1070 ['<p>', '<quasit style="display: block">[foobar]</quasit>'],
1071
1072 ['<blockquote>', '<blockquote>[foo]</blockquote><p>extra'],
1073 ['<blockquote>', '<blockquote><p>[foo]<p>bar</blockquote><p>extra'],
1074 ['<blockquote>', '[foo]<blockquote>bar</blockquote><p>extra'],
1075 ['<blockquote>', '<p>[foo<p>bar]<p>baz'],
1076 ['<blockquote>', '<section>[foo]</section>'],
1077 ['<blockquote>', '<section><p>[foo]</section>'],
1078 ['<blockquote>', '<section><hgroup><h1>[foo]</h1><h2>bar</h2></hgroup><p >baz</section>'],
1079 ['<article>', '<section>[foo]</section>'],
1080
1081 ['<address>', '<div>[foobar]</div>'],
1082 ['<article>', '<div>[foobar]</div>'],
1083 ['<blockquote>', '<div>[foobar]</div>'],
1084 ['<dd>', '<div>[foobar]</div>'],
1085 ['<del>', '<div>[foobar]</div>'],
1086 ['<dl>', '<div>[foobar]</div>'],
1087 ['<dt>', '<div>[foobar]</div>'],
1088 ['<h1>', '<div>[foobar]</div>'],
1089 ['<h2>', '<div>[foobar]</div>'],
1090 ['<h3>', '<div>[foobar]</div>'],
1091 ['<h4>', '<div>[foobar]</div>'],
1092 ['<h5>', '<div>[foobar]</div>'],
1093 ['<h6>', '<div>[foobar]</div>'],
1094 ['<ins>', '<div>[foobar]</div>'],
1095 ['<li>', '<div>[foobar]</div>'],
1096 ['<ol>', '<div>[foobar]</div>'],
1097 ['<pre>', '<div>[foobar]</div>'],
1098 ['<ul>', '<div>[foobar]</div>'],
1099 ['<quasit>', '<div>[foobar]</div>'],
1100
1101 ['<address>', '<p>[foobar]</p>'],
1102 ['<article>', '<p>[foobar]</p>'],
1103 ['<aside>', '<p>[foobar]</p>'],
1104 ['<blockquote>', '<p>[foobar]</p>'],
1105 ['<body>', '<p>[foobar]</p>'],
1106 ['<dd>', '<p>[foobar]</p>'],
1107 ['<del>', '<p>[foobar]</p>'],
1108 ['<details>', '<p>[foobar]</p>'],
1109 ['<dir>', '<p>[foobar]</p>'],
1110 ['<dl>', '<p>[foobar]</p>'],
1111 ['<dt>', '<p>[foobar]</p>'],
1112 ['<fieldset>', '<p>[foobar]</p>'],
1113 ['<figcaption>', '<p>[foobar]</p>'],
1114 ['<figure>', '<p>[foobar]</p>'],
1115 ['<footer>', '<p>[foobar]</p>'],
1116 ['<form>', '<p>[foobar]</p>'],
1117 ['<h1>', '<p>[foobar]</p>'],
1118 ['<h2>', '<p>[foobar]</p>'],
1119 ['<h3>', '<p>[foobar]</p>'],
1120 ['<h4>', '<p>[foobar]</p>'],
1121 ['<h5>', '<p>[foobar]</p>'],
1122 ['<h6>', '<p>[foobar]</p>'],
1123 ['<header>', '<p>[foobar]</p>'],
1124 ['<head>', '<p>[foobar]</p>'],
1125 ['<hgroup>', '<p>[foobar]</p>'],
1126 ['<hr>', '<p>[foobar]</p>'],
1127 ['<html>', '<p>[foobar]</p>'],
1128 ['<ins>', '<p>[foobar]</p>'],
1129 ['<li>', '<p>[foobar]</p>'],
1130 ['<listing>', '<p>[foobar]</p>'],
1131 ['<menu>', '<p>[foobar]</p>'],
1132 ['<nav>', '<p>[foobar]</p>'],
1133 ['<ol>', '<p>[foobar]</p>'],
1134 ['<plaintext>', '<p>[foobar]</p>'],
1135 ['<pre>', '<p>[foobar]</p>'],
1136 ['<section>', '<p>[foobar]</p>'],
1137 ['<ul>', '<p>[foobar]</p>'],
1138 ['<xmp>', '<p>[foobar]</p>'],
1139 ['<quasit>', '<p>[foobar]</p>'],
1140
1141 ['<address>', '<p>[foo<p>bar]'],
1142 ['<article>', '<p>[foo<p>bar]'],
1143 ['<aside>', '<p>[foo<p>bar]'],
1144 ['<blockquote>', '<p>[foo<p>bar]'],
1145 ['<body>', '<p>[foo<p>bar]'],
1146 ['<dd>', '<p>[foo<p>bar]'],
1147 ['<del>', '<p>[foo<p>bar]'],
1148 ['<details>', '<p>[foo<p>bar]'],
1149 ['<dir>', '<p>[foo<p>bar]'],
1150 ['<div>', '<p>[foo<p>bar]'],
1151 ['<dl>', '<p>[foo<p>bar]'],
1152 ['<dt>', '<p>[foo<p>bar]'],
1153 ['<fieldset>', '<p>[foo<p>bar]'],
1154 ['<figcaption>', '<p>[foo<p>bar]'],
1155 ['<figure>', '<p>[foo<p>bar]'],
1156 ['<footer>', '<p>[foo<p>bar]'],
1157 ['<form>', '<p>[foo<p>bar]'],
1158 ['<h1>', '<p>[foo<p>bar]'],
1159 ['<h2>', '<p>[foo<p>bar]'],
1160 ['<h3>', '<p>[foo<p>bar]'],
1161 ['<h4>', '<p>[foo<p>bar]'],
1162 ['<h5>', '<p>[foo<p>bar]'],
1163 ['<h6>', '<p>[foo<p>bar]'],
1164 ['<header>', '<p>[foo<p>bar]'],
1165 ['<head>', '<p>[foo<p>bar]'],
1166 ['<hgroup>', '<p>[foo<p>bar]'],
1167 ['<hr>', '<p>[foo<p>bar]'],
1168 ['<html>', '<p>[foo<p>bar]'],
1169 ['<ins>', '<p>[foo<p>bar]'],
1170 ['<li>', '<p>[foo<p>bar]'],
1171 ['<listing>', '<p>[foo<p>bar]'],
1172 ['<menu>', '<p>[foo<p>bar]'],
1173 ['<nav>', '<p>[foo<p>bar]'],
1174 ['<ol>', '<p>[foo<p>bar]'],
1175 ['<p>', '<p>[foo<p>bar]'],
1176 ['<plaintext>', '<p>[foo<p>bar]'],
1177 ['<pre>', '<p>[foo<p>bar]'],
1178 ['<section>', '<p>[foo<p>bar]'],
1179 ['<ul>', '<p>[foo<p>bar]'],
1180 ['<xmp>', '<p>[foo<p>bar]'],
1181 ['<quasit>', '<p>[foo<p>bar]'],
1182
1183 ['p', '<div>[foobar]</div>'],
1184
1185 '<ol><li>[foo]<li>bar</ol>',
1186
1187 ['<p>', '<h1>[foo]<br>bar</h1>'],
1188 ['<p>', '<h1>foo<br>[bar]</h1>'],
1189 ['<p>', '<h1>[foo<br>bar]</h1>'],
1190 ['<address>', '<h1>[foo]<br>bar</h1>'],
1191 ['<address>', '<h1>foo<br>[bar]</h1>'],
1192 ['<address>', '<h1>[foo<br>bar]</h1>'],
1193 ['<pre>', '<h1>[foo]<br>bar</h1>'],
1194 ['<pre>', '<h1>foo<br>[bar]</h1>'],
1195 ['<pre>', '<h1>[foo<br>bar]</h1>'],
1196 ['<h2>', '<h1>[foo]<br>bar</h1>'],
1197 ['<h2>', '<h1>foo<br>[bar]</h1>'],
1198 ['<h2>', '<h1>[foo<br>bar]</h1>'],
1199
1200 ['<h1>', '<p>[foo]<br>bar</p>'],
1201 ['<h1>', '<p>foo<br>[bar]</p>'],
1202 ['<h1>', '<p>[foo<br>bar]</p>'],
1203 ['<address>', '<p>[foo]<br>bar</p>'],
1204 ['<address>', '<p>foo<br>[bar]</p>'],
1205 ['<address>', '<p>[foo<br>bar]</p>'],
1206 ['<pre>', '<p>[foo]<br>bar</p>'],
1207 ['<pre>', '<p>foo<br>[bar]</p>'],
1208 ['<pre>', '<p>[foo<br>bar]</p>'],
1209
1210 ['<p>', '<address>[foo]<br>bar</address>'],
1211 ['<p>', '<address>foo<br>[bar]</address>'],
1212 ['<p>', '<address>[foo<br>bar]</address>'],
1213 ['<pre>', '<address>[foo]<br>bar</address>'],
1214 ['<pre>', '<address>foo<br>[bar]</address>'],
1215 ['<pre>', '<address>[foo<br>bar]</address>'],
1216 ['<h1>', '<address>[foo]<br>bar</address>'],
1217 ['<h1>', '<address>foo<br>[bar]</address>'],
1218 ['<h1>', '<address>[foo<br>bar]</address>'],
1219
1220 ['<p>', '<pre>[foo]<br>bar</pre>'],
1221 ['<p>', '<pre>foo<br>[bar]</pre>'],
1222 ['<p>', '<pre>[foo<br>bar]</pre>'],
1223 ['<address>', '<pre>[foo]<br>bar</pre>'],
1224 ['<address>', '<pre>foo<br>[bar]</pre>'],
1225 ['<address>', '<pre>[foo<br>bar]</pre>'],
1226 ['<h1>', '<pre>[foo]<br>bar</pre>'],
1227 ['<h1>', '<pre>foo<br>[bar]</pre>'],
1228 ['<h1>', '<pre>[foo<br>bar]</pre>'],
1229
1230 ['<h1>', '<p>[foo</p>bar]'],
1231 ['<h1>', '[foo<p>bar]</p>'],
1232 ['<p>', '<div>[foo<p>bar]</p></div>'],
1233 ['<p>', '<xmp>[foo]</xmp>'],
1234 ['<div>', '<xmp>[foo]</xmp>'],
1235
1236 '<div><ol><li>[foo]</ol></div>',
1237 '<div><table><tr><td>[foo]</table></div>',
1238 '<p>[foo<h1>bar]</h1>',
1239 '<h1>[foo</h1><h2>bar]</h2>',
1240 '<div>[foo</div>bar]',
1241
1242 // https://bugs.webkit.org/show_bug.cgi?id=47054
1243 ['<p>', '<div style=color:blue>[foo]</div>'],
1244 // https://bugs.webkit.org/show_bug.cgi?id=47574
1245 ['<h1>', '{<p>foo</p>ba]r'],
1246 ['<pre>', '&#10;[foo<p>bar]</p>'],
1247 // From https://bugs.webkit.org/show_bug.cgi?id=47300
1248 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14009
1249 ['!<p>', '{<pre>&#10;foo&#10;&#10;bar&#10;</pre>}'],
1250 ],
1251 //@}
1252 forwarddelete: [
1253 //@{
1254 // Collapsed selection
1255 'foo[]',
1256 '<span>foo[]</span>',
1257 '<p>foo[]</p>',
1258 'foo[]bar',
1259 '<span>foo</span>{}<span>bar</span>',
1260 '<span>foo[</span><span>]bar</span>',
1261 'foo[]<span style=display:none>bar</span>baz',
1262 'foo[]<script>bar</script>baz',
1263 'fo[]&ouml;bar',
1264 'fo[]o&#x308;bar',
1265 'fo[]o&#x308;&#x327;bar',
1266 '[]&ouml;bar',
1267 '[]o&#x308;bar',
1268 '[]o&#x308;&#x327;bar',
1269
1270 '[]&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;&#x5dd;',
1271 '&#x5e9;&#x5c1;&#x5b8;&#x5dc;[]&#x5d5;&#x5b9;&#x5dd;',
1272
1273 '<p>foo[]</p><p>bar</p>',
1274 '<p>foo[]</p>bar',
1275 'foo[]<p>bar</p>',
1276 '<p>foo[]<br></p><p>bar</p>',
1277 '<p>foo[]<br></p>bar',
1278 'foo[]<br><p>bar</p>',
1279
1280 '<p>{}<br></p>foo',
1281 '<p>{}<span><br></span></p>foo',
1282 'foo{}<p><br>',
1283 'foo{}<p><span><br></span>',
1284 'foo{}<br><p><br>',
1285 'foo{}<span><br></span><p><br>',
1286 'foo{}<br><p><span><br></span>',
1287 'foo{}<span><br></span><p><span><br></span>',
1288 'foo{}<p>',
1289 '<table><tr><td>{}</table>foo',
1290 '<table><tr><td>{}<br></table>foo',
1291 '<table><tr><td>{}<span><br></span></table>foo',
1292
1293 '<div><p>foo[]</p></div><p>bar</p>',
1294 '<p>foo[]</p><div><p>bar</p></div>',
1295 '<div><p>foo[]</p></div><div><p>bar</p></div>',
1296 '<div><p>foo[]</p></div>bar',
1297 'foo[]<div><p>bar</p></div>',
1298
1299 '<div>foo[]</div><div>bar</div>',
1300 '<pre>foo[]</pre>bar',
1301
1302 'foo[]<br>bar',
1303 '<b>foo[]</b><br>bar',
1304 'foo[]<hr>bar',
1305 '<p>foo[]<hr><p>bar',
1306 '<p>foo[]</p><br><p>bar</p>',
1307 '<p>foo[]</p><br><br><p>bar</p>',
1308 '<p>foo[]</p><img src=/img/lion.svg><p>bar',
1309 'foo[]<img src=/img/lion.svg>bar',
1310
1311 'foo[]<a>bar</a>',
1312 'foo[]<a href=/>bar</a>',
1313 'foo[]<a name=abc>bar</a>',
1314 'foo[]<a href=/ name=abc>bar</a>',
1315 'foo[]<span><a>bar</a></span>',
1316 'foo[]<span><a href=/>bar</a></span>',
1317 'foo[]<span><a name=abc>bar</a></span>',
1318 'foo[]<span><a href=/ name=abc>bar</a></span>',
1319 '<a>foo[]</a>bar',
1320 '<a href=/>foo[]</a>bar',
1321 '<a name=abc>foo[]</a>bar',
1322 '<a href=/ name=abc>foo[]</a>bar',
1323
1324 'foo []&nbsp;',
1325 '[]&nbsp; foo',
1326 'foo[] &nbsp;bar',
1327 'foo[]&nbsp; bar',
1328 'foo[]&nbsp;&nbsp;bar',
1329 'foo[] bar',
1330 'foo[] &nbsp; bar',
1331 'foo []&nbsp; bar',
1332 'foo &nbsp;[] bar',
1333 'foo[] <span>&nbsp;</span> bar',
1334 'foo []<span>&nbsp;</span> bar',
1335 'foo <span>&nbsp;</span>[] bar',
1336 '<b>foo[] </b>&nbsp;bar',
1337 '<b>foo[]&nbsp;</b> bar',
1338 '<b>foo[]&nbsp;</b>&nbsp;bar',
1339 '<b>foo[] </b> bar',
1340
1341 '<pre>foo []&nbsp;</pre>',
1342 '<pre>[]&nbsp; foo</pre>',
1343 '<pre>foo[] &nbsp;bar</pre>',
1344 '<pre>foo[]&nbsp; bar</pre>',
1345 '<pre>foo[] bar</pre>',
1346
1347 '<div style=white-space:pre>foo []&nbsp;</div>',
1348 '<div style=white-space:pre>[]&nbsp; foo</div>',
1349 '<div style=white-space:pre>foo[] &nbsp;bar</div>',
1350 '<div style=white-space:pre>foo[]&nbsp; bar</div>',
1351 '<div style=white-space:pre>foo[] bar</div>',
1352
1353 '<div style=white-space:pre-wrap>foo []&nbsp;</div>',
1354 '<div style=white-space:pre-wrap>[]&nbsp; foo</div>',
1355 '<div style=white-space:pre-wrap>foo[] &nbsp;bar</div>',
1356 '<div style=white-space:pre-wrap>foo[]&nbsp; bar</div>',
1357 '<div style=white-space:pre-wrap>foo[] bar</div>',
1358
1359 '<div style=white-space:pre-line>foo []&nbsp;</div>',
1360 '<div style=white-space:pre-line>[]&nbsp; foo</div>',
1361 '<div style=white-space:pre-line>foo[] &nbsp;bar</div>',
1362 '<div style=white-space:pre-line>foo[]&nbsp; bar</div>',
1363 '<div style=white-space:pre-line>foo[] bar</div>',
1364
1365 '<div style=white-space:nowrap>foo []&nbsp;</div>',
1366 '<div style=white-space:nowrap>[]&nbsp; foo</div>',
1367 '<div style=white-space:nowrap>foo[] &nbsp;bar</div>',
1368 '<div style=white-space:nowrap>foo[]&nbsp; bar</div>',
1369 '<div style=white-space:nowrap>foo[] bar</div>',
1370
1371 // Tables with collapsed selection
1372 'foo[]<table><tr><td>bar</table>baz',
1373 'foo<table><tr><td>bar[]</table>baz',
1374 '<p>foo[]<table><tr><td>bar</table><p>baz',
1375 '<table><tr><td>foo[]<td>bar</table>',
1376 '<table><tr><td>foo[]<tr><td>bar</table>',
1377
1378 'foo[]<br><table><tr><td>bar</table>baz',
1379 'foo<table><tr><td>bar[]<br></table>baz',
1380 '<p>foo[]<br><table><tr><td>bar</table><p>baz',
1381 '<p>foo<table><tr><td>bar[]<br></table><p>baz',
1382 '<table><tr><td>foo[]<br><td>bar</table>',
1383 '<table><tr><td>foo[]<br><tr><td>bar</table>',
1384
1385 'foo<table><tr><td>bar[]</table><br>baz',
1386 'foo[]<table><tr><td><hr>bar</table>baz',
1387 '<table><tr><td>foo[]<td><hr>bar</table>',
1388 '<table><tr><td>foo[]<tr><td><hr>bar</table>',
1389
1390 // Lists with collapsed selection
1391 'foo[]<ol><li>bar<li>baz</ol>',
1392 'foo[]<br><ol><li>bar<li>baz</ol>',
1393 '<ol><li>foo[]<li>bar</ol>',
1394 '<ol><li>foo[]<br><li>bar</ol>',
1395 '<ol><li>foo[]<li>bar<br>baz</ol>',
1396
1397 '<ol><li><p>foo[]<li>bar</ol>',
1398 '<ol><li>foo[]<li><p>bar</ol>',
1399 '<ol><li><p>foo[]<li><p>bar</ol>',
1400
1401 '<ol><li>foo[]<ul><li>bar</ul></ol>',
1402 'foo[]<ol><ol><li>bar</ol></ol>',
1403 'foo[]<div><ol><li>bar</ol></div>',
1404
1405 'foo[]<dl><dt>bar<dd>baz</dl>',
1406 'foo[]<dl><dd>bar</dl>',
1407 '<dl><dt>foo[]<dd>bar</dl>',
1408 '<dl><dt>foo[]<dt>bar<dd>baz</dl>',
1409 '<dl><dt>foo<dd>bar[]<dd>baz</dl>',
1410
1411 '<ol><li>foo[]</ol>bar',
1412 '<ol><li>foo[]<br></ol>bar',
1413 '<ol><li>{}<br></ol>bar',
1414 '<ol><li>foo<li>{}<br></ol>bar',
1415
1416 '<ol><li>foo[]</ol><p>bar',
1417 '<ol><li>foo[]<br></ol><p>bar',
1418 '<ol><li>{}<br></ol><p>bar',
1419 '<ol><li>foo<li>{}<br></ol><p>bar',
1420
1421 '<ol><li>foo[]</ol><br>',
1422 '<ol><li>foo[]<br></ol><br>',
1423 '<ol><li>{}<br></ol><br>',
1424 '<ol><li>foo<li>{}<br></ol><br>',
1425
1426 '<ol><li>foo[]</ol><p><br>',
1427 '<ol><li>foo[]<br></ol><p><br>',
1428 '<ol><li>{}<br></ol><p><br>',
1429 '<ol><li>foo<li>{}<br></ol><p><br>',
1430
1431 // Indented stuff with collapsed selection
1432 'foo[]<blockquote>bar</blockquote>',
1433 'foo[]<blockquote><blockquote>bar</blockquote></blockquote>',
1434 'foo[]<blockquote><div>bar</div></blockquote>',
1435 'foo[]<blockquote style="color: blue">bar</blockquote>',
1436
1437 'foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>',
1438 'foo[]<blockquote><div><p>bar<p>baz</div></blockquote>',
1439 'foo[]<blockquote style="color: blue"><p>bar<p>baz</blockquote>',
1440
1441 'foo[]<blockquote><p><b>bar</b><p>baz</blockquote>',
1442 'foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>',
1443 'foo[]<blockquote><p><span>bar</span><p>baz</blockquote>',
1444
1445 'foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra',
1446 'foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra',
1447 'foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquo te><p>extra',
1448
1449 // Invisible stuff with collapsed selection
1450 'foo[]<span></span>bar',
1451 'foo[]<span><span></span></span>bar',
1452 'foo[]<quasit></quasit>bar',
1453 'foo[]<span></span><br>bar',
1454 '<span>foo[]<span></span></span>bar',
1455 'foo[]<span></span><span>bar</span>',
1456 'foo[]<div><div><p>bar</div></div>',
1457 'foo[]<div><div><p><!--abc-->bar</div></div>',
1458 'foo[]<div><div><!--abc--><p>bar</div></div>',
1459 'foo[]<div><!--abc--><div><p>bar</div></div>',
1460 'foo[]<!--abc--><div><div><p>bar</div></div>',
1461 '<div><div><p>foo[]</div></div>bar',
1462 '<div><div><p>foo[]</div></div><!--abc-->bar',
1463 '<div><div><p>foo[]</div><!--abc--></div>bar',
1464 '<div><div><p>foo[]</p><!--abc--></div></div>bar',
1465 '<div><div><p>foo[]<!--abc--></div></div>bar',
1466 '<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>' ,
1467 '<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></d iv></div>',
1468 '<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></d iv></div>',
1469 '<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></d iv></div>',
1470 '<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></d iv></div>',
1471 '<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></d iv></div>',
1472 '<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></d iv></div>',
1473 '<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></d iv></div>',
1474
1475 // Styled stuff with collapsed selection
1476 '<p style=color:blue>foo[]<p>bar',
1477 '<p style=color:blue>foo[]<p style=color:brown>bar',
1478 '<p>foo[]<p style=color:brown>bar',
1479 '<p><font color=blue>foo[]</font><p>bar',
1480 '<p><font color=blue>foo[]</font><p><font color=brown>bar</font>',
1481 '<p>foo[]<p><font color=brown>bar</font>',
1482 '<p><span style=color:blue>foo[]</font><p>bar',
1483 '<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</f ont>',
1484 '<p>foo[]<p><span style=color:brown>bar</font>',
1485
1486 '<p style=background-color:aqua>foo[]<p>bar',
1487 '<p style=background-color:aqua>foo[]<p style=background-color:tan>bar',
1488 '<p>foo[]<p style=background-color:tan>bar',
1489 '<p><span style=background-color:aqua>foo[]</font><p>bar',
1490 '<p><span style=background-color:aqua>foo[]</font><p><span style=backgro und-color:tan>bar</font>',
1491 '<p>foo[]<p><span style=background-color:tan>bar</font>',
1492
1493 '<p style=text-decoration:underline>foo[]<p>bar',
1494 '<p style=text-decoration:underline>foo[]<p style=text-decoration:line-t hrough>bar',
1495 '<p>foo[]<p style=text-decoration:line-through>bar',
1496 '<p><u>foo[]</u><p>bar',
1497 '<p><u>foo[]</u><p><s>bar</s>',
1498 '<p>foo[]<p><s>bar</s>',
1499
1500 '<p style=color:blue>foo[]</p>bar',
1501 'foo[]<p style=color:brown>bar',
1502 '<div style=color:blue><p style=color:green>foo[]</div>bar',
1503 '<div style=color:blue><p style=color:green>foo[]</div><p style=color:br own>bar',
1504 '<p style=color:blue>foo[]<div style=color:brown><p style=color:green>ba r',
1505
1506 // Uncollapsed selection (should be same as delete command)
1507 'foo[bar]baz',
1508 '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
1509 '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
1510 '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
1511 '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
1512 '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
1513 '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
1514 '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
1515 '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>ba z]</span>quz',
1516
1517 'foo<b>[bar]</b>baz',
1518 'foo<b>{bar}</b>baz',
1519 'foo{<b>bar</b>}baz',
1520 'foo<span>[bar]</span>baz',
1521 'foo<span>{bar}</span>baz',
1522 'foo{<span>bar</span>}baz',
1523 '<b>foo[bar</b><i>baz]quz</i>',
1524 '<p>foo</p><p>[bar]</p><p>baz</p>',
1525 '<p>foo</p><p>{bar}</p><p>baz</p>',
1526 '<p>foo</p><p>{bar</p>}<p>baz</p>',
1527 '<p>foo</p>{<p>bar}</p><p>baz</p>',
1528 '<p>foo</p>{<p>bar</p>}<p>baz</p>',
1529
1530 '<p>foo[bar<p>baz]quz',
1531 '<p>foo[bar<div>baz]quz</div>',
1532 '<p>foo[bar<h1>baz]quz</h1>',
1533 '<div>foo[bar</div><p>baz]quz',
1534 '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',
1535
1536 '<p><b>foo[bar</b><p>baz]quz',
1537 '<div><p>foo[bar</div><p>baz]quz',
1538 '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
1539 '<p>foo[bar<p style=color:blue>baz]quz',
1540 '<p>foo[bar<p><b>baz]quz</b>',
1541
1542 '<div><p>foo<p>[bar<p>baz]</div>',
1543
1544 'foo[<br>]bar',
1545 '<p>foo[</p><p>]bar</p>',
1546 '<p>foo[</p><p>]bar<br>baz</p>',
1547 'foo[<p>]bar</p>',
1548 'foo{<p>}bar</p>',
1549 'foo[<p>]bar<br>baz</p>',
1550 'foo[<p>]bar</p>baz',
1551 'foo{<p>bar</p>}baz',
1552 'foo<p>{bar</p>}baz',
1553 'foo{<p>bar}</p>baz',
1554 '<p>foo[</p>]bar',
1555 '<p>foo{</p>}bar',
1556 '<p>foo[</p>]bar<br>baz',
1557 '<p>foo[</p>]bar<p>baz</p>',
1558 'foo[<div><p>]bar</div>',
1559 '<div><p>foo[</p></div>]bar',
1560 'foo[<div><p>]bar</p>baz</div>',
1561 'foo[<div>]bar<p>baz</p></div>',
1562 '<div><p>foo</p>bar[</div>]baz',
1563 '<div>foo<p>bar[</p></div>]baz',
1564
1565 '<p>foo<br>{</p>]bar',
1566 '<p>foo<br><br>{</p>]bar',
1567 'foo<br>{<p>]bar</p>',
1568 'foo<br><br>{<p>]bar</p>',
1569 '<p>foo<br>{</p><p>}bar</p>',
1570 '<p>foo<br><br>{</p><p>}bar</p>',
1571
1572 '<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</tab le>',
1573 '<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</tab le>',
1574 '<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</tab le>',
1575 '<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</tab le>',
1576 '<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</tab le>',
1577 '<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</tab le>',
1578 '{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</tabl e>}',
1579 '<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz< /table>',
1580 '<p>fo[o<table><tr><td>b]ar</table><p>baz',
1581 '<p>foo<table><tr><td>ba[r</table><p>b]az',
1582 '<p>fo[o<table><tr><td>bar</table><p>b]az',
1583
1584 '<p>foo<ol><li>ba[r<li>b]az</ol><p>quz',
1585 '<p>foo<ol><li>bar<li>[baz]</ol><p>quz',
1586 '<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz',
1587 '<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz',
1588 '<p>fo[o<ol><li>bar<li>b]az</ol><p>quz',
1589 '<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz',
1590
1591 '<ol><li>fo[o</ol><ol><li>b]ar</ol>',
1592 '<ol><li>fo[o</ol><ul><li>b]ar</ul>',
1593
1594 'foo[<ol><li>]bar</ol>',
1595 '<ol><li>foo[<li>]bar</ol>',
1596 'foo[<dl><dt>]bar<dd>baz</dl>',
1597 'foo[<dl><dd>]bar</dl>',
1598 '<dl><dt>foo[<dd>]bar</dl>',
1599 '<dl><dt>foo[<dt>]bar<dd>baz</dl>',
1600 '<dl><dt>foo<dd>bar[<dd>]baz</dl>',
1601
1602 // https://bugs.webkit.org/show_bug.cgi?id=35281
1603 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13976
1604 '<ol><li>foo</ol>{}<br><ol><li>bar</ol>',
1605 '<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>',
1606 '<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>',
1607 '<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>',
1608 '<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
1609 '<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
1610 '<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>',
1611 '<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>',
1612 '<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>',
1613 '<ol><li>foo[</ol>bar]<ol><li>baz</ol>',
1614 '<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>',
1615 '<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>',
1616 '<ol><li>fo[]o</ol><ol><li>bar</ol>',
1617 '<ol><li>foo</ol>[bar<ol><li>]baz</ol>',
1618 '<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>',
1619 '<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>',
1620 '<ol><li>foo</ol><ol><li>[]bar</ol>',
1621 '<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>',
1622 '<ul><li>foo</ul>{}<br><ul><li>bar</ul>',
1623 '<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>',
1624 '<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>',
1625 '<ol><li>foo</ol>{}<br><ul><li>bar</ul>',
1626 '<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>',
1627 '<ul><li>foo</ul>{}<br><ol><li>bar</ol>',
1628 '<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>',
1629
1630 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13831
1631 '<p><b>[foo]</b>',
1632 '<p><quasit>[foo]</quasit>',
1633 '<p><b><i>[foo]</i></b>',
1634 '<p><b>{foo}</b>',
1635 '<p>{<b>foo</b>}',
1636 '<p><b>[]f</b>',
1637 '<b>[foo]</b>',
1638 '<div><b>[foo]</b></div>',
1639 ],
1640 //@}
1641 hilitecolor: [
1642 //@{
1643 'foo[]bar',
1644 '<p>[foo</p> <p>bar]</p>',
1645 '<span>[foo</span> <span>bar]</span>',
1646 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
1647 '<p>[foo<p><br><p>bar]',
1648 '<b>foo[]bar</b>',
1649 '<i>foo[]bar</i>',
1650 '<span>foo</span>{}<span>bar</span>',
1651 '<span>foo[</span><span>]bar</span>',
1652 'foo[bar]baz',
1653 'foo[bar<b>baz]qoz</b>quz',
1654 'foo[bar<i>baz]qoz</i>quz',
1655 '{<p><p> <p>foo</p>}',
1656
1657 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
1658 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> ',
1659 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> ',
1660 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> ',
1661 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> ',
1662 '{<table><tr><td>foo<td>bar<td>baz</table>}',
1663
1664 '<p style="background-color: rgb(0, 255, 255)">foo[bar]baz</p>',
1665 '<p style="background-color: #00ffff">foo[bar]baz</p>',
1666 '<p style="background-color: aqua">foo[bar]baz</p>',
1667 '{<p style="background-color: aqua">foo</p><p>bar</p>}',
1668 '<span style="background-color: aqua">foo<span style="background-color: tan">[bar]</span>baz</span>',
1669 '<span style="background-color: #00ffff">foo<span style="background-colo r: tan">[bar]</span>baz</span>',
1670 '<span style="background-color: #0ff">foo<span style="background-color: tan">[bar]</span>baz</span>',
1671 '<span style="background-color: rgb(0, 255, 255)">foo<span style="backgr ound-color: tan">[bar]</span>baz</span>',
1672 '<span style="background-color: aqua">foo<span style="background-color: tan">b[ar]</span>baz</span>',
1673 '<p style="background-color: aqua">foo<span style="background-color: tan ">b[ar]</span>baz</p>',
1674 '<div style="background-color: aqua"><p style="background-color: tan">b[ ar]</p></div>',
1675 '<span style="display: block; background-color: aqua"><span style="displ ay: block; background-color: tan">b[ar]</span></span>',
1676
1677 // Tests for queryCommandIndeterm() and queryCommandState()
1678 'fo[o<span style=background-color:tan>b]ar</span>baz',
1679 'foo<span style=background-color:tan>ba[r</span>b]az',
1680 'fo[o<span style=background-color:tan>bar</span>b]az',
1681 'foo[<span style=background-color:tan>b]ar</span>baz',
1682 'foo<span style=background-color:tan>ba[r</span>]baz',
1683 'foo[<span style=background-color:tan>bar</span>]baz',
1684 'foo<span style=background-color:tan>[bar]</span>baz',
1685 'foo{<span style=background-color:tan>bar</span>}baz',
1686 '<span style=background-color:tan>fo[o</span><span style=background-colo r:yellow>b]ar</span>',
1687 '<span style=background-color:tan>fo[o</span><span style=background-colo r:tan>b]ar</span>',
1688 '<span style=background-color:tan>fo[o<span style=background-color:trans parent>b]ar</span></span>',
1689
1690 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13829
1691 '!<font size=6>[foo]</font>',
1692 '!<span style=font-size:xx-large>[foo]</span>',
1693 '!<font size=6>foo[bar]baz</font>',
1694 '!<span style=font-size:xx-large>foo[bar]baz</span>',
1695 '![foo<font size=6>bar</font>baz]',
1696 '![foo<span style=font-size:xx-large>bar</span>baz]',
1697 ],
1698 //@}
1699 indent: [
1700 //@{
1701 // All these have a trailing unselected paragraph, because otherwise
1702 // Gecko is unhappy: it throws exceptions in non-CSS mode, and in CSS
1703 // mode it adds the indentation invisibly to the wrapper div in many
1704 // cases.
1705 'foo[]bar<p>extra',
1706 '<span>foo</span>{}<span>bar</span><p>extra',
1707 '<span>foo[</span><span>]bar</span><p>extra',
1708 'foo[bar]baz<p>extra',
1709 '<p dir=rtl>פו[בר]בז<p dir=rtl>נוםף',
1710 '<p dir=rtl>פו[ברבז<p>Foobar]baz<p>Extra',
1711 '<p>Foo[barbaz<p dir=rtl>פובר]בז<p>Extra',
1712 '<div><p>Foo[barbaz<p dir=rtl>פובר]בז</div><p>Extra',
1713 'foo]bar[baz<p>extra',
1714 '{<p><p> <p>foo</p>}<p>extra',
1715 'foo[bar<i>baz]qoz</i>quz<p>extra',
1716 '[]foo<p>extra',
1717 'foo[]<p>extra',
1718 '<p>[]foo<p>extra',
1719 '<p>foo[]<p>extra',
1720 '<p>{}<br>foo</p><p>extra',
1721 '<p>foo<br>{}</p><p>extra',
1722 '<span>{}<br>foo</span>bar<p>extra',
1723 '<span>foo<br>{}</span>bar<p>extra',
1724 '<p>foo</p>{}<p>bar</p>',
1725
1726 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
1727 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> <p>extra',
1728 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> <p>extra',
1729 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> <p>extra',
1730 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> <p>extra',
1731 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
1732
1733 '<p>foo[bar]</p><p>baz</p><p>extra',
1734 '<p>[foobar</p><p>ba]z</p><p>extra',
1735 'foo[bar]<br>baz<p>extra',
1736 'foo[bar]<br><br><br><br>baz<p>extra',
1737 'foobar<br>[ba]z<p>extra',
1738 'foobar<br><br><br><br>[ba]z<p>extra',
1739 'foo[bar<br>ba]z<p>extra',
1740 '<div>foo<p>[bar]</p>baz</div><p>extra',
1741
1742 // These mimic existing indentation in various browsers, to see how
1743 // they cope with indenting twice. This is spec, Gecko non-CSS, and
1744 // Opera:
1745 '<blockquote><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
1746 '<blockquote><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
1747 '<blockquote><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
1748 '<blockquote><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
1749 '<p>[foo]<blockquote><p>bar</blockquote><p>extra',
1750 '<p>[foo<blockquote><p>b]ar</blockquote><p>extra',
1751 '<p>foo<blockquote><p>bar</blockquote><p>[baz]<p>extra',
1752 '<p>foo<blockquote><p>[bar</blockquote><p>baz]<p>extra',
1753 '<p>[foo<blockquote><p>bar</blockquote><p>baz]<p>extra',
1754 '<blockquote><p>foo</blockquote><p>[bar]<blockquote><p>baz</blockquote>< p>extra',
1755
1756 '<blockquote>foo[bar]<br>baz</blockquote><p>extra',
1757 '<blockquote>foo[bar<br>b]az</blockquote><p>extra',
1758 '<blockquote>foo[bar]</blockquote>baz<p>extra',
1759 '<blockquote>foo[bar</blockquote>b]az<p>extra',
1760 '[foo]<blockquote>bar</blockquote><p>extra',
1761 '[foo<blockquote>b]ar</blockquote><p>extra',
1762 'foo<blockquote>bar</blockquote>[baz]<p>extra',
1763 '[foo<blockquote>bar</blockquote>baz]<p>extra',
1764 '<blockquote>foo</blockquote>[bar]<blockquote>baz</blockquote><p>extra',
1765
1766 // IE:
1767 '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar]</p><p>baz</p> </blockquote><p>extra',
1768 '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar</p><p>b]az</p> </blockquote><p>extra',
1769 '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar]</p></blockquo te><p>baz</p><p>extra',
1770 '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar</p></blockquot e><p>b]az</p><p>extra',
1771 '<p>[foo]<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquot e><p>extra',
1772 '<p>[foo<blockquote style="margin-right: 0" dir="ltr"><p>b]ar</blockquot e><p>extra',
1773 '<p>foo<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote> <p>[baz]<p>extra',
1774 '<p>foo<blockquote style="margin-right: 0" dir="ltr"><p>[bar</blockquote ><p>baz]<p>extra',
1775 '<p>[foo<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote ><p>baz]<p>extra',
1776 '<blockquote style="margin-right: 0" dir="ltr"><p>foo</blockquote><p>[ba r]<blockquote style="margin-right: 0" dir="ltr"><p>baz</blockquote><p>extra',
1777
1778 // Firefox CSS mode:
1779 '<p style="margin-left: 40px">foo[bar]</p><p style="margin-left: 40px">b az</p><p>extra',
1780 '<p style="margin-left: 40px">foo[bar</p><p style="margin-left: 40px">b] az</p><p>extra',
1781 '<p style="margin-left: 40px">foo[bar]</p><p>baz</p><p>extra',
1782 '<p style="margin-left: 40px">foo[bar</p><p>b]az</p><p>extra',
1783 '<p>[foo]<p style="margin-left: 40px">bar<p>extra',
1784 '<p>[foo<p style="margin-left: 40px">b]ar<p>extra',
1785 '<p>foo<p style="margin-left: 40px">bar<p>[baz]<p>extra',
1786 '<p>foo<p style="margin-left: 40px">[bar<p>baz]<p>extra',
1787 '<p>[foo<p style="margin-left: 40px">bar<p>baz]<p>extra',
1788 '<p style="margin-left: 40px">foo<p>[bar]<p style="margin-left: 40px">ba z<p>extra',
1789
1790 // WebKit:
1791 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
1792 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
1793 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
1794 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
1795 '<p>[foo]<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>extra',
1796 '<p>[foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>b]ar</blockquote><p>extra',
1797 '<p>foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>[baz]<p>extra',
1798 '<p>foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>[bar</blockquote><p>baz]<p>extra',
1799 '<p>[foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>baz]<p>extra',
1800 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo</blockquote><p>[bar]<blockquote class="webki t-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>b az</blockquote><p>extra',
1801
1802 // MDC says "In Firefox, if the selection spans multiple lines at
1803 // different levels of indentation, only the least indented lines in
1804 // the selection will be indented." Let's test that.
1805 '<blockquote>f[oo<blockquote>b]ar</blockquote></blockquote><p>extra',
1806
1807 // Lists!
1808 '<ol><li>foo<li>[bar]<li>baz</ol>',
1809 '<ol data-start=1 data-end=2><li>foo<li>bar<li>baz</ol>',
1810 '<ol><li>foo</ol>[bar]',
1811 '<ol><li>[foo]<br>bar<li>baz</ol>',
1812 '<ol><li>foo<br>[bar]<li>baz</ol>',
1813 '<ol><li><div>[foo]</div>bar<li>baz</ol>',
1814 '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
1815 '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
1816 '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
1817 '<ol><li>foo</li><ol data-start=0 data-end=1><li>bar<li>baz</ol><li>quz< /ol>',
1818 '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
1819 '<ol><li>foo</li><ol data-start=1 data-end=2><li>bar<li>baz</ol><li>quz< /ol>',
1820 '<ol><li>foo<ol><li>b[a]r</ol><li>baz</ol>',
1821 '<ol><li>foo</li><ol><li>b[a]r</ol><li>baz</ol>',
1822 '<ol><li>foo{<ol><li>bar</ol>}<li>baz</ol>',
1823 '<ol><li>foo</li>{<ol><li>bar</ol>}<li>baz</ol>',
1824 '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
1825 '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
1826 '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
1827 '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
1828 '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
1829 '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
1830
1831 // Lists with id's:
1832 // http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2009-July/020721. html
1833 '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</li><ol id=u3><li id=i3 >baz</ol></ol>',
1834 '<ol><ol><li id=i1>foo</ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ ol></ol>',
1835 '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</li><ol><li id=i3>baz</ ol></ol>',
1836 '<ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>',
1837 '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</ol>',
1838
1839 // Try indenting multiple items at once.
1840 '<ol><li>foo<li>b[ar<li>baz]</ol>',
1841 '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
1842 '<ol><li>[foo</li><ol><li>bar]</ol><li>baz</ol>',
1843 '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
1844 '<ol><li>foo</li><ol><li>b[ar</ol><li>b]az</ol>',
1845 '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
1846 '<ol><li>[foo</li><ol><li>bar</ol><li>baz]</ol><p>extra',
1847
1848 // We probably can't actually get this DOM . . .
1849 '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
1850 '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
1851 '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
1852 '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
1853
1854 'foo<!--bar-->[baz]<p>extra',
1855 '[foo]<!--bar-->baz<p>extra',
1856 '<p>foo<!--bar-->{}<p>extra',
1857 '<p>{}<!--foo-->bar<p>extra',
1858
1859 // Whitespace nodes
1860 '<blockquote><p>foo</blockquote> <p>[bar]',
1861 '<p>[foo]</p> <blockquote><p>bar</blockquote>',
1862 '<blockquote><p>foo</blockquote> <p>[bar]</p> <blockquote><p>baz</blockq uote>',
1863 '<ol><li>foo</li><ol><li>bar</li> </ol><li>[baz]</ol>',
1864 '<ol><li>foo</li><ol><li>bar</li></ol> <li>[baz]</ol>',
1865 '<ol><li>foo</li><ol><li>bar</li> </ol> <li>[baz]</ol>',
1866 '<ol><li>foo<ol><li>bar</li> </ol></li><li>[baz]</ol>',
1867 '<ol><li>foo<ol><li>bar</li></ol></li> <li>[baz]</ol>',
1868 '<ol><li>foo<ol><li>bar</li> </ol></li> <li>[baz]</ol>',
1869 '<ol><li>foo<li>[bar]</li> <ol><li>baz</ol></ol>',
1870 '<ol><li>foo<li>[bar]</li><ol> <li>baz</ol></ol>',
1871 '<ol><li>foo<li>[bar]</li> <ol> <li>baz</ol></ol>',
1872 '<ol><li>foo<li>[bar] <ol><li>baz</ol></ol>',
1873 '<ol><li>foo<li>[bar]<ol> <li>baz</ol></ol>',
1874 '<ol><li>foo<li>[bar] <ol> <li>baz</ol></ol>',
1875
1876 // https://bugs.webkit.org/show_bug.cgi?id=32003
1877 '<ul><li>a<br>{<br>}</li><li>b</li></ul>',
1878 ],
1879 //@}
1880 inserthorizontalrule: [
1881 //@{
1882 'foo[]bar',
1883 '<span>foo</span>{}<span>bar</span>',
1884 '<span>foo[</span><span>]bar</span>',
1885 '<p>foo[bar<p>baz]quz',
1886 '<div><b>foo</b>{}<b>bar</b></div>',
1887 '<div><b>foo[</b><b>]bar</b></div>',
1888 '<div><b>foo</b>{<b>bar</b>}<b>baz</b></div>',
1889 '<b>foo[]bar</b>',
1890 '<b id=abc>foo[]bar</b>',
1891 ["abc", 'foo[bar]baz'],
1892 'foo[bar]baz',
1893
1894 'foo<b>[bar]</b>baz',
1895 'foo<b>{bar}</b>baz',
1896 'foo{<b>bar</b>}baz',
1897 '<p>foo<p>[bar]<p>baz',
1898 '<p>foo<p>{bar}<p>baz',
1899 '<p>foo{<p>bar</p>}<p>baz',
1900
1901 '<p>foo[bar]baz</p>',
1902 '<p id=abc>foo[bar]baz</p>',
1903 '<h1>foo[bar]baz</h1>',
1904 '<p>foo<b>b[a]r</b>baz</p>',
1905
1906 '<a>foo[bar]baz</a>',
1907 '<a href=/>foo[bar]baz</a>',
1908 '<abbr>foo[bar]baz</abbr>',
1909 '<address>foo[bar]baz</address>',
1910 '<article>foo[bar]baz</article>',
1911 '<aside>foo[bar]baz</aside>',
1912 '<b>foo[bar]baz</b>',
1913 '<bdi>foo[bar]baz</bdi>',
1914 '<bdo dir=rtl>foo[bar]baz</bdo>',
1915 '<blockquote>foo[bar]baz</blockquote>',
1916 '<table><caption>foo[bar]baz</caption><tr><td>quz</table>',
1917 '<cite>foo[bar]baz</cite>',
1918 '<code>foo[bar]baz</code>',
1919 '<dl><dd>foo[bar]baz</dd></dl>',
1920 '<del>foo[bar]baz</del>',
1921 '<details>foo[bar]baz</details>',
1922 '<dfn>foo[bar]baz</dfn>',
1923 '<div>foo[bar]baz</div>',
1924 '<dl><dt>foo[bar]baz</dt></dl>',
1925 '<em>foo[bar]baz</em>',
1926 '<figure><figcaption>foo[bar]baz</figcaption>quz</figure>',
1927 '<figure>foo[bar]baz</figure>',
1928 '<footer>foo[bar]baz</footer>',
1929 '<h1>foo[bar]baz</h1>',
1930 '<h2>foo[bar]baz</h2>',
1931 '<h3>foo[bar]baz</h3>',
1932 '<h4>foo[bar]baz</h4>',
1933 '<h5>foo[bar]baz</h5>',
1934 '<h6>foo[bar]baz</h6>',
1935 '<header>foo[bar]baz</header>',
1936 '<hgroup>foo[bar]baz</hgroup>',
1937 '<hgroup><h1>foo[bar]baz</h1></hgroup>',
1938 '<i>foo[bar]baz</i>',
1939 '<ins>foo[bar]baz</ins>',
1940 '<kbd>foo[bar]baz</kbd>',
1941 '<mark>foo[bar]baz</mark>',
1942 '<nav>foo[bar]baz</nav>',
1943 '<ol><li>foo[bar]baz</li></ol>',
1944 '<p>foo[bar]baz</p>',
1945 '<pre>foo[bar]baz</pre>',
1946 '<q>foo[bar]baz</q>',
1947 '<ruby>foo[bar]baz<rt>quz</rt></ruby>',
1948 '<ruby>foo<rt>bar[baz]quz</rt></ruby>',
1949 '<ruby>foo<rp>bar[baz]quz</rp><rt>qoz</rt><rp>qiz</rp></ruby>',
1950 '<s>foo[bar]baz</s>',
1951 '<samp>foo[bar]baz</samp>',
1952 '<section>foo[bar]baz</section>',
1953 '<small>foo[bar]baz</small>',
1954 '<span>foo[bar]baz</span>',
1955 '<strong>foo[bar]baz</strong>',
1956 '<sub>foo[bar]baz</sub>',
1957 '<sup>foo[bar]baz</sup>',
1958 '<table><tr><td>foo[bar]baz</td></table>',
1959 '<table><tr><th>foo[bar]baz</th></table>',
1960 '<u>foo[bar]baz</u>',
1961 '<ul><li>foo[bar]baz</li></ul>',
1962 '<var>foo[bar]baz</var>',
1963
1964 '<acronym>foo[bar]baz</acronym>',
1965 '<big>foo[bar]baz</big>',
1966 '<blink>foo[bar]baz</blink>',
1967 '<center>foo[bar]baz</center>',
1968 '<dir>foo[bar]baz</dir>',
1969 '<dir><li>foo[bar]baz</li></dir>',
1970 '<font>foo[bar]baz</font>',
1971 '<listing>foo[bar]baz</listing>',
1972 '<marquee>foo[bar]baz</marquee>',
1973 '<nobr>foo[bar]baz</nobr>',
1974 '<strike>foo[bar]baz</strike>',
1975 '<tt>foo[bar]baz</tt>',
1976 '<xmp>foo[bar]baz</xmp>',
1977
1978 '<quasit>foo[bar]baz</quasit>',
1979
1980 '<table><tr><td>fo[o<td>b]ar</table>',
1981 'fo[o<span contenteditable=false>bar</span>b]az',
1982 ],
1983 //@}
1984 inserthtml: [
1985 //@{
1986 'foo[]bar',
1987 'foo[bar]baz',
1988 'foo<span style=color:#aBcDeF>[bar]</span>baz',
1989 'foo<span style=color:#aBcDeF>{bar}</span>baz',
1990 'foo{<span style=color:#aBcDeF>bar</span>}baz',
1991 '[foo<span style=color:#aBcDeF>bar]</span>baz',
1992 '{foo<span style=color:#aBcDeF>bar}</span>baz',
1993 'foo<span style=color:#aBcDeF>[bar</span>baz]',
1994 'foo<span style=color:#aBcDeF>{bar</span>baz}',
1995 'foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]< /span>quz',
1996
1997 ['', 'foo[bar]baz'],
1998 ['\0', 'foo[bar]baz'],
1999 ['\x07', 'foo[bar]baz'],
2000 // The following line makes Firefox 7.0a2 go into an infinite loop on
2001 // my machine.
2002 //['\ud800', 'foo[bar]baz'],
2003
2004 ['<b>', 'foo[bar]baz'],
2005 ['<b>abc', 'foo[bar]baz'],
2006 ['<p>abc', '<p>foo[bar]baz'],
2007 ['<li>abc', '<p>foo[bar]baz'],
2008 ['<p>abc', '<ol>{<li>foo</li>}<li>bar</ol>'],
2009 ['<p>abc', '<ol><li>foo</li>{<li>bar</li>}<li>baz</ol>'],
2010 ['<p>abc', '<ol><li>[foo]</li><li>bar</ol>'],
2011
2012 ['abc', '<xmp>f[o]o</xmp>'],
2013 ['<b>abc</b>', '<xmp>f[o]o</xmp>'],
2014 ['abc', '<script>f[o]o</script>bar'],
2015 ['<b>abc</b>', '<script>f[o]o</script>bar'],
2016
2017 ['<a>abc</a>', '<a>f[o]o</a>'],
2018 ['<a href=/>abc</a>', '<a href=.>f[o]o</a>'],
2019 ['<hr>', '<p>f[o]o'],
2020 ['<hr>', '<b>f[o]o</b>'],
2021 ['<h2>abc</h2>', '<h1>f[o]o</h1>'],
2022 ['<td>abc</td>', '<table><tr><td>f[o]o</table>'],
2023 ['<td>abc</td>', 'f[o]o'],
2024
2025 ['<dt>abc</dt>', '<dl><dt>f[o]o<dd>bar</dl>'],
2026 ['<dt>abc</dt>', '<dl><dt>foo<dd>b[a]r</dl>'],
2027 ['<dd>abc</dd>', '<dl><dt>f[o]o<dd>bar</dl>'],
2028 ['<dd>abc</dd>', '<dl><dt>foo<dd>b[a]r</dl>'],
2029 ['<dt>abc</dt>', 'f[o]o'],
2030 ['<dt>abc</dt>', '<ol><li>f[o]o</ol>'],
2031 ['<dd>abc</dd>', 'f[o]o'],
2032 ['<dd>abc</dd>', '<ol><li>f[o]o</ol>'],
2033
2034 ['<li>abc</li>', '<dir><li>f[o]o</dir>'],
2035 ['<li>abc</li>', '<ol><li>f[o]o</ol>'],
2036 ['<li>abc</li>', '<ul><li>f[o]o</ul>'],
2037 ['<dir><li>abc</dir>', '<dir><li>f[o]o</dir>'],
2038 ['<dir><li>abc</dir>', '<ol><li>f[o]o</ol>'],
2039 ['<dir><li>abc</dir>', '<ul><li>f[o]o</ul>'],
2040 ['<ol><li>abc</ol>', '<dir><li>f[o]o</dir>'],
2041 ['<ol><li>abc</ol>', '<ol><li>f[o]o</ol>'],
2042 ['<ol><li>abc</ol>', '<ul><li>f[o]o</ul>'],
2043 ['<ul><li>abc</ul>', '<dir><li>f[o]o</dir>'],
2044 ['<ul><li>abc</ul>', '<ol><li>f[o]o</ol>'],
2045 ['<ul><li>abc</ul>', '<ul><li>f[o]o</ul>'],
2046 ['<li>abc</li>', 'f[o]o'],
2047
2048 ['<nobr>abc</nobr>', '<nobr>f[o]o</nobr>'],
2049 ['<nobr>abc</nobr>', 'f[o]o'],
2050
2051 ['<p>abc', '<font color=blue>foo[]bar</font>'],
2052 ['<p>abc', '<span style=color:blue>foo[]bar</span>'],
2053 ['<p>abc', '<span style=font-variant:small-caps>foo[]bar</span>'],
2054 [' ', '<p>[foo]</p>'],
2055 ['<span style=display:none></span>', '<p>[foo]</p>'],
2056 ['<!--abc-->', '<p>[foo]</p>'],
2057
2058 ['abc', '<p>{}<br></p>'],
2059 ['<!--abc-->', '<p>{}<br></p>'],
2060 ['abc', '<p><!--foo-->{}<span><br></span><!--bar--></p>'],
2061 ['<!--abc-->', '<p><!--foo-->{}<span><br></span><!--bar--></p>'],
2062 ['abc', '<p>{}<span><!--foo--><br><!--bar--></span></p>'],
2063 ['<!--abc-->', '<p>{}<span><!--foo--><br><!--bar--></span></p>'],
2064
2065 ['abc', '<p><br>{}</p>'],
2066 ['<!--abc-->', '<p><br>{}</p>'],
2067 ['abc', '<p><!--foo--><span><br></span>{}<!--bar--></p>'],
2068 ['<!--abc-->', '<p><!--foo--><span><br></span>{}<!--bar--></p>'],
2069 ['abc', '<p><span><!--foo--><br><!--bar--></span>{}</p>'],
2070 ['<!--abc-->', '<p><span><!--foo--><br><!--bar--></span>{}</p>'],
2071 ],
2072 //@}
2073 insertimage: [
2074 //@{
2075 'foo[]bar',
2076 '<span>foo</span>{}<span>bar</span>',
2077 '<span>foo[</span><span>]bar</span>',
2078 ["", 'foo[bar]baz'],
2079 'foo[bar]baz',
2080 'foo<span style=color:#aBcDeF>[bar]</span>baz',
2081 'foo<span style=color:#aBcDeF>{bar}</span>baz',
2082 'foo{<span style=color:#aBcDeF>bar</span>}baz',
2083 '[foo<span style=color:#aBcDeF>bar]</span>baz',
2084 '{foo<span style=color:#aBcDeF>bar}</span>baz',
2085 'foo<span style=color:#aBcDeF>[bar</span>baz]',
2086 'foo<span style=color:#aBcDeF>{bar</span>baz}',
2087 'foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]< /span>quz',
2088
2089 'foo<b>[bar]</b>baz',
2090 'foo<b>{bar}</b>baz',
2091 'foo{<b>bar</b>}baz',
2092 'foo<span>[bar]</span>baz',
2093 'foo<span>{bar}</span>baz',
2094 'foo{<span>bar</span>}baz',
2095 '<b>foo[bar</b><i>baz]quz</i>',
2096 '<p>foo</p><p>[bar]</p><p>baz</p>',
2097 '<p>foo</p><p>{bar}</p><p>baz</p>',
2098 '<p>foo</p>{<p>bar</p>}<p>baz</p>',
2099
2100 '<p>foo[bar<p>baz]quz',
2101 '<p>foo[bar<div>baz]quz</div>',
2102 '<p>foo[bar<h1>baz]quz</h1>',
2103 '<div>foo[bar</div><p>baz]quz',
2104 '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',
2105
2106 '<p><b>foo[bar</b><p>baz]quz',
2107 '<div><p>foo[bar</div><p>baz]quz',
2108 '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
2109 '<p>foo[bar<p style=color:blue>baz]quz',
2110 '<p>foo[bar<p><b>baz]quz</b>',
2111
2112 '<div><p>foo<p>[bar<p>baz]</div>',
2113
2114 'foo[<br>]bar',
2115 '<p>foo[</p><p>]bar</p>',
2116 '<p>foo[</p><p>]bar<br>baz</p>',
2117 'foo[<p>]bar</p>',
2118 'foo[<p>]bar<br>baz</p>',
2119 'foo[<p>]bar</p>baz',
2120 '<p>foo[</p>]bar',
2121 '<p>foo[</p>]bar<br>baz',
2122 '<p>foo[</p>]bar<p>baz</p>',
2123 'foo[<div><p>]bar</div>',
2124 '<div><p>foo[</p></div>]bar',
2125 'foo[<div><p>]bar</p>baz</div>',
2126 'foo[<div>]bar<p>baz</p></div>',
2127 '<div><p>foo</p>bar[</div>]baz',
2128 '<div>foo<p>bar[</p></div>]baz',
2129 ],
2130 //@}
2131 insertlinebreak: [
2132 //@{ Same as insertparagraph (set below)
2133 ],
2134 //@}
2135 insertorderedlist: [
2136 //@{
2137 'foo[]bar',
2138 'foo[bar]baz',
2139 'foo<br>[bar]',
2140 'f[oo<br>b]ar<br>baz',
2141 '<p>[foo]<br>bar</p>',
2142 '[foo<ol><li>bar]</ol>baz',
2143 'foo<ol><li>[bar</ol>baz]',
2144 '[foo<ul><li>bar]</ul>baz',
2145 'foo<ul><li>[bar</ul>baz]',
2146 'foo<ul><li>[bar</ul><ol><li>baz]</ol>quz',
2147 'foo<ol><li>[bar</ol><ul><li>baz]</ul>quz',
2148
2149 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
2150 '<table><tbody><tr><td>fo[o<td>b]ar<td>baz</table>',
2151 '{<table><tr><td>foo<td>bar<td>baz</table>}',
2152
2153 '<p>foo<p>[bar]<p>baz',
2154 '<p>foo<blockquote>[bar]</blockquote><p>baz',
2155 '<dl><dt>foo<dd>[bar]<dt>baz<dd>quz</dl>',
2156 '<dl><dt>foo<dd>bar<dt>[baz]<dd>quz</dl>',
2157
2158 '<p>[foo<p>bar]<p>baz',
2159 '<p>[foo<blockquote>bar]</blockquote><p>baz',
2160 '<dl><dt>[foo<dd>bar]<dt>baz<dd>quz</dl>',
2161 '<dl><dt>foo<dd>[bar<dt>baz]<dd>quz</dl>',
2162
2163 '<p>[foo<blockquote><p>bar]<p>baz</blockquote>',
2164
2165
2166 // Various <ol> stuff
2167 '<ol><li>foo<li>[bar]<li>baz</ol>',
2168 '<ol><li>foo</ol>[bar]',
2169 '[foo]<ol><li>bar</ol>',
2170 '<ol><li>foo</ol>[bar]<ol><li>baz</ol>',
2171 '<ol><ol><li>[foo]</ol></ol>',
2172 '<ol><li>[foo]<br>bar<li>baz</ol>',
2173 '<ol><li>foo<br>[bar]<li>baz</ol>',
2174 '<ol><li><div>[foo]</div>bar<li>baz</ol>',
2175 '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
2176 '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
2177 '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
2178 '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
2179 '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
2180 '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
2181 '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
2182 '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
2183 '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
2184 '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
2185
2186 // Multiple items at once.
2187 '<ol><li>foo<li>[bar<li>baz]</ol>',
2188 '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
2189 '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
2190 '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
2191
2192 // We probably can't actually get this DOM . . .
2193 '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
2194 '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
2195 '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
2196 '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
2197
2198
2199 // Same stuff but with <ul>
2200 '<ul><li>foo<li>[bar]<li>baz</ul>',
2201 '<ul><li>foo</ul>[bar]',
2202 '[foo]<ul><li>bar</ul>',
2203 '<ul><li>foo</ul>[bar]<ul><li>baz</ul>',
2204 '<ul><ul><li>[foo]</ul></ul>',
2205 '<ul><li>[foo]<br>bar<li>baz</ul>',
2206 '<ul><li>foo<br>[bar]<li>baz</ul>',
2207 '<ul><li><div>[foo]</div>bar<li>baz</ul>',
2208 '<ul><li>foo<ul><li>[bar]<li>baz</ul><li>quz</ul>',
2209 '<ul><li>foo<ul><li>bar<li>[baz]</ul><li>quz</ul>',
2210 '<ul><li>foo</li><ul><li>[bar]<li>baz</ul><li>quz</ul>',
2211 '<ul><li>foo</li><ul><li>bar<li>[baz]</ul><li>quz</ul>',
2212 '<ul><li>[foo]<ul><li>bar</ul><li>baz</ul>',
2213 '<ul><li>[foo]</li><ul><li>bar</ul><li>baz</ul>',
2214 '<ul><li>foo<li>[bar]<ul><li>baz</ul><li>quz</ul>',
2215 '<ul><li>foo<li>[bar]</li><ul><li>baz</ul><li>quz</ul>',
2216 '<ul><li>foo<ul><li>bar<li>baz</ul><li>[quz]</ul>',
2217 '<ul><li>foo</li><ul><li>bar<li>baz</ul><li>[quz]</ul>',
2218
2219 // Multiple items at once.
2220 '<ul><li>foo<li>[bar<li>baz]</ul>',
2221 '<ul><li>[foo<ul><li>bar]</ul><li>baz</ul>',
2222 '<ul><li>foo<ul><li>b[ar</ul><li>b]az</ul>',
2223 '<ul><li>[foo<ul><li>bar</ul><li>baz]</ul><p>extra',
2224
2225 // We probably can't actually get this DOM . . .
2226 '<ul><li>[foo]<ul><li>bar</ul>baz</ul>',
2227 '<ul><li>foo<ul><li>[bar]</ul>baz</ul>',
2228 '<ul><li>foo<ul><li>bar</ul>[baz]</ul>',
2229 '<ul><li>[foo<ul><li>bar]</ul>baz</ul>',
2230
2231
2232 // Mix of <ol> and <ul>
2233 'foo<ol><li>bar</ol><ul><li>[baz]</ul>quz',
2234 'foo<ol><li>bar</ol><ul><li>[baz</ul>quz]',
2235 'foo<ul><li>[bar]</ul><ol><li>baz</ol>quz',
2236 '[foo<ul><li>bar]</ul><ol><li>baz</ol>quz',
2237
2238 // Interaction with indentation
2239 '[foo]<blockquote>bar</blockquote>baz',
2240 'foo<blockquote>[bar]</blockquote>baz',
2241 '[foo<blockquote>bar]</blockquote>baz',
2242 '<ol><li>foo</ol><blockquote>[bar]</blockquote>baz',
2243 '[foo]<blockquote><ol><li>bar</ol></blockquote>baz',
2244 'foo<blockquote>[bar]<br>baz</blockquote>',
2245 '[foo<blockquote>bar]<br>baz</blockquote>',
2246 '<ol><li>foo</ol><blockquote>[bar]<br>baz</blockquote>',
2247
2248 '<p>[foo]<blockquote><p>bar</blockquote><p>baz',
2249 '<p>foo<blockquote><p>[bar]</blockquote><p>baz',
2250 '<p>[foo<blockquote><p>bar]</blockquote><p>baz',
2251 '<ol><li>foo</ol><blockquote><p>[bar]</blockquote><p>baz',
2252
2253 // Attributes
2254 '<ul id=abc><li>foo<li>[bar]<li>baz</ul>',
2255 '<ul style=color:blue><li>foo<li>[bar]<li>baz</ul>',
2256 '<ul style=text-indent:1em><li>foo<li>[bar]<li>baz</ul>',
2257 '<ul id=abc><li>[foo]<li>bar<li>baz</ul>',
2258 '<ul style=color:blue><li>[foo]<li>bar<li>baz</ul>',
2259 '<ul style=text-indent:1em><li>[foo]<li>bar<li>baz</ul>',
2260 '<ul id=abc><li>foo<li>bar<li>[baz]</ul>',
2261 '<ul style=color:blue><li>foo<li>bar<li>[baz]</ul>',
2262 '<ul style=text-indent:1em><li>foo<li>bar<li>[baz]</ul>',
2263
2264 // Whitespace nodes
2265 '<ol><li>foo</ol> <p>[bar]',
2266 '<p>[foo]</p> <ol><li>bar</ol>',
2267 '<ol><li>foo</ol> <p>[bar]</p> <ol><li>baz</ol>',
2268
2269 // This caused an infinite loop at one point due to a bug in "fix
2270 // disallowed ancestors". Disabled because I'm not sure how we want it
2271 // to behave:
2272 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14578
2273 '!<span contenteditable=true>foo[]</span>',
2274 ],
2275 //@}
2276 insertparagraph: [
2277 //@{
2278 'foo[bar]baz',
2279 'fo[o<table><tr><td>b]ar</table>',
2280 '<table><tr><td>[foo<td>bar]<tr><td>baz<td>quz</table>',
2281 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<tr><td>baz<td> quz</table>',
2282 '<table><tr><td>fo[o</table>b]ar',
2283 '<table><tr><td>fo[o<td>b]ar<td>baz</table>',
2284 '{<table><tr><td>foo</table>}',
2285 '<table><tr><td>[foo]</table>',
2286 '<ol><li>[foo]<li>bar</ol>',
2287 '<ol><li>f[o]o<li>bar</ol>',
2288
2289 '[]foo',
2290 'foo[]',
2291 '<span>foo[]</span>',
2292 'foo[]<br>',
2293 'foo[]bar',
2294 '<address>[]foo</address>',
2295 '<address>foo[]</address>',
2296 '<address>foo[]<br></address>',
2297 '<address>foo[]bar</address>',
2298 '<div>[]foo</div>',
2299 '<div>foo[]</div>',
2300 '<div>foo[]<br></div>',
2301 '<div>foo[]bar</div>',
2302 '<dl><dt>[]foo<dd>bar</dl>',
2303 '<dl><dt>foo[]<dd>bar</dl>',
2304 '<dl><dt>foo[]<br><dd>bar</dl>',
2305 '<dl><dt>foo[]bar<dd>baz</dl>',
2306 '<dl><dt>foo<dd>[]bar</dl>',
2307 '<dl><dt>foo<dd>bar[]</dl>',
2308 '<dl><dt>foo<dd>bar[]<br></dl>',
2309 '<dl><dt>foo<dd>bar[]baz</dl>',
2310 '<h1>[]foo</h1>',
2311 '<h1>foo[]</h1>',
2312 '<h1>foo[]<br></h1>',
2313 '<h1>foo[]bar</h1>',
2314 '<ol><li>[]foo</ol>',
2315 '<ol><li>foo[]</ol>',
2316 '<ol><li>foo[]<br></ol>',
2317 '<ol><li>foo[]bar</ol>',
2318 '<p>[]foo</p>',
2319 '<p>foo[]</p>',
2320 '<p>foo[]<br></p>',
2321 '<p>foo[]bar</p>',
2322 '<pre>[]foo</pre>',
2323 '<pre>foo[]</pre>',
2324 '<pre>foo[]<br></pre>',
2325 '<pre>foo[]bar</pre>',
2326
2327 '<pre>foo[]<br><br></pre>',
2328 '<pre>foo<br>{}<br></pre>',
2329 '<pre>foo&#10;[]</pre>',
2330 '<pre>foo[]&#10;</pre>',
2331 '<pre>foo&#10;[]&#10;</pre>',
2332
2333 '<xmp>foo[]bar</xmp>',
2334 '<script>foo[]bar</script>baz',
2335 '<div style=display:none>foo[]bar</div>baz',
2336 '<listing>foo[]bar</listing>',
2337
2338 '<ol><li>{}<br></li></ol>',
2339 'foo<ol><li>{}<br></li></ol>',
2340 '<ol><li>{}<br></li></ol>foo',
2341 '<ol><li>foo<li>{}<br></ol>',
2342 '<ol><li>{}<br><li>bar</ol>',
2343 '<ol><li>foo</li><ul><li>{}<br></ul></ol>',
2344
2345 '<dl><dt>{}<br></dt></dl>',
2346 '<dl><dt>foo<dd>{}<br></dl>',
2347 '<dl><dt>{}<br><dd>bar</dl>',
2348 '<dl><dt>foo<dd>bar<dl><dt>{}<br><dd>baz</dl></dl>',
2349 '<dl><dt>foo<dd>bar<dl><dt>baz<dd>{}<br></dl></dl>',
2350
2351 '<h1>foo[bar</h1><p>baz]quz</p>',
2352 '<p>foo[bar</p><h1>baz]quz</h1>',
2353 '<p>foo</p>{}<br>',
2354 '{}<br><p>foo</p>',
2355 '<p>foo</p>{}<br><h1>bar</h1>',
2356 '<h1>foo</h1>{}<br><p>bar</p>',
2357 '<h1>foo</h1>{}<br><h2>bar</h2>',
2358 '<p>foo</p><h1>[bar]</h1><p>baz</p>',
2359 '<p>foo</p>{<h1>bar</h1>}<p>baz</p>',
2360
2361 '<table><tr><td>foo[]bar</table>',
2362 '<table><tr><td><p>foo[]bar</table>',
2363
2364 '<blockquote>[]foo</blockquote>',
2365 '<blockquote>foo[]</blockquote>',
2366 '<blockquote>foo[]<br></blockquote>',
2367 '<blockquote>foo[]bar</blockquote>',
2368 '<blockquote><p>[]foo</blockquote>',
2369 '<blockquote><p>foo[]</blockquote>',
2370 '<blockquote><p>foo[]bar</blockquote>',
2371 '<blockquote><p>foo[]<p>bar</blockquote>',
2372 '<blockquote><p>foo[]bar<p>baz</blockquote>',
2373
2374 '<span>foo[]bar</span>',
2375 '<span>foo[]bar</span>baz',
2376 '<b>foo[]bar</b>',
2377 '<b>foo[]bar</b>baz',
2378 '<b>foo[]</b>bar',
2379 'foo<b>[]bar</b>',
2380 '<b>foo[]</b><i>bar</i>',
2381 '<b id=x class=y>foo[]bar</b>',
2382 '<i><b>foo[]bar</b>baz</i>',
2383
2384 '<p><b>foo[]bar</b></p>',
2385 '<p><b>[]foo</b></p>',
2386 '<p><b id=x class=y>foo[]bar</b></p>',
2387 '<div><b>foo[]bar</b></div>',
2388
2389 '<a href=foo>foo[]bar</a>',
2390 '<a href=foo>foo[]bar</a>baz',
2391 '<a href=foo>foo[]</a>bar',
2392 'foo<a href=foo>[]bar</a>',
2393
2394 '<p>foo[]<!--bar-->',
2395 '<p><!--foo-->[]bar',
2396
2397 '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
2398 '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
2399 '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
2400 '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
2401 '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
2402 '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
2403 '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
2404 '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>ba z]</span>quz',
2405
2406 // https://bugs.webkit.org/show_bug.cgi?id=5036
2407 '<ul contenteditable><li>{}<br></ul>',
2408 '<ul contenteditable><li>foo[]</ul>',
2409 '<div contenteditable=false><ul contenteditable><li>{}<br></ul></div>',
2410 '<div contenteditable=false><ul contenteditable><li>foo[]</ul></div>',
2411
2412 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13841
2413 // https://bugs.webkit.org/show_bug.cgi?id=23507
2414 '<address><p>foo[]</address>',
2415 '<dl><dt><p>foo[]</dl>',
2416 '<dl><dd><p>foo[]</dl>',
2417 '<ol><li><p>foo[]</ol>',
2418 '<ul><li><p>foo[]</ul>',
2419 '<address><div>foo[]</address>',
2420 '<dl><dt><div>foo[]</dl>',
2421 '<dl><dd><div>foo[]</dl>',
2422 '<ol><li><div>foo[]</ol>',
2423 '<ul><li><div>foo[]</ul>',
2424 '<div><p>foo[]</div>',
2425 '<div><div>foo[]</div>',
2426
2427 '<address><p>[]foo</address>',
2428 '<dl><dt><p>[]foo</dl>',
2429 '<dl><dd><p>[]foo</dl>',
2430 '<ol><li><p>[]foo</ol>',
2431 '<ul><li><p>[]foo</ul>',
2432 '<address><div>[]foo</address>',
2433 '<dl><dt><div>[]foo</dl>',
2434 '<dl><dd><div>[]foo</dl>',
2435 '<ol><li><div>[]foo</ol>',
2436 '<ul><li><div>[]foo</ul>',
2437 '<div><p>[]foo</div>',
2438 '<div><div>[]foo</div>',
2439
2440 '<address><p>foo[]bar</address>',
2441 '<dl><dt><p>foo[]bar</dl>',
2442 '<dl><dd><p>foo[]bar</dl>',
2443 '<ol><li><p>foo[]bar</ol>',
2444 '<ul><li><p>foo[]bar</ul>',
2445 '<address><div>foo[]bar</address>',
2446 '<dl><dt><div>foo[]bar</dl>',
2447 '<dl><dd><div>foo[]bar</dl>',
2448 '<ol><li><div>foo[]bar</ol>',
2449 '<ul><li><div>foo[]bar</ul>',
2450 '<div><p>foo[]bar</div>',
2451 '<div><div>foo[]bar</div>',
2452
2453 '<ol><li class=a id=x><p class=b id=y>foo[]</ol>',
2454 '<div class=a id=x><div class=b id=y>foo[]</div></div>',
2455 '<div class=a id=x><p class=b id=y>foo[]</div>',
2456 '<ol><li class=a id=x><p class=b id=y>[]foo</ol>',
2457 '<div class=a id=x><div class=b id=y>[]foo</div></div>',
2458 '<div class=a id=x><p class=b id=y>[]foo</div>',
2459 '<ol><li class=a id=x><p class=b id=y>foo[]bar</ol>',
2460 '<div class=a id=x><div class=b id=y>foo[]bar</div></div>',
2461 '<div class=a id=x><p class=b id=y>foo[]bar</div>',
2462 ],
2463 //@}
2464 inserttext: [
2465 //@{
2466 'foo[bar]baz',
2467 ['', 'foo[bar]baz'],
2468
2469 ['\t', 'foo[]bar'],
2470 ['&', 'foo[]bar'],
2471 ['\n', 'foo[]bar'],
2472 ['abc\ndef', 'foo[]bar'],
2473 ['\x07', 'foo[]bar'],
2474
2475 ['<b>hi</b>', 'foo[]bar'],
2476 ['<', 'foo[]bar'],
2477 ['&amp;', 'foo[]bar'],
2478
2479 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14254
2480 ['!\r', 'foo[]bar'],
2481 ['!\r\n', 'foo[]bar'],
2482 ['!\0', 'foo[]bar'],
2483 ['!\ud800', 'foo[]bar'],
2484
2485 // Whitespace tests! The following two bugs are relevant to some of
2486 // these:
2487 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14119
2488 // https://bugzilla.mozilla.org/show_bug.cgi?id=681626
2489 [' ', 'foo[]bar'],
2490 [' ', 'foo []bar'],
2491 [' ', 'foo[] bar'],
2492 [' ', 'foo &nbsp;[]bar'],
2493 [' ', 'foo []&nbsp;bar'],
2494 [' ', 'foo[] &nbsp;bar'],
2495 [' ', 'foo&nbsp; []bar'],
2496 [' ', 'foo&nbsp;[] bar'],
2497 [' ', 'foo[]&nbsp; bar'],
2498 [' ', 'foo&nbsp;&nbsp;[]bar'],
2499 [' ', 'foo&nbsp;[]&nbsp;bar'],
2500 [' ', 'foo[]&nbsp;&nbsp;bar'],
2501 [' ', 'foo []&nbsp; bar'],
2502 [' ', 'foo []bar'],
2503 [' ', 'foo []&nbsp;&nbsp; &nbsp; bar'],
2504
2505 [' ', '[]foo'],
2506 [' ', '{}foo'],
2507 [' ', 'foo[]'],
2508 [' ', 'foo{}'],
2509 [' ', 'foo&nbsp;[]'],
2510 [' ', 'foo&nbsp;{}'],
2511 [' ', 'foo&nbsp;&nbsp;[]'],
2512 [' ', 'foo&nbsp;&nbsp;{}'],
2513 [' ', '<b>foo[]</b>bar'],
2514 [' ', 'foo[]<b>bar</b>'],
2515
2516 [' ', 'foo[] '],
2517 [' ', ' foo [] '],
2518 [' ', 'foo[]<span> </span>'],
2519 [' ', 'foo[]<span> </span> '],
2520 [' ', ' []foo'],
2521 [' ', ' [] foo '],
2522 [' ', '<span> </span>[]foo'],
2523 [' ', ' <span> </span>[]foo'],
2524
2525 [' ', '{}<br>'],
2526 [' ', '<p>{}<br>'],
2527
2528 [' ', '<p>foo[]<p>bar'],
2529 [' ', '<p>foo&nbsp;[]<p>bar'],
2530 [' ', '<p>foo[]<p>&nbsp;bar'],
2531
2532 // Some of the same tests as above, repeated with various values of
2533 // white-space.
2534 [' ', '<pre>foo[]bar</pre>'],
2535 [' ', '<pre>foo []bar</pre>'],
2536 [' ', '<pre>foo[] bar</pre>'],
2537 [' ', '<pre>foo &nbsp;[]bar</pre>'],
2538 [' ', '<pre>[]foo</pre>'],
2539 [' ', '<pre>foo[]</pre>'],
2540 [' ', '<pre>foo&nbsp;[]</pre>'],
2541 [' ', '<pre> foo [] </pre>'],
2542
2543 [' ', '<div style=white-space:pre>foo[]bar</div>'],
2544 [' ', '<div style=white-space:pre>foo []bar</div>'],
2545 [' ', '<div style=white-space:pre>foo[] bar</div>'],
2546 [' ', '<div style=white-space:pre>foo &nbsp;[]bar</div>'],
2547 [' ', '<div style=white-space:pre>[]foo</div>'],
2548 [' ', '<div style=white-space:pre>foo[]</div>'],
2549 [' ', '<div style=white-space:pre>foo&nbsp;[]</div>'],
2550 [' ', '<div style=white-space:pre> foo [] </div>'],
2551
2552 [' ', '<div style=white-space:pre-wrap>foo[]bar</div>'],
2553 [' ', '<div style=white-space:pre-wrap>foo []bar</div>'],
2554 [' ', '<div style=white-space:pre-wrap>foo[] bar</div>'],
2555 [' ', '<div style=white-space:pre-wrap>foo &nbsp;[]bar</div>'],
2556 [' ', '<div style=white-space:pre-wrap>[]foo</div>'],
2557 [' ', '<div style=white-space:pre-wrap>foo[]</div>'],
2558 [' ', '<div style=white-space:pre-wrap>foo&nbsp;[]</div>'],
2559 [' ', '<div style=white-space:pre-wrap> foo [] </div>'],
2560
2561 [' ', '<div style=white-space:pre-line>foo[]bar</div>'],
2562 [' ', '<div style=white-space:pre-line>foo []bar</div>'],
2563 [' ', '<div style=white-space:pre-line>foo[] bar</div>'],
2564 [' ', '<div style=white-space:pre-line>foo &nbsp;[]bar</div>'],
2565 [' ', '<div style=white-space:pre-line>[]foo</div>'],
2566 [' ', '<div style=white-space:pre-line>foo[]</div>'],
2567 [' ', '<div style=white-space:pre-line>foo&nbsp;[]</div>'],
2568 [' ', '<div style=white-space:pre-line> foo [] </div>'],
2569
2570 [' ', '<div style=white-space:nowrap>foo[]bar</div>'],
2571 [' ', '<div style=white-space:nowrap>foo []bar</div>'],
2572 [' ', '<div style=white-space:nowrap>foo[] bar</div>'],
2573 [' ', '<div style=white-space:nowrap>foo &nbsp;[]bar</div>'],
2574 [' ', '<div style=white-space:nowrap>[]foo</div>'],
2575 [' ', '<div style=white-space:nowrap>foo[]</div>'],
2576 [' ', '<div style=white-space:nowrap>foo&nbsp;[]</div>'],
2577 [' ', '<div style=white-space:nowrap> foo [] </div>'],
2578
2579 // End whitespace tests
2580
2581 // Autolinking tests
2582 [' ', 'http://a[]'],
2583 [' ', 'ftp://a[]'],
2584 [' ', 'quasit://a[]'],
2585 [' ', '.x-++-.://a[]'],
2586 [' ', '(http://a)[]'],
2587 [' ', '&lt;http://a>[]'],
2588 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14744
2589 ['! ', '&#x5b;http://a&#x5d;[]'],
2590 ['! ', '&#x7b;http://a&#x7d;[]'],
2591 [' ', 'http://a![]'],
2592 [' ', '!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~http://a!"#$%&amp;\'()*+,-./:; &lt;=>?\^_`|~[]'],
2593 [' ', 'http://a!"\'(),-.:;&lt;>`[]'],
2594 [' ', 'http://a#$%&amp;*+/=?\^_|~[]'],
2595 [' ', 'mailto:a[]'],
2596 [' ', 'a@b[]'],
2597 [' ', 'a@[]'],
2598 [' ', '@b[]'],
2599 [' ', '#@x[]'],
2600 [' ', 'a@.[]'],
2601 [' ', '!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~a@b!"#$%&amp;\'()*+,-./:;&lt;= >?\^_`|~[]'],
2602 [' ', '<b>a@b</b>{}'],
2603 [' ', '<b>a</b><i>@</i><u>b</u>{}'],
2604 [' ', 'a@b<b>[]c</b>'],
2605 [' ', '<p>a@b</p><p>[]c</p>'],
2606 ['a', 'http://a[]'],
2607 ['\t', 'http://a[]'],
2608 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14254
2609 ['!\r', 'http://a[]'],
2610 // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14745
2611 ['!\n', 'http://a[]'],
2612 ['\f', 'http://a[]'],
2613 ['\u00A0', 'http://a[]'],
2614
2615 [' ', 'foo[]'],
2616
2617 'foo[]bar',
2618 'foo&nbsp;[]',
2619 'foo\xa0[]',
2620 '<p>foo[]',
2621 '<p>foo</p>{}',
2622 '<p>[]foo',
2623 '<p>{}foo',
2624 '{}<p>foo',
2625 '<p>foo</p>{}<p>bar</p>',
2626 '<b>foo[]</b>bar',
2627 '<b>foo</b>[]bar',
2628 'foo<b>{}</b>bar',
2629 '<a>foo[]</a>bar',
2630 '<a>foo</a>[]bar',
2631 '<a href=/>foo[]</a>bar',
2632 '<a href=/>foo</a>[]bar',
2633 '<p>fo[o<p>b]ar',
2634 '<p>fo[o<p>bar<p>b]az',
2635 '{}<br>',
2636 '<p>{}<br>',
2637 '<p><span>{}<br></span>',
2638 '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
2639 '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
2640 '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
2641 '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
2642 '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
2643 '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
2644 '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
2645 '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>ba z]</span>quz',
2646
2647
2648 // These are like the corresponding tests in the multitest section, but
2649 // because the selection isn't collapsed, we don't need to do
2650 // multitests to set overrides.
2651 'foo<b>[bar]</b>baz',
2652 'foo<i>[bar]</i>baz',
2653 'foo<s>[bar]</s>baz',
2654 'foo<sub>[bar]</sub>baz',
2655 'foo<sup>[bar]</sup>baz',
2656 'foo<u>[bar]</u>baz',
2657 'foo<a href=http://www.google.com>[bar]</a>baz',
2658 'foo<font face=sans-serif>[bar]</font>baz',
2659 'foo<font size=4>[bar]</font>baz',
2660 'foo<font color=#0000FF>[bar]</font>baz',
2661 'foo<span style=background-color:#00FFFF>[bar]</span>baz',
2662 'foo<a href=http://www.google.com><font color=blue>[bar]</font></a>baz',
2663 'foo<font color=blue><a href=http://www.google.com>[bar]</a></font>baz',
2664 'foo<a href=http://www.google.com><font color=brown>[bar]</font></a>baz' ,
2665 'foo<font color=brown><a href=http://www.google.com>[bar]</a></font>baz' ,
2666 'foo<a href=http://www.google.com><font color=black>[bar]</font></a>baz' ,
2667 'foo<a href=http://www.google.com><u>[bar]</u></a>baz',
2668 'foo<u><a href=http://www.google.com>[bar]</a></u>baz',
2669 'foo<sub><font size=2>[bar]</font></sub>baz',
2670 'foo<font size=2><sub>[bar]</sub></font>baz',
2671 'foo<sub><font size=3>[bar]</font></sub>baz',
2672 'foo<font size=3><sub>[bar]</sub></font>baz',
2673
2674 // Now repeat but with different selections.
2675 '[foo<b>bar]</b>baz',
2676 '[foo<i>bar]</i>baz',
2677 '[foo<s>bar]</s>baz',
2678 '[foo<sub>bar]</sub>baz',
2679 '[foo<sup>bar]</sup>baz',
2680 '[foo<u>bar]</u>baz',
2681 '[foo<a href=http://www.google.com>bar]</a>baz',
2682 '[foo<font face=sans-serif>bar]</font>baz',
2683 '[foo<font size=4>bar]</font>baz',
2684 '[foo<font color=#0000FF>bar]</font>baz',
2685 '[foo<span style=background-color:#00FFFF>bar]</span>baz',
2686 '[foo<a href=http://www.google.com><font color=blue>bar]</font></a>baz',
2687 '[foo<font color=blue><a href=http://www.google.com>bar]</a></font>baz',
2688 '[foo<a href=http://www.google.com><font color=brown>bar]</font></a>baz' ,
2689 '[foo<font color=brown><a href=http://www.google.com>bar]</a></font>baz' ,
2690 '[foo<a href=http://www.google.com><font color=black>bar]</font></a>baz' ,
2691 '[foo<a href=http://www.google.com><u>bar]</u></a>baz',
2692 '[foo<u><a href=http://www.google.com>bar]</a></u>baz',
2693 '[foo<sub><font size=2>bar]</font></sub>baz',
2694 '[foo<font size=2><sub>bar]</sub></font>baz',
2695 '[foo<sub><font size=3>bar]</font></sub>baz',
2696 '[foo<font size=3><sub>bar]</sub></font>baz',
2697
2698 'foo<b>[bar</b>baz]',
2699 'foo<i>[bar</i>baz]',
2700 'foo<s>[bar</s>baz]',
2701 'foo<sub>[bar</sub>baz]',
2702 'foo<sup>[bar</sup>baz]',
2703 'foo<u>[bar</u>baz]',
2704 'foo<a href=http://www.google.com>[bar</a>baz]',
2705 'foo<font face=sans-serif>[bar</font>baz]',
2706 'foo<font size=4>[bar</font>baz]',
2707 'foo<font color=#0000FF>[bar</font>baz]',
2708 'foo<span style=background-color:#00FFFF>[bar</span>baz]',
2709 'foo<a href=http://www.google.com><font color=blue>[bar</font></a>baz]',
2710 'foo<font color=blue><a href=http://www.google.com>[bar</a></font>baz]',
2711 'foo<a href=http://www.google.com><font color=brown>[bar</font></a>baz]' ,
2712 'foo<font color=brown><a href=http://www.google.com>[bar</a></font>baz]' ,
2713 'foo<a href=http://www.google.com><font color=black>[bar</font></a>baz]' ,
2714 'foo<a href=http://www.google.com><u>[bar</u></a>baz]',
2715 'foo<u><a href=http://www.google.com>[bar</a></u>baz]',
2716 'foo<sub><font size=2>[bar</font></sub>baz]',
2717 'foo<font size=2><sub>[bar</sub></font>baz]',
2718 'foo<sub><font size=3>[bar</font></sub>baz]',
2719 'foo<font size=3><sub>[bar</sub></font>baz]',
2720
2721 // https://bugs.webkit.org/show_bug.cgi?id=19702
2722 '<blockquote><font color=blue>[foo]</font></blockquote>',
2723 ],
2724 //@}
2725 insertunorderedlist: [
2726 //@{
2727 'foo[]bar',
2728 'foo[bar]baz',
2729 'foo<br>[bar]',
2730 'f[oo<br>b]ar<br>baz',
2731 '<p>[foo]<br>bar</p>',
2732 '[foo<ol><li>bar]</ol>baz',
2733 'foo<ol><li>[bar</ol>baz]',
2734 '[foo<ul><li>bar]</ul>baz',
2735 'foo<ul><li>[bar</ul>baz]',
2736 'foo<ul><li>[bar</ul><ol><li>baz]</ol>quz',
2737 'foo<ol><li>[bar</ol><ul><li>baz]</ul>quz',
2738
2739 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
2740 '<table><tbody><tr><td>fo[o<td>b]ar<td>baz</table>',
2741 '{<table><tr><td>foo<td>bar<td>baz</table>}',
2742
2743 '<p>foo<p>[bar]<p>baz',
2744 '<p>foo<blockquote>[bar]</blockquote><p>baz',
2745 '<dl><dt>foo<dd>[bar]<dt>baz<dd>quz</dl>',
2746 '<dl><dt>foo<dd>bar<dt>[baz]<dd>quz</dl>',
2747
2748 '<p>[foo<p>bar]<p>baz',
2749 '<p>[foo<blockquote>bar]</blockquote><p>baz',
2750 '<dl><dt>[foo<dd>bar]<dt>baz<dd>quz</dl>',
2751 '<dl><dt>foo<dd>[bar<dt>baz]<dd>quz</dl>',
2752
2753 '<p>[foo<blockquote><p>bar]<p>baz</blockquote>',
2754
2755
2756 // Various <ol> stuff
2757 '<ol><li>foo<li>[bar]<li>baz</ol>',
2758 '<ol><li>foo</ol>[bar]',
2759 '[foo]<ol><li>bar</ol>',
2760 '<ol><li>foo</ol>[bar]<ol><li>baz</ol>',
2761 '<ol><ol><li>[foo]</ol></ol>',
2762 '<ol><li>[foo]<br>bar<li>baz</ol>',
2763 '<ol><li>foo<br>[bar]<li>baz</ol>',
2764 '<ol><li><div>[foo]</div>bar<li>baz</ol>',
2765 '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
2766 '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
2767 '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
2768 '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
2769 '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
2770 '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
2771 '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
2772 '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
2773 '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
2774 '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
2775
2776 // Multiple items at once.
2777 '<ol><li>foo<li>[bar<li>baz]</ol>',
2778 '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
2779 '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
2780 '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
2781
2782 // We probably can't actually get this DOM . . .
2783 '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
2784 '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
2785 '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
2786 '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
2787
2788
2789 // Same stuff but with <ul>
2790 '<ul><li>foo<li>[bar]<li>baz</ul>',
2791 '<ul><li>foo</ul>[bar]',
2792 '[foo]<ul><li>bar</ul>',
2793 '<ul><li>foo</ul>[bar]<ul><li>baz</ul>',
2794 '<ul><ul><li>[foo]</ul></ul>',
2795 '<ul><li>[foo]<br>bar<li>baz</ul>',
2796 '<ul><li>foo<br>[bar]<li>baz</ul>',
2797 '<ul><li><div>[foo]</div>bar<li>baz</ul>',
2798 '<ul><li>foo<ul><li>[bar]<li>baz</ul><li>quz</ul>',
2799 '<ul><li>foo<ul><li>bar<li>[baz]</ul><li>quz</ul>',
2800 '<ul><li>foo</li><ul><li>[bar]<li>baz</ul><li>quz</ul>',
2801 '<ul><li>foo</li><ul><li>bar<li>[baz]</ul><li>quz</ul>',
2802 '<ul><li>[foo]<ul><li>bar</ul><li>baz</ul>',
2803 '<ul><li>[foo]</li><ul><li>bar</ul><li>baz</ul>',
2804 '<ul><li>foo<li>[bar]<ul><li>baz</ul><li>quz</ul>',
2805 '<ul><li>foo<li>[bar]</li><ul><li>baz</ul><li>quz</ul>',
2806 '<ul><li>foo<ul><li>bar<li>baz</ul><li>[quz]</ul>',
2807 '<ul><li>foo</li><ul><li>bar<li>baz</ul><li>[quz]</ul>',
2808
2809 // Multiple items at once.
2810 '<ul><li>foo<li>[bar<li>baz]</ul>',
2811 '<ul><li>[foo<ul><li>bar]</ul><li>baz</ul>',
2812 '<ul><li>foo<ul><li>b[ar</ul><li>b]az</ul>',
2813 '<ul><li>[foo<ul><li>bar</ul><li>baz]</ul><p>extra',
2814
2815 // We probably can't actually get this DOM . . .
2816 '<ul><li>[foo]<ul><li>bar</ul>baz</ul>',
2817 '<ul><li>foo<ul><li>[bar]</ul>baz</ul>',
2818 '<ul><li>foo<ul><li>bar</ul>[baz]</ul>',
2819 '<ul><li>[foo<ul><li>bar]</ul>baz</ul>',
2820
2821
2822 // Mix of <ol> and <ul>
2823 'foo<ol><li>bar</ol><ul><li>[baz]</ul>quz',
2824 'foo<ol><li>bar</ol><ul><li>[baz</ul>quz]',
2825 'foo<ul><li>[bar]</ul><ol><li>baz</ol>quz',
2826 '[foo<ul><li>bar]</ul><ol><li>baz</ol>quz',
2827
2828 // Interaction with indentation
2829 '[foo]<blockquote>bar</blockquote>baz',
2830 'foo<blockquote>[bar]</blockquote>baz',
2831 '[foo<blockquote>bar]</blockquote>baz',
2832 '<ol><li>foo</ol><blockquote>[bar]</blockquote>baz',
2833 '[foo]<blockquote><ol><li>bar</ol></blockquote>baz',
2834 'foo<blockquote>[bar]<br>baz</blockquote>',
2835 '[foo<blockquote>bar]<br>baz</blockquote>',
2836 '<ol><li>foo</ol><blockquote>[bar]<br>baz</blockquote>',
2837
2838 '<p>[foo]<blockquote><p>bar</blockquote><p>baz',
2839 '<p>foo<blockquote><p>[bar]</blockquote><p>baz',
2840 '<p>[foo<blockquote><p>bar]</blockquote><p>baz',
2841 '<ol><li>foo</ol><blockquote><p>[bar]</blockquote><p>baz',
2842
2843 // Attributes
2844 '<ul id=abc><li>foo<li>[bar]<li>baz</ul>',
2845 '<ul style=color:blue><li>foo<li>[bar]<li>baz</ul>',
2846 '<ul style=text-indent:1em><li>foo<li>[bar]<li>baz</ul>',
2847 '<ul id=abc><li>[foo]<li>bar<li>baz</ul>',
2848 '<ul style=color:blue><li>[foo]<li>bar<li>baz</ul>',
2849 '<ul style=text-indent:1em><li>[foo]<li>bar<li>baz</ul>',
2850 '<ul id=abc><li>foo<li>bar<li>[baz]</ul>',
2851 '<ul style=color:blue><li>foo<li>bar<li>[baz]</ul>',
2852 '<ul style=text-indent:1em><li>foo<li>bar<li>[baz]</ul>',
2853
2854 // Whitespace nodes
2855 '<ul><li>foo</ul> <p>[bar]',
2856 '<p>[foo]</p> <ul><li>bar</ul>',
2857 '<ul><li>foo</ul> <p>[bar]</p> <ul><li>baz</ul>',
2858
2859 // https://bugs.webkit.org/show_bug.cgi?id=24167
2860 '{<div style="font-size: 1.3em">1</div><div style="font-size: 1.1em">2</ div>}',
2861 ],
2862 //@}
2863 italic: [
2864 //@{
2865 'foo[]bar',
2866 '<p>[foo</p> <p>bar]</p>',
2867 '<span>[foo</span> <span>bar]</span>',
2868 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
2869 '<p>[foo<p><br><p>bar]',
2870 '<b>foo[]bar</b>',
2871 '<i>foo[]bar</i>',
2872 '<span>foo</span>{}<span>bar</span>',
2873 '<span>foo[</span><span>]bar</span>',
2874 'foo[bar]baz',
2875 'foo[bar<b>baz]qoz</b>quz',
2876 'foo[bar<i>baz]qoz</i>quz',
2877 '{<p><p> <p>foo</p>}',
2878
2879 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
2880 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> ',
2881 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> ',
2882 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> ',
2883 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> ',
2884 '{<table><tr><td>foo<td>bar<td>baz</table>}',
2885
2886 'foo<span style="font-style: italic">[bar]</span>baz',
2887 'foo<address>[bar]</address>baz',
2888 'foo<cite>[bar]</cite>baz',
2889 'foo<dfn>[bar]</dfn>baz',
2890 'foo<em>[bar]</em>baz',
2891 'foo<i>[bar]</i>baz',
2892 'foo<var>[bar]</var>baz',
2893
2894 'foo{<address>bar</address>}baz',
2895 'foo{<cite>bar</cite>}baz',
2896 'foo{<dfn>bar</dfn>}baz',
2897 'foo{<em>bar</em>}baz',
2898 'foo{<i>bar</i>}baz',
2899 'foo{<var>bar</var>}baz',
2900
2901 'foo<address>b[a]r</address>baz',
2902 'foo<cite>b[a]r</cite>baz',
2903 'foo<dfn>b[a]r</dfn>baz',
2904 'foo<em>b[a]r</em>baz',
2905 'foo<i>b[a]r</i>baz',
2906 'foo<var>b[a]r</var>baz',
2907
2908 'fo[o<address>bar</address>b]az',
2909 'fo[o<cite>bar</cite>b]az',
2910 'fo[o<dfn>bar</dfn>b]az',
2911 'fo[o<em>bar</em>b]az',
2912 'fo[o<i>bar</i>b]az',
2913 'fo[o<var>bar</var>b]az',
2914
2915 'foo[<address>bar</address>baz]',
2916 'foo[<cite>bar</cite>baz]',
2917 'foo[<dfn>bar</dfn>baz]',
2918 'foo[<em>bar</em>baz]',
2919 'foo[<i>bar</i>baz]',
2920 'foo[<var>bar</var>baz]',
2921
2922 '[foo<address>bar</address>]baz',
2923 '[foo<cite>bar</cite>]baz',
2924 '[foo<dfn>bar</dfn>]baz',
2925 '[foo<em>bar</em>]baz',
2926 '[foo<i>bar</i>]baz',
2927 '[foo<var>bar</var>]baz',
2928
2929 'foo<span style="font-style: italic">[bar]</span>baz',
2930 'foo<span style="font-style: oblique">[bar]</span>baz',
2931 'foo<span style="font-style: oblique">b[a]r</span>baz',
2932
2933 '<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>',
2934 '<i><p>foo[<b>bar</b>}</p><p>baz</p></i>',
2935 'foo [bar <b>baz] qoz</b> quz sic',
2936 'foo bar <b>baz [qoz</b> quz] sic',
2937 'foo [bar <i>baz] qoz</i> quz sic',
2938 'foo bar <i>baz [qoz</i> quz] sic',
2939
2940 // Tests for queryCommandIndeterm() and queryCommandState()
2941 'fo[o<i>b]ar</i>baz',
2942 'foo<i>ba[r</i>b]az',
2943 'fo[o<i>bar</i>b]az',
2944 'foo[<i>b]ar</i>baz',
2945 'foo<i>ba[r</i>]baz',
2946 'foo[<i>bar</i>]baz',
2947 'foo<i>[bar]</i>baz',
2948 'foo{<i>bar</i>}baz',
2949 'fo[o<span style=font-style:italic>b]ar</span>baz',
2950 'fo[o<span style=font-style:oblique>b]ar</span>baz',
2951 '<span style=font-style:italic>fo[o</span><span style=font-style:oblique >b]ar</span>',
2952 '<span style=font-style:oblique>fo[o</span><span style=font-style:italic >b]ar</span>',
2953 '<i>fo[o</i><address>b]ar</address>',
2954 ],
2955 //@}
2956 justifycenter: [
2957 //@{
2958 'foo[]bar<p>extra',
2959 '<span>foo</span>{}<span>bar</span><p>extra',
2960 '<span>foo[</span><span>]bar</span><p>extra',
2961 'foo[bar]baz<p>extra',
2962 'foo[bar<b>baz]qoz</b>quz<p>extra',
2963 '<p>foo[]bar<p>extra',
2964 '<p>foo[bar]baz<p>extra',
2965 '<h1>foo[bar]baz</h1><p>extra',
2966 '<pre>foo[bar]baz</pre><p>extra',
2967 '<xmp>foo[bar]baz</xmp><p>extra',
2968 '<center><p>[foo]<p>bar</center><p>extra',
2969 '<center><p>[foo<p>bar]</center><p>extra',
2970
2971 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
2972 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> <p>extra',
2973 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> <p>extra',
2974 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> <p>extra',
2975 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> <p>extra',
2976 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
2977
2978 '<table align=center><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra' ,
2979 '<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<t d>baz</table><p>extra',
2980 '<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<t d>baz</table><p>extra',
2981 '<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<t d>baz</table><p>extra',
2982 '<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<t d>baz</table><p>extra',
2983 '{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra',
2984
2985 '<table><tbody align=center><tr><td>foo<td>b[a]r<td>baz</table><p>extra' ,
2986 '<table><tbody align=center><tr data-start=1 data-end=2><td>foo<td>bar<t d>baz</table><p>extra',
2987 '<table><tbody align=center><tr data-start=0 data-end=2><td>foo<td>bar<t d>baz</table><p>extra',
2988 '<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<t d>baz</table><p>extra',
2989 '<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<t d>baz</table><p>extra',
2990 '{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra' ,
2991
2992 '<table><tbody><tr align=center><td>foo<td>b[a]r<td>baz</table><p>extra' ,
2993 '<table><tbody><tr align=center data-start=1 data-end=2><td>foo<td>bar<t d>baz</table><p>extra',
2994 '<table><tbody><tr align=center data-start=0 data-end=2><td>foo<td>bar<t d>baz</table><p>extra',
2995 '<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<t d>baz</table><p>extra',
2996 '<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<t d>baz</table><p>extra',
2997 '{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra',
2998
2999 '<div align=center><p>[foo]<p>bar</div><p>extra',
3000 '<div align=center><p>[foo<p>bar}</div><p>extra',
3001 '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
3002 '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
3003
3004 '<div align=justify><p>[foo]<p>bar</div><p>extra',
3005 '<div align=justify><p>[foo<p>bar}</div><p>extra',
3006 '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
3007 '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
3008
3009 '<div align=left><p>[foo]<p>bar</div><p>extra',
3010 '<div align=left><p>[foo<p>bar}</div><p>extra',
3011 '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
3012 '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
3013
3014 '<div align=right><p>[foo]<p>bar</div><p>extra',
3015 '<div align=right><p>[foo<p>bar}</div><p>extra',
3016 '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
3017 '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
3018
3019 '<center>foo</center>[bar]<p>extra',
3020 '[foo]<center>bar</center><p>extra',
3021 '<center>foo</center>[bar]<center>baz</center><p>extra',
3022 '<div align=center>foo</div>[bar]<p>extra',
3023 '[foo]<div align=center>bar</div><p>extra',
3024 '<div align=center>foo</div>[bar]<div align=center>baz</div><p>extra',
3025 '<div align=center><p>foo</div><p>[bar]<p>extra',
3026 '<p>[foo]<div align=center><p>bar</div><p>extra',
3027 '<div align=center><p>foo</div><p>[bar]<div align=center><p>baz</div><p> extra',
3028 '<div style=text-align:center>foo</div>[bar]<p>extra',
3029 '[foo]<div style=text-align:center>bar</div><p>extra',
3030 '<div style=text-align:center>foo</div>[bar]<div style=text-align:center >baz</div><p>extra',
3031 '<div style=text-align:center><p>foo</div><p>[bar]<p>extra',
3032 '<p>[foo]<div style=text-align:center><p>bar</div><p>extra',
3033 '<div style=text-align:center><p>foo</div><p>[bar]<div style=text-align: center><p>baz</div><p>extra',
3034 '<p align=center>foo<p>[bar]<p>extra',
3035 '<p>[foo]<p align=center>bar<p>extra',
3036 '<p align=center>foo<p>[bar]<p align=center>baz<p>extra',
3037
3038 '<center>[foo</center>bar]<p>extra',
3039 '<center>fo[o</center>b]ar<p>extra',
3040 '<div align=center>[foo</div>bar]<p>extra',
3041 '<div align=center>fo[o</div>b]ar<p>extra',
3042 '<div style=text-align:center>[foo</div>bar]<p>extra',
3043 '<div style=text-align:center>fo[o</div>b]ar<p>extra',
3044 '<span style=text-align:center>[foo]</span><p>extra',
3045 '<span style=text-align:center>f[o]o</span><p>extra',
3046
3047 '<div style=text-align:center>[foo<div style=text-align:left contentedit able=false>bar</div>baz]</div><p>extra',
3048
3049 '<div align=nonsense><p>[foo]</div><p>extra',
3050 '<div style=text-align:inherit><p>[foo]</div><p>extra',
3051 '<quasit align=right><p>[foo]</p></quasit><p>extra',
3052
3053 '<div align=center>{<div align=left>foo</div>}</div>',
3054 '<div align=left>{<div align=center>foo</div>}</div>',
3055 '<div align=center>{<div align=left>foo</div>bar}</div>',
3056 '<div align=left>{<div align=center>foo</div>bar}</div>',
3057 '<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</d iv>',
3058 '<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</d iv>',
3059 '<div align=center>{<div align=left>foo</div><!-- bar -->}</div>',
3060 '<div align=left>{<div align=center>foo</div><!-- bar -->}</div>',
3061
3062 '<div style=text-align:start>[foo]</div><p>extra',
3063 '<div style=text-align:end>[foo]</div><p>extra',
3064 '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
3065 '<div dir=rtl style=text-align:end>[foo]</div><p>extra',
3066
3067 // Whitespace nodes
3068 '<div style=text-align:center><p>foo</div> <p>[bar]',
3069 '<div align=center><p>foo</div> <p>[bar]',
3070 '<center><p>foo</center> <p>[bar]',
3071 '<p>[foo]</p> <div style=text-align:center><p>bar</div>',
3072 '<p>[foo]</p> <div align=center><p>bar</div>',
3073 '<p>[foo]</p> <center><p>bar</center>',
3074 '<div style=text-align:center><p>foo</div> <p>[bar]</p> <div style=text- align:center><p>baz</div>',
3075 '<div align=center><p>foo</div> <p>[bar]</p> <div align=center><p>baz</d iv>',
3076 '<center><p>foo</center> <p>[bar]</p> <center><p>baz</center>',
3077 ],
3078 //@}
3079 justifyfull: [
3080 //@{
3081 'foo[]bar<p>extra',
3082 '<span>foo</span>{}<span>bar</span><p>extra',
3083 '<span>foo[</span><span>]bar</span><p>extra',
3084 'foo[bar]baz<p>extra',
3085 'foo[bar<b>baz]qoz</b>quz<p>extra',
3086 '<p>foo[]bar<p>extra',
3087 '<p>foo[bar]baz<p>extra',
3088 '<h1>foo[bar]baz</h1><p>extra',
3089 '<pre>foo[bar]baz</pre><p>extra',
3090 '<xmp>foo[bar]baz</xmp><p>extra',
3091 '<center><p>[foo]<p>bar</center><p>extra',
3092 '<center><p>[foo<p>bar]</center><p>extra',
3093
3094 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3095 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> <p>extra',
3096 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> <p>extra',
3097 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> <p>extra',
3098 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> <p>extra',
3099 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3100
3101 '<table align=justify><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra ',
3102 '<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar< td>baz</table><p>extra',
3103 '<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar< td>baz</table><p>extra',
3104 '<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar< td>baz</table><p>extra',
3105 '<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar< td>baz</table><p>extra',
3106 '{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3107
3108 '<table><tbody align=justify><tr><td>foo<td>b[a]r<td>baz</table><p>extra ',
3109 '<table><tbody align=justify><tr data-start=1 data-end=2><td>foo<td>bar< td>baz</table><p>extra',
3110 '<table><tbody align=justify><tr data-start=0 data-end=2><td>foo<td>bar< td>baz</table><p>extra',
3111 '<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar< td>baz</table><p>extra',
3112 '<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar< td>baz</table><p>extra',
3113 '{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra ',
3114
3115 '<table><tbody><tr align=justify><td>foo<td>b[a]r<td>baz</table><p>extra ',
3116 '<table><tbody><tr align=justify data-start=1 data-end=2><td>foo<td>bar< td>baz</table><p>extra',
3117 '<table><tbody><tr align=justify data-start=0 data-end=2><td>foo<td>bar< td>baz</table><p>extra',
3118 '<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar< td>baz</table><p>extra',
3119 '<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar< td>baz</table><p>extra',
3120 '{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra',
3121
3122 '<div align=center><p>[foo]<p>bar</div><p>extra',
3123 '<div align=center><p>[foo<p>bar}</div><p>extra',
3124 '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
3125 '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
3126
3127 '<div align=justify><p>[foo]<p>bar</div><p>extra',
3128 '<div align=justify><p>[foo<p>bar}</div><p>extra',
3129 '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
3130 '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
3131
3132 '<div align=left><p>[foo]<p>bar</div><p>extra',
3133 '<div align=left><p>[foo<p>bar}</div><p>extra',
3134 '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
3135 '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
3136
3137 '<div align=right><p>[foo]<p>bar</div><p>extra',
3138 '<div align=right><p>[foo<p>bar}</div><p>extra',
3139 '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
3140 '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
3141
3142 '<div align=justify>foo</div>[bar]<p>extra',
3143 '[foo]<div align=justify>bar</div><p>extra',
3144 '<div align=justify>foo</div>[bar]<div align=justify>baz</div><p>extra',
3145 '<div align=justify><p>foo</div><p>[bar]<p>extra',
3146 '<p>[foo]<div align=justify><p>bar</div><p>extra',
3147 '<div align=justify><p>foo</div><p>[bar]<div align=justify><p>baz</div>< p>extra',
3148 '<div style=text-align:justify>foo</div>[bar]<p>extra',
3149 '[foo]<div style=text-align:justify>bar</div><p>extra',
3150 '<div style=text-align:justify>foo</div>[bar]<div style=text-align:justi fy>baz</div><p>extra',
3151 '<div style=text-align:justify><p>foo</div><p>[bar]<p>extra',
3152 '<p>[foo]<div style=text-align:justify><p>bar</div><p>extra',
3153 '<div style=text-align:justify><p>foo</div><p>[bar]<div style=text-align :justify><p>baz</div><p>extra',
3154 '<p align=justify>foo<p>[bar]<p>extra',
3155 '<p>[foo]<p align=justify>bar<p>extra',
3156 '<p align=justify>foo<p>[bar]<p align=justify>baz<p>extra',
3157
3158 '<div align=justify>[foo</div>bar]<p>extra',
3159 '<div align=justify>fo[o</div>b]ar<p>extra',
3160 '<div style=text-align:justify>[foo</div>bar]<p>extra',
3161 '<div style=text-align:justify>fo[o</div>b]ar<p>extra',
3162 '<span style=text-align:justify>[foo]</span><p>extra',
3163 '<span style=text-align:justify>f[o]o</span><p>extra',
3164
3165 '<div style=text-align:justify>[foo<div style=text-align:left contentedi table=false>bar</div>baz]</div><p>extra',
3166
3167 '<div align=nonsense><p>[foo]</div><p>extra',
3168 '<div style=text-align:inherit><p>[foo]</div><p>extra',
3169 '<quasit align=center><p>[foo]</p></quasit><p>extra',
3170
3171 '<div style=text-align:start>[foo]</div><p>extra',
3172 '<div style=text-align:end>[foo]</div><p>extra',
3173 '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
3174 '<div dir=rtl style=text-align:end>[foo]</div><p>extra',
3175
3176 // Whitespace nodes
3177 '<div style=text-align:justify><p>foo</div> <p>[bar]',
3178 '<div align=justify><p>foo</div> <p>[bar]',
3179 '<p>[foo]</p> <div style=text-align:justify><p>bar</div>',
3180 '<p>[foo]</p> <div align=justify><p>bar</div>',
3181 '<div style=text-align:justify><p>foo</div> <p>[bar]</p> <div style=text -align:justify><p>baz</div>',
3182 '<div align=justify><p>foo</div> <p>[bar]</p> <div align=justify><p>baz< /div>',
3183 ],
3184 //@}
3185 justifyleft: [
3186 //@{
3187 'foo[]bar<p>extra',
3188 '<span>foo</span>{}<span>bar</span><p>extra',
3189 '<span>foo[</span><span>]bar</span><p>extra',
3190 'foo[bar]baz<p>extra',
3191 'foo[bar<b>baz]qoz</b>quz<p>extra',
3192 '<p>foo[]bar<p>extra',
3193 '<p>foo[bar]baz<p>extra',
3194 '<h1>foo[bar]baz</h1><p>extra',
3195 '<pre>foo[bar]baz</pre><p>extra',
3196 '<xmp>foo[bar]baz</xmp><p>extra',
3197 '<center><p>[foo]<p>bar</center><p>extra',
3198 '<center><p>[foo<p>bar]</center><p>extra',
3199
3200 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3201 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> <p>extra',
3202 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> <p>extra',
3203 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> <p>extra',
3204 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> <p>extra',
3205 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3206
3207 '<table align=left><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3208 '<table align=left><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td> baz</table><p>extra',
3209 '<table align=left><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td> baz</table><p>extra',
3210 '<table align=left><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td> baz</table><p>extra',
3211 '<table align=left data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td> baz</table><p>extra',
3212 '{<table align=left><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3213
3214 '<table><tbody align=left><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3215 '<table><tbody align=left><tr data-start=1 data-end=2><td>foo<td>bar<td> baz</table><p>extra',
3216 '<table><tbody align=left><tr data-start=0 data-end=2><td>foo<td>bar<td> baz</table><p>extra',
3217 '<table><tbody align=left data-start=0 data-end=1><tr><td>foo<td>bar<td> baz</table><p>extra',
3218 '<table data-start=0 data-end=1><tbody align=left><tr><td>foo<td>bar<td> baz</table><p>extra',
3219 '{<table><tbody align=left><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3220
3221 '<table><tbody><tr align=left><td>foo<td>b[a]r<td>baz</table><p>extra',
3222 '<table><tbody><tr align=left data-start=1 data-end=2><td>foo<td>bar<td> baz</table><p>extra',
3223 '<table><tbody><tr align=left data-start=0 data-end=2><td>foo<td>bar<td> baz</table><p>extra',
3224 '<table><tbody data-start=0 data-end=1><tr align=left><td>foo<td>bar<td> baz</table><p>extra',
3225 '<table data-start=0 data-end=1><tbody><tr align=left><td>foo<td>bar<td> baz</table><p>extra',
3226 '{<table><tr align=left><td>foo<td>bar<td>baz</table>}<p>extra',
3227
3228 '<div align=center><p>[foo]<p>bar</div><p>extra',
3229 '<div align=center><p>[foo<p>bar}</div><p>extra',
3230 '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
3231 '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
3232
3233 '<div align=justify><p>[foo]<p>bar</div><p>extra',
3234 '<div align=justify><p>[foo<p>bar}</div><p>extra',
3235 '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
3236 '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
3237
3238 '<div align=left><p>[foo]<p>bar</div><p>extra',
3239 '<div align=left><p>[foo<p>bar}</div><p>extra',
3240 '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
3241 '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
3242
3243 '<div align=right><p>[foo]<p>bar</div><p>extra',
3244 '<div align=right><p>[foo<p>bar}</div><p>extra',
3245 '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
3246 '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
3247
3248 '<div align=left>foo</div>[bar]<p>extra',
3249 '[foo]<div align=left>bar</div><p>extra',
3250 '<div align=left>foo</div>[bar]<div align=left>baz</div><p>extra',
3251 '<div align=left><p>foo</div><p>[bar]<p>extra',
3252 '<p>[foo]<div align=left><p>bar</div><p>extra',
3253 '<div align=left><p>foo</div><p>[bar]<div align=left><p>baz</div><p>extr a',
3254 '<div style=text-align:left>foo</div>[bar]<p>extra',
3255 '[foo]<div style=text-align:left>bar</div><p>extra',
3256 '<div style=text-align:left>foo</div>[bar]<div style=text-align:left>baz </div><p>extra',
3257 '<div style=text-align:left><p>foo</div><p>[bar]<p>extra',
3258 '<p>[foo]<div style=text-align:left><p>bar</div><p>extra',
3259 '<div style=text-align:left><p>foo</div><p>[bar]<div style=text-align:le ft><p>baz</div><p>extra',
3260 '<p align=left>foo<p>[bar]<p>extra',
3261 '<p>[foo]<p align=left>bar<p>extra',
3262 '<p align=left>foo<p>[bar]<p align=left>baz<p>extra',
3263
3264 '<div align=left>[foo</div>bar]<p>extra',
3265 '<div align=left>fo[o</div>b]ar<p>extra',
3266 '<div style=text-align:left>[foo</div>bar]<p>extra',
3267 '<div style=text-align:left>fo[o</div>b]ar<p>extra',
3268 '<span style=text-align:left>[foo]</span><p>extra',
3269 '<span style=text-align:left>f[o]o</span><p>extra',
3270
3271 '<div style=text-align:left>[foo<div style=text-align:left contenteditab le=false>bar</div>baz]</div><p>extra',
3272
3273 '<div align=nonsense><p>[foo]</div><p>extra',
3274 '<div style=text-align:inherit><p>[foo]</div><p>extra',
3275 '<quasit align=center><p>[foo]</p></quasit><p>extra',
3276
3277 '<div style=text-align:start>[foo]</div><p>extra',
3278 '<div style=text-align:end>[foo]</div><p>extra',
3279 '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
3280 '<div dir=rtl style=text-align:end>[foo]</div><p>extra',
3281
3282 // Whitespace nodes
3283 '<div style=text-align:left><p>foo</div> <p>[bar]',
3284 '<div align=left><p>foo</div> <p>[bar]',
3285 '<p>[foo]</p> <div style=text-align:left><p>bar</div>',
3286 '<p>[foo]</p> <div align=left><p>bar</div>',
3287 '<div style=text-align:left><p>foo</div> <p>[bar]</p> <div style=text-al ign:left><p>baz</div>',
3288 '<div align=left><p>foo</div> <p>[bar]</p> <div align=left><p>baz</div>' ,
3289 ],
3290 //@}
3291 justifyright: [
3292 //@{
3293 'foo[]bar<p>extra',
3294 '<span>foo</span>{}<span>bar</span><p>extra',
3295 '<span>foo[</span><span>]bar</span><p>extra',
3296 'foo[bar]baz<p>extra',
3297 'foo[bar<b>baz]qoz</b>quz<p>extra',
3298 '<p>foo[]bar<p>extra',
3299 '<p>foo[bar]baz<p>extra',
3300 '<h1>foo[bar]baz</h1><p>extra',
3301 '<pre>foo[bar]baz</pre><p>extra',
3302 '<xmp>foo[bar]baz</xmp><p>extra',
3303 '<center><p>[foo]<p>bar</center><p>extra',
3304 '<center><p>[foo<p>bar]</center><p>extra',
3305
3306 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3307 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> <p>extra',
3308 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> <p>extra',
3309 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> <p>extra',
3310 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> <p>extra',
3311 '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3312
3313 '<table align=right><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3314 '<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td >baz</table><p>extra',
3315 '<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td >baz</table><p>extra',
3316 '<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td >baz</table><p>extra',
3317 '<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td >baz</table><p>extra',
3318 '{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3319
3320 '<table><tbody align=right><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
3321 '<table><tbody align=right><tr data-start=1 data-end=2><td>foo<td>bar<td >baz</table><p>extra',
3322 '<table><tbody align=right><tr data-start=0 data-end=2><td>foo<td>bar<td >baz</table><p>extra',
3323 '<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td >baz</table><p>extra',
3324 '<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td >baz</table><p>extra',
3325 '{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra',
3326
3327 '<table><tbody><tr align=right><td>foo<td>b[a]r<td>baz</table><p>extra',
3328 '<table><tbody><tr align=right data-start=1 data-end=2><td>foo<td>bar<td >baz</table><p>extra',
3329 '<table><tbody><tr align=right data-start=0 data-end=2><td>foo<td>bar<td >baz</table><p>extra',
3330 '<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td >baz</table><p>extra',
3331 '<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td >baz</table><p>extra',
3332 '{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra',
3333
3334 '<div align=center><p>[foo]<p>bar</div><p>extra',
3335 '<div align=center><p>[foo<p>bar}</div><p>extra',
3336 '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
3337 '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
3338
3339 '<div align=justify><p>[foo]<p>bar</div><p>extra',
3340 '<div align=justify><p>[foo<p>bar}</div><p>extra',
3341 '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
3342 '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
3343
3344 '<div align=left><p>[foo]<p>bar</div><p>extra',
3345 '<div align=left><p>[foo<p>bar}</div><p>extra',
3346 '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
3347 '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
3348
3349 '<div align=right><p>[foo]<p>bar</div><p>extra',
3350 '<div align=right><p>[foo<p>bar}</div><p>extra',
3351 '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
3352 '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
3353
3354 '<div align=right>foo</div>[bar]<p>extra',
3355 '[foo]<div align=right>bar</div><p>extra',
3356 '<div align=right>foo</div>[bar]<div align=right>baz</div><p>extra',
3357 '<div align=right><p>foo</div><p>[bar]<p>extra',
3358 '<p>[foo]<div align=right><p>bar</div><p>extra',
3359 '<div align=right><p>foo</div><p>[bar]<div align=right><p>baz</div><p>ex tra',
3360 '<div style=text-align:right>foo</div>[bar]<p>extra',
3361 '[foo]<div style=text-align:right>bar</div><p>extra',
3362 '<div style=text-align:right>foo</div>[bar]<div style=text-align:right>b az</div><p>extra',
3363 '<div style=text-align:right><p>foo</div><p>[bar]<p>extra',
3364 '<p>[foo]<div style=text-align:right><p>bar</div><p>extra',
3365 '<div style=text-align:right><p>foo</div><p>[bar]<div style=text-align:r ight><p>baz</div><p>extra',
3366 '<p align=right>foo<p>[bar]<p>extra',
3367 '<p>[foo]<p align=right>bar<p>extra',
3368 '<p align=right>foo<p>[bar]<p align=right>baz<p>extra',
3369
3370 '<div align=right>[foo</div>bar]<p>extra',
3371 '<div align=right>fo[o</div>b]ar<p>extra',
3372 '<div style=text-align:right>[foo</div>bar]<p>extra',
3373 '<div style=text-align:right>fo[o</div>b]ar<p>extra',
3374 '<span style=text-align:right>[foo]</span><p>extra',
3375 '<span style=text-align:right>f[o]o</span><p>extra',
3376
3377 '<div style=text-align:right>[foo<div style=text-align:left contentedita ble=false>bar</div>baz]</div><p>extra',
3378
3379 '<div align=nonsense><p>[foo]</div><p>extra',
3380 '<div style=text-align:inherit><p>[foo]</div><p>extra',
3381 '<quasit align=center><p>[foo]</p></quasit><p>extra',
3382
3383 '<div style=text-align:start>[foo]</div><p>extra',
3384 '<div style=text-align:end>[foo]</div><p>extra',
3385 '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
3386 '<div dir=rtl style=text-align:end>[foo]</div><p>extra',
3387
3388 // Whitespace nodes
3389 '<div style=text-align:right><p>foo</div> <p>[bar]',
3390 '<div align=right><p>foo</div> <p>[bar]',
3391 '<p>[foo]</p> <div style=text-align:right><p>bar</div>',
3392 '<p>[foo]</p> <div align=right><p>bar</div>',
3393 '<div style=text-align:right><p>foo</div> <p>[bar]</p> <div style=text-a lign:right><p>baz</div>',
3394 '<div align=right><p>foo</div> <p>[bar]</p> <div align=right><p>baz</div >',
3395 ],
3396 //@}
3397 outdent: [
3398 //@{
3399 // These mimic existing indentation in various browsers, to see how
3400 // they cope with outdenting various things. This is spec, Gecko
3401 // non-CSS, and Opera:
3402 '<blockquote><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
3403 '<blockquote><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
3404 '<blockquote><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
3405 '<blockquote><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
3406
3407 // IE:
3408 '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar]</p><p>baz< /p></blockquote><p>extra',
3409 '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar</p><p>b]az< /p></blockquote><p>extra',
3410 '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar]</p></block quote><p>baz</p><p>extra',
3411 '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar</p></blockq uote><p>b]az</p><p>extra',
3412
3413 // Firefox CSS mode:
3414 '<p style="margin-left: 40px">foo[bar]</p><p style="margin-left: 40px">b az</p><p>extra',
3415 '<p style="margin-left: 40px">foo[bar</p><p style="margin-left: 40px">b] az</p><p>extra',
3416 '<p style="margin-left: 40px">foo[bar]</p><p>baz</p><p>extra',
3417 '<p style="margin-left: 40px">foo[bar</p><p>b]az</p><p>extra',
3418
3419 // WebKit:
3420 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
3421 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
3422 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
3423 '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
3424
3425 // Now let's try nesting lots of stuff and see what happens.
3426 '<blockquote><blockquote>foo[bar]baz</blockquote></blockquote>',
3427 '<blockquote><blockquote data-abc=def>foo[bar]baz</blockquote></blockquo te>',
3428 '<blockquote data-abc=def><blockquote>foo[bar]baz</blockquote></blockquo te>',
3429 '<blockquote><div>foo[bar]baz</div></blockquote>',
3430 '<blockquote><div id=abc>foo[bar]baz</div></blockquote>',
3431 '<blockquote id=abc>foo[bar]baz</blockquote>',
3432 '<blockquote style="color: blue">foo[bar]baz</blockquote>',
3433
3434 '<blockquote><blockquote><p>foo[bar]<p>baz</blockquote></blockquote>',
3435 '<blockquote><blockquote data-abc=def><p>foo[bar]<p>baz</blockquote></bl ockquote>',
3436 '<blockquote data-abc=def><blockquote><p>foo[bar]<p>baz</blockquote></bl ockquote>',
3437 '<blockquote><div><p>foo[bar]<p>baz</div></blockquote>',
3438 '<blockquote><div id=abc><p>foo[bar]<p>baz</div></blockquote>',
3439 '<blockquote id=abc><p>foo[bar]<p>baz</blockquote>',
3440 '<blockquote style="color: blue"><p>foo[bar]<p>baz</blockquote>',
3441
3442 '<blockquote><p><b>foo[bar]</b><p>baz</blockquote>',
3443 '<blockquote><p><strong>foo[bar]</strong><p>baz</blockquote>',
3444 '<blockquote><p><span>foo[bar]</span><p>baz</blockquote>',
3445 '<blockquote><blockquote style="color: blue"><p>foo[bar]</blockquote><p> baz</blockquote>',
3446 '<blockquote style="color: blue"><blockquote><p>foo[bar]</blockquote><p> baz</blockquote>',
3447
3448 // Lists!
3449 '<ol><li>foo<li>[bar]<li>baz</ol>',
3450 '<ol data-start=1 data-end=2><li>foo<li>bar<li>baz</ol>',
3451 '<ol><li>foo</ol>[bar]',
3452 '<ol><li>[foo]<br>bar<li>baz</ol>',
3453 '<ol><li>foo<br>[bar]<li>baz</ol>',
3454 '<ol><li><div>[foo]</div>bar<li>baz</ol>',
3455 '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
3456 '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
3457 '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
3458 '<ol><li>foo</li><ol data-start=0 data-end=1><li>bar<li>baz</ol><li>quz< /ol>',
3459 '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
3460 '<ol><li>foo</li><ol data-start=1 data-end=2><li>bar<li>baz</ol><li>quz< /ol>',
3461 '<ol><li>foo<ol><li>b[a]r</ol><li>baz</ol>',
3462 '<ol><li>foo</li><ol><li>b[a]r</ol><li>baz</ol>',
3463 '<ol><li>foo{<ol><li>bar</ol>}<li>baz</ol>',
3464 '<ol><li>foo</li>{<ol><li>bar</ol>}<li>baz</ol>',
3465 '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
3466 '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
3467 '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
3468 '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
3469 '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
3470 '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
3471
3472 // Try outdenting multiple items at once.
3473 '<ol><li>foo<li>b[ar<li>baz]</ol>',
3474 '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
3475 '<ol><li>[foo</li><ol><li>bar]</ol><li>baz</ol>',
3476 '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
3477 '<ol><li>foo</li><ol><li>b[ar</ol><li>b]az</ol>',
3478 '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
3479 '<ol><li>[foo</li><ol><li>bar</ol><li>baz]</ol><p>extra',
3480
3481 // We probably can't actually get this DOM . . .
3482 '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
3483 '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
3484 '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
3485 '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
3486
3487 // Attribute handling on lists
3488 'foo<ol start=5><li>[bar]</ol>baz',
3489 'foo<ol id=abc><li>[bar]</ol>baz',
3490 'foo<ol style=color:blue><li>[bar]</ol>baz',
3491 'foo<ol><li value=5>[bar]</ol>baz',
3492 'foo<ol><li id=abc>[bar]</ol>baz',
3493 'foo<ol><li style=color:blue>[bar]</ol>baz',
3494 '<ol><li>foo</li><ol><li value=5>[bar]</ol></ol>',
3495 '<ul><li>foo</li><ol><li value=5>[bar]</ol></ul>',
3496 '<ol><li>foo</li><ol start=5><li>[bar]</ol><li>baz</ol>',
3497 '<ol><li>foo</li><ol id=abc><li>[bar]</ol><li>baz</ol>',
3498 '<ol><li>foo</li><ol style=color:blue><li>[bar]</ol><li>baz</ol>',
3499 '<ol><li>foo</li><ol style=text-indent:1em><li>[bar]</ol><li>baz</ol>',
3500 '<ol><li>foo</li><ol start=5><li>[bar<li>baz]</ol><li>quz</ol>',
3501 '<ol><li>foo</li><ol id=abc><li>[bar<li>baz]</ol><li>quz</ol>',
3502 '<ol><li>foo</li><ol style=color:blue><li>[bar<li>baz]</ol><li>quz</ol>' ,
3503 '<ol><li>foo</li><ol style=text-indent:1em><li>[bar<li>baz]</ol><li>quz< /ol>',
3504
3505 // List inside indentation element
3506 '<blockquote><ol><li>[foo]</ol></blockquote><p>extra',
3507 '<blockquote>foo<ol><li>[bar]</ol>baz</blockquote><p>extra',
3508 '<blockquote><ol><li>foo</li><ol><li>[bar]</ol><li>baz</ol></blockquote> <p>extra',
3509
3510 '<ol><li><h1>[foo]</h1></ol>',
3511 '<ol><li><xmp>[foo]</xmp></li></ol>',
3512 '<blockquote><ol><li>foo<div><ol><li>[bar]</ol></div><li>baz</ol></block quote>',
3513
3514 // Whitespace nodes
3515 '<blockquote> <p>[foo]</p></blockquote>',
3516 '<blockquote><p>[foo]</p> </blockquote>',
3517 '<blockquote> <p>[foo]</p> </blockquote>',
3518 '<ol> <li>[foo]</li></ol>',
3519 '<ol><li>[foo]</li> </ol>',
3520 '<ol> <li>[foo]</li> </ol>',
3521 '<ul> <li>[foo]</li></ul>',
3522 '<ul><li>[foo]</li> </ul>',
3523 '<ul> <li>[foo]</li> </ul>',
3524 '<blockquote> <p>[foo]</p> <p>bar</p> <p>baz</p></blockquote>',
3525 '<blockquote> <p>foo</p> <p>[bar]</p> <p>baz</p></blockquote>',
3526 '<blockquote> <p>foo</p> <p>bar</p> <p>[baz]</p></blockquote>',
3527 '<ol> <li>[foo]</li> <li>bar</li> <li>baz</li></ol>',
3528 '<ol> <li>foo</li> <li>[bar]</li> <li>baz</li></ol>',
3529 '<ol> <li>foo</li> <li>bar</li> <li>[baz]</li></ol>',
3530 '<ul> <li>[foo]</li> <li>bar</li> <li>baz</li></ul>',
3531 '<ul> <li>foo</li> <li>[bar]</li> <li>baz</li></ul>',
3532 '<ul> <li>foo</li> <li>bar</li> <li>[baz]</li></ul>',
3533
3534 // https://bugs.webkit.org/show_bug.cgi?id=24249
3535 '<ol><li>[]a<table><tr><td><br></table></ol>',
3536 // https://bugs.webkit.org/show_bug.cgi?id=43447
3537 '<blockquote><span>foo<br>[bar]</span></blockquote>',
3538 ],
3539 //@}
3540 removeformat: [
3541 //@{
3542 'foo[]bar',
3543 '<span>foo</span>{}<span>bar</span>',
3544 '<span>foo[</span><span>]bar</span>',
3545 '[foo<b>bar</b>baz]',
3546 'foo[<b>bar</b>baz]',
3547 'foo[<b>bar</b>]baz',
3548 'foo<b>[bar]</b>baz',
3549 'foo<b>b[a]r</b>baz',
3550 '[foo<strong>bar</strong>baz]',
3551 '[foo<span style="font-weight: bold">bar</span>baz]',
3552 'foo<span style="font-weight: bold">b[a]r</span>baz',
3553 '[foo<span style="font-variant: small-caps">bar</span>baz]',
3554 'foo<span style="font-variant: small-caps">b[a]r</span>baz',
3555 '[foo<b id=foo>bar</b>baz]',
3556 'foo<b id=foo>b[a]r</b>baz',
3557
3558 // HTML has lots of inline elements, doesn't it?
3559 '[foo<a>bar</a>baz]',
3560 'foo<a>b[a]r</a>baz',
3561 '[foo<a href=foo>bar</a>baz]',
3562 'foo<a href=foo>b[a]r</a>baz',
3563 '[foo<abbr>bar</abbr>baz]',
3564 'foo<abbr>b[a]r</abbr>baz',
3565 '[foo<acronym>bar</acronym>baz]',
3566 'foo<acronym>b[a]r</acronym>baz',
3567 '[foo<b>bar</b>baz]',
3568 'foo<b>b[a]r</b>baz',
3569 '[foo<bdi dir=rtl>bar</bdi>baz]',
3570 'foo<bdi dir=rtl>b[a]r</bdi>baz',
3571 '[foo<bdo dir=rtl>bar</bdo>baz]',
3572 'foo<bdo dir=rtl>b[a]r</bdo>baz',
3573 '[foo<big>bar</big>baz]',
3574 'foo<big>b[a]r</big>baz',
3575 '[foo<blink>bar</blink>baz]',
3576 'foo<blink>b[a]r</blink>baz',
3577 '[foo<cite>bar</cite>baz]',
3578 'foo<cite>b[a]r</cite>baz',
3579 '[foo<code>bar</code>baz]',
3580 'foo<code>b[a]r</code>baz',
3581 '[foo<del>bar</del>baz]',
3582 'foo<del>b[a]r</del>baz',
3583 '[foo<dfn>bar</dfn>baz]',
3584 'foo<dfn>b[a]r</dfn>baz',
3585 '[foo<em>bar</em>baz]',
3586 'foo<em>b[a]r</em>baz',
3587 '[foo<font>bar</font>baz]',
3588 'foo<font>b[a]r</font>baz',
3589 '[foo<font color=blue>bar</font>baz]',
3590 'foo<font color=blue>b[a]r</font>baz',
3591 '[foo<i>bar</i>baz]',
3592 'foo<i>b[a]r</i>baz',
3593 '[foo<ins>bar</ins>baz]',
3594 'foo<ins>b[a]r</ins>baz',
3595 '[foo<kbd>bar</kbd>baz]',
3596 'foo<kbd>b[a]r</kbd>baz',
3597 '[foo<mark>bar</mark>baz]',
3598 'foo<mark>b[a]r</mark>baz',
3599 '[foo<nobr>bar</nobr>baz]',
3600 'foo<nobr>b[a]r</nobr>baz',
3601 '[foo<q>bar</q>baz]',
3602 'foo<q>b[a]r</q>baz',
3603 '[foo<samp>bar</samp>baz]',
3604 'foo<samp>b[a]r</samp>baz',
3605 '[foo<s>bar</s>baz]',
3606 'foo<s>b[a]r</s>baz',
3607 '[foo<small>bar</small>baz]',
3608 'foo<small>b[a]r</small>baz',
3609 '[foo<span>bar</span>baz]',
3610 'foo<span>b[a]r</span>baz',
3611 '[foo<strike>bar</strike>baz]',
3612 'foo<strike>b[a]r</strike>baz',
3613 '[foo<strong>bar</strong>baz]',
3614 'foo<strong>b[a]r</strong>baz',
3615 '[foo<sub>bar</sub>baz]',
3616 'foo<sub>b[a]r</sub>baz',
3617 '[foo<sup>bar</sup>baz]',
3618 'foo<sup>b[a]r</sup>baz',
3619 '[foo<tt>bar</tt>baz]',
3620 'foo<tt>b[a]r</tt>baz',
3621 '[foo<u>bar</u>baz]',
3622 'foo<u>b[a]r</u>baz',
3623 '[foo<var>bar</var>baz]',
3624 'foo<var>b[a]r</var>baz',
3625
3626 // Empty and replaced elements
3627 '[foo<br>bar]',
3628 '[foo<hr>bar]',
3629 '[foo<wbr>bar]',
3630 '[foo<img>bar]',
3631 '[foo<img src=abc>bar]',
3632 '[foo<video></video>bar]',
3633 '[foo<video src=abc></video>bar]',
3634 '[foo<svg><circle fill=blue r=20 cx=20 cy=20 /></svg>bar]',
3635
3636 // Unrecognized elements
3637 '[foo<nonexistentelement>bar</nonexistentelement>baz]',
3638 'foo<nonexistentelement>b[a]r</nonexistentelement>baz',
3639 '[foo<nonexistentelement style="display: block">bar</nonexistentelement> baz]',
3640 'foo<nonexistentelement style="display: block">b[a]r</nonexistentelement >baz',
3641
3642 // Random stuff
3643 '[foo<span id=foo>bar</span>baz]',
3644 'foo<span id=foo>b[a]r</span>baz',
3645 '[foo<span class=foo>bar</span>baz]',
3646 'foo<span class=foo>b[a]r</span>baz',
3647 '[foo<b style="font-weight: normal">bar</b>baz]',
3648 'foo<b style="font-weight: normal">b[a]r</b>baz',
3649 '<p style="background-color: aqua">foo[bar]baz</p>',
3650 '<p><span style="background-color: aqua">foo[bar]baz</span></p>',
3651 '<p style="font-weight: bold">foo[bar]baz</p>',
3652 '<b><p style="font-weight: bold">foo[bar]baz</p></b>',
3653 '<p style="font-variant: small-caps">foo[bar]baz</p>',
3654 '{<p style="font-variant: small-caps">foobarbaz</p>}',
3655 '<p style="text-indent: 2em">foo[bar]baz</p>',
3656 '{<p style="text-indent: 2em">foobarbaz</p>}',
3657
3658 // https://bugzilla.mozilla.org/show_bug.cgi?id=649138
3659 // Chrome 15 dev fails this for some unclear reason.
3660 '<table data-start=0 data-end=1><tr><td><b>foo</b></table>',
3661 ],
3662 //@}
3663 strikethrough: [
3664 //@{
3665 'foo[]bar',
3666 '<p>[foo</p> <p>bar]</p>',
3667 '<span>[foo</span> <span>bar]</span>',
3668 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
3669 '<p>[foo<p><br><p>bar]',
3670 '<b>foo[]bar</b>',
3671 '<i>foo[]bar</i>',
3672 '<span>foo</span>{}<span>bar</span>',
3673 '<span>foo[</span><span>]bar</span>',
3674 'foo[bar]baz',
3675 'foo[bar<b>baz]qoz</b>quz',
3676 'foo[bar<i>baz]qoz</i>quz',
3677 '{<p><p> <p>foo</p>}',
3678
3679 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
3680 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> ',
3681 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> ',
3682 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> ',
3683 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> ',
3684 '{<table><tr><td>foo<td>bar<td>baz</table>}',
3685
3686 'foo<u>[bar]</u>baz',
3687 'foo<span style="text-decoration: underline">[bar]</span>baz',
3688 '<u>foo[bar]baz</u>',
3689 '<u>foo[b<span style="color:blue">ar]ba</span>z</u>',
3690 '<u>foo[b<span style="color:blue" id=foo>ar]ba</span>z</u>',
3691 '<u>foo[b<span style="font-size:3em">ar]ba</span>z</u>',
3692 '<u>foo[b<i>ar]ba</i>z</u>',
3693 '<p style="text-decoration: underline">foo[bar]baz</p>',
3694
3695 'foo<s>[bar]</s>baz',
3696 'foo<span style="text-decoration: line-through">[bar]</span>baz',
3697 '<s>foo[bar]baz</s>',
3698 '<s>foo[b<span style="color:blue">ar]ba</span>z</s>',
3699 '<s>foo[b<span style="color:blue" id=foo>ar]ba</span>z</s>',
3700 '<s>foo[b<span style="font-size:3em">ar]ba</span>z</s>',
3701 '<s>foo[b<i>ar]ba</i>z</s>',
3702 '<p style="text-decoration: line-through">foo[bar]baz</p>',
3703
3704 'foo<strike>[bar]</strike>baz',
3705 '<strike>foo[bar]baz</strike>',
3706 '<strike>foo[b<span style="color:blue">ar]ba</span>z</strike>',
3707 '<strike>foo[b<span style="color:blue" id=foo>ar]ba</span>z</strike>',
3708 '<strike>foo[b<span style="font-size:3em">ar]ba</span>z</strike>',
3709 '<strike>foo[b<i>ar]ba</i>z</strike>',
3710
3711 'foo<ins>[bar]</ins>baz',
3712 '<ins>foo[bar]baz</ins>',
3713 '<ins>foo[b<span style="color:blue">ar]ba</span>z</ins>',
3714 '<ins>foo[b<span style="color:blue" id=foo>ar]ba</span>z</ins>',
3715 '<ins>foo[b<span style="font-size:3em">ar]ba</span>z</ins>',
3716 '<ins>foo[b<i>ar]ba</i>z</ins>',
3717
3718 'foo<del>[bar]</del>baz',
3719 '<del>foo[bar]baz</del>',
3720 '<del>foo[b<span style="color:blue">ar]ba</span>z</del>',
3721 '<del>foo[b<span style="color:blue" id=foo>ar]ba</span>z</del>',
3722 '<del>foo[b<span style="font-size:3em">ar]ba</span>z</del>',
3723 '<del>foo[b<i>ar]ba</i>z</del>',
3724
3725 'foo<span style="text-decoration: underline line-through">[bar]</span>ba z',
3726 'foo<span style="text-decoration: underline line-through">b[a]r</span>ba z',
3727 'foo<s style="text-decoration: underline">[bar]</s>baz',
3728 'foo<s style="text-decoration: underline">b[a]r</s>baz',
3729 'foo<u style="text-decoration: line-through">[bar]</u>baz',
3730 'foo<u style="text-decoration: line-through">b[a]r</u>baz',
3731 'foo<s style="text-decoration: overline">[bar]</s>baz',
3732 'foo<s style="text-decoration: overline">b[a]r</s>baz',
3733 'foo<u style="text-decoration: overline">[bar]</u>baz',
3734 'foo<u style="text-decoration: overline">b[a]r</u>baz',
3735
3736 '<p style="text-decoration: line-through">foo[bar]baz</p>',
3737 '<p style="text-decoration: overline">foo[bar]baz</p>',
3738
3739 'foo<span class="underline">[bar]</span>baz',
3740 'foo<span class="underline">b[a]r</span>baz',
3741 'foo<span class="line-through">[bar]</span>baz',
3742 'foo<span class="line-through">b[a]r</span>baz',
3743 'foo<span class="underline-and-line-through">[bar]</span>baz',
3744 'foo<span class="underline-and-line-through">b[a]r</span>baz',
3745
3746 // Tests for queryCommandIndeterm() and queryCommandState()
3747 'fo[o<s>b]ar</s>baz',
3748 'foo<s>ba[r</s>b]az',
3749 'fo[o<s>bar</s>b]az',
3750 'foo[<s>b]ar</s>baz',
3751 'foo<s>ba[r</s>]baz',
3752 'foo[<s>bar</s>]baz',
3753 'foo<s>[bar]</s>baz',
3754 'foo{<s>bar</s>}baz',
3755 'fo[o<span style=text-decoration:line-through>b]ar</span>baz',
3756 '<strike>fo[o</strike><s>b]ar</s>',
3757 '<s>fo[o</s><del>b]ar</del>',
3758 ],
3759 //@}
3760 subscript: [
3761 //@{
3762 'foo[]bar',
3763 '<p>[foo</p> <p>bar]</p>',
3764 '<span>[foo</span> <span>bar]</span>',
3765 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
3766 '<p>[foo<p><br><p>bar]',
3767 '<b>foo[]bar</b>',
3768 '<i>foo[]bar</i>',
3769 '<span>foo</span>{}<span>bar</span>',
3770 '<span>foo[</span><span>]bar</span>',
3771 'foo[bar]baz',
3772 'foo[bar<b>baz]qoz</b>quz',
3773 'foo[bar<i>baz]qoz</i>quz',
3774 '{<p><p> <p>foo</p>}',
3775
3776 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
3777 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> ',
3778 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> ',
3779 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> ',
3780 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> ',
3781 '{<table><tr><td>foo<td>bar<td>baz</table>}',
3782
3783 'foo<sub>[bar]</sub>baz',
3784 'foo<sub>b[a]r</sub>baz',
3785 'foo<sup>[bar]</sup>baz',
3786 'foo<sup>b[a]r</sup>baz',
3787
3788 'foo<span style=vertical-align:sub>[bar]</span>baz',
3789 'foo<span style=vertical-align:super>[bar]</span>baz',
3790
3791 'foo<sub><sub>[bar]</sub></sub>baz',
3792 'foo<sub><sub>b[a]r</sub></sub>baz',
3793 'foo<sub>b<sub>[a]</sub>r</sub>baz',
3794 'foo<sup><sup>[bar]</sup></sup>baz',
3795 'foo<sup><sup>b[a]r</sup></sup>baz',
3796 'foo<sup>b<sup>[a]</sup>r</sup>baz',
3797 'foo<sub><sup>[bar]</sup></sub>baz',
3798 'foo<sub><sup>b[a]r</sup></sub>baz',
3799 'foo<sub>b<sup>[a]</sup>r</sub>baz',
3800 'foo<sup><sub>[bar]</sub></sup>baz',
3801 'foo<sup><sub>b[a]r</sub></sup>baz',
3802 'foo<sup>b<sub>[a]</sub>r</sup>baz',
3803
3804 // Tests for queryCommandIndeterm() and queryCommandState()
3805 'fo[o<sub>b]ar</sub>baz',
3806 'foo<sub>ba[r</sub>b]az',
3807 'fo[o<sub>bar</sub>b]az',
3808 'foo[<sub>b]ar</sub>baz',
3809 'foo<sub>ba[r</sub>]baz',
3810 'foo[<sub>bar</sub>]baz',
3811 'foo<sub>[bar]</sub>baz',
3812 'foo{<sub>bar</sub>}baz',
3813 '<sub>fo[o</sub><sup>b]ar</sup>',
3814 '<sub>fo[o</sub><span style=vertical-align:sub>b]ar</span>',
3815 'foo<span style=vertical-align:top>[bar]</span>baz',
3816 '<sub>fo[o</sub><span style=vertical-align:top>b]ar</span>',
3817 ],
3818 //@}
3819 superscript: [
3820 //@{
3821 'foo[]bar',
3822 '<p>[foo</p> <p>bar]</p>',
3823 '<span>[foo</span> <span>bar]</span>',
3824 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
3825 '<p>[foo<p><br><p>bar]',
3826 '<b>foo[]bar</b>',
3827 '<i>foo[]bar</i>',
3828 '<span>foo</span>{}<span>bar</span>',
3829 '<span>foo[</span><span>]bar</span>',
3830 'foo[bar]baz',
3831 'foo[bar<b>baz]qoz</b>quz',
3832 'foo[bar<i>baz]qoz</i>quz',
3833 '{<p><p> <p>foo</p>}',
3834
3835 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
3836 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> ',
3837 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> ',
3838 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> ',
3839 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> ',
3840 '{<table><tr><td>foo<td>bar<td>baz</table>}',
3841
3842 'foo<sub>[bar]</sub>baz',
3843 'foo<sub>b[a]r</sub>baz',
3844 'foo<sup>[bar]</sup>baz',
3845 'foo<sup>b[a]r</sup>baz',
3846
3847 'foo<span style=vertical-align:sub>[bar]</span>baz',
3848 'foo<span style=vertical-align:super>[bar]</span>baz',
3849
3850 'foo<sub><sub>[bar]</sub></sub>baz',
3851 'foo<sub><sub>b[a]r</sub></sub>baz',
3852 'foo<sub>b<sub>[a]</sub>r</sub>baz',
3853 'foo<sup><sup>[bar]</sup></sup>baz',
3854 'foo<sup><sup>b[a]r</sup></sup>baz',
3855 'foo<sup>b<sup>[a]</sup>r</sup>baz',
3856 'foo<sub><sup>[bar]</sup></sub>baz',
3857 'foo<sub><sup>b[a]r</sup></sub>baz',
3858 'foo<sub>b<sup>[a]</sup>r</sub>baz',
3859 'foo<sup><sub>[bar]</sub></sup>baz',
3860 'foo<sup><sub>b[a]r</sub></sup>baz',
3861 'foo<sup>b<sub>[a]</sub>r</sup>baz',
3862
3863 // Tests for queryCommandIndeterm() and queryCommandState()
3864 'fo[o<sup>b]ar</sup>baz',
3865 'foo<sup>ba[r</sup>b]az',
3866 'fo[o<sup>bar</sup>b]az',
3867 'foo[<sup>b]ar</sup>baz',
3868 'foo<sup>ba[r</sup>]baz',
3869 'foo[<sup>bar</sup>]baz',
3870 'foo<sup>[bar]</sup>baz',
3871 'foo{<sup>bar</sup>}baz',
3872 '<sup>fo[o</sup><sub>b]ar</sub>',
3873 '<sup>fo[o</sup><span style=vertical-align:super>b]ar</span>',
3874 'foo<span style=vertical-align:bottom>[bar]</span>baz',
3875 '<sup>fo[o</sup><span style=vertical-align:bottom>b]ar</span>',
3876
3877 // https://bugs.webkit.org/show_bug.cgi?id=28472
3878 'foo<sup>[bar]<br></sup>',
3879 ],
3880 //@}
3881 underline: [
3882 //@{
3883 'foo[]bar',
3884 '<p>[foo</p> <p>bar]</p>',
3885 '<span>[foo</span> <span>bar]</span>',
3886 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
3887 '<p>[foo<p><br><p>bar]',
3888 '<b>foo[]bar</b>',
3889 '<i>foo[]bar</i>',
3890 '<span>foo</span>{}<span>bar</span>',
3891 '<span>foo[</span><span>]bar</span>',
3892 'foo[bar]baz',
3893 'foo[bar<b>baz]qoz</b>quz',
3894 'foo[bar<i>baz]qoz</i>quz',
3895 '{<p><p> <p>foo</p>}',
3896
3897 '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
3898 '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table> ',
3899 '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table> ',
3900 '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table> ',
3901 '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table> ',
3902 '{<table><tr><td>foo<td>bar<td>baz</table>}',
3903
3904 'foo<u>[bar]</u>baz',
3905 'foo<span style="text-decoration: underline">[bar]</span>baz',
3906 '<u>foo[bar]baz</u>',
3907 '<u>foo[b<span style="color:blue">ar]ba</span>z</u>',
3908 '<u>foo[b<span style="color:blue" id=foo>ar]ba</span>z</u>',
3909 '<u>foo[b<span style="font-size:3em">ar]ba</span>z</u>',
3910 '<u>foo[b<i>ar]ba</i>z</u>',
3911 '<p style="text-decoration: underline">foo[bar]baz</p>',
3912
3913 'foo<s>[bar]</s>baz',
3914 'foo<span style="text-decoration: line-through">[bar]</span>baz',
3915 '<s>foo[bar]baz</s>',
3916 '<s>foo[b<span style="color:blue">ar]ba</span>z</s>',
3917 '<s>foo[b<span style="color:blue" id=foo>ar]ba</span>z</s>',
3918 '<s>foo[b<span style="font-size:3em">ar]ba</span>z</s>',
3919 '<s>foo[b<i>ar]ba</i>z</s>',
3920 '<p style="text-decoration: line-through">foo[bar]baz</p>',
3921
3922 'foo<strike>[bar]</strike>baz',
3923 '<strike>foo[bar]baz</strike>',
3924 '<strike>foo[b<span style="color:blue">ar]ba</span>z</strike>',
3925 '<strike>foo[b<span style="color:blue" id=foo>ar]ba</span>z</strike>',
3926 '<strike>foo[b<span style="font-size:3em">ar]ba</span>z</strike>',
3927 '<strike>foo[b<i>ar]ba</i>z</strike>',
3928
3929 'foo<ins>[bar]</ins>baz',
3930 '<ins>foo[bar]baz</ins>',
3931 '<ins>foo[b<span style="color:blue">ar]ba</span>z</ins>',
3932 '<ins>foo[b<span style="color:blue" id=foo>ar]ba</span>z</ins>',
3933 '<ins>foo[b<span style="font-size:3em">ar]ba</span>z</ins>',
3934 '<ins>foo[b<i>ar]ba</i>z</ins>',
3935
3936 'foo<del>[bar]</del>baz',
3937 '<del>foo[bar]baz</del>',
3938 '<del>foo[b<span style="color:blue">ar]ba</span>z</del>',
3939 '<del>foo[b<span style="color:blue" id=foo>ar]ba</span>z</del>',
3940 '<del>foo[b<span style="font-size:3em">ar]ba</span>z</del>',
3941 '<del>foo[b<i>ar]ba</i>z</del>',
3942
3943 'foo<span style="text-decoration: underline line-through">[bar]</span>ba z',
3944 'foo<span style="text-decoration: underline line-through">b[a]r</span>ba z',
3945 'foo<s style="text-decoration: underline">[bar]</s>baz',
3946 'foo<s style="text-decoration: underline">b[a]r</s>baz',
3947 'foo<u style="text-decoration: line-through">[bar]</u>baz',
3948 'foo<u style="text-decoration: line-through">b[a]r</u>baz',
3949 'foo<s style="text-decoration: overline">[bar]</s>baz',
3950 'foo<s style="text-decoration: overline">b[a]r</s>baz',
3951 'foo<u style="text-decoration: overline">[bar]</u>baz',
3952 'foo<u style="text-decoration: overline">b[a]r</u>baz',
3953
3954 '<p style="text-decoration: line-through">foo[bar]baz</p>',
3955 '<p style="text-decoration: overline">foo[bar]baz</p>',
3956
3957 'foo<span class="underline">[bar]</span>baz',
3958 'foo<span class="underline">b[a]r</span>baz',
3959 'foo<span class="line-through">[bar]</span>baz',
3960 'foo<span class="line-through">b[a]r</span>baz',
3961 'foo<span class="underline-and-line-through">[bar]</span>baz',
3962 'foo<span class="underline-and-line-through">b[a]r</span>baz',
3963
3964 // Tests for queryCommandIndeterm() and queryCommandState()
3965 'fo[o<u>b]ar</u>baz',
3966 'foo<u>ba[r</u>b]az',
3967 'fo[o<u>bar</u>b]az',
3968 'foo[<u>b]ar</u>baz',
3969 'foo<u>ba[r</u>]baz',
3970 'foo[<u>bar</u>]baz',
3971 'foo<u>[bar]</u>baz',
3972 'foo{<u>bar</u>}baz',
3973 'fo[o<span style=text-decoration:underline>b]ar</span>baz',
3974 '<ins>fo[o</ins><u>b]ar</u>',
3975 '<u>fo[o</u><ins>b]ar</ins>',
3976 ],
3977 //@}
3978 unlink: [
3979 //@{
3980 'foo[]bar',
3981 '<p>[foo</p> <p>bar]</p>',
3982 '<span>[foo</span> <span>bar]</span>',
3983 '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
3984 '<b>foo[]bar</b>',
3985 '<i>foo[]bar</i>',
3986 '<span>foo</span>{}<span>bar</span>',
3987 '<span>foo[</span><span>]bar</span>',
3988 'foo[bar]baz',
3989 'foo[bar<b>baz]qoz</b>quz',
3990 'foo[bar<i>baz]qoz</i>quz',
3991 '{<p><p> <p>foo</p>}',
3992
3993 '<a href=http://www.google.com/>foo[bar]baz</a>',
3994 '<a href=http://www.google.com/>foo[barbaz</a>}',
3995 '{<a href=http://www.google.com/>foobar]baz</a>',
3996 '{<a href=http://www.google.com/>foobarbaz</a>}',
3997 '<a href=http://www.google.com/>[foobarbaz]</a>',
3998
3999 'foo<a href=http://www.google.com/>b[]ar</a>baz',
4000 'foo<a href=http://www.google.com/>[bar]</a>baz',
4001 'foo[<a href=http://www.google.com/>bar</a>]baz',
4002 'foo<a href=http://www.google.com/>[bar</a>baz]',
4003 '[foo<a href=http://www.google.com/>bar]</a>baz',
4004 '[foo<a href=http://www.google.com/>bar</a>baz]',
4005
4006 '<a id=foo href=http://www.google.com/>foobar[]baz</a>',
4007 '<a id=foo href=http://www.google.com/>foo[bar]baz</a>',
4008 '<a id=foo href=http://www.google.com/>[foobarbaz]</a>',
4009 'foo<a id=foo href=http://www.google.com/>[bar]</a>baz',
4010 'foo[<a id=foo href=http://www.google.com/>bar</a>]baz',
4011 '[foo<a id=foo href=http://www.google.com/>bar</a>baz]',
4012
4013 '<a name=foo>foobar[]baz</a>',
4014 '<a name=foo>foo[bar]baz</a>',
4015 '<a name=foo>[foobarbaz]</a>',
4016 'foo<a name=foo>[bar]</a>baz',
4017 'foo[<a name=foo>bar</a>]baz',
4018 '[foo<a name=foo>bar</a>baz]',
4019 ],
4020 //@}
4021 copy: ['!foo[bar]baz'],
4022 cut: ['!foo[bar]baz'],
4023 defaultparagraphseparator: [
4024 //@{
4025 ['', 'foo[bar]baz'],
4026 ['div', 'foo[bar]baz'],
4027 ['p', 'foo[bar]baz'],
4028 ['DIV', 'foo[bar]baz'],
4029 ['P', 'foo[bar]baz'],
4030 [' div ', 'foo[bar]baz'],
4031 [' p ', 'foo[bar]baz'],
4032 ['<div>', 'foo[bar]baz'],
4033 ['<p>', 'foo[bar]baz'],
4034 ['li', 'foo[bar]baz'],
4035 ['blockquote', 'foo[bar]baz'],
4036 ],
4037 //@}
4038 paste: ['!foo[bar]baz'],
4039 selectall: ['foo[bar]baz'],
4040 stylewithcss: [
4041 //@{
4042 ['true', 'foo[bar]baz'],
4043 ['TRUE', 'foo[bar]baz'],
4044 ['TrUe', 'foo[bar]baz'],
4045 ['true ', 'foo[bar]baz'],
4046 [' true', 'foo[bar]baz'],
4047 ['truer', 'foo[bar]baz'],
4048 [' true ', 'foo[bar]baz'],
4049 [' TrUe', 'foo[bar]baz'],
4050 ['', 'foo[bar]baz'],
4051 [' ', 'foo[bar]baz'],
4052 ['false', 'foo[bar]baz'],
4053 ['FALSE', 'foo[bar]baz'],
4054 ['FaLsE', 'foo[bar]baz'],
4055 [' false', 'foo[bar]baz'],
4056 ['false ', 'foo[bar]baz'],
4057 ['falser', 'foo[bar]baz'],
4058 ['falsé', 'foo[bar]baz'],
4059 ],
4060 //@}
4061 usecss: [
4062 //@{
4063 ['true', 'foo[bar]baz'],
4064 ['TRUE', 'foo[bar]baz'],
4065 ['TrUe', 'foo[bar]baz'],
4066 ['true ', 'foo[bar]baz'],
4067 [' true', 'foo[bar]baz'],
4068 ['truer', 'foo[bar]baz'],
4069 [' true ', 'foo[bar]baz'],
4070 [' TrUe', 'foo[bar]baz'],
4071 ['', 'foo[bar]baz'],
4072 [' ', 'foo[bar]baz'],
4073 ['false', 'foo[bar]baz'],
4074 ['FALSE', 'foo[bar]baz'],
4075 ['FaLsE', 'foo[bar]baz'],
4076 [' false', 'foo[bar]baz'],
4077 ['false ', 'foo[bar]baz'],
4078 ['falser', 'foo[bar]baz'],
4079 ['falsé', 'foo[bar]baz'],
4080 ],
4081 //@}
4082 quasit: ['foo[bar]baz'],
4083 multitest: [
4084 //@{
4085 // Insertion-affecting state. Test that insertText works right, and
4086 // test that various block commands preserve (or don't preserve) the
4087 // state.
4088 ['foo[]bar', 'bold', 'inserttext'],
4089 ['foo[]bar', 'bold', 'delete'],
4090 ['foo[]bar', 'bold', 'delete', 'inserttext'],
4091 ['foo[]bar', 'bold', 'formatblock'],
4092 ['foo[]bar', 'bold', 'formatblock', 'inserttext'],
4093 ['foo[]bar', 'bold', 'forwarddelete'],
4094 ['foo[]bar', 'bold', 'forwarddelete', 'inserttext'],
4095 ['foo[]bar', 'bold', 'indent'],
4096 ['foo[]bar', 'bold', 'indent', 'inserttext'],
4097 ['foo[]bar', 'bold', 'inserthorizontalrule'],
4098 ['foo[]bar', 'bold', 'inserthorizontalrule', 'inserttext'],
4099 ['foo[]bar', 'bold', 'inserthtml'],
4100 ['foo[]bar', 'bold', 'inserthtml', 'inserttext'],
4101 ['foo[]bar', 'bold', 'insertimage'],
4102 ['foo[]bar', 'bold', 'insertimage', 'inserttext'],
4103 ['foo[]bar', 'bold', 'insertlinebreak'],
4104 ['foo[]bar', 'bold', 'insertlinebreak', 'inserttext'],
4105 ['foo[]bar', 'bold', 'insertorderedlist'],
4106 ['foo[]bar', 'bold', 'insertorderedlist', 'inserttext'],
4107 ['foo[]bar', 'bold', 'insertparagraph'],
4108 ['foo[]bar', 'bold', 'insertparagraph', 'inserttext'],
4109 ['foo[]bar', 'bold', 'insertunorderedlist'],
4110 ['foo[]bar', 'bold', 'insertunorderedlist', 'inserttext'],
4111 ['foo[]bar', 'bold', 'justifycenter'],
4112 ['foo[]bar', 'bold', 'justifycenter', 'inserttext'],
4113 ['foo[]bar', 'bold', 'justifyfull'],
4114 ['foo[]bar', 'bold', 'justifyfull', 'inserttext'],
4115 ['foo[]bar', 'bold', 'justifyleft'],
4116 ['foo[]bar', 'bold', 'justifyleft', 'inserttext'],
4117 ['foo[]bar', 'bold', 'justifyright'],
4118 ['foo[]bar', 'bold', 'justifyright', 'inserttext'],
4119 ['foo[]bar', 'bold', 'outdent'],
4120 ['foo[]bar', 'bold', 'outdent', 'inserttext'],
4121
4122 ['foo[]bar', 'italic', 'inserttext'],
4123 ['foo[]bar', 'italic', 'delete'],
4124 ['foo[]bar', 'italic', 'delete', 'inserttext'],
4125 ['foo[]bar', 'italic', 'formatblock'],
4126 ['foo[]bar', 'italic', 'formatblock', 'inserttext'],
4127 ['foo[]bar', 'italic', 'forwarddelete'],
4128 ['foo[]bar', 'italic', 'forwarddelete', 'inserttext'],
4129 ['foo[]bar', 'italic', 'indent'],
4130 ['foo[]bar', 'italic', 'indent', 'inserttext'],
4131 ['foo[]bar', 'italic', 'inserthorizontalrule'],
4132 ['foo[]bar', 'italic', 'inserthorizontalrule', 'inserttext'],
4133 ['foo[]bar', 'italic', 'inserthtml'],
4134 ['foo[]bar', 'italic', 'inserthtml', 'inserttext'],
4135 ['foo[]bar', 'italic', 'insertimage'],
4136 ['foo[]bar', 'italic', 'insertimage', 'inserttext'],
4137 ['foo[]bar', 'italic', 'insertlinebreak'],
4138 ['foo[]bar', 'italic', 'insertlinebreak', 'inserttext'],
4139 ['foo[]bar', 'italic', 'insertorderedlist'],
4140 ['foo[]bar', 'italic', 'insertorderedlist', 'inserttext'],
4141 ['foo[]bar', 'italic', 'insertparagraph'],
4142 ['foo[]bar', 'italic', 'insertparagraph', 'inserttext'],
4143 ['foo[]bar', 'italic', 'insertunorderedlist'],
4144 ['foo[]bar', 'italic', 'insertunorderedlist', 'inserttext'],
4145 ['foo[]bar', 'italic', 'justifycenter'],
4146 ['foo[]bar', 'italic', 'justifycenter', 'inserttext'],
4147 ['foo[]bar', 'italic', 'justifyfull'],
4148 ['foo[]bar', 'italic', 'justifyfull', 'inserttext'],
4149 ['foo[]bar', 'italic', 'justifyleft'],
4150 ['foo[]bar', 'italic', 'justifyleft', 'inserttext'],
4151 ['foo[]bar', 'italic', 'justifyright'],
4152 ['foo[]bar', 'italic', 'justifyright', 'inserttext'],
4153 ['foo[]bar', 'italic', 'outdent'],
4154 ['foo[]bar', 'italic', 'outdent', 'inserttext'],
4155
4156 ['foo[]bar', 'strikethrough', 'inserttext'],
4157 ['foo[]bar', 'strikethrough', 'delete'],
4158 ['foo[]bar', 'strikethrough', 'delete', 'inserttext'],
4159 ['foo[]bar', 'strikethrough', 'formatblock'],
4160 ['foo[]bar', 'strikethrough', 'formatblock', 'inserttext'],
4161 ['foo[]bar', 'strikethrough', 'forwarddelete'],
4162 ['foo[]bar', 'strikethrough', 'forwarddelete', 'inserttext'],
4163 ['foo[]bar', 'strikethrough', 'indent'],
4164 ['foo[]bar', 'strikethrough', 'indent', 'inserttext'],
4165 ['foo[]bar', 'strikethrough', 'inserthorizontalrule'],
4166 ['foo[]bar', 'strikethrough', 'inserthorizontalrule', 'inserttext'],
4167 ['foo[]bar', 'strikethrough', 'inserthtml'],
4168 ['foo[]bar', 'strikethrough', 'inserthtml', 'inserttext'],
4169 ['foo[]bar', 'strikethrough', 'insertimage'],
4170 ['foo[]bar', 'strikethrough', 'insertimage', 'inserttext'],
4171 ['foo[]bar', 'strikethrough', 'insertlinebreak'],
4172 ['foo[]bar', 'strikethrough', 'insertlinebreak', 'inserttext'],
4173 ['foo[]bar', 'strikethrough', 'insertorderedlist'],
4174 ['foo[]bar', 'strikethrough', 'insertorderedlist', 'inserttext'],
4175 ['foo[]bar', 'strikethrough', 'insertparagraph'],
4176 ['foo[]bar', 'strikethrough', 'insertparagraph', 'inserttext'],
4177 ['foo[]bar', 'strikethrough', 'insertunorderedlist'],
4178 ['foo[]bar', 'strikethrough', 'insertunorderedlist', 'inserttext'],
4179 ['foo[]bar', 'strikethrough', 'justifycenter'],
4180 ['foo[]bar', 'strikethrough', 'justifycenter', 'inserttext'],
4181 ['foo[]bar', 'strikethrough', 'justifyfull'],
4182 ['foo[]bar', 'strikethrough', 'justifyfull', 'inserttext'],
4183 ['foo[]bar', 'strikethrough', 'justifyleft'],
4184 ['foo[]bar', 'strikethrough', 'justifyleft', 'inserttext'],
4185 ['foo[]bar', 'strikethrough', 'justifyright'],
4186 ['foo[]bar', 'strikethrough', 'justifyright', 'inserttext'],
4187 ['foo[]bar', 'strikethrough', 'outdent'],
4188 ['foo[]bar', 'strikethrough', 'outdent', 'inserttext'],
4189
4190 ['foo[]bar', 'subscript', 'inserttext'],
4191 ['foo[]bar', 'subscript', 'delete'],
4192 ['foo[]bar', 'subscript', 'delete', 'inserttext'],
4193 ['foo[]bar', 'subscript', 'formatblock'],
4194 ['foo[]bar', 'subscript', 'formatblock', 'inserttext'],
4195 ['foo[]bar', 'subscript', 'forwarddelete'],
4196 ['foo[]bar', 'subscript', 'forwarddelete', 'inserttext'],
4197 ['foo[]bar', 'subscript', 'indent'],
4198 ['foo[]bar', 'subscript', 'indent', 'inserttext'],
4199 ['foo[]bar', 'subscript', 'inserthorizontalrule'],
4200 ['foo[]bar', 'subscript', 'inserthorizontalrule', 'inserttext'],
4201 ['foo[]bar', 'subscript', 'inserthtml'],
4202 ['foo[]bar', 'subscript', 'inserthtml', 'inserttext'],
4203 ['foo[]bar', 'subscript', 'insertimage'],
4204 ['foo[]bar', 'subscript', 'insertimage', 'inserttext'],
4205 ['foo[]bar', 'subscript', 'insertlinebreak'],
4206 ['foo[]bar', 'subscript', 'insertlinebreak', 'inserttext'],
4207 ['foo[]bar', 'subscript', 'insertorderedlist'],
4208 ['foo[]bar', 'subscript', 'insertorderedlist', 'inserttext'],
4209 ['foo[]bar', 'subscript', 'insertparagraph'],
4210 ['foo[]bar', 'subscript', 'insertparagraph', 'inserttext'],
4211 ['foo[]bar', 'subscript', 'insertunorderedlist'],
4212 ['foo[]bar', 'subscript', 'insertunorderedlist', 'inserttext'],
4213 ['foo[]bar', 'subscript', 'justifycenter'],
4214 ['foo[]bar', 'subscript', 'justifycenter', 'inserttext'],
4215 ['foo[]bar', 'subscript', 'justifyfull'],
4216 ['foo[]bar', 'subscript', 'justifyfull', 'inserttext'],
4217 ['foo[]bar', 'subscript', 'justifyleft'],
4218 ['foo[]bar', 'subscript', 'justifyleft', 'inserttext'],
4219 ['foo[]bar', 'subscript', 'justifyright'],
4220 ['foo[]bar', 'subscript', 'justifyright', 'inserttext'],
4221 ['foo[]bar', 'subscript', 'outdent'],
4222 ['foo[]bar', 'subscript', 'outdent', 'inserttext'],
4223
4224 ['foo[]bar', 'superscript', 'inserttext'],
4225 ['foo[]bar', 'superscript', 'delete'],
4226 ['foo[]bar', 'superscript', 'delete', 'inserttext'],
4227 ['foo[]bar', 'superscript', 'formatblock'],
4228 ['foo[]bar', 'superscript', 'formatblock', 'inserttext'],
4229 ['foo[]bar', 'superscript', 'forwarddelete'],
4230 ['foo[]bar', 'superscript', 'forwarddelete', 'inserttext'],
4231 ['foo[]bar', 'superscript', 'indent'],
4232 ['foo[]bar', 'superscript', 'indent', 'inserttext'],
4233 ['foo[]bar', 'superscript', 'inserthorizontalrule'],
4234 ['foo[]bar', 'superscript', 'inserthorizontalrule', 'inserttext'],
4235 ['foo[]bar', 'superscript', 'inserthtml'],
4236 ['foo[]bar', 'superscript', 'inserthtml', 'inserttext'],
4237 ['foo[]bar', 'superscript', 'insertimage'],
4238 ['foo[]bar', 'superscript', 'insertimage', 'inserttext'],
4239 ['foo[]bar', 'superscript', 'insertlinebreak'],
4240 ['foo[]bar', 'superscript', 'insertlinebreak', 'inserttext'],
4241 ['foo[]bar', 'superscript', 'insertorderedlist'],
4242 ['foo[]bar', 'superscript', 'insertorderedlist', 'inserttext'],
4243 ['foo[]bar', 'superscript', 'insertparagraph'],
4244 ['foo[]bar', 'superscript', 'insertparagraph', 'inserttext'],
4245 ['foo[]bar', 'superscript', 'insertunorderedlist'],
4246 ['foo[]bar', 'superscript', 'insertunorderedlist', 'inserttext'],
4247 ['foo[]bar', 'superscript', 'justifycenter'],
4248 ['foo[]bar', 'superscript', 'justifycenter', 'inserttext'],
4249 ['foo[]bar', 'superscript', 'justifyfull'],
4250 ['foo[]bar', 'superscript', 'justifyfull', 'inserttext'],
4251 ['foo[]bar', 'superscript', 'justifyleft'],
4252 ['foo[]bar', 'superscript', 'justifyleft', 'inserttext'],
4253 ['foo[]bar', 'superscript', 'justifyright'],
4254 ['foo[]bar', 'superscript', 'justifyright', 'inserttext'],
4255 ['foo[]bar', 'superscript', 'outdent'],
4256 ['foo[]bar', 'superscript', 'outdent', 'inserttext'],
4257
4258 ['foo[]bar', 'underline', 'inserttext'],
4259 ['foo[]bar', 'underline', 'delete'],
4260 ['foo[]bar', 'underline', 'delete', 'inserttext'],
4261 ['foo[]bar', 'underline', 'formatblock'],
4262 ['foo[]bar', 'underline', 'formatblock', 'inserttext'],
4263 ['foo[]bar', 'underline', 'forwarddelete'],
4264 ['foo[]bar', 'underline', 'forwarddelete', 'inserttext'],
4265 ['foo[]bar', 'underline', 'indent'],
4266 ['foo[]bar', 'underline', 'indent', 'inserttext'],
4267 ['foo[]bar', 'underline', 'inserthorizontalrule'],
4268 ['foo[]bar', 'underline', 'inserthorizontalrule', 'inserttext'],
4269 ['foo[]bar', 'underline', 'inserthtml'],
4270 ['foo[]bar', 'underline', 'inserthtml', 'inserttext'],
4271 ['foo[]bar', 'underline', 'insertimage'],
4272 ['foo[]bar', 'underline', 'insertimage', 'inserttext'],
4273 ['foo[]bar', 'underline', 'insertlinebreak'],
4274 ['foo[]bar', 'underline', 'insertlinebreak', 'inserttext'],
4275 ['foo[]bar', 'underline', 'insertorderedlist'],
4276 ['foo[]bar', 'underline', 'insertorderedlist', 'inserttext'],
4277 ['foo[]bar', 'underline', 'insertparagraph'],
4278 ['foo[]bar', 'underline', 'insertparagraph', 'inserttext'],
4279 ['foo[]bar', 'underline', 'insertunorderedlist'],
4280 ['foo[]bar', 'underline', 'insertunorderedlist', 'inserttext'],
4281 ['foo[]bar', 'underline', 'justifycenter'],
4282 ['foo[]bar', 'underline', 'justifycenter', 'inserttext'],
4283 ['foo[]bar', 'underline', 'justifyfull'],
4284 ['foo[]bar', 'underline', 'justifyfull', 'inserttext'],
4285 ['foo[]bar', 'underline', 'justifyleft'],
4286 ['foo[]bar', 'underline', 'justifyleft', 'inserttext'],
4287 ['foo[]bar', 'underline', 'justifyright'],
4288 ['foo[]bar', 'underline', 'justifyright', 'inserttext'],
4289 ['foo[]bar', 'underline', 'outdent'],
4290 ['foo[]bar', 'underline', 'outdent', 'inserttext'],
4291
4292 // Insertion-affecting value. Test that insertText works right, and
4293 // test that various block commands preserve (or don't preserve) the
4294 // value.
4295 ['foo[]bar', 'backcolor', 'inserttext'],
4296 ['foo[]bar', 'backcolor', 'delete'],
4297 ['foo[]bar', 'backcolor', 'delete', 'inserttext'],
4298 ['foo[]bar', 'backcolor', 'formatblock'],
4299 ['foo[]bar', 'backcolor', 'formatblock', 'inserttext'],
4300 ['foo[]bar', 'backcolor', 'forwarddelete'],
4301 ['foo[]bar', 'backcolor', 'forwarddelete', 'inserttext'],
4302 ['foo[]bar', 'backcolor', 'indent'],
4303 ['foo[]bar', 'backcolor', 'indent', 'inserttext'],
4304 ['foo[]bar', 'backcolor', 'inserthorizontalrule'],
4305 ['foo[]bar', 'backcolor', 'inserthorizontalrule', 'inserttext'],
4306 ['foo[]bar', 'backcolor', 'inserthtml'],
4307 ['foo[]bar', 'backcolor', 'inserthtml', 'inserttext'],
4308 ['foo[]bar', 'backcolor', 'insertimage'],
4309 ['foo[]bar', 'backcolor', 'insertimage', 'inserttext'],
4310 ['foo[]bar', 'backcolor', 'insertlinebreak'],
4311 ['foo[]bar', 'backcolor', 'insertlinebreak', 'inserttext'],
4312 ['foo[]bar', 'backcolor', 'insertorderedlist'],
4313 ['foo[]bar', 'backcolor', 'insertorderedlist', 'inserttext'],
4314 ['foo[]bar', 'backcolor', 'insertparagraph'],
4315 ['foo[]bar', 'backcolor', 'insertparagraph', 'inserttext'],
4316 ['foo[]bar', 'backcolor', 'insertunorderedlist'],
4317 ['foo[]bar', 'backcolor', 'insertunorderedlist', 'inserttext'],
4318 ['foo[]bar', 'backcolor', 'justifycenter'],
4319 ['foo[]bar', 'backcolor', 'justifycenter', 'inserttext'],
4320 ['foo[]bar', 'backcolor', 'justifyfull'],
4321 ['foo[]bar', 'backcolor', 'justifyfull', 'inserttext'],
4322 ['foo[]bar', 'backcolor', 'justifyleft'],
4323 ['foo[]bar', 'backcolor', 'justifyleft', 'inserttext'],
4324 ['foo[]bar', 'backcolor', 'justifyright'],
4325 ['foo[]bar', 'backcolor', 'justifyright', 'inserttext'],
4326 ['foo[]bar', 'backcolor', 'outdent'],
4327 ['foo[]bar', 'backcolor', 'outdent', 'inserttext'],
4328
4329 ['foo[]bar', 'createlink', 'inserttext'],
4330 ['foo[]bar', 'createlink', 'delete'],
4331 ['foo[]bar', 'createlink', 'delete', 'inserttext'],
4332 ['foo[]bar', 'createlink', 'formatblock'],
4333 ['foo[]bar', 'createlink', 'formatblock', 'inserttext'],
4334 ['foo[]bar', 'createlink', 'forwarddelete'],
4335 ['foo[]bar', 'createlink', 'forwarddelete', 'inserttext'],
4336 ['foo[]bar', 'createlink', 'indent'],
4337 ['foo[]bar', 'createlink', 'indent', 'inserttext'],
4338 ['foo[]bar', 'createlink', 'inserthorizontalrule'],
4339 ['foo[]bar', 'createlink', 'inserthorizontalrule', 'inserttext'],
4340 ['foo[]bar', 'createlink', 'inserthtml'],
4341 ['foo[]bar', 'createlink', 'inserthtml', 'inserttext'],
4342 ['foo[]bar', 'createlink', 'insertimage'],
4343 ['foo[]bar', 'createlink', 'insertimage', 'inserttext'],
4344 ['foo[]bar', 'createlink', 'insertlinebreak'],
4345 ['foo[]bar', 'createlink', 'insertlinebreak', 'inserttext'],
4346 ['foo[]bar', 'createlink', 'insertorderedlist'],
4347 ['foo[]bar', 'createlink', 'insertorderedlist', 'inserttext'],
4348 ['foo[]bar', 'createlink', 'insertparagraph'],
4349 ['foo[]bar', 'createlink', 'insertparagraph', 'inserttext'],
4350 ['foo[]bar', 'createlink', 'insertunorderedlist'],
4351 ['foo[]bar', 'createlink', 'insertunorderedlist', 'inserttext'],
4352 ['foo[]bar', 'createlink', 'justifycenter'],
4353 ['foo[]bar', 'createlink', 'justifycenter', 'inserttext'],
4354 ['foo[]bar', 'createlink', 'justifyfull'],
4355 ['foo[]bar', 'createlink', 'justifyfull', 'inserttext'],
4356 ['foo[]bar', 'createlink', 'justifyleft'],
4357 ['foo[]bar', 'createlink', 'justifyleft', 'inserttext'],
4358 ['foo[]bar', 'createlink', 'justifyright'],
4359 ['foo[]bar', 'createlink', 'justifyright', 'inserttext'],
4360 ['foo[]bar', 'createlink', 'outdent'],
4361 ['foo[]bar', 'createlink', 'outdent', 'inserttext'],
4362
4363 ['foo[]bar', 'fontname', 'inserttext'],
4364 ['foo[]bar', 'fontname', 'delete'],
4365 ['foo[]bar', 'fontname', 'delete', 'inserttext'],
4366 ['foo[]bar', 'fontname', 'formatblock'],
4367 ['foo[]bar', 'fontname', 'formatblock', 'inserttext'],
4368 ['foo[]bar', 'fontname', 'forwarddelete'],
4369 ['foo[]bar', 'fontname', 'forwarddelete', 'inserttext'],
4370 ['foo[]bar', 'fontname', 'indent'],
4371 ['foo[]bar', 'fontname', 'indent', 'inserttext'],
4372 ['foo[]bar', 'fontname', 'inserthorizontalrule'],
4373 ['foo[]bar', 'fontname', 'inserthorizontalrule', 'inserttext'],
4374 ['foo[]bar', 'fontname', 'inserthtml'],
4375 ['foo[]bar', 'fontname', 'inserthtml', 'inserttext'],
4376 ['foo[]bar', 'fontname', 'insertimage'],
4377 ['foo[]bar', 'fontname', 'insertimage', 'inserttext'],
4378 ['foo[]bar', 'fontname', 'insertlinebreak'],
4379 ['foo[]bar', 'fontname', 'insertlinebreak', 'inserttext'],
4380 ['foo[]bar', 'fontname', 'insertorderedlist'],
4381 ['foo[]bar', 'fontname', 'insertorderedlist', 'inserttext'],
4382 ['foo[]bar', 'fontname', 'insertparagraph'],
4383 ['foo[]bar', 'fontname', 'insertparagraph', 'inserttext'],
4384 ['foo[]bar', 'fontname', 'insertunorderedlist'],
4385 ['foo[]bar', 'fontname', 'insertunorderedlist', 'inserttext'],
4386 ['foo[]bar', 'fontname', 'justifycenter'],
4387 ['foo[]bar', 'fontname', 'justifycenter', 'inserttext'],
4388 ['foo[]bar', 'fontname', 'justifyfull'],
4389 ['foo[]bar', 'fontname', 'justifyfull', 'inserttext'],
4390 ['foo[]bar', 'fontname', 'justifyleft'],
4391 ['foo[]bar', 'fontname', 'justifyleft', 'inserttext'],
4392 ['foo[]bar', 'fontname', 'justifyright'],
4393 ['foo[]bar', 'fontname', 'justifyright', 'inserttext'],
4394 ['foo[]bar', 'fontname', 'outdent'],
4395 ['foo[]bar', 'fontname', 'outdent', 'inserttext'],
4396
4397 ['foo[]bar', 'fontsize', 'inserttext'],
4398 ['foo[]bar', 'fontsize', 'delete'],
4399 ['foo[]bar', 'fontsize', 'delete', 'inserttext'],
4400 ['foo[]bar', 'fontsize', 'formatblock'],
4401 ['foo[]bar', 'fontsize', 'formatblock', 'inserttext'],
4402 ['foo[]bar', 'fontsize', 'forwarddelete'],
4403 ['foo[]bar', 'fontsize', 'forwarddelete', 'inserttext'],
4404 ['foo[]bar', 'fontsize', 'indent'],
4405 ['foo[]bar', 'fontsize', 'indent', 'inserttext'],
4406 ['foo[]bar', 'fontsize', 'inserthorizontalrule'],
4407 ['foo[]bar', 'fontsize', 'inserthorizontalrule', 'inserttext'],
4408 ['foo[]bar', 'fontsize', 'inserthtml'],
4409 ['foo[]bar', 'fontsize', 'inserthtml', 'inserttext'],
4410 ['foo[]bar', 'fontsize', 'insertimage'],
4411 ['foo[]bar', 'fontsize', 'insertimage', 'inserttext'],
4412 ['foo[]bar', 'fontsize', 'insertlinebreak'],
4413 ['foo[]bar', 'fontsize', 'insertlinebreak', 'inserttext'],
4414 ['foo[]bar', 'fontsize', 'insertorderedlist'],
4415 ['foo[]bar', 'fontsize', 'insertorderedlist', 'inserttext'],
4416 ['foo[]bar', 'fontsize', 'insertparagraph'],
4417 ['foo[]bar', 'fontsize', 'insertparagraph', 'inserttext'],
4418 ['foo[]bar', 'fontsize', 'insertunorderedlist'],
4419 ['foo[]bar', 'fontsize', 'insertunorderedlist', 'inserttext'],
4420 ['foo[]bar', 'fontsize', 'justifycenter'],
4421 ['foo[]bar', 'fontsize', 'justifycenter', 'inserttext'],
4422 ['foo[]bar', 'fontsize', 'justifyfull'],
4423 ['foo[]bar', 'fontsize', 'justifyfull', 'inserttext'],
4424 ['foo[]bar', 'fontsize', 'justifyleft'],
4425 ['foo[]bar', 'fontsize', 'justifyleft', 'inserttext'],
4426 ['foo[]bar', 'fontsize', 'justifyright'],
4427 ['foo[]bar', 'fontsize', 'justifyright', 'inserttext'],
4428 ['foo[]bar', 'fontsize', 'outdent'],
4429 ['foo[]bar', 'fontsize', 'outdent', 'inserttext'],
4430
4431 ['foo[]bar', 'forecolor', 'inserttext'],
4432 ['foo[]bar', 'forecolor', 'delete'],
4433 ['foo[]bar', 'forecolor', 'delete', 'inserttext'],
4434 ['foo[]bar', 'forecolor', 'formatblock'],
4435 ['foo[]bar', 'forecolor', 'formatblock', 'inserttext'],
4436 ['foo[]bar', 'forecolor', 'forwarddelete'],
4437 ['foo[]bar', 'forecolor', 'forwarddelete', 'inserttext'],
4438 ['foo[]bar', 'forecolor', 'indent'],
4439 ['foo[]bar', 'forecolor', 'indent', 'inserttext'],
4440 ['foo[]bar', 'forecolor', 'inserthorizontalrule'],
4441 ['foo[]bar', 'forecolor', 'inserthorizontalrule', 'inserttext'],
4442 ['foo[]bar', 'forecolor', 'inserthtml'],
4443 ['foo[]bar', 'forecolor', 'inserthtml', 'inserttext'],
4444 ['foo[]bar', 'forecolor', 'insertimage'],
4445 ['foo[]bar', 'forecolor', 'insertimage', 'inserttext'],
4446 ['foo[]bar', 'forecolor', 'insertlinebreak'],
4447 ['foo[]bar', 'forecolor', 'insertlinebreak', 'inserttext'],
4448 ['foo[]bar', 'forecolor', 'insertorderedlist'],
4449 ['foo[]bar', 'forecolor', 'insertorderedlist', 'inserttext'],
4450 ['foo[]bar', 'forecolor', 'insertparagraph'],
4451 ['foo[]bar', 'forecolor', 'insertparagraph', 'inserttext'],
4452 ['foo[]bar', 'forecolor', 'insertunorderedlist'],
4453 ['foo[]bar', 'forecolor', 'insertunorderedlist', 'inserttext'],
4454 ['foo[]bar', 'forecolor', 'justifycenter'],
4455 ['foo[]bar', 'forecolor', 'justifycenter', 'inserttext'],
4456 ['foo[]bar', 'forecolor', 'justifyfull'],
4457 ['foo[]bar', 'forecolor', 'justifyfull', 'inserttext'],
4458 ['foo[]bar', 'forecolor', 'justifyleft'],
4459 ['foo[]bar', 'forecolor', 'justifyleft', 'inserttext'],
4460 ['foo[]bar', 'forecolor', 'justifyright'],
4461 ['foo[]bar', 'forecolor', 'justifyright', 'inserttext'],
4462 ['foo[]bar', 'forecolor', 'outdent'],
4463 ['foo[]bar', 'forecolor', 'outdent', 'inserttext'],
4464
4465 ['foo[]bar', 'hilitecolor', 'inserttext'],
4466 ['foo[]bar', 'hilitecolor', 'delete'],
4467 ['foo[]bar', 'hilitecolor', 'delete', 'inserttext'],
4468 ['foo[]bar', 'hilitecolor', 'formatblock'],
4469 ['foo[]bar', 'hilitecolor', 'formatblock', 'inserttext'],
4470 ['foo[]bar', 'hilitecolor', 'forwarddelete'],
4471 ['foo[]bar', 'hilitecolor', 'forwarddelete', 'inserttext'],
4472 ['foo[]bar', 'hilitecolor', 'indent'],
4473 ['foo[]bar', 'hilitecolor', 'indent', 'inserttext'],
4474 ['foo[]bar', 'hilitecolor', 'inserthorizontalrule'],
4475 ['foo[]bar', 'hilitecolor', 'inserthorizontalrule', 'inserttext'],
4476 ['foo[]bar', 'hilitecolor', 'inserthtml'],
4477 ['foo[]bar', 'hilitecolor', 'inserthtml', 'inserttext'],
4478 ['foo[]bar', 'hilitecolor', 'insertimage'],
4479 ['foo[]bar', 'hilitecolor', 'insertimage', 'inserttext'],
4480 ['foo[]bar', 'hilitecolor', 'insertlinebreak'],
4481 ['foo[]bar', 'hilitecolor', 'insertlinebreak', 'inserttext'],
4482 ['foo[]bar', 'hilitecolor', 'insertorderedlist'],
4483 ['foo[]bar', 'hilitecolor', 'insertorderedlist', 'inserttext'],
4484 ['foo[]bar', 'hilitecolor', 'insertparagraph'],
4485 ['foo[]bar', 'hilitecolor', 'insertparagraph', 'inserttext'],
4486 ['foo[]bar', 'hilitecolor', 'insertunorderedlist'],
4487 ['foo[]bar', 'hilitecolor', 'insertunorderedlist', 'inserttext'],
4488 ['foo[]bar', 'hilitecolor', 'justifycenter'],
4489 ['foo[]bar', 'hilitecolor', 'justifycenter', 'inserttext'],
4490 ['foo[]bar', 'hilitecolor', 'justifyfull'],
4491 ['foo[]bar', 'hilitecolor', 'justifyfull', 'inserttext'],
4492 ['foo[]bar', 'hilitecolor', 'justifyleft'],
4493 ['foo[]bar', 'hilitecolor', 'justifyleft', 'inserttext'],
4494 ['foo[]bar', 'hilitecolor', 'justifyright'],
4495 ['foo[]bar', 'hilitecolor', 'justifyright', 'inserttext'],
4496 ['foo[]bar', 'hilitecolor', 'outdent'],
4497 ['foo[]bar', 'hilitecolor', 'outdent', 'inserttext'],
4498
4499 // Test things that interfere with each other
4500 ['foo[]bar', 'superscript', 'subscript', 'inserttext'],
4501 ['foo[]bar', 'subscript', 'superscript', 'inserttext'],
4502
4503 ['foo[]bar', 'createlink', ['forecolor', '#0000FF'], 'inserttext'],
4504 ['foo[]bar', ['forecolor', '#0000FF'], 'createlink', 'inserttext'],
4505 ['foo[]bar', 'createlink', ['forecolor', 'blue'], 'inserttext'],
4506 ['foo[]bar', ['forecolor', 'blue'], 'createlink', 'inserttext'],
4507 ['foo[]bar', 'createlink', ['forecolor', 'brown'], 'inserttext'],
4508 ['foo[]bar', ['forecolor', 'brown'], 'createlink', 'inserttext'],
4509 ['foo[]bar', 'createlink', ['forecolor', 'black'], 'inserttext'],
4510 ['foo[]bar', ['forecolor', 'black'], 'createlink', 'inserttext'],
4511 ['foo[]bar', 'createlink', 'underline', 'inserttext'],
4512 ['foo[]bar', 'underline', 'createlink', 'inserttext'],
4513 ['foo[]bar', 'createlink', 'underline', 'underline', 'inserttext'],
4514 ['foo[]bar', 'underline', 'underline', 'createlink', 'inserttext'],
4515
4516 ['foo[]bar', 'subscript', ['fontsize', '2'], 'inserttext'],
4517 ['foo[]bar', ['fontsize', '2'], 'subscript', 'inserttext'],
4518 ['foo[]bar', 'subscript', ['fontsize', '3'], 'inserttext'],
4519 ['foo[]bar', ['fontsize', '3'], 'subscript', 'inserttext'],
4520
4521 ['foo[]bar', ['hilitecolor', 'aqua'], ['backcolor', 'tan'], 'inserttext' ],
4522 ['foo[]bar', ['backcolor', 'tan'], ['hilitecolor', 'aqua'], 'inserttext' ],
4523
4524
4525 // The following are all just inserttext tests that we took from there,
4526 // but we first backspace the selected text instead of letting
4527 // inserttext handle it. This tests that deletion correctly sets
4528 // overrides.
4529 ['foo<b>[bar]</b>baz', 'delete', 'inserttext'],
4530 ['foo<i>[bar]</i>baz', 'delete', 'inserttext'],
4531 ['foo<s>[bar]</s>baz', 'delete', 'inserttext'],
4532 ['foo<sub>[bar]</sub>baz', 'delete', 'inserttext'],
4533 ['foo<sup>[bar]</sup>baz', 'delete', 'inserttext'],
4534 ['foo<u>[bar]</u>baz', 'delete', 'inserttext'],
4535 ['foo<a href=http://www.google.com>[bar]</a>baz', 'delete', 'inserttext' ],
4536 ['foo<font face=sans-serif>[bar]</font>baz', 'delete', 'inserttext'],
4537 ['foo<font size=4>[bar]</font>baz', 'delete', 'inserttext'],
4538 ['foo<font color=#0000FF>[bar]</font>baz', 'delete', 'inserttext'],
4539 ['foo<span style=background-color:#00FFFF>[bar]</span>baz', 'delete', 'i nserttext'],
4540 ['foo<a href=http://www.google.com><font color=blue>[bar]</font></a>baz' , 'delete', 'inserttext'],
4541 ['foo<font color=blue><a href=http://www.google.com>[bar]</a></font>baz' , 'delete', 'inserttext'],
4542 ['foo<a href=http://www.google.com><font color=brown>[bar]</font></a>baz ', 'delete', 'inserttext'],
4543 ['foo<font color=brown><a href=http://www.google.com>[bar]</a></font>baz ', 'delete', 'inserttext'],
4544 ['foo<a href=http://www.google.com><font color=black>[bar]</font></a>baz ', 'delete', 'inserttext'],
4545 ['foo<a href=http://www.google.com><u>[bar]</u></a>baz', 'delete', 'inse rttext'],
4546 ['foo<u><a href=http://www.google.com>[bar]</a></u>baz', 'delete', 'inse rttext'],
4547 ['foo<sub><font size=2>[bar]</font></sub>baz', 'delete', 'inserttext'],
4548 ['foo<font size=2><sub>[bar]</sub></font>baz', 'delete', 'inserttext'],
4549 ['foo<sub><font size=3>[bar]</font></sub>baz', 'delete', 'inserttext'],
4550 ['foo<font size=3><sub>[bar]</sub></font>baz', 'delete', 'inserttext'],
4551
4552 // Now repeat but with different selections.
4553 ['[foo<b>bar]</b>baz', 'delete', 'inserttext'],
4554 ['[foo<i>bar]</i>baz', 'delete', 'inserttext'],
4555 ['[foo<s>bar]</s>baz', 'delete', 'inserttext'],
4556 ['[foo<sub>bar]</sub>baz', 'delete', 'inserttext'],
4557 ['[foo<sup>bar]</sup>baz', 'delete', 'inserttext'],
4558 ['[foo<u>bar]</u>baz', 'delete', 'inserttext'],
4559 ['[foo<a href=http://www.google.com>bar]</a>baz', 'delete', 'inserttext' ],
4560 ['[foo<font face=sans-serif>bar]</font>baz', 'delete', 'inserttext'],
4561 ['[foo<font size=4>bar]</font>baz', 'delete', 'inserttext'],
4562 ['[foo<font color=#0000FF>bar]</font>baz', 'delete', 'inserttext'],
4563 ['[foo<span style=background-color:#00FFFF>bar]</span>baz', 'delete', 'i nserttext'],
4564 ['[foo<a href=http://www.google.com><font color=blue>bar]</font></a>baz' , 'delete', 'inserttext'],
4565 ['[foo<font color=blue><a href=http://www.google.com>bar]</a></font>baz' , 'delete', 'inserttext'],
4566 ['[foo<a href=http://www.google.com><font color=brown>bar]</font></a>baz ', 'delete', 'inserttext'],
4567 ['[foo<font color=brown><a href=http://www.google.com>bar]</a></font>baz ', 'delete', 'inserttext'],
4568 ['[foo<a href=http://www.google.com><font color=black>bar]</font></a>baz ', 'delete', 'inserttext'],
4569 ['[foo<a href=http://www.google.com><u>bar]</u></a>baz', 'delete', 'inse rttext'],
4570 ['[foo<u><a href=http://www.google.com>bar]</a></u>baz', 'delete', 'inse rttext'],
4571 ['[foo<sub><font size=2>bar]</font></sub>baz', 'delete', 'inserttext'],
4572 ['[foo<font size=2><sub>bar]</sub></font>baz', 'delete', 'inserttext'],
4573 ['[foo<sub><font size=3>bar]</font></sub>baz', 'delete', 'inserttext'],
4574 ['[foo<font size=3><sub>bar]</sub></font>baz', 'delete', 'inserttext'],
4575
4576 ['foo<b>[bar</b>baz]', 'delete', 'inserttext'],
4577 ['foo<i>[bar</i>baz]', 'delete', 'inserttext'],
4578 ['foo<s>[bar</s>baz]', 'delete', 'inserttext'],
4579 ['foo<sub>[bar</sub>baz]', 'delete', 'inserttext'],
4580 ['foo<sup>[bar</sup>baz]', 'delete', 'inserttext'],
4581 ['foo<u>[bar</u>baz]', 'delete', 'inserttext'],
4582 ['foo<a href=http://www.google.com>[bar</a>baz]', 'delete', 'inserttext' ],
4583 ['foo<font face=sans-serif>[bar</font>baz]', 'delete', 'inserttext'],
4584 ['foo<font size=4>[bar</font>baz]', 'delete', 'inserttext'],
4585 ['foo<font color=#0000FF>[bar</font>baz]', 'delete', 'inserttext'],
4586 ['foo<span style=background-color:#00FFFF>[bar</span>baz]', 'delete', 'i nserttext'],
4587 ['foo<a href=http://www.google.com><font color=blue>[bar</font></a>baz]' , 'delete', 'inserttext'],
4588 ['foo<font color=blue><a href=http://www.google.com>[bar</a></font>baz]' , 'delete', 'inserttext'],
4589 ['foo<a href=http://www.google.com><font color=brown>[bar</font></a>baz] ', 'delete', 'inserttext'],
4590 ['foo<font color=brown><a href=http://www.google.com>[bar</a></font>baz] ', 'delete', 'inserttext'],
4591 ['foo<a href=http://www.google.com><font color=black>[bar</font></a>baz] ', 'delete', 'inserttext'],
4592 ['foo<a href=http://www.google.com><u>[bar</u></a>baz]', 'delete', 'inse rttext'],
4593 ['foo<u><a href=http://www.google.com>[bar</a></u>baz]', 'delete', 'inse rttext'],
4594 ['foo<sub><font size=2>[bar</font></sub>baz]', 'delete', 'inserttext'],
4595 ['foo<font size=2><sub>[bar</sub></font>baz]', 'delete', 'inserttext'],
4596 ['foo<sub><font size=3>[bar</font></sub>baz]', 'delete', 'inserttext'],
4597 ['foo<font size=3><sub>[bar</sub></font>baz]', 'delete', 'inserttext'],
4598
4599 // https://bugs.webkit.org/show_bug.cgi?id=19702
4600 ['<blockquote><font color=blue>[foo]</font></blockquote>', 'delete', 'in serttext'],
4601 ],
4602 //@}
4603 };
4604 tests.backcolor = tests.hilitecolor;
4605 tests.insertlinebreak = tests.insertparagraph;
4606
4607 // Tests that start with "!" are believed to have bogus results and should be
4608 // skipped until the relevant bugs are fixed.
4609 var badTests = {};
4610 (function(){
4611 for (var command in tests) {
4612 badTests[command] = [];
4613 for (var i = 0; i < tests[command].length; i++) {
4614 var test = tests[command][i];
4615 if (typeof test == "string" && test[0] == "!") {
4616 test = test.slice(1);
4617 tests[command][i] = test;
4618 badTests[command].push(test);
4619 }
4620 if (typeof test == "object" && test[0][0] == "!") {
4621 test = [test[0].slice(1)].concat(test.slice(1));
4622 tests[command][i] = test;
4623 badTests[command].push(test);
4624 }
4625 }
4626 }
4627 })();
4628
4629 var defaultValues = {
4630 //@{
4631 backcolor: "#00FFFF",
4632 createlink: "http://www.google.com/",
4633 fontname: "sans-serif",
4634 fontsize: "4",
4635 forecolor: "#0000FF",
4636 formatblock: "<div>",
4637 hilitecolor: "#00FFFF",
4638 inserthorizontalrule: "",
4639 inserthtml: "ab<b>c</b>d",
4640 insertimage: "/img/lion.svg",
4641 inserttext: "a",
4642 defaultparagraphseparator: "div",
4643 stylewithcss: "true",
4644 usecss: "true",
4645 };
4646 //@}
4647
4648 var notes = {
4649 //@{
4650 fontname: 'Note that the body\'s font-family is "serif".',
4651 };
4652 //@}
4653
4654 var doubleTestingCommands = [
4655 //@{
4656 "backcolor",
4657 "bold",
4658 "fontname",
4659 "fontsize",
4660 "forecolor",
4661 "italic",
4662 "justifycenter",
4663 "justifyfull",
4664 "justifyleft",
4665 "justifyright",
4666 "strikethrough",
4667 "stylewithcss",
4668 "subscript",
4669 "superscript",
4670 "underline",
4671 "usecss",
4672 ];
4673 //@}
4674
4675 function prettyPrint(value) {
4676 //@{
4677 // Partly stolen from testharness.js
4678 if (typeof value != "string") {
4679 return String(value);
4680 }
4681
4682 value = value.replace(/\\/g, "\\\\")
4683 .replace(/"/g, '\\"');
4684
4685 for (var i = 0; i < 32; i++) {
4686 var replace = "\\";
4687 switch (i) {
4688 case 0: replace += "0"; break;
4689 case 1: replace += "x01"; break;
4690 case 2: replace += "x02"; break;
4691 case 3: replace += "x03"; break;
4692 case 4: replace += "x04"; break;
4693 case 5: replace += "x05"; break;
4694 case 6: replace += "x06"; break;
4695 case 7: replace += "x07"; break;
4696 case 8: replace += "b"; break;
4697 case 9: replace += "t"; break;
4698 case 10: replace += "n"; break;
4699 case 11: replace += "v"; break;
4700 case 12: replace += "f"; break;
4701 case 13: replace += "r"; break;
4702 case 14: replace += "x0e"; break;
4703 case 15: replace += "x0f"; break;
4704 case 16: replace += "x10"; break;
4705 case 17: replace += "x11"; break;
4706 case 18: replace += "x12"; break;
4707 case 19: replace += "x13"; break;
4708 case 20: replace += "x14"; break;
4709 case 21: replace += "x15"; break;
4710 case 22: replace += "x16"; break;
4711 case 23: replace += "x17"; break;
4712 case 24: replace += "x18"; break;
4713 case 25: replace += "x19"; break;
4714 case 26: replace += "x1a"; break;
4715 case 27: replace += "x1b"; break;
4716 case 28: replace += "x1c"; break;
4717 case 29: replace += "x1d"; break;
4718 case 30: replace += "x1e"; break;
4719 case 31: replace += "x1f"; break;
4720 }
4721 value = value.replace(new RegExp(String.fromCharCode(i), "g"), replace);
4722 }
4723 return '"' + value + '"';
4724 }
4725 //@}
4726
4727 function doSetup(selector, idx) {
4728 //@{
4729 var table = document.querySelectorAll(selector)[idx];
4730
4731 var tr = document.createElement("tr");
4732 table.firstChild.appendChild(tr);
4733 tr.className = (tr.className + " active").trim();
4734
4735 return tr;
4736 }
4737 //@}
4738
4739 function queryOutputHelper(beforeIndeterm, beforeState, beforeValue,
4740 afterIndeterm, afterState, afterValue,
4741 command, value) {
4742 //@{
4743 var frag = document.createDocumentFragment();
4744 var beforeDiv = document.createElement("div");
4745 var afterDiv = document.createElement("div");
4746 frag.appendChild(beforeDiv);
4747 frag.appendChild(afterDiv);
4748 beforeDiv.className = afterDiv.className = "extra-results";
4749 beforeDiv.textContent = "Before: ";
4750 afterDiv.textContent = "After: ";
4751
4752 beforeDiv.appendChild(document.createElement("span"));
4753 afterDiv.appendChild(document.createElement("span"));
4754 if ("indeterm" in commands[command]) {
4755 // We only know it has to be either true or false.
4756 if (beforeIndeterm !== true && beforeIndeterm !== false) {
4757 beforeDiv.lastChild.className = "bad-result";
4758 }
4759 } else {
4760 // It always has to be false.
4761 beforeDiv.lastChild.className = beforeIndeterm === false
4762 ? "good-result"
4763 : "bad-result";
4764 }
4765 // After running the command, indeterminate must always be false, except if
4766 // it's an exception, or if it's insert*list and the state was true to
4767 // begin with. And we can't help strikethrough/underline.
4768 if ((/^insert(un)?orderedlist$/.test(command) && beforeState)
4769 || command == "strikethrough"
4770 || command == "underline") {
4771 if (afterIndeterm !== true && afterIndeterm !== false) {
4772 afterDiv.lastChild.className = "bad-result";
4773 }
4774 } else {
4775 afterDiv.lastChild.className =
4776 afterIndeterm === false
4777 ? "good-result"
4778 : "bad-result";
4779 }
4780 beforeDiv.lastChild.textContent = "indeterm " + prettyPrint(beforeIndeterm);
4781 afterDiv.lastChild.textContent = "indeterm " + prettyPrint(afterIndeterm);
4782
4783 beforeDiv.appendChild(document.createTextNode(", "));
4784 afterDiv.appendChild(document.createTextNode(", "));
4785
4786 beforeDiv.appendChild(document.createElement("span"));
4787 afterDiv.appendChild(document.createElement("span"));
4788 if (/^insert(un)?orderedlist$/.test(command)) {
4789 // If the before state is true, the after state could be either true or
4790 // false. But if the before state is false, the after state has to be
4791 // true.
4792 if (beforeState !== true && beforeState !== false) {
4793 beforeDiv.lastChild.className = "bad-result";
4794 }
4795 if (!beforeState) {
4796 afterDiv.lastChild.className = afterState === true
4797 ? "good-result"
4798 : "bad-result";
4799 } else if (afterState !== true && afterState !== false) {
4800 afterDiv.lastChild.className = "bad-result";
4801 }
4802 } else if (/^justify(center|full|left|right)$/.test(command)) {
4803 // We don't know about the before state, but the after state is always
4804 // supposed to be true.
4805 if (beforeState !== true && beforeState !== false) {
4806 beforeDiv.lastChild.className = "bad-result";
4807 }
4808 afterDiv.lastChild.className = afterState === true
4809 ? "good-result"
4810 : "bad-result";
4811 } else if (command == "strikethrough" || command == "underline") {
4812 // The only thing we can say is the before/after states need to be
4813 // either true or false.
4814 if (beforeState !== true && beforeState !== false) {
4815 beforeDiv.lastChild.className = "bad-result";
4816 }
4817 if (afterState !== true && afterState !== false) {
4818 afterDiv.lastChild.className = "bad-result";
4819 }
4820 } else {
4821 // The general rule is it must flip the state, unless there's no state
4822 // defined, in which case it should always be false.
4823 beforeDiv.lastChild.className =
4824 afterDiv.lastChild.className =
4825 ("state" in commands[command] && typeof beforeState == "boolean" && typeof afterState == "boolean" && beforeState === !afterState)
4826 || (!("state" in commands[command]) && beforeState === false && afte rState === false)
4827 ? "good-result"
4828 : "bad-result";
4829 }
4830 beforeDiv.lastChild.textContent = "state " + prettyPrint(beforeState);
4831 afterDiv.lastChild.textContent = "state " + prettyPrint(afterState);
4832
4833 beforeDiv.appendChild(document.createTextNode(", "));
4834 afterDiv.appendChild(document.createTextNode(", "));
4835
4836 beforeDiv.appendChild(document.createElement("span"));
4837 afterDiv.appendChild(document.createElement("span"));
4838
4839 // Direct equality comparison doesn't make sense in a bunch of cases.
4840 if (command == "backcolor" || command == "forecolor" || command == "hiliteco lor") {
4841 if (/^([0-9a-fA-F]{3}){1,2}$/.test(value)) {
4842 value = "#" + value;
4843 }
4844 } else if (command == "fontsize") {
4845 value = normalizeFontSize(value);
4846 if (value !== null) {
4847 value = String(cssSizeToLegacy(value));
4848 }
4849 } else if (command == "formatblock") {
4850 value = value.replace(/^<(.*)>$/, "$1").toLowerCase();
4851 } else if (command == "defaultparagraphseparator") {
4852 value = value.toLowerCase();
4853 if (value != "p" && value != "div") {
4854 value = "";
4855 }
4856 }
4857
4858 if (((command == "backcolor" || command == "forecolor" || command == "hilite color") && value.toLowerCase() == "currentcolor")
4859 || (command == "fontsize" && value === null)
4860 || (command == "formatblock" && formattableBlockNames.indexOf(value.replace( /^<(.*)>$/, "$1").trim()) == -1)
4861 || (command == "defaultparagraphseparator" && value == "")) {
4862 afterDiv.lastChild.className = beforeValue === afterValue
4863 ? "good-result"
4864 : "bad-result";
4865 } else if (/^justify(center|full|left|right)$/.test(command)) {
4866 // We know there are only four correct values beforehand, and afterward
4867 // the value has to be the one we set.
4868 if (!/^(center|justify|left|right)$/.test(beforeValue)) {
4869 beforeDiv.lastChild.className = "bad-result";
4870 }
4871 var expectedValue = command == "justifyfull"
4872 ? "justify"
4873 : command.replace("justify", "");
4874 afterDiv.lastChild.className = afterValue === expectedValue
4875 ? "good-result"
4876 : "bad-result";
4877 } else if (!("value" in commands[command])) {
4878 // If it's not defined we want "".
4879 beforeDiv.lastChild.className = beforeValue === ""
4880 ? "good-result"
4881 : "bad-result";
4882 afterDiv.lastChild.className = afterValue === ""
4883 ? "good-result"
4884 : "bad-result";
4885 } else {
4886 // And in all other cases, the value afterwards has to be the one we
4887 // set.
4888 afterDiv.lastChild.className =
4889 areEquivalentValues(command, afterValue, value)
4890 ? "good-result"
4891 : "bad-result";
4892 }
4893 beforeDiv.lastChild.textContent = "value " + prettyPrint(beforeValue);
4894 afterDiv.lastChild.textContent = "value " + prettyPrint(afterValue);
4895
4896 return frag;
4897 }
4898 //@}
4899
4900 function normalizeTest(command, test, styleWithCss) {
4901 //@{
4902 // Our standard format for test processing is:
4903 // [input HTML, [command1, value1], [command2, value2], ...]
4904 // But this is verbose, so we actually use three different formats in the
4905 // tests and multiTests arrays:
4906 //
4907 // 1) Plain string giving the input HTML. The command is implicit from the
4908 // key of the tests array. If the command takes values, the value is given
4909 // by defaultValues, otherwise it's "". Has to be converted to
4910 // [input HTML, [command, value].
4911 //
4912 // 2) Two-element array [value, input HTML]. Has to be converted to
4913 // [input HTML, [command, value]].
4914 //
4915 // 3) An element of multiTests. This just has to have values filled in.
4916 //
4917 // Optionally, a styleWithCss argument can be passed, either true or false.
4918 // If it is, we'll prepend a styleWithCss invocation.
4919 if (command == "multitest") {
4920 if (typeof test == "string") {
4921 test = JSON.parse(test);
4922 }
4923 for (var i = 1; i < test.length; i++) {
4924 if (typeof test[i] == "string"
4925 && test[i] in defaultValues) {
4926 test[i] = [test[i], defaultValues[test[i]]];
4927 } else if (typeof test[i] == "string") {
4928 test[i] = [test[i], ""];
4929 }
4930 }
4931 return test;
4932 }
4933
4934 if (typeof test == "string") {
4935 if (command in defaultValues) {
4936 test = [test, [command, defaultValues[command]]];
4937 } else {
4938 test = [test, [command, ""]];
4939 }
4940 } else if (test.length == 2) {
4941 test = [test[1], [command, String(test[0])]];
4942 }
4943
4944 if (styleWithCss !== undefined) {
4945 test.splice(1, 0, ["stylewithcss", String(styleWithCss)]);
4946 }
4947
4948 return test;
4949 }
4950 //@}
4951
4952 function doInputCell(tr, test, command) {
4953 //@{
4954 var testHtml = test[0];
4955
4956 var msg = null;
4957 if (command in defaultValues) {
4958 // Single command with a value, possibly with a styleWithCss stuck
4959 // before. We don't need to specify the command itself, since this
4960 // presumably isn't in multiTests, so the command is already given by
4961 // the section header.
4962 msg = 'value: ' + prettyPrint(test[test.length - 1][1]);
4963 } else if (command == "multitest") {
4964 // Uses a different input format
4965 msg = JSON.stringify(test);
4966 }
4967 var inputCell = document.createElement("td");
4968 inputCell.innerHTML = "<div></div><div></div>";
4969 inputCell.firstChild.innerHTML = testHtml;
4970 inputCell.lastChild.textContent = inputCell.firstChild.innerHTML;
4971 if (msg !== null) {
4972 inputCell.lastChild.textContent += " (" + msg + ")";
4973 }
4974
4975 tr.appendChild(inputCell);
4976 }
4977 //@}
4978
4979 function doSpecCell(tr, test, command) {
4980 //@{
4981 var specCell = document.createElement("td");
4982 tr.appendChild(specCell);
4983 try {
4984 var points = setupCell(specCell, test[0]);
4985 var range = document.createRange();
4986 range.setStart(points[0], points[1]);
4987 range.setEnd(points[2], points[3]);
4988 // The points might be backwards
4989 if (range.collapsed) {
4990 range.setEnd(points[0], points[1]);
4991 }
4992 specCell.firstChild.contentEditable = "true";
4993 specCell.firstChild.spellcheck = false;
4994
4995 if (command != "multitest") {
4996 try { var beforeIndeterm = myQueryCommandIndeterm(command, range) }
4997 catch(e) { beforeIndeterm = "Exception" }
4998 try { var beforeState = myQueryCommandState(command, range) }
4999 catch(e) { beforeState = "Exception" }
5000 try { var beforeValue = myQueryCommandValue(command, range) }
5001 catch(e) { beforeValue = "Exception" }
5002 }
5003
5004 for (var i = 1; i < test.length; i++) {
5005 myExecCommand(test[i][0], false, test[i][1], range);
5006 }
5007
5008 if (command != "multitest") {
5009 try { var afterIndeterm = myQueryCommandIndeterm(command, range) }
5010 catch(e) { afterIndeterm = "Exception" }
5011 try { var afterState = myQueryCommandState(command, range) }
5012 catch(e) { afterState = "Exception" }
5013 try { var afterValue = myQueryCommandValue(command, range) }
5014 catch(e) { afterValue = "Exception" }
5015 }
5016
5017 specCell.firstChild.contentEditable = "inherit";
5018 specCell.firstChild.removeAttribute("spellcheck");
5019 var compareDiv1 = specCell.firstChild.cloneNode(true);
5020
5021 // Now do various sanity checks, and throw if they're violated. First
5022 // just count children:
5023 if (specCell.childNodes.length != 2) {
5024 throw "The cell didn't have two children. Did something spill outsi de the test div?";
5025 }
5026
5027 // Now verify that the DOM serializes.
5028 compareDiv1.normalize();
5029 var compareDiv2 = compareDiv1.cloneNode(false);
5030 compareDiv2.innerHTML = compareDiv1.innerHTML;
5031 // Oddly, IE9 sometimes produces two nodes that return true for
5032 // isEqualNode but have different innerHTML (omitting closing tags vs.
5033 // not).
5034 if (!compareDiv1.isEqualNode(compareDiv2)
5035 && compareDiv1.innerHTML != compareDiv2.innerHTML) {
5036 throw "DOM does not round-trip through serialization! "
5037 + compareDiv1.innerHTML + " vs. " + compareDiv2.innerHTML;
5038 }
5039 if (!compareDiv1.isEqualNode(compareDiv2)) {
5040 throw "DOM does not round-trip through serialization (although inner HTML is the same)! "
5041 + compareDiv1.innerHTML;
5042 }
5043
5044 // Check for attributes
5045 if (specCell.firstChild.attributes.length) {
5046 throw "Wrapper div has attributes! " +
5047 specCell.innerHTML.replace(/<div><\/div>$/, "");
5048 }
5049
5050 // Final sanity check: make sure everything isAllowedChild() of its
5051 // parent.
5052 getDescendants(specCell.firstChild).forEach(function(descendant) {
5053 if (!isAllowedChild(descendant, descendant.parentNode)) {
5054 throw "Something here is not an allowed child of its parent: " + descendant;
5055 }
5056 });
5057
5058 addBrackets(range);
5059
5060 specCell.lastChild.textContent = specCell.firstChild.innerHTML;
5061 if (command != "multitest") {
5062 specCell.lastChild.appendChild(queryOutputHelper(
5063 beforeIndeterm, beforeState, beforeValue,
5064 afterIndeterm, afterState, afterValue,
5065 command, test[test.length - 1][1]));
5066 if (specCell.querySelector(".bad-result")) {
5067 specCell.parentNode.className = "alert";
5068 }
5069 }
5070 } catch (e) {
5071 specCell.firstChild.contentEditable = "inherit";
5072 specCell.firstChild.removeAttribute("spellcheck");
5073 specCell.lastChild.textContent = "Exception: " + formatException(e);
5074
5075 specCell.parentNode.className = "alert";
5076 specCell.lastChild.className = "alert";
5077
5078 // Don't bother comparing to localStorage, this is always wrong no
5079 // matter what.
5080 return;
5081 }
5082
5083 if (command != "multitest") {
5084 // Old storage format
5085 var key = "execcommand-" + command
5086 + "-" + (test.length == 2 || test[1][1] == "false" ? "0" : "1")
5087 + "-" + tr.firstChild.lastChild.textContent;
5088 } else {
5089 var key = "execcommand-" + JSON.stringify(test);
5090 }
5091
5092 // Use getItem() instead of direct property access to work around Firefox
5093 // bug: https://bugzilla.mozilla.org/show_bug.cgi?id=532062
5094 var oldValue = localStorage.getItem(key);
5095 var newValue = specCell.lastChild.firstChild.textContent;
5096
5097 // Ignore differences between {} and [].
5098 if (oldValue === null
5099 || oldValue.replace("{}", "[]") !== newValue.replace("{}", "[]")) {
5100 specCell.parentNode.className = "alert";
5101 var alertDiv = document.createElement("div");
5102 specCell.lastChild.appendChild(alertDiv);
5103 alertDiv.className = "alert";
5104 if (oldValue === null) {
5105 alertDiv.textContent = "Newly added test result";
5106 } else if (oldValue.replace(/[\[\]{}]/g, "") == newValue.replace(/[\[\]{ }]/g, "")) {
5107 alertDiv.textContent = "Last run produced a different selection: " + oldValue;
5108 } else {
5109 alertDiv.textContent = "Last run produced different markup: " + oldV alue;
5110 }
5111
5112 var button = document.createElement("button");
5113 alertDiv.appendChild(button);
5114 button.textContent = "Store new result";
5115 button.className = "store-new-result";
5116 button.onclick = (function(key, val, alertDiv) { return function() {
5117 localStorage[key] = val;
5118 // Make it easier to do mass updates, and also to jump to the next
5119 // new result
5120 var buttons = document.getElementsByClassName("store-new-result");
5121 for (var i = 0; i < buttons.length; i++) {
5122 if (isDescendant(buttons[i], alertDiv)
5123 && i + 1 < buttons.length) {
5124 buttons[i + 1].focus();
5125 break;
5126 }
5127 }
5128 var td = alertDiv;
5129 while (td.tagName != "TD") {
5130 td = td.parentNode;
5131 }
5132 alertDiv.parentNode.removeChild(alertDiv);
5133 if (!td.querySelector(".alert")) {
5134 td.parentNode.className = (" " + td.parentNode.className + " ")
5135 .replace(/ alert /g, "")
5136 .replace(/^ | $/g, "");
5137 }
5138 } })(key, newValue, alertDiv);
5139 }
5140 }
5141 //@}
5142
5143 function browserCellException(e, testDiv, browserCell) {
5144 //@{
5145 if (testDiv) {
5146 testDiv.contenteditable = "inherit";
5147 testDiv.removeAttribute("spellcheck");
5148 }
5149 browserCell.lastChild.className = "alert";
5150 browserCell.lastChild.textContent = "Exception: " + formatException(e);
5151 if (testDiv && testDiv.parentNode != browserCell) {
5152 browserCell.insertBefore(testDiv, browserCell.firstChild);
5153 }
5154 }
5155 //@}
5156
5157 function formatException(e) {
5158 //@{
5159 if (typeof e == "object" && "stack" in e) {
5160 return e + " (stack: " + e.stack + ")";
5161 }
5162 return String(e);
5163 }
5164 //@}
5165
5166 function doSameCell(tr) {
5167 //@{
5168 tr.className = (" " + tr.className + " ").replace(" active ", "").trim();
5169 if (tr.className == "") {
5170 tr.removeAttribute("class");
5171 }
5172
5173 var sameCell = document.createElement("td");
5174 if (!document.querySelector("#browser-checkbox").checked) {
5175 sameCell.className = "maybe";
5176 sameCell.textContent = "?";
5177 } else {
5178 var exception = false;
5179 try {
5180 // Ad hoc normalization to avoid basically spurious mismatches. For
5181 // now this includes ignoring where the selection goes.
5182 var normalizedSpecCell = tr.childNodes[1].lastChild.firstChild.textC ontent
5183 .replace(/[[\]{}]/g, "")
5184 .replace(/ style="margin: 0 0 0 40px; border: none; padding: 0px ;"/g, '')
5185 .replace(/ style="margin-right: 0px;" dir="ltr"/g, '')
5186 .replace(/ style="margin-left: 0px;" dir="rtl"/g, '')
5187 .replace(/ style="margin-(left|right): 40px;"/g, '')
5188 .replace(/: /g, ":")
5189 .replace(/;? ?"/g, '"')
5190 .replace(/<(\/?)strong/g, '<$1b')
5191 .replace(/<(\/?)strike/g, '<$1s')
5192 .replace(/<(\/?)em/g, '<$1i')
5193 .replace(/#[0-9a-fA-F]{6}/g, function(match) { return match.toUp perCase(); });
5194 var normalizedBrowserCell = tr.childNodes[2].lastChild.firstChild.te xtContent
5195 .replace(/[[\]{}]/g, "")
5196 .replace(/ style="margin: 0 0 0 40px; border: none; padding: 0px ;"/g, '')
5197 .replace(/ style="margin-right: 0px;" dir="ltr"/g, '')
5198 .replace(/ style="margin-left: 0px;" dir="rtl"/g, '')
5199 .replace(/ style="margin-(left|right): 40px;"/g, '')
5200 .replace(/: /g, ":")
5201 .replace(/;? ?"/g, '"')
5202 .replace(/<(\/?)strong/g, '<$1b')
5203 .replace(/<(\/?)strike/g, '<$1s')
5204 .replace(/<(\/?)em/g, '<$1i')
5205 .replace(/#[0-9a-fA-F]{6}/g, function(match) { return match.toUp perCase(); })
5206 .replace(/ size="2" width="100%"/g, '');
5207 if (navigator.userAgent.indexOf("MSIE") != -1) {
5208 // IE produces <font style> instead of <span style>, so let's
5209 // translate all <span>s to <font>s.
5210 normalizedSpecCell = normalizedSpecCell
5211 .replace(/<(\/?)span/g, '<$1font');
5212 normalizedBrowserCell = normalizedBrowserCell
5213 .replace(/<(\/?)span/g, '<$1font');
5214 }
5215 } catch (e) {
5216 exception = true;
5217 }
5218 if (!exception && normalizedSpecCell == normalizedBrowserCell) {
5219 sameCell.className = "yes";
5220 sameCell.textContent = "\u2713";
5221 } else {
5222 sameCell.className = "no";
5223 sameCell.textContent = "\u2717";
5224 }
5225 }
5226 tr.appendChild(sameCell);
5227
5228 for (var i = 0; i <= 2; i++) {
5229 // Insert <wbr> so IE doesn't stretch the screen. This is considerably
5230 // more complicated than it has to be, thanks to Firefox's lack of
5231 // support for outerHTML.
5232 var div = tr.childNodes[i].lastChild;
5233 if (div.firstChild) {
5234 var text = div.firstChild.textContent;
5235 div.removeChild(div.firstChild);
5236 div.insertBefore(document.createElement("div"), div.firstChild);
5237 div.firstChild.innerHTML = text
5238 .replace(/&/g, "&amp;")
5239 .replace(/</g, "&lt;")
5240 .replace(/>/g, "><wbr>")
5241 .replace(/&lt;/g, "<wbr>&lt;");
5242 while (div.firstChild.hasChildNodes()) {
5243 div.insertBefore(div.firstChild.lastChild, div.firstChild.nextSi bling);
5244 }
5245 div.removeChild(div.firstChild);
5246 }
5247
5248 // Add position: absolute span to not affect vertical layout
5249 getDescendants(tr.childNodes[i].firstChild)
5250 .filter(function(node) {
5251 return node.nodeType == Node.TEXT_NODE
5252 && /^(\{\}?|\})$/.test(node.data);
5253 }).forEach(function(node) {
5254 var span = document.createElement("span");
5255 span.style.position = "absolute";
5256 span.textContent = node.data;
5257 node.parentNode.insertBefore(span, node);
5258 node.parentNode.removeChild(node);
5259 });
5260 }
5261 }
5262 //@}
5263
5264 function doTearDown(command) {
5265 //@{
5266 getSelection().removeAllRanges();
5267 }
5268 //@}
5269
5270 function setupCell(cell, html) {
5271 //@{
5272 cell.innerHTML = "<div></div><div></div>";
5273
5274 return setupDiv(cell.firstChild, html);
5275 }
5276 //@}
5277
5278 function setupDiv(node, html) {
5279 //@{
5280 // A variety of checks to avoid simple errors. Not foolproof, of course.
5281 var re = /\{|\[|data-start/g;
5282 var markers = [];
5283 var marker;
5284 while (marker = re.exec(html)) {
5285 markers.push(marker);
5286 }
5287 if (markers.length != 1) {
5288 throw "Need exactly one start marker ([ or { or data-start), found " + m arkers.length;
5289 }
5290
5291 var re = /\}|\]|data-end/g;
5292 var markers = [];
5293 var marker;
5294 while (marker = re.exec(html)) {
5295 markers.push(marker);
5296 }
5297 if (markers.length != 1) {
5298 throw "Need exactly one end marker (] or } or data-end), found " + marke rs.length;
5299 }
5300
5301 node.innerHTML = html;
5302
5303 var startNode, startOffset, endNode, endOffset;
5304
5305 // For braces that don't lie inside text nodes, we can't just set
5306 // innerHTML, because that might disturb the DOM. For instance, if the
5307 // brace is right before a <tr>, it could get moved outside the table
5308 // entirely, which messes everything up pretty badly. So we instead
5309 // allow using data attributes: data-start and data-end on the start and
5310 // end nodes, with a numeric value indicating the offset. This format
5311 // doesn't allow the parent div to be a start or end node, but in that case
5312 // you can always use the curly braces.
5313 if (node.querySelector("[data-start]")) {
5314 startNode = node.querySelector("[data-start]");
5315 startOffset = startNode.getAttribute("data-start");
5316 startNode.removeAttribute("data-start");
5317 }
5318 if (node.querySelector("[data-end]")) {
5319 endNode = node.querySelector("[data-end]");
5320 endOffset = endNode.getAttribute("data-end");
5321 endNode.removeAttribute("data-end");
5322 }
5323
5324 var cur = node;
5325 while (true) {
5326 if (!cur || (cur != node && !(cur.compareDocumentPosition(node) & Node.D OCUMENT_POSITION_CONTAINS))) {
5327 break;
5328 }
5329
5330 if (cur.nodeType != Node.TEXT_NODE) {
5331 cur = nextNode(cur);
5332 continue;
5333 }
5334
5335 var data = cur.data.replace(/\]/g, "");
5336 var startIdx = data.indexOf("[");
5337
5338 data = cur.data.replace(/\[/g, "");
5339 var endIdx = data.indexOf("]");
5340
5341 cur.data = cur.data.replace(/[\[\]]/g, "");
5342
5343 if (startIdx != -1) {
5344 startNode = cur;
5345 startOffset = startIdx;
5346 }
5347
5348 if (endIdx != -1) {
5349 endNode = cur;
5350 endOffset = endIdx;
5351 }
5352
5353 // These are only legal as the first or last
5354 data = cur.data.replace(/\}/g, "");
5355 var elStartIdx = data.indexOf("{");
5356
5357 data = cur.data.replace(/\{/g, "");
5358 var elEndIdx = data.indexOf("}");
5359
5360 if (elStartIdx == 0) {
5361 startNode = cur.parentNode;
5362 startOffset = getNodeIndex(cur);
5363 } else if (elStartIdx != -1) {
5364 startNode = cur.parentNode;
5365 startOffset = getNodeIndex(cur) + 1;
5366 }
5367 if (elEndIdx == 0) {
5368 endNode = cur.parentNode;
5369 endOffset = getNodeIndex(cur);
5370 } else if (elEndIdx != -1) {
5371 endNode = cur.parentNode;
5372 endOffset = getNodeIndex(cur) + 1;
5373 }
5374
5375 cur.data = cur.data.replace(/[{}]/g, "");
5376 if (!cur.data.length) {
5377 if (cur == startNode || cur == endNode) {
5378 throw "You put a square bracket where there was no text node . . .";
5379 }
5380 var oldCur = cur;
5381 cur = nextNode(cur);
5382 oldCur.parentNode.removeChild(oldCur);
5383 } else {
5384 cur = nextNode(cur);
5385 }
5386 }
5387
5388 return [startNode, startOffset, endNode, endOffset];
5389 }
5390 //@}
5391
5392 function setSelection(startNode, startOffset, endNode, endOffset) {
5393 //@{
5394 if (navigator.userAgent.indexOf("Opera") != -1) {
5395 // Yes, browser sniffing is evil, but I can't be bothered to debug
5396 // Opera.
5397 var range = document.createRange();
5398 range.setStart(startNode, startOffset);
5399 range.setEnd(endNode, endOffset);
5400 if (range.collapsed) {
5401 range.setEnd(startNode, startOffset);
5402 }
5403 getSelection().removeAllRanges();
5404 getSelection().addRange(range);
5405 } else if ("extend" in getSelection()) {
5406 // WebKit behaves unreasonably for collapse(), so do that manually.
5407 /*
5408 var range = document.createRange();
5409 range.setStart(startNode, startOffset);
5410 getSelection().removeAllRanges();
5411 getSelection().addRange(range);
5412 */
5413 getSelection().collapse(startNode, startOffset);
5414 getSelection().extend(endNode, endOffset);
5415 } else {
5416 // IE9. Selections have no direction, so we just make the selection
5417 // always forwards.
5418 var range;
5419 if (getSelection().rangeCount) {
5420 range = getSelection().getRangeAt(0);
5421 } else {
5422 range = document.createRange();
5423 }
5424 range.setStart(startNode, startOffset);
5425 range.setEnd(endNode, endOffset);
5426 if (range.collapsed) {
5427 // Phooey, we got them backwards.
5428 range.setEnd(startNode, startOffset);
5429 }
5430 if (!getSelection().rangeCount) {
5431 getSelection().addRange(range);
5432 }
5433 }
5434 }
5435 //@}
5436
5437 /**
5438 * Add brackets at the start and end points of the given range, so that they're
5439 * visible.
5440 */
5441 function addBrackets(range) {
5442 //@{
5443 // Handle the collapsed case specially, to avoid confusingly getting the
5444 // markers backwards in some cases
5445 if (range.startContainer.nodeType == Node.TEXT_NODE
5446 || range.startContainer.nodeType == Node.COMMENT_NODE) {
5447 if (range.collapsed) {
5448 range.startContainer.insertData(range.startOffset, "[]");
5449 } else {
5450 range.startContainer.insertData(range.startOffset, "[");
5451 }
5452 } else {
5453 var marker = range.collapsed ? "{}" : "{";
5454 if (range.startOffset != range.startContainer.childNodes.length
5455 && range.startContainer.childNodes[range.startOffset].nodeType == Node.T EXT_NODE) {
5456 range.startContainer.childNodes[range.startOffset].insertData(0, mar ker);
5457 } else if (range.startOffset != 0
5458 && range.startContainer.childNodes[range.startOffset - 1].nodeType == No de.TEXT_NODE) {
5459 range.startContainer.childNodes[range.startOffset - 1].appendData(ma rker);
5460 } else {
5461 // Seems to serialize as I'd want even for tables . . . IE doesn't
5462 // allow undefined to be passed as the second argument (it throws
5463 // an exception), so we have to explicitly check the number of
5464 // children and pass null.
5465 range.startContainer.insertBefore(document.createTextNode(marker),
5466 range.startContainer.childNodes.length == range.startOffset
5467 ? null
5468 : range.startContainer.childNodes[range.startOffset]);
5469 }
5470 }
5471 if (range.collapsed) {
5472 return;
5473 }
5474 if (range.endContainer.nodeType == Node.TEXT_NODE
5475 || range.endContainer.nodeType == Node.COMMENT_NODE) {
5476 range.endContainer.insertData(range.endOffset, "]");
5477 } else {
5478 if (range.endOffset != range.endContainer.childNodes.length
5479 && range.endContainer.childNodes[range.endOffset].nodeType == Node.TEXT_ NODE) {
5480 range.endContainer.childNodes[range.endOffset].insertData(0, "}");
5481 } else if (range.endOffset != 0
5482 && range.endContainer.childNodes[range.endOffset - 1].nodeType == Node.T EXT_NODE) {
5483 range.endContainer.childNodes[range.endOffset - 1].appendData("}");
5484 } else {
5485 range.endContainer.insertBefore(document.createTextNode("}"),
5486 range.endContainer.childNodes.length == range.endOffset
5487 ? null
5488 : range.endContainer.childNodes[range.endOffset]);
5489 }
5490 }
5491 }
5492 //@}
5493
5494 function normalizeSerializedStyle(wrapper) {
5495 //@{
5496 // Inline CSS attribute serialization has terrible interop, so we fix
5497 // things up a bit to avoid spurious mismatches. This needs to be removed
5498 // once CSSOM defines this stuff properly, but for now there's just no
5499 // standard for any of it. This only normalizes descendants of wrapper,
5500 // not wrapper itself.
5501 [].forEach.call(wrapper.querySelectorAll("[style]"), function(node) {
5502 if (node.style.color != "") {
5503 var newColor = normalizeColor(node.style.color);
5504 node.style.color = "";
5505 node.style.color = newColor;
5506 }
5507 if (node.style.backgroundColor != "") {
5508 var newBackgroundColor = normalizeColor(node.style.backgroundColor);
5509 node.style.backgroundColor = "";
5510 node.style.backgroundColor = newBackgroundColor;
5511 }
5512 node.setAttribute("style", node.getAttribute("style")
5513 // Random spacing differences
5514 .replace(/; ?$/, "")
5515 .replace(/: /g, ":")
5516 // Gecko likes "transparent"
5517 .replace(/transparent/g, "rgba(0, 0, 0, 0)")
5518 // WebKit likes to look overly precise
5519 .replace(/, 0.496094\)/g, ", 0.5)")
5520 // Gecko converts anything with full alpha to "transparent" which
5521 // then becomes "rgba(0, 0, 0, 0)", so we have to make other
5522 // browsers match
5523 .replace(/rgba\([0-9]+, [0-9]+, [0-9]+, 0\)/g, "rgba(0, 0, 0, 0)")
5524 );
5525 });
5526 }
5527 //@}
5528
5529 /**
5530 * Input is the same format as output of generateTest in gentest.html.
5531 */
5532 function runConformanceTest(browserTest) {
5533 //@{
5534 document.getElementById("test-container").innerHTML = "<div contenteditable> </div><p>test";
5535 var testName = JSON.stringify(browserTest[1]) + " " + format_value(browserTe st[0]);
5536 var testDiv = document.querySelector("div[contenteditable]");
5537 var originalRootElement, newRootElement;
5538 var exception = null;
5539 var expectedExecCommandReturnValues = browserTest[3];
5540 var expectedQueryResults = browserTest[4];
5541 var actualQueryResults = {};
5542 var actualQueryExceptions = {};
5543
5544 try {
5545 var points = setupDiv(testDiv, browserTest[0]);
5546
5547 var range = document.createRange();
5548 range.setStart(points[0], points[1]);
5549 range.setEnd(points[2], points[3]);
5550 // The points might be backwards
5551 if (range.collapsed) {
5552 range.setEnd(points[0], points[1]);
5553 }
5554 getSelection().removeAllRanges();
5555 getSelection().addRange(range);
5556
5557 var originalRootElement = document.documentElement.cloneNode(true);
5558 originalRootElement.querySelector("[contenteditable]").parentNode
5559 .removeChild(originalRootElement.querySelector("[contenteditable]")) ;
5560 originalRootElement.querySelector("#log").parentNode
5561 .removeChild(originalRootElement.querySelector("#log"));
5562
5563 for (var command in expectedQueryResults) {
5564 var results = [];
5565 var exceptions = {};
5566 try { results[0] = document.queryCommandIndeterm(command) }
5567 catch(e) { exceptions[0] = e }
5568 try { results[1] = document.queryCommandState(command) }
5569 catch(e) { exceptions[1] = e }
5570 try { results[2] = document.queryCommandValue(command) }
5571 catch(e) { exceptions[2] = e }
5572 actualQueryResults[command] = results;
5573 actualQueryExceptions[command] = exceptions;
5574 }
5575 } catch(e) {
5576 exception = e;
5577 }
5578
5579 for (var i = 0; i < browserTest[1].length; i++) {
5580 test(function() {
5581 assert_equals(exception, null, "Setup must not throw an exception");
5582
5583 assert_equals(document.execCommand(browserTest[1][i][0], false, brow serTest[1][i][1]),
5584 expectedExecCommandReturnValues[i]);
5585 }, testName + ": execCommand(" + format_value(browserTest[1][i][0]) + ", false, " + format_value(browserTest[1][i][1]) + ") return value");
5586 }
5587
5588 if (exception === null) {
5589 try {
5590 for (var command in expectedQueryResults) {
5591 var results = actualQueryResults[command];
5592 var exceptions = actualQueryExceptions[command];
5593 try { results[3] = document.queryCommandIndeterm(command) }
5594 catch(e) { exceptions[3] = e }
5595 try { results[4] = document.queryCommandState(command) }
5596 catch(e) { exceptions[4] = e }
5597 try { results[5] = document.queryCommandValue(command) }
5598 catch(e) { exceptions[5] = e }
5599 }
5600
5601 var newRootElement = document.documentElement.cloneNode(true);
5602 newRootElement.querySelector("[contenteditable]").parentNode
5603 .removeChild(newRootElement.querySelector("[contenteditable]"));
5604 newRootElement.querySelector("#log").parentNode
5605 .removeChild(newRootElement.querySelector("#log"));
5606
5607 normalizeSerializedStyle(testDiv);
5608 } catch(e) {
5609 exception = e;
5610 }
5611 }
5612
5613 test(function() {
5614 assert_equals(exception, null, "Setup must not throw an exception");
5615
5616 // Now test for modifications to non-editable content. First just
5617 // count children:
5618 assert_equals(testDiv.parentNode.childNodes.length, 2,
5619 "The parent div must have two children. Did something spill outside the test div?");
5620
5621 // Check for attributes
5622 assert_equals(testDiv.attributes.length, 1,
5623 'Wrapper div must have only one attribute (<div contenteditable="">) , but has more (' +
5624 formatStartTag(testDiv) + ")");
5625
5626 assert_equals(document.body.attributes.length, 0,
5627 "Body element must have no attributes (<body>), but has more (" +
5628 formatStartTag(document.body) + ")");
5629
5630 // Check that in general, nothing outside the test div was modified.
5631 // TODO: Less verbose error reporting, the way some of the range tests
5632 // do?
5633 assert_equals(newRootElement.innerHTML, originalRootElement.innerHTML,
5634 "Everything outside the editable div must be unchanged, but some cha nge did occur");
5635 }, testName + " checks for modifications to non-editable content");
5636
5637 test(function() {
5638 assert_equals(exception, null, "Setup must not throw an exception");
5639
5640 assert_equals(testDiv.innerHTML,
5641 browserTest[2].replace(/[\[\]{}]/g, ""),
5642 "Unexpected innerHTML (after normalizing inline style)");
5643 }, testName + " compare innerHTML");
5644
5645 for (var command in expectedQueryResults) {
5646 var descriptions = [
5647 'queryCommandIndeterm("' + command + '") before',
5648 'queryCommandState("' + command + '") before',
5649 'queryCommandValue("' + command + '") before',
5650 'queryCommandIndeterm("' + command + '") after',
5651 'queryCommandState("' + command + '") after',
5652 'queryCommandValue("' + command + '") after',
5653 ];
5654 for (var i = 0; i < 6; i++) {
5655 test(function() {
5656 assert_equals(exception, null, "Setup must not throw an exceptio n");
5657
5658 if (expectedQueryResults[command][i] === null) {
5659 // Some ad hoc tests to verify that we have a real
5660 // DOMException. FIXME: This should be made more rigorous,
5661 // with clear steps specified for checking that something
5662 // is really a DOMException.
5663 assert_true(i in actualQueryExceptions[command],
5664 "An exception must be thrown in this case");
5665 var e = actualQueryExceptions[command][i];
5666 assert_equals(typeof e, "object",
5667 "typeof thrown object");
5668 assert_idl_attribute(e, "code",
5669 "Thrown object must be a DOMException");
5670 assert_idl_attribute(e, "INVALID_ACCESS_ERR",
5671 "Thrown object must be a DOMException");
5672 assert_equals(e.code, e.INVALID_ACCESS_ERR,
5673 "Thrown object must be an INVALID_ACCESS_ERR, so its .co de and .INVALID_ACCESS_ERR attributes must be equal");
5674 } else if ((i == 2 || i == 5)
5675 && (command == "backcolor" || command == "forecolor" || command == "hilitecolor")
5676 && typeof actualQueryResults[command][i] == "string") {
5677 assert_false(i in actualQueryExceptions[command],
5678 "An exception must not be thrown in this case");
5679 // We don't return the format that the color should be in:
5680 // that's up to CSSOM. Thus we normalize before comparing.
5681 assert_equals(normalizeColor(actualQueryResults[command][i]) ,
5682 expectedQueryResults[command][i],
5683 "Wrong result returned (after color normalization)");
5684 } else {
5685 assert_false(i in actualQueryExceptions[command],
5686 "An exception must not be thrown in this case");
5687 assert_equals(actualQueryResults[command][i],
5688 expectedQueryResults[command][i],
5689 "Wrong result returned");
5690 }
5691 }, testName + " " + descriptions[i]);
5692 }
5693 }
5694
5695 // Silly Firefox
5696 document.body.removeAttribute("bgcolor");
5697 }
5698 //@}
5699
5700 /**
5701 * Return a string like '<body bgcolor="#FFFFFF">'.
5702 */
5703 function formatStartTag(el) {
5704 //@{
5705 var ret = "<" + el.tagName.toLowerCase();
5706 for (var i = 0; i < el.attributes.length; i++) {
5707 ret += " " + el.attributes[i].name + '="';
5708 ret += el.attributes[i].value.replace(/\&/g, "&amp;")
5709 .replace(/"/g, "&quot;");
5710 ret += '"';
5711 }
5712 return ret + ">";
5713 }
5714 //@}
5715
5716 // vim: foldmarker=@{,@} foldmethod=marker
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698