dom/imptests/editing/tests.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 // For the original (development) tests, we want to make a bunch of changes to
     2 // the page as it loads.  We don't want this for the conformance tests, so let
     3 // them opt out.
     4 if (typeof testsJsLibraryOnly == "undefined" || !testsJsLibraryOnly) {
     5 	// Alert the reader of egregious Opera bug that will make the specced
     6 	// implementation horribly buggy
     7 	//@{
     8 	(function() {
     9 		var div = document.createElement("div");
    10 		div.appendChild(document.createElement("br"));
    11 		document.body.insertBefore(div, document.body.firstChild);
    12 		var range = document.createRange();
    13 		range.setStart(div, 1);
    14 		div.insertBefore(document.createElement("p"), div.firstChild);
    15 		if (range.startOffset > range.startContainer.childNodes.length) {
    16 			var warningDiv = document.createElement("p");
    17 			document.body.insertBefore(warningDiv, document.body.firstChild);
    18 			warningDiv.style.fontWeight = "bold";
    19 			warningDiv.style.fontSize = "2em";
    20 			warningDiv.style.color = "red";
    21 			warningDiv.innerHTML = 'Your browser suffers from an <a href="http://software.hixie.ch/utilities/js/live-dom-viewer/saved/1028">egregious bug</a> in range mutation that will give incorrect results for the spec columns in many cases.  To ensure that the spec column contains the output actually required by the spec, use a different browser.';
    22 		}
    23 		div.parentNode.removeChild(div);
    24 	})();
    25 	//@}
    27 	// Insert the toolbar thingie as soon as the script file is loaded
    28 	//@{
    29 	(function() {
    30 		var toolbarDiv = document.createElement("div");
    31 		toolbarDiv.id = "toolbar";
    32 		// Note: this is completely not a hack at all.
    33 		toolbarDiv.innerHTML = "<style id=alerts>body > div > table > tbody > tr:not(.alert):not(:first-child):not(.active) { display: none }</style>"
    34 			+ "<label><input id=alert-checkbox type=checkbox accesskey=a checked onclick='updateAlertRowStyle()'> Display rows without spec <u>a</u>lerts</label>"
    35 			+ "<label><input id=browser-checkbox type=checkbox accesskey=b checked onclick='localStorage[\"display-browser-tests\"] = event.target.checked'> Run <u>b</u>rowser tests as well as spec tests</label>";
    37 		document.body.appendChild(toolbarDiv);
    38 	})();
    39 	//@}
    41 	// Confusingly, we're storing a string here, not a boolean.
    42 	document.querySelector("#alert-checkbox").checked = localStorage["display-alerts"] != "false";
    43 	document.querySelector("#browser-checkbox").checked = localStorage["display-browser-tests"] != "false";
    45 	function updateAlertRowStyle() {
    46 	//@{
    47 		var checked = document.querySelector("#alert-checkbox").checked;
    48 		document.querySelector("#alerts").disabled = checked;
    49 		localStorage["display-alerts"] = checked;
    50 	}
    51 	//@}
    52 	updateAlertRowStyle();
    54 	// Feature-test whether the browser wraps at <wbr> or not, and set word-wrap:
    55 	// break-word where necessary if not.  (IE and Opera don't wrap, Gecko and
    56 	// WebKit do.)  word-wrap: break-word will break anywhere at all, so it looks
    57 	// significantly uglier.
    58 	//@{
    59 	(function() {
    60 		var wordWrapTestDiv = document.createElement("div");
    61 		wordWrapTestDiv.style.width = "5em";
    62 		document.body.appendChild(wordWrapTestDiv);
    63 		wordWrapTestDiv.innerHTML = "abc";
    64 		var height1 = getComputedStyle(wordWrapTestDiv).height;
    65 		wordWrapTestDiv.innerHTML = "abc<wbr>abc<wbr>abc<wbr>abc<wbr>abc<wbr>abc";
    66 		var height2 = getComputedStyle(wordWrapTestDiv).height;
    67 		document.body.removeChild(wordWrapTestDiv);
    68 		if (height1 == height2) {
    69 			document.body.className = (document.body.className + " wbr-workaround").trim();
    70 		}
    71 	})();
    72 	//@}
    73 }
    75 // Now for the meat of the file.
    76 var tests = {
    77 	backcolor: [
    78 	//@{ Same as hilitecolor (set below)
    79 	],
    80 	//@}
    81 	bold: [
    82 	//@{
    83 		'foo[]bar',
    84 		'<p>[foo</p> <p>bar]</p>',
    85 		'<span>[foo</span> <span>bar]</span>',
    86 		'<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
    87 		'<p>[foo<p><br><p>bar]',
    88 		'<b>foo[]bar</b>',
    89 		'<i>foo[]bar</i>',
    90 		'<span>foo</span>{}<span>bar</span>',
    91 		'<span>foo[</span><span>]bar</span>',
    92 		'foo[bar]baz',
    93 		'foo[bar<b>baz]qoz</b>quz',
    94 		'foo[bar<i>baz]qoz</i>quz',
    95 		'{<p><p> <p>foo</p>}',
    97 		'foo<span contenteditable=false>[bar]</span>baz',
    98 		'fo[o<span contenteditable=false>bar</span>b]az',
    99 		'foo<span contenteditable=false>ba[r</span>b]az',
   100 		'fo[o<span contenteditable=false>b]ar</span>baz',
   101 		'fo[<b>o</b><span contenteditable=false>bar</span><b>b</b>]az',
   102 		'<span contenteditable=false>foo<span contenteditable=true>[bar]</span>baz</span>',
   103 		'<span contenteditable=false>fo[o<span contenteditable=true>bar</span>b]az</span>',
   104 		'<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b]az</span>',
   105 		'<span contenteditable=false>fo[o<span contenteditable=true>b]ar</span>baz</span>',
   106 		'<span contenteditable=false>fo[<b>o<span contenteditable=true>bar</span>b</b>]az</span>',
   108 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   109 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
   110 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
   111 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
   112 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
   113 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
   115 		'foo<span style="font-weight: bold">[bar]</span>baz',
   116 		'foo<b>[bar]</b>baz',
   117 		'foo<b>bar</b>[baz]',
   118 		'[foo]<b>bar</b>baz',
   119 		'<b>foo</b>[bar]<b>baz</b>',
   120 		'foo<strong>bar</strong>[baz]',
   121 		'[foo]<strong>bar</strong>baz',
   122 		'<strong>foo</strong>[bar]<strong>baz</strong>',
   123 		'<b>foo</b>[bar]<strong>baz</strong>',
   124 		'<strong>foo</strong>[bar]<b>baz</b>',
   125 		'foo[<b>bar</b>]baz',
   126 		'foo[<b>bar]</b>baz',
   127 		'foo<b>[bar</b>]baz',
   129 		'foo{<b></b>}baz',
   130 		'foo{<i></i>}baz',
   131 		'foo{<b><i></i></b>}baz',
   132 		'foo{<i><b></b></i>}baz',
   134 		'foo<strong>[bar]</strong>baz',
   135 		'foo[<strong>bar</strong>]baz',
   136 		'foo[<strong>bar]</strong>baz',
   137 		'foo<strong>[bar</strong>]baz',
   138 		'foo<span style="font-weight: bold">[bar]</span>baz',
   139 		'foo[<span style="font-weight: bold">bar</span>]baz',
   140 		'foo[<span style="font-weight: bold">bar]</span>baz',
   141 		'foo<span style="font-weight: bold">[bar</span>]baz',
   143 		'<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>',
   144 		'<b><p>foo[<i>bar</i>}</p><p>baz</p></b>',
   146 		'foo [bar <b>baz] qoz</b> quz sic',
   147 		'foo bar <b>baz [qoz</b> quz] sic',
   149 		'<b id=purple>bar [baz] qoz</b>',
   151 		'foo<span style="font-weight: 100">[bar]</span>baz',
   152 		'foo<span style="font-weight: 200">[bar]</span>baz',
   153 		'foo<span style="font-weight: 300">[bar]</span>baz',
   154 		'foo<span style="font-weight: 400">[bar]</span>baz',
   155 		'foo<span style="font-weight: 500">[bar]</span>baz',
   156 		'foo<span style="font-weight: 600">[bar]</span>baz',
   157 		'foo<span style="font-weight: 700">[bar]</span>baz',
   158 		'foo<span style="font-weight: 800">[bar]</span>baz',
   159 		'foo<span style="font-weight: 900">[bar]</span>baz',
   160 		'foo<span style="font-weight: 400">[bar</span>]baz',
   161 		'foo<span style="font-weight: 700">[bar</span>]baz',
   162 		'foo[<span style="font-weight: 400">bar]</span>baz',
   163 		'foo[<span style="font-weight: 700">bar]</span>baz',
   164 		'foo[<span style="font-weight: 400">bar</span>]baz',
   165 		'foo[<span style="font-weight: 700">bar</span>]baz',
   166 		'<span style="font-weight: 100">foo[bar]baz</span>',
   167 		'<span style="font-weight: 400">foo[bar]baz</span>',
   168 		'<span style="font-weight: 700">foo[bar]baz</span>',
   169 		'<span style="font-weight: 900">foo[bar]baz</span>',
   170 		'{<span style="font-weight: 100">foobar]baz</span>',
   171 		'{<span style="font-weight: 400">foobar]baz</span>',
   172 		'{<span style="font-weight: 700">foobar]baz</span>',
   173 		'{<span style="font-weight: 900">foobar]baz</span>',
   174 		'<span style="font-weight: 100">foo[barbaz</span>}',
   175 		'<span style="font-weight: 400">foo[barbaz</span>}',
   176 		'<span style="font-weight: 700">foo[barbaz</span>}',
   177 		'<span style="font-weight: 900">foo[barbaz</span>}',
   179 		'<h3>foo[bar]baz</h3>',
   180 		'{<h3>foobar]baz</h3>',
   181 		'<h3>foo[barbaz</h3>}',
   182 		'<h3>[foobarbaz]</h3>',
   183 		'{<h3>foobarbaz]</h3>',
   184 		'<h3>[foobarbaz</h3>}',
   185 		'{<h3>foobarbaz</h3>}',
   187 		'<b>foo<span style="font-weight: normal">bar<b>[baz]</b>quz</span>qoz</b>',
   188 		'<b>foo<span style="font-weight: normal">[bar]</span>baz</b>',
   190 		'{<b>foo</b> <b>bar</b>}',
   191 		'{<h3>foo</h3><b>bar</b>}',
   193 		'<i><b>foo</b></i>[bar]<i><b>baz</b></i>',
   194 		'<i><b>foo</b></i>[bar]<b>baz</b>',
   195 		'<b>foo</b>[bar]<i><b>baz</b></i>',
   196 		'<font color=blue face=monospace><b>foo</b></font>[bar]',
   198 		'foo<span style="font-weight: normal"><b>{bar}</b></span>baz',
   199 		'[foo<span class=notbold>bar</span>baz]',
   200 		'<b><span class=notbold>[foo]</span></b>',
   201 		'<b><span class=notbold>foo[bar]baz</span></b>',
   203 		'<p style="font-weight: bold">foo[bar]baz</p>',
   205 		// Tests for queryCommandIndeterm() and queryCommandState()
   206 		'fo[o<b>b]ar</b>baz',
   207 		'foo<b>ba[r</b>b]az',
   208 		'fo[o<b>bar</b>b]az',
   209 		'foo[<b>b]ar</b>baz',
   210 		'foo<b>ba[r</b>]baz',
   211 		'foo[<b>bar</b>]baz',
   212 		'foo<b>[bar]</b>baz',
   213 		'foo{<b>bar</b>}baz',
   214 		'fo[o<span style=font-weight:bold>b]ar</span>baz',
   215 		'<span style=font-weight:800>fo[o</span><span style=font-weight:900>b]ar</span>',
   216 		'<span style=font-weight:700>fo[o</span><span style=font-weight:800>b]ar</span>',
   217 		'<span style=font-weight:600>fo[o</span><span style=font-weight:700>b]ar</span>',
   218 		'<span style=font-weight:500>fo[o</span><span style=font-weight:600>b]ar</span>',
   219 		'<span style=font-weight:400>fo[o</span><span style=font-weight:500>b]ar</span>',
   220 		'<span style=font-weight:300>fo[o</span><span style=font-weight:400>b]ar</span>',
   221 		'<span style=font-weight:200>fo[o</span><span style=font-weight:300>b]ar</span>',
   222 		'<span style=font-weight:100>fo[o</span><span style=font-weight:200>b]ar</span>',
   223 	],
   224 	//@}
   225 	createlink: [
   226 	//@{
   227 		'foo[]bar',
   228 		'<p>[foo</p> <p>bar]</p>',
   229 		'<span>[foo</span> <span>bar]</span>',
   230 		'<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
   231 		'<p>[foo<p><br><p>bar]',
   232 		'<b>foo[]bar</b>',
   233 		'<i>foo[]bar</i>',
   234 		'<span>foo</span>{}<span>bar</span>',
   235 		'<span>foo[</span><span>]bar</span>',
   236 		'foo[bar]baz',
   237 		'foo[bar<b>baz]qoz</b>quz',
   238 		'foo[bar<i>baz]qoz</i>quz',
   239 		'{<p><p> <p>foo</p>}',
   241 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   242 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
   243 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
   244 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
   245 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
   246 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
   248 		'<a href=http://www.google.com/>foo[bar]baz</a>',
   249 		'<a href=http://www.google.com/>foo[barbaz</a>}',
   250 		'{<a href=http://www.google.com/>foobar]baz</a>',
   251 		'{<a href=http://www.google.com/>foobarbaz</a>}',
   252 		'<a href=http://www.google.com/>[foobarbaz]</a>',
   254 		'foo<a href=http://www.google.com/>[bar]</a>baz',
   255 		'[foo]<a href=http://www.google.com/>bar</a>baz',
   256 		'foo<a href=http://www.google.com/>bar</a>[baz]',
   257 		'foo[<a href=http://www.google.com/>bar</a>]baz',
   258 		'foo<a href=http://www.google.com/>[bar</a>baz]',
   259 		'[foo<a href=http://www.google.com/>bar]</a>baz',
   260 		'[foo<a href=http://www.google.com/>bar</a>baz]',
   262 		'<a href=otherurl>foo[bar]baz</a>',
   263 		'<a href=otherurl>foo[barbaz</a>}',
   264 		'{<a href=otherurl>foobar]baz</a>',
   265 		'{<a href=otherurl>foobarbaz</a>}',
   266 		'<a href=otherurl>[foobarbaz]</a>',
   268 		'foo<a href=otherurl>[bar]</a>baz',
   269 		'foo[<a href=otherurl>bar</a>]baz',
   270 		'foo<a href=otherurl>[bar</a>baz]',
   271 		'[foo<a href=otherurl>bar]</a>baz',
   272 		'[foo<a href=otherurl>bar</a>baz]',
   274 		'<a href=otherurl><b>foo[bar]baz</b></a>',
   275 		'<a href=otherurl><b>foo[barbaz</b></a>}',
   276 		'{<a href=otherurl><b>foobar]baz</b></a>',
   277 		'<a href=otherurl><b>[foobarbaz]</b></a>',
   279 		'<a name=abc>foo[bar]baz</a>',
   280 		'<a name=abc><b>foo[bar]baz</b></a>',
   282 		['', 'foo[bar]baz'],
   283 	],
   284 	//@}
   285 	// Opera requires this to be quoted, contrary to ES5 11.1.5 which allows
   286 	// PropertyName to be any IdentifierName, and see 7.6 which defines
   287 	// IdentifierName to include ReservedWord; Identifier excludes it.
   288 	"delete": [
   289 	//@{
   290 		// Collapsed selection
   291 		//
   292 		// These three commented-out test call Firefox 5.0a2 to blow up, not
   293 		// just throwing exceptions on the tests themselves but on many
   294 		// subsequent tests too.
   295 		//'[]foo',
   296 		//'<span>[]foo</span>',
   297 		//'<p>[]foo</p>',
   298 		'foo[]bar',
   299 		'<span>foo</span>{}<span>bar</span>',
   300 		'<span>foo[</span><span>]bar</span>',
   301 		'foo<span style=display:none>bar</span>[]baz',
   302 		'foo<script>bar</script>[]baz',
   304 		'fo&ouml;[]bar',
   305 		'foo&#x308;[]bar',
   306 		'foo&#x308;&#x327;[]bar',
   307 		'&ouml;[]bar',
   308 		'o&#x308;[]bar',
   309 		'o&#x308;&#x327;[]bar',
   311 		'&#x5e9;&#x5c1;&#x5b8;[]&#x5dc;&#x5d5;&#x5b9;&#x5dd;',
   312 		'&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;[]&#x5dd;',
   314 		'<p>foo</p><p>[]bar</p>',
   315 		'<p>foo</p>[]bar',
   316 		'foo<p>[]bar</p>',
   317 		'<p>foo<br></p><p>[]bar</p>',
   318 		'<p>foo<br></p>[]bar',
   319 		'foo<br><p>[]bar</p>',
   320 		'<p>foo<br><br></p><p>[]bar</p>',
   321 		'<p>foo<br><br></p>[]bar',
   322 		'foo<br><br><p>[]bar</p>',
   324 		'<div><p>foo</p></div><p>[]bar</p>',
   325 		'<p>foo</p><div><p>[]bar</p></div>',
   326 		'<div><p>foo</p></div><div><p>[]bar</p></div>',
   327 		'<div><p>foo</p></div>[]bar',
   328 		'foo<div><p>[]bar</p></div>',
   330 		'<div>foo</div><div>[]bar</div>',
   331 		'<pre>foo</pre>[]bar',
   333 		'foo<br>[]bar',
   334 		'foo<br><b>[]bar</b>',
   335 		'foo<hr>[]bar',
   336 		'<p>foo<hr><p>[]bar',
   337 		'<p>foo</p><br><p>[]bar</p>',
   338 		'<p>foo</p><br><br><p>[]bar</p>',
   339 		'<p>foo</p><img src=/img/lion.svg><p>[]bar',
   340 		'foo<img src=/img/lion.svg>[]bar',
   342 		'<a>foo</a>[]bar',
   343 		'<a href=/>foo</a>[]bar',
   344 		'<a name=abc>foo</a>[]bar',
   345 		'<a href=/ name=abc>foo</a>[]bar',
   346 		'<span><a>foo</a></span>[]bar',
   347 		'<span><a href=/>foo</a></span>[]bar',
   348 		'<span><a name=abc>foo</a></span>[]bar',
   349 		'<span><a href=/ name=abc>foo</a></span>[]bar',
   350 		'foo<a>[]bar</a>',
   351 		'foo<a href=/>[]bar</a>',
   352 		'foo<a name=abc>[]bar</a>',
   353 		'foo<a href=/ name=abc>[]bar</a>',
   355 		'foo &nbsp;[]',
   356 		'&nbsp;[] foo',
   357 		'foo &nbsp;[]bar',
   358 		'foo&nbsp; []bar',
   359 		'foo&nbsp;&nbsp;[]bar',
   360 		'foo  []bar',
   361 		'foo []&nbsp; bar',
   362 		'foo &nbsp;[] bar',
   363 		'foo &nbsp; []bar',
   364 		'foo []<span>&nbsp;</span> bar',
   365 		'foo <span>&nbsp;</span>[] bar',
   366 		'foo <span>&nbsp;</span> []bar',
   367 		'<b>foo </b>&nbsp;[]bar',
   368 		'<b>foo&nbsp;</b> []bar',
   369 		'<b>foo&nbsp;</b>&nbsp;[]bar',
   370 		'<b>foo </b> []bar',
   371 		'<p>foo </p><p>[] bar</p>',
   373 		'<pre>foo &nbsp;[]</pre>',
   374 		'<pre>&nbsp;[] foo</pre>',
   375 		'<pre>foo &nbsp;[]bar</pre>',
   376 		'<pre>foo&nbsp; []bar</pre>',
   377 		'<pre>foo  []bar</pre>',
   379 		'<div style=white-space:pre>foo &nbsp;[]</div>',
   380 		'<div style=white-space:pre>&nbsp;[] foo</div>',
   381 		'<div style=white-space:pre>foo &nbsp;[]bar</div>',
   382 		'<div style=white-space:pre>foo&nbsp; []bar</div>',
   383 		'<div style=white-space:pre>foo  []bar</div>',
   385 		'<div style=white-space:pre-wrap>foo &nbsp;[]</div>',
   386 		'<div style=white-space:pre-wrap>&nbsp;[] foo</div>',
   387 		'<div style=white-space:pre-wrap>foo &nbsp;[]bar</div>',
   388 		'<div style=white-space:pre-wrap>foo&nbsp; []bar</div>',
   389 		'<div style=white-space:pre-wrap>foo  []bar</div>',
   391 		'<div style=white-space:pre-line>foo &nbsp;[]</div>',
   392 		'<div style=white-space:pre-line>&nbsp;[] foo</div>',
   393 		'<div style=white-space:pre-line>foo &nbsp;[]bar</div>',
   394 		'<div style=white-space:pre-line>foo&nbsp; []bar</div>',
   395 		'<div style=white-space:pre-line>foo  []bar</div>',
   397 		'<div style=white-space:nowrap>foo &nbsp;[]</div>',
   398 		'<div style=white-space:nowrap>&nbsp;[] foo</div>',
   399 		'<div style=white-space:nowrap>foo &nbsp;[]bar</div>',
   400 		'<div style=white-space:nowrap>foo&nbsp; []bar</div>',
   401 		'<div style=white-space:nowrap>foo  []bar</div>',
   403 		// Tables with collapsed selection
   404 		'foo<table><tr><td>[]bar</table>baz',
   405 		'foo<table><tr><td>bar</table>[]baz',
   406 		'<p>foo<table><tr><td>[]bar</table><p>baz',
   407 		'<p>foo<table><tr><td>bar</table><p>[]baz',
   408 		'<table><tr><td>foo<td>[]bar</table>',
   409 		'<table><tr><td>foo<tr><td>[]bar</table>',
   411 		'foo<br><table><tr><td>[]bar</table>baz',
   412 		'foo<table><tr><td>bar<br></table>[]baz',
   413 		'<p>foo<br><table><tr><td>[]bar</table><p>baz',
   414 		'<p>foo<table><tr><td>bar<br></table><p>[]baz',
   415 		'<table><tr><td>foo<br><td>[]bar</table>',
   416 		'<table><tr><td>foo<br><tr><td>[]bar</table>',
   418 		'foo<br><br><table><tr><td>[]bar</table>baz',
   419 		'foo<table><tr><td>bar<br><br></table>[]baz',
   420 		'<p>foo<br><br><table><tr><td>[]bar</table><p>baz',
   421 		'<p>foo<table><tr><td>bar<br><br></table><p>[]baz',
   422 		'<table><tr><td>foo<br><br><td>[]bar</table>',
   423 		'<table><tr><td>foo<br><br><tr><td>[]bar</table>',
   425 		'foo<hr><table><tr><td>[]bar</table>baz',
   426 		'foo<table><tr><td>bar<hr></table>[]baz',
   427 		'<table><tr><td>foo<hr><td>[]bar</table>',
   428 		'<table><tr><td>foo<hr><tr><td>[]bar</table>',
   430 		// Lists with collapsed selection
   431 		'foo<ol><li>[]bar<li>baz</ol>',
   432 		'foo<br><ol><li>[]bar<li>baz</ol>',
   433 		'foo<br><br><ol><li>[]bar<li>baz</ol>',
   434 		'<ol><li>foo<li>[]bar</ol>',
   435 		'<ol><li>foo<br><li>[]bar</ol>',
   436 		'<ol><li>foo<br><br><li>[]bar</ol>',
   437 		'<ol><li>foo<li>[]bar<br>baz</ol>',
   438 		'<ol><li>foo<br>bar<li>[]baz</ol>',
   440 		'<ol><li><p>foo</p>{}bar</ol>',
   442 		'<ol><li><p>foo<li>[]bar</ol>',
   443 		'<ol><li>foo<li><p>[]bar</ol>',
   444 		'<ol><li><p>foo<li><p>[]bar</ol>',
   446 		'<ol><li>foo<ul><li>[]bar</ul></ol>',
   447 		'foo<ol><ol><li>[]bar</ol></ol>',
   448 		'foo<div><ol><li>[]bar</ol></div>',
   450 		'foo<dl><dt>[]bar<dd>baz</dl>',
   451 		'foo<dl><dd>[]bar</dl>',
   452 		'<dl><dt>foo<dd>[]bar</dl>',
   453 		'<dl><dt>foo<dt>[]bar<dd>baz</dl>',
   454 		'<dl><dt>foo<dd>bar<dd>[]baz</dl>',
   456 		'<ol><li>foo</ol>[]bar',
   457 		'<ol><li>foo<br></ol>[]bar',
   458 		'<ol><li>foo<br><br></ol>[]bar',
   459 		'<ol><li><br></ol>[]bar',
   460 		'<ol><li>foo<li><br></ol>[]bar',
   462 		'<ol><li>foo</ol><p>[]bar',
   463 		'<ol><li>foo<br></ol><p>[]bar',
   464 		'<ol><li>foo<br><br></ol><p>[]bar',
   465 		'<ol><li><br></ol><p>[]bar',
   466 		'<ol><li>foo<li><br></ol><p>[]bar',
   468 		'<ol><li>foo</ol>{}<br>',
   469 		'<ol><li>foo<br></ol>{}<br>',
   470 		'<ol><li>foo<br><br></ol>{}<br>',
   471 		'<ol><li><br></ol>{}<br>',
   472 		'<ol><li>foo<li><br></ol>{}<br>',
   474 		'<ol><li>foo</ol><p>{}<br>',
   475 		'<ol><li>foo<br></ol><p>{}<br>',
   476 		'<ol><li>foo<br><br></ol><p>{}<br>',
   477 		'<ol><li><br></ol><p>{}<br>',
   478 		'<ol><li>foo<li><br></ol><p>{}<br>',
   480 		// Indented stuff with collapsed selection
   481 		'foo<blockquote>[]bar</blockquote>',
   482 		'foo<blockquote><blockquote>[]bar</blockquote></blockquote>',
   483 		'foo<blockquote><div>[]bar</div></blockquote>',
   484 		'foo<blockquote style="color: blue">[]bar</blockquote>',
   486 		'foo<blockquote><blockquote><p>[]bar<p>baz</blockquote></blockquote>',
   487 		'foo<blockquote><div><p>[]bar<p>baz</div></blockquote>',
   488 		'foo<blockquote style="color: blue"><p>[]bar<p>baz</blockquote>',
   490 		'foo<blockquote><p><b>[]bar</b><p>baz</blockquote>',
   491 		'foo<blockquote><p><strong>[]bar</strong><p>baz</blockquote>',
   492 		'foo<blockquote><p><span>[]bar</span><p>baz</blockquote>',
   494 		'foo<blockquote><ol><li>[]bar</ol></blockquote><p>extra',
   495 		'foo<blockquote>bar<ol><li>[]baz</ol>quz</blockquote><p>extra',
   496 		'foo<blockquote><ol><li>bar</li><ol><li>[]baz</ol><li>quz</ol></blockquote><p>extra',
   498 		// Invisible stuff with collapsed selection
   499 		'foo<span></span>[]bar',
   500 		'foo<span><span></span></span>[]bar',
   501 		'foo<quasit></quasit>[]bar',
   502 		'foo<br><span></span>[]bar',
   503 		'<span>foo<span></span></span>[]bar',
   504 		'foo<span></span><span>[]bar</span>',
   505 		'foo<div><div><p>[]bar</div></div>',
   506 		'foo<div><div><p><!--abc-->[]bar</div></div>',
   507 		'foo<div><div><!--abc--><p>[]bar</div></div>',
   508 		'foo<div><!--abc--><div><p>[]bar</div></div>',
   509 		'foo<!--abc--><div><div><p>[]bar</div></div>',
   510 		'<div><div><p>foo</div></div>[]bar',
   511 		'<div><div><p>foo</div></div><!--abc-->[]bar',
   512 		'<div><div><p>foo</div><!--abc--></div>[]bar',
   513 		'<div><div><p>foo</p><!--abc--></div></div>[]bar',
   514 		'<div><div><p>foo<!--abc--></div></div>[]bar',
   515 		'<div><div><p>foo</p></div></div><div><div><div>[]bar</div></div></div>',
   516 		'<div><div><p>foo<!--abc--></p></div></div><div><div><div>[]bar</div></div></div>',
   517 		'<div><div><p>foo</p><!--abc--></div></div><div><div><div>[]bar</div></div></div>',
   518 		'<div><div><p>foo</p></div><!--abc--></div><div><div><div>[]bar</div></div></div>',
   519 		'<div><div><p>foo</p></div></div><!--abc--><div><div><div>[]bar</div></div></div>',
   520 		'<div><div><p>foo</p></div></div><div><!--abc--><div><div>[]bar</div></div></div>',
   521 		'<div><div><p>foo</p></div></div><div><div><!--abc--><div>[]bar</div></div></div>',
   522 		'<div><div><p>foo</p></div></div><div><div><div><!--abc-->[]bar</div></div></div>',
   524 		// Styled stuff with collapsed selection
   525 		'<p style=color:blue>foo<p>[]bar',
   526 		'<p style=color:blue>foo<p style=color:brown>[]bar',
   527 		'<p style=color:blue>foo<p style=color:rgba(0,0,255,1)>[]bar',
   528 		'<p style=color:transparent>foo<p style=color:rgba(0,0,0,0)>[]bar',
   529 		'<p>foo<p style=color:brown>[]bar',
   530 		'<p><font color=blue>foo</font><p>[]bar',
   531 		'<p><font color=blue>foo</font><p><font color=brown>[]bar</font>',
   532 		'<p>foo<p><font color=brown>[]bar</font>',
   533 		'<p><span style=color:blue>foo</font><p>[]bar',
   534 		'<p><span style=color:blue>foo</font><p><span style=color:brown>[]bar</font>',
   535 		'<p>foo<p><span style=color:brown>[]bar</font>',
   537 		'<p style=background-color:aqua>foo<p>[]bar',
   538 		'<p style=background-color:aqua>foo<p style=background-color:tan>[]bar',
   539 		'<p>foo<p style=background-color:tan>[]bar',
   540 		'<p><span style=background-color:aqua>foo</font><p>[]bar',
   541 		'<p><span style=background-color:aqua>foo</font><p><span style=background-color:tan>[]bar</font>',
   542 		'<p>foo<p><span style=background-color:tan>[]bar</font>',
   544 		'<p style=text-decoration:underline>foo<p>[]bar',
   545 		'<p style=text-decoration:underline>foo<p style=text-decoration:line-through>[]bar',
   546 		'<p>foo<p style=text-decoration:line-through>[]bar',
   547 		'<p><u>foo</u><p>[]bar',
   548 		'<p><u>foo</u><p><s>[]bar</s>',
   549 		'<p>foo<p><s>[]bar</s>',
   551 		'<p style=color:blue>foo</p>[]bar',
   552 		'foo<p style=color:brown>[]bar',
   553 		'<div style=color:blue><p style=color:green>foo</div>[]bar',
   554 		'<div style=color:blue><p style=color:green>foo</div><p style=color:brown>[]bar',
   555 		'<p style=color:blue>foo<div style=color:brown><p style=color:green>[]bar',
   557 		// Uncollapsed selection
   558 		'foo[bar]baz',
   559 		'<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
   560 		'<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
   561 		'<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
   562 		'<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
   563 		'<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
   564 		'<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
   565 		'<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
   566 		'<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
   568 		'foo<b>[bar]</b>baz',
   569 		'foo<b>{bar}</b>baz',
   570 		'foo{<b>bar</b>}baz',
   571 		'foo<span>[bar]</span>baz',
   572 		'foo<span>{bar}</span>baz',
   573 		'foo{<span>bar</span>}baz',
   574 		'<b>foo[bar</b><i>baz]quz</i>',
   575 		'<p>foo</p><p>[bar]</p><p>baz</p>',
   576 		'<p>foo</p><p>{bar}</p><p>baz</p>',
   577 		'<p>foo</p><p>{bar</p>}<p>baz</p>',
   578 		'<p>foo</p>{<p>bar}</p><p>baz</p>',
   579 		'<p>foo</p>{<p>bar</p>}<p>baz</p>',
   581 		'<p>foo[bar<p>baz]quz',
   582 		'<p>foo[bar<div>baz]quz</div>',
   583 		'<p>foo[bar<h1>baz]quz</h1>',
   584 		'<div>foo[bar</div><p>baz]quz',
   585 		'<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',
   587 		'<p><b>foo[bar</b><p>baz]quz',
   588 		'<div><p>foo[bar</div><p>baz]quz',
   589 		'<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
   590 		'<p>foo[bar<p style=color:blue>baz]quz',
   591 		'<p>foo[bar<p><b>baz]quz</b>',
   593 		'<div><p>foo<p>[bar<p>baz]</div>',
   595 		'foo[<br>]bar',
   596 		'<p>foo[</p><p>]bar</p>',
   597 		'<p>foo[</p><p>]bar<br>baz</p>',
   598 		'foo[<p>]bar</p>',
   599 		'foo{<p>}bar</p>',
   600 		'foo[<p>]bar<br>baz</p>',
   601 		'foo[<p>]bar</p>baz',
   602 		'foo{<p>bar</p>}baz',
   603 		'foo<p>{bar</p>}baz',
   604 		'foo{<p>bar}</p>baz',
   605 		'<p>foo[</p>]bar',
   606 		'<p>foo{</p>}bar',
   607 		'<p>foo[</p>]bar<br>baz',
   608 		'<p>foo[</p>]bar<p>baz</p>',
   609 		'foo[<div><p>]bar</div>',
   610 		'<div><p>foo[</p></div>]bar',
   611 		'foo[<div><p>]bar</p>baz</div>',
   612 		'foo[<div>]bar<p>baz</p></div>',
   613 		'<div><p>foo</p>bar[</div>]baz',
   614 		'<div>foo<p>bar[</p></div>]baz',
   616 		'<p>foo<br>{</p>]bar',
   617 		'<p>foo<br><br>{</p>]bar',
   618 		'foo<br>{<p>]bar</p>',
   619 		'foo<br><br>{<p>]bar</p>',
   620 		'<p>foo<br>{</p><p>}bar</p>',
   621 		'<p>foo<br><br>{</p><p>}bar</p>',
   623 		'<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>',
   624 		'<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
   625 		'<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
   626 		'<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>',
   627 		'<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>',
   628 		'<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>',
   629 		'{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}',
   630 		'<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>',
   631 		'<p>fo[o<table><tr><td>b]ar</table><p>baz',
   632 		'<p>foo<table><tr><td>ba[r</table><p>b]az',
   633 		'<p>fo[o<table><tr><td>bar</table><p>b]az',
   635 		'<p>foo<ol><li>ba[r<li>b]az</ol><p>quz',
   636 		'<p>foo<ol><li>bar<li>[baz]</ol><p>quz',
   637 		'<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz',
   638 		'<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz',
   639 		'<p>fo[o<ol><li>bar<li>b]az</ol><p>quz',
   640 		'<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz',
   642 		'<ol><li>fo[o</ol><ol><li>b]ar</ol>',
   643 		'<ol><li>fo[o</ol><ul><li>b]ar</ul>',
   645 		'foo[<ol><li>]bar</ol>',
   646 		'<ol><li>foo[<li>]bar</ol>',
   647 		'foo[<dl><dt>]bar<dd>baz</dl>',
   648 		'foo[<dl><dd>]bar</dl>',
   649 		'<dl><dt>foo[<dd>]bar</dl>',
   650 		'<dl><dt>foo[<dt>]bar<dd>baz</dl>',
   651 		'<dl><dt>foo<dd>bar[<dd>]baz</dl>',
   653 		'<b>foo [&nbsp;</b>bar]',
   654 		'foo<b> [&nbsp;bar]</b>',
   655 		'<b>[foo&nbsp;] </b>bar',
   656 		'[foo<b>&nbsp;] bar</b>',
   658 		// Do we merge based on element names or the display property?
   659 		'<p style=display:inline>fo[o<p style=display:inline>b]ar',
   660 		'<span style=display:block>fo[o</span><span style=display:block>b]ar</span>',
   661 		'<span style=display:inline-block>fo[o</span><span style=display:inline-block>b]ar</span>',
   662 		'<span style=display:inline-table>fo[o</span><span style=display:inline-table>b]ar</span>',
   663 		'<span style=display:none>fo[o</span><span style=display:none>b]ar</span>',
   664 		'<quasit style=display:block>fo[o</quasit><quasit style=display:block>b]ar</quasit>',
   666 		// https://bugs.webkit.org/show_bug.cgi?id=35281
   667 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=13976
   668 		'<ol><li>foo</ol>{}<br><ol><li>bar</ol>',
   669 		'<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>',
   670 		'<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>',
   671 		'<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>',
   672 		'<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
   673 		'<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
   674 		'<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>',
   675 		// Broken test: http://www.w3.org/Bugs/Public/show_bug.cgi?id=14727
   676 		'!<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>',
   677 		'<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>',
   678 		'<ol><li>foo[</ol>bar]<ol><li>baz</ol>',
   679 		'<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>',
   680 		'<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>',
   681 		'<ol><li>foo[]</ol><ol><li>bar</ol>',
   682 		'<ol><li>foo</ol>[bar<ol><li>]baz</ol>',
   683 		'<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>',
   684 		'<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>',
   685 		'<ol><li>foo</ol><ol><li>b[]ar</ol>',
   686 		'<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>',
   687 		'<ul><li>foo</ul>{}<br><ul><li>bar</ul>',
   688 		'<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>',
   689 		'<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>',
   690 		'<ol><li>foo</ol>{}<br><ul><li>bar</ul>',
   691 		'<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>',
   692 		'<ul><li>foo</ul>{}<br><ol><li>bar</ol>',
   693 		'<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>',
   695 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=13831
   696 		'<p><b>[foo]</b>',
   697 		'<p><quasit>[foo]</quasit>',
   698 		'<p><b><i>[foo]</i></b>',
   699 		'<p><b>{foo}</b>',
   700 		'<p>{<b>foo</b>}',
   701 		'<p><b>f[]</b>',
   702 		'<b>[foo]</b>',
   703 		'<div><b>[foo]</b></div>',
   704 	],
   705 	//@}
   706 	fontname: [
   707 	//@{
   708 		'foo[]bar',
   709 		'<p>[foo</p> <p>bar]</p>',
   710 		'<span>[foo</span> <span>bar]</span>',
   711 		'<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
   712 		'<p>[foo<p><br><p>bar]',
   713 		'<b>foo[]bar</b>',
   714 		'<i>foo[]bar</i>',
   715 		'<span>foo</span>{}<span>bar</span>',
   716 		'<span>foo[</span><span>]bar</span>',
   717 		'foo[bar]baz',
   718 		'foo[bar<b>baz]qoz</b>quz',
   719 		'foo[bar<i>baz]qoz</i>quz',
   720 		'{<p><p> <p>foo</p>}',
   722 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   723 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
   724 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
   725 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
   726 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
   727 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
   729 		'foo<code>[bar]</code>baz',
   730 		'foo<kbd>[bar]</kbd>baz',
   731 		'foo<listing>[bar]</listing>baz',
   732 		'foo<pre>[bar]</pre>baz',
   733 		'foo<samp>[bar]</samp>baz',
   734 		'foo<tt>[bar]</tt>baz',
   736 		'foo<code>b[a]r</code>baz',
   737 		'foo<kbd>b[a]r</kbd>baz',
   738 		'foo<listing>b[a]r</listing>baz',
   739 		'foo<pre>b[a]r</pre>baz',
   740 		'foo<samp>b[a]r</samp>baz',
   741 		'foo<tt>b[a]r</tt>baz',
   743 		'[foo<code>bar</code>baz]',
   744 		'[foo<kbd>bar</kbd>baz]',
   745 		'[foo<listing>bar</listing>baz]',
   746 		'[foo<pre>bar</pre>baz]',
   747 		'[foo<samp>bar</samp>baz]',
   748 		'[foo<tt>bar</tt>baz]',
   750 		'[foo<code>ba]r</code>baz',
   751 		'[foo<kbd>ba]r</kbd>baz',
   752 		'[foo<listing>ba]r</listing>baz',
   753 		'[foo<pre>ba]r</pre>baz',
   754 		'[foo<samp>ba]r</samp>baz',
   755 		'[foo<tt>ba]r</tt>baz',
   757 		'foo<code>b[ar</code>baz]',
   758 		'foo<kbd>b[ar</kbd>baz]',
   759 		'foo<listing>b[ar</listing>baz]',
   760 		'foo<pre>b[ar</pre>baz]',
   761 		'foo<samp>b[ar</samp>baz]',
   762 		'foo<tt>b[ar</tt>baz]',
   764 		'foo<span style="font-family: sans-serif">[bar]</span>baz',
   765 		'foo<span style="font-family: sans-serif">b[a]r</span>baz',
   766 		'foo<span style="font-family: monospace">[bar]</span>baz',
   767 		'foo<span style="font-family: monospace">b[a]r</span>baz',
   769 		'foo<tt contenteditable=false>ba[r</tt>b]az',
   770 		'fo[o<tt contenteditable=false>b]ar</tt>baz',
   771 		'foo<tt>{}<br></tt>bar',
   772 		'foo<tt>{<br></tt>}bar',
   773 		'foo<tt>{<br></tt>b]ar',
   775 		// Tests for queryCommandIndeterm() and queryCommandState()
   776 		'fo[o<span style=font-family:monospace>b]ar</span>baz',
   777 		'foo<span style=font-family:monospace>ba[r</span>b]az',
   778 		'fo[o<span style=font-family:monospace>bar</span>b]az',
   779 		'foo[<span style=font-family:monospace>b]ar</span>baz',
   780 		'foo<span style=font-family:monospace>ba[r</span>]baz',
   781 		'foo[<span style=font-family:monospace>bar</span>]baz',
   782 		'foo<span style=font-family:monospace>[bar]</span>baz',
   783 		'foo{<span style=font-family:monospace>bar</span>}baz',
   784 		'fo[o<code>b]ar</code>',
   785 		'fo[o<kbd>b]ar</kbd>',
   786 		'fo[o<listing>b]ar</listing>',
   787 		'fo[o<pre>b]ar</pre>',
   788 		'fo[o<samp>b]ar</samp>',
   789 		'fo[o<tt>b]ar</tt>',
   790 		'<tt>fo[o</tt><code>b]ar</code>',
   791 		'<pre>fo[o</pre><samp>b]ar</samp>',
   792 		'<span style=font-family:monospace>fo[o</span><kbd>b]ar</kbd>',
   793 	],
   794 	//@}
   795 	fontsize: [
   796 	//@{
   797 		'foo[]bar',
   798 		'<p>[foo</p> <p>bar]</p>',
   799 		'<span>[foo</span> <span>bar]</span>',
   800 		'<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
   801 		'<p>[foo<p><br><p>bar]',
   802 		'<b>foo[]bar</b>',
   803 		'<i>foo[]bar</i>',
   804 		'<span>foo</span>{}<span>bar</span>',
   805 		'<span>foo[</span><span>]bar</span>',
   806 		'foo[bar]baz',
   807 		'foo[bar<b>baz]qoz</b>quz',
   808 		'foo[bar<i>baz]qoz</i>quz',
   809 		'{<p><p> <p>foo</p>}',
   811 		["1", 'foo[bar]baz'],
   812 		["0", 'foo[bar]baz'],
   813 		["-5", 'foo[bar]baz'],
   814 		["6", 'foo[bar]baz'],
   815 		["7", 'foo[bar]baz'],
   816 		["8", 'foo[bar]baz'],
   817 		["100", 'foo[bar]baz'],
   818 		["2em", 'foo[bar]baz'],
   819 		["20pt", 'foo[bar]baz'],
   820 		["xx-large", 'foo[bar]baz'],
   821 		[" 1 ", 'foo[bar]baz'],
   822 		["1.", 'foo[bar]baz'],
   823 		["1.0", 'foo[bar]baz'],
   824 		["1.0e2", 'foo[bar]baz'],
   825 		["1.1", 'foo[bar]baz'],
   826 		["1.9", 'foo[bar]baz'],
   827 		["+0", 'foo[bar]baz'],
   828 		["+1", 'foo[bar]baz'],
   829 		["+9", 'foo[bar]baz'],
   830 		["-0", 'foo[bar]baz'],
   831 		["-1", 'foo[bar]baz'],
   832 		["-9", 'foo[bar]baz'],
   833 		["", 'foo[bar]baz'],
   835 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   836 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
   837 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
   838 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
   839 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
   840 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
   842 		'foo<font size=1>[bar]</font>baz',
   843 		'<font size=1>foo[bar]baz</font>',
   844 		'foo<font size=3>[bar]</font>baz',
   845 		'<font size=3>foo[bar]baz</font>',
   846 		'foo<font size=4>[bar]</font>baz',
   847 		'<font size=4>foo[bar]baz</font>',
   848 		'foo<font size=+1>[bar]</font>baz',
   849 		'<font size=+1>foo[bar]baz</font>',
   850 		'<font size=4>foo<font size=1>b[a]r</font>baz</font>',
   852 		'foo<span style="font-size: xx-small">[bar]</span>baz',
   853 		'<span style="font-size: xx-small">foo[bar]baz</span>',
   854 		'foo<span style="font-size: medium">[bar]</span>baz',
   855 		'<span style="font-size: medium">foo[bar]baz</span>',
   856 		'foo<span style="font-size: large">[bar]</span>baz',
   857 		'<span style="font-size: large">foo[bar]baz</span>',
   858 		'<span style="font-size: large">foo<span style="font-size: xx-small">b[a]r</span>baz</span>',
   860 		'foo<span style="font-size: 2em">[bar]</span>baz',
   861 		'<span style="font-size: 2em">foo[bar]baz</span>',
   863 		'<p style="font-size: xx-small">foo[bar]baz</p>',
   864 		'<p style="font-size: medium">foo[bar]baz</p>',
   865 		'<p style="font-size: large">foo[bar]baz</p>',
   866 		'<p style="font-size: 2em">foo[bar]baz</p>',
   868 		["3", '<p style="font-size: xx-small">foo[bar]baz</p>'],
   869 		["3", '<p style="font-size: medium">foo[bar]baz</p>'],
   870 		["3", '<p style="font-size: large">foo[bar]baz</p>'],
   871 		["3", '<p style="font-size: 2em">foo[bar]baz</p>'],
   873 		// Minor algorithm bug: this changes the size of the "b" and "r" in
   874 		// "bar" when we pull down styles
   875 		["3", '<font size=6>foo <span style="font-size: 2em">b[a]r</span> baz</font>'],
   877 		["3", 'foo<big>[bar]</big>baz'],
   878 		["3", 'foo<big>b[a]r</big>baz'],
   879 		["3", 'foo<small>[bar]</small>baz'],
   880 		["3", 'foo<small>b[a]r</small>baz'],
   882 		// Tests for queryCommandIndeterm() and queryCommandState()
   883 		'fo[o<font size=2>b]ar</font>baz',
   884 		'foo<font size=2>ba[r</font>b]az',
   885 		'fo[o<font size=2>bar</font>b]az',
   886 		'foo[<font size=2>b]ar</font>baz',
   887 		'foo<font size=2>ba[r</font>]baz',
   888 		'foo[<font size=2>bar</font>]baz',
   889 		'foo<font size=2>[bar]</font>baz',
   890 		'foo{<font size=2>bar</font>}baz',
   891 		'<font size=1>fo[o</font><span style=font-size:xx-small>b]ar</span>',
   892 		'<font size=2>fo[o</font><span style=font-size:small>b]ar</span>',
   893 		'<font size=3>fo[o</font><span style=font-size:medium>b]ar</span>',
   894 		'<font size=4>fo[o</font><span style=font-size:large>b]ar</span>',
   895 		'<font size=5>fo[o</font><span style=font-size:x-large>b]ar</span>',
   896 		'<font size=6>fo[o</font><span style=font-size:xx-large>b]ar</span>',
   898 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=13829
   899 		["!6", '<span style=background-color:aqua>[foo]</span>'],
   900 		["!6", '<span style=background-color:aqua>foo[bar]baz</span>'],
   901 		["!6", '[foo<span style=background-color:aqua>bar</span>baz]'],
   902 	],
   903 	//@}
   904 	forecolor: [
   905 	//@{
   906 		'foo[]bar',
   907 		'<p>[foo</p> <p>bar]</p>',
   908 		'<span>[foo</span> <span>bar]</span>',
   909 		'<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
   910 		'<p>[foo<p><br><p>bar]',
   911 		'<b>foo[]bar</b>',
   912 		'<i>foo[]bar</i>',
   913 		'<span>foo</span>{}<span>bar</span>',
   914 		'<span>foo[</span><span>]bar</span>',
   915 		'foo[bar]baz',
   916 		'foo[bar<b>baz]qoz</b>quz',
   917 		'foo[bar<i>baz]qoz</i>quz',
   918 		'{<p><p> <p>foo</p>}',
   920 		['blue', 'foo[bar]baz'],
   921 		['f', 'foo[bar]baz'],
   922 		['#f', 'foo[bar]baz'],
   923 		['00f', 'foo[bar]baz'],
   924 		['#00f', 'foo[bar]baz'],
   925 		['0000ff', 'foo[bar]baz'],
   926 		['#0000ff', 'foo[bar]baz'],
   927 		['000000fff', 'foo[bar]baz'],
   928 		['#000000fff', 'foo[bar]baz'],
   929 		['rgb(0, 0, 255)', 'foo[bar]baz'],
   930 		['rgb(0%, 0%, 100%)', 'foo[bar]baz'],
   931 		['rgb( 0 ,0 ,255)', 'foo[bar]baz'],
   932 		['rgba(0, 0, 255, 0.0)', 'foo[bar]baz'],
   933 		['rgb(15, -10, 375)', 'foo[bar]baz'],
   934 		['rgba(0, 0, 0, 1)', 'foo[bar]baz'],
   935 		['rgba(255, 255, 255, 1)', 'foo[bar]baz'],
   936 		['rgba(0, 0, 255, 0.5)', 'foo[bar]baz'],
   937 		['hsl(240, 100%, 50%)', 'foo[bar]baz'],
   938 		['cornsilk', 'foo[bar]baz'],
   939 		['potato quiche', 'foo[bar]baz'],
   940 		['transparent', 'foo[bar]baz'],
   941 		['currentColor', 'foo[bar]baz'],
   943 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   944 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
   945 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
   946 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
   947 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
   948 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
   950 		'foo<font color=blue>[bar]</font>baz',
   951 		'foo{<font color=blue>bar</font>}baz',
   952 		'<span style="color: blue">foo<span style="color: brown">[bar]</span>baz</span>',
   953 		'<span style="color: #00f">foo<span style="color: brown">[bar]</span>baz</span>',
   954 		'<span style="color: #0000ff">foo<span style="color: brown">[bar]</span>baz</span>',
   955 		'<span style="color: rgb(0, 0, 255)">foo<span style="color: brown">[bar]</span>baz</span>',
   956 		'<font color=blue>foo<font color=brown>[bar]</font>baz</font>',
   957 		'<span style="color: rgb(0, 0, 255)">foo<span style="color: brown">b[ar]</span>baz</span>',
   958 		'foo<span id=purple>ba[r</span>ba]z',
   959 		'<span style="color: rgb(0, 0, 255)">foo<span id=purple>b[a]r</span>baz</span>',
   961 		['blue', '<a href=http://www.google.com>foo[bar]baz</a>'],
   962 		['#0000ff', '<a href=http://www.google.com>foo[bar]baz</a>'],
   963 		['rgb(0,0,255)', '<a href=http://www.google.com>foo[bar]baz</a>'],
   965 		// Tests for queryCommandValue()
   966 		'<font color="blue">[foo]</font>',
   967 		'<font color="0000ff">[foo]</font>',
   968 		'<font color="#0000ff">[foo]</font>',
   969 		'<span style="color: blue">[foo]</span>',
   970 		'<span style="color: #0000ff">[foo]</span>',
   971 		'<span style="color: rgb(0, 0, 255)">[foo]</span>',
   972 		'<span style="color: rgb(0%, 0%, 100%)">[foo]</span>',
   973 		'<span style="color: rgb( 0 ,0 ,255)">[foo]</span>',
   974 		'<span style="color: rgba(0, 0, 255, 0.0)">[foo]</span>',
   975 		'<span style="color: rgb(15, -10, 375)">[foo]</span>',
   976 		'<span style="color: rgba(0, 0, 0, 1)">[foo]</span>',
   977 		'<span style="color: rgba(255, 255, 255, 1)">[foo]</span>',
   978 		'<span style="color: rgba(0, 0, 255, 0.5)">[foo]</span>',
   979 		'<span style="color: hsl(240, 100%, 50%)">[foo]</span>',
   980 		'<span style="color: cornsilk">[foo]</span>',
   981 		'<span style="color: transparent">[foo]</span>',
   982 		'<span style="color: currentColor">[foo]</span>',
   984 		// Tests for queryCommandIndeterm() and queryCommandState()
   985 		'fo[o<font color=brown>b]ar</font>baz',
   986 		'foo<font color=brown>ba[r</font>b]az',
   987 		'fo[o<font color=brown>bar</font>b]az',
   988 		'foo[<font color=brown>b]ar</font>baz',
   989 		'foo<font color=brown>ba[r</font>]baz',
   990 		'foo[<font color=brown>bar</font>]baz',
   991 		'foo<font color=brown>[bar]</font>baz',
   992 		'foo{<font color=brown>bar</font>}baz',
   993 		'<font color=brown>fo[o</font><span style=color:brown>b]ar</span>',
   994 		'<span style=color:brown>fo[o</span><span style=color:#0000ff>b]ar</span>',
   995 	],
   996 	//@}
   997 	formatblock: [
   998 	//@{
   999 		'foo[]bar<p>extra',
  1000 		'<span>foo</span>{}<span>bar</span><p>extra',
  1001 		'<span>foo[</span><span>]bar</span><p>extra',
  1002 		'foo[bar]baz<p>extra',
  1003 		'foo]bar[baz<p>extra',
  1004 		'{<p><p> <p>foo</p>}',
  1005 		'foo[bar<i>baz]qoz</i>quz<p>extra',
  1007 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
  1008 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
  1009 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
  1010 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
  1011 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
  1012 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
  1014 		'<div>[foobar]</div>',
  1015 		'<p>[foobar]</p>',
  1016 		'<blockquote>[foobar]</blockquote>',
  1017 		'<h1>[foobar]</h1>',
  1018 		'<h2>[foobar]</h2>',
  1019 		'<h3>[foobar]</h3>',
  1020 		'<h4>[foobar]</h4>',
  1021 		'<h5>[foobar]</h5>',
  1022 		'<h6>[foobar]</h6>',
  1023 		'<dl><dt>[foo]<dd>bar</dl>',
  1024 		'<dl><dt>foo<dd>[bar]</dl>',
  1025 		'<dl><dt>[foo<dd>bar]</dl>',
  1026 		'<ol><li>[foobar]</ol>',
  1027 		'<ul><li>[foobar]</ul>',
  1028 		'<address>[foobar]</address>',
  1029 		'<pre>[foobar]</pre>',
  1030 		'<article>[foobar]</article>',
  1031 		'<ins>[foobar]</ins>',
  1032 		'<del>[foobar]</del>',
  1033 		'<quasit>[foobar]</quasit>',
  1034 		'<quasit style="display: block">[foobar]</quasit>',
  1036 		['<p>', 'foo[]bar<p>extra'],
  1037 		['<p>', '<span>foo</span>{}<span>bar</span><p>extra'],
  1038 		['<p>', '<span>foo[</span><span>]bar</span><p>extra'],
  1039 		['<p>', 'foo[bar]baz<p>extra'],
  1040 		['<p>', 'foo]bar[baz<p>extra'],
  1041 		['<p>', '{<p><p> <p>foo</p>}'],
  1042 		['<p>', 'foo[bar<i>baz]qoz</i>quz<p>extra'],
  1044 		['<p>', '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>'],
  1045 		['<p>', '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>'],
  1046 		['<p>', '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>'],
  1047 		['<p>', '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>'],
  1048 		['<p>', '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>'],
  1049 		['<p>', '{<table><tr><td>foo<td>bar<td>baz</table>}'],
  1051 		['<p>', '<div>[foobar]</div>'],
  1052 		['<p>', '<p>[foobar]</p>'],
  1053 		['<p>', '<blockquote>[foobar]</blockquote>'],
  1054 		['<p>', '<h1>[foobar]</h1>'],
  1055 		['<p>', '<h2>[foobar]</h2>'],
  1056 		['<p>', '<h3>[foobar]</h3>'],
  1057 		['<p>', '<h4>[foobar]</h4>'],
  1058 		['<p>', '<h5>[foobar]</h5>'],
  1059 		['<p>', '<h6>[foobar]</h6>'],
  1060 		['<p>', '<dl><dt>[foo]<dd>bar</dl>'],
  1061 		['<p>', '<dl><dt>foo<dd>[bar]</dl>'],
  1062 		['<p>', '<dl><dt>[foo<dd>bar]</dl>'],
  1063 		['<p>', '<ol><li>[foobar]</ol>'],
  1064 		['<p>', '<ul><li>[foobar]</ul>'],
  1065 		['<p>', '<address>[foobar]</address>'],
  1066 		['<p>', '<pre>[foobar]</pre>'],
  1067 		['<p>', '<listing>[foobar]</listing>'],
  1068 		['<p>', '<xmp>[foobar]</xmp>'],
  1069 		['<p>', '<article>[foobar]</article>'],
  1070 		['<p>', '<ins>[foobar]</ins>'],
  1071 		['<p>', '<del>[foobar]</del>'],
  1072 		['<p>', '<quasit>[foobar]</quasit>'],
  1073 		['<p>', '<quasit style="display: block">[foobar]</quasit>'],
  1075 		['<blockquote>', '<blockquote>[foo]</blockquote><p>extra'],
  1076 		['<blockquote>', '<blockquote><p>[foo]<p>bar</blockquote><p>extra'],
  1077 		['<blockquote>', '[foo]<blockquote>bar</blockquote><p>extra'],
  1078 		['<blockquote>', '<p>[foo<p>bar]<p>baz'],
  1079 		['<blockquote>', '<section>[foo]</section>'],
  1080 		['<blockquote>', '<section><p>[foo]</section>'],
  1081 		['<blockquote>', '<section><hgroup><h1>[foo]</h1><h2>bar</h2></hgroup><p>baz</section>'],
  1082 		['<article>', '<section>[foo]</section>'],
  1084 		['<address>', '<div>[foobar]</div>'],
  1085 		['<article>', '<div>[foobar]</div>'],
  1086 		['<blockquote>', '<div>[foobar]</div>'],
  1087 		['<dd>', '<div>[foobar]</div>'],
  1088 		['<del>', '<div>[foobar]</div>'],
  1089 		['<dl>', '<div>[foobar]</div>'],
  1090 		['<dt>', '<div>[foobar]</div>'],
  1091 		['<h1>', '<div>[foobar]</div>'],
  1092 		['<h2>', '<div>[foobar]</div>'],
  1093 		['<h3>', '<div>[foobar]</div>'],
  1094 		['<h4>', '<div>[foobar]</div>'],
  1095 		['<h5>', '<div>[foobar]</div>'],
  1096 		['<h6>', '<div>[foobar]</div>'],
  1097 		['<ins>', '<div>[foobar]</div>'],
  1098 		['<li>', '<div>[foobar]</div>'],
  1099 		['<ol>', '<div>[foobar]</div>'],
  1100 		['<p>', '<div>[foobar]</div>'],
  1101 		['<pre>', '<div>[foobar]</div>'],
  1102 		['<ul>', '<div>[foobar]</div>'],
  1103 		['<quasit>', '<div>[foobar]</div>'],
  1105 		['<address>', '<p>[foobar]</p>'],
  1106 		['<article>', '<p>[foobar]</p>'],
  1107 		['<aside>', '<p>[foobar]</p>'],
  1108 		['<blockquote>', '<p>[foobar]</p>'],
  1109 		['<body>', '<p>[foobar]</p>'],
  1110 		['<dd>', '<p>[foobar]</p>'],
  1111 		['<del>', '<p>[foobar]</p>'],
  1112 		['<details>', '<p>[foobar]</p>'],
  1113 		['<dir>', '<p>[foobar]</p>'],
  1114 		['<div>', '<p>[foobar]</p>'],
  1115 		['<dl>', '<p>[foobar]</p>'],
  1116 		['<dt>', '<p>[foobar]</p>'],
  1117 		['<fieldset>', '<p>[foobar]</p>'],
  1118 		['<figcaption>', '<p>[foobar]</p>'],
  1119 		['<figure>', '<p>[foobar]</p>'],
  1120 		['<footer>', '<p>[foobar]</p>'],
  1121 		['<form>', '<p>[foobar]</p>'],
  1122 		['<h1>', '<p>[foobar]</p>'],
  1123 		['<h2>', '<p>[foobar]</p>'],
  1124 		['<h3>', '<p>[foobar]</p>'],
  1125 		['<h4>', '<p>[foobar]</p>'],
  1126 		['<h5>', '<p>[foobar]</p>'],
  1127 		['<h6>', '<p>[foobar]</p>'],
  1128 		['<header>', '<p>[foobar]</p>'],
  1129 		['<head>', '<p>[foobar]</p>'],
  1130 		['<hgroup>', '<p>[foobar]</p>'],
  1131 		['<hr>', '<p>[foobar]</p>'],
  1132 		['<html>', '<p>[foobar]</p>'],
  1133 		['<ins>', '<p>[foobar]</p>'],
  1134 		['<li>', '<p>[foobar]</p>'],
  1135 		['<listing>', '<p>[foobar]</p>'],
  1136 		['<menu>', '<p>[foobar]</p>'],
  1137 		['<nav>', '<p>[foobar]</p>'],
  1138 		['<ol>', '<p>[foobar]</p>'],
  1139 		['<p>', '<p>[foobar]</p>'],
  1140 		['<plaintext>', '<p>[foobar]</p>'],
  1141 		['<pre>', '<p>[foobar]</p>'],
  1142 		['<section>', '<p>[foobar]</p>'],
  1143 		['<ul>', '<p>[foobar]</p>'],
  1144 		['<xmp>', '<p>[foobar]</p>'],
  1145 		['<quasit>', '<p>[foobar]</p>'],
  1147 		['<address>', '<p>[foo<p>bar]'],
  1148 		['<article>', '<p>[foo<p>bar]'],
  1149 		['<aside>', '<p>[foo<p>bar]'],
  1150 		['<blockquote>', '<p>[foo<p>bar]'],
  1151 		['<body>', '<p>[foo<p>bar]'],
  1152 		['<dd>', '<p>[foo<p>bar]'],
  1153 		['<del>', '<p>[foo<p>bar]'],
  1154 		['<details>', '<p>[foo<p>bar]'],
  1155 		['<dir>', '<p>[foo<p>bar]'],
  1156 		['<div>', '<p>[foo<p>bar]'],
  1157 		['<dl>', '<p>[foo<p>bar]'],
  1158 		['<dt>', '<p>[foo<p>bar]'],
  1159 		['<fieldset>', '<p>[foo<p>bar]'],
  1160 		['<figcaption>', '<p>[foo<p>bar]'],
  1161 		['<figure>', '<p>[foo<p>bar]'],
  1162 		['<footer>', '<p>[foo<p>bar]'],
  1163 		['<form>', '<p>[foo<p>bar]'],
  1164 		['<h1>', '<p>[foo<p>bar]'],
  1165 		['<h2>', '<p>[foo<p>bar]'],
  1166 		['<h3>', '<p>[foo<p>bar]'],
  1167 		['<h4>', '<p>[foo<p>bar]'],
  1168 		['<h5>', '<p>[foo<p>bar]'],
  1169 		['<h6>', '<p>[foo<p>bar]'],
  1170 		['<header>', '<p>[foo<p>bar]'],
  1171 		['<head>', '<p>[foo<p>bar]'],
  1172 		['<hgroup>', '<p>[foo<p>bar]'],
  1173 		['<hr>', '<p>[foo<p>bar]'],
  1174 		['<html>', '<p>[foo<p>bar]'],
  1175 		['<ins>', '<p>[foo<p>bar]'],
  1176 		['<li>', '<p>[foo<p>bar]'],
  1177 		['<listing>', '<p>[foo<p>bar]'],
  1178 		['<menu>', '<p>[foo<p>bar]'],
  1179 		['<nav>', '<p>[foo<p>bar]'],
  1180 		['<ol>', '<p>[foo<p>bar]'],
  1181 		['<p>', '<p>[foo<p>bar]'],
  1182 		['<plaintext>', '<p>[foo<p>bar]'],
  1183 		['<pre>', '<p>[foo<p>bar]'],
  1184 		['<section>', '<p>[foo<p>bar]'],
  1185 		['<ul>', '<p>[foo<p>bar]'],
  1186 		['<xmp>', '<p>[foo<p>bar]'],
  1187 		['<quasit>', '<p>[foo<p>bar]'],
  1189 		['p', '<div>[foobar]</div>'],
  1191 		'<ol><li>[foo]<li>bar</ol>',
  1193 		['<p>', '<h1>[foo]<br>bar</h1>'],
  1194 		['<p>', '<h1>foo<br>[bar]</h1>'],
  1195 		['<p>', '<h1>[foo<br>bar]</h1>'],
  1196 		['<address>', '<h1>[foo]<br>bar</h1>'],
  1197 		['<address>', '<h1>foo<br>[bar]</h1>'],
  1198 		['<address>', '<h1>[foo<br>bar]</h1>'],
  1199 		['<pre>', '<h1>[foo]<br>bar</h1>'],
  1200 		['<pre>', '<h1>foo<br>[bar]</h1>'],
  1201 		['<pre>', '<h1>[foo<br>bar]</h1>'],
  1202 		['<h2>', '<h1>[foo]<br>bar</h1>'],
  1203 		['<h2>', '<h1>foo<br>[bar]</h1>'],
  1204 		['<h2>', '<h1>[foo<br>bar]</h1>'],
  1206 		['<h1>', '<p>[foo]<br>bar</p>'],
  1207 		['<h1>', '<p>foo<br>[bar]</p>'],
  1208 		['<h1>', '<p>[foo<br>bar]</p>'],
  1209 		['<address>', '<p>[foo]<br>bar</p>'],
  1210 		['<address>', '<p>foo<br>[bar]</p>'],
  1211 		['<address>', '<p>[foo<br>bar]</p>'],
  1212 		['<pre>', '<p>[foo]<br>bar</p>'],
  1213 		['<pre>', '<p>foo<br>[bar]</p>'],
  1214 		['<pre>', '<p>[foo<br>bar]</p>'],
  1216 		['<p>', '<address>[foo]<br>bar</address>'],
  1217 		['<p>', '<address>foo<br>[bar]</address>'],
  1218 		['<p>', '<address>[foo<br>bar]</address>'],
  1219 		['<pre>', '<address>[foo]<br>bar</address>'],
  1220 		['<pre>', '<address>foo<br>[bar]</address>'],
  1221 		['<pre>', '<address>[foo<br>bar]</address>'],
  1222 		['<h1>', '<address>[foo]<br>bar</address>'],
  1223 		['<h1>', '<address>foo<br>[bar]</address>'],
  1224 		['<h1>', '<address>[foo<br>bar]</address>'],
  1226 		['<p>', '<pre>[foo]<br>bar</pre>'],
  1227 		['<p>', '<pre>foo<br>[bar]</pre>'],
  1228 		['<p>', '<pre>[foo<br>bar]</pre>'],
  1229 		['<address>', '<pre>[foo]<br>bar</pre>'],
  1230 		['<address>', '<pre>foo<br>[bar]</pre>'],
  1231 		['<address>', '<pre>[foo<br>bar]</pre>'],
  1232 		['<h1>', '<pre>[foo]<br>bar</pre>'],
  1233 		['<h1>', '<pre>foo<br>[bar]</pre>'],
  1234 		['<h1>', '<pre>[foo<br>bar]</pre>'],
  1236 		['<h1>', '<p>[foo</p>bar]'],
  1237 		['<h1>', '[foo<p>bar]</p>'],
  1238 		['<p>', '<div>[foo<p>bar]</p></div>'],
  1239 		['<p>', '<xmp>[foo]</xmp>'],
  1240 		['<div>', '<xmp>[foo]</xmp>'],
  1242 		'<div><ol><li>[foo]</ol></div>',
  1243 		'<div><table><tr><td>[foo]</table></div>',
  1244 		'<p>[foo<h1>bar]</h1>',
  1245 		'<h1>[foo</h1><h2>bar]</h2>',
  1246 		'<div>[foo</div>bar]',
  1248 		// https://bugs.webkit.org/show_bug.cgi?id=47054
  1249 		['<p>', '<div style=color:blue>[foo]</div>'],
  1250 		// https://bugs.webkit.org/show_bug.cgi?id=47574
  1251 		['<h1>', '{<p>foo</p>ba]r'],
  1252 		['<pre>', '&#10;[foo<p>bar]</p>'],
  1253 		// From https://bugs.webkit.org/show_bug.cgi?id=47300
  1254 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=14009
  1255 		['!<p>', '{<pre>&#10;foo&#10;&#10;bar&#10;</pre>}'],
  1256 	],
  1257 	//@}
  1258 	forwarddelete: [
  1259 	//@{
  1260 		// Collapsed selection
  1261 		'foo[]',
  1262 		'<span>foo[]</span>',
  1263 		'<p>foo[]</p>',
  1264 		'foo[]bar',
  1265 		'<span>foo</span>{}<span>bar</span>',
  1266 		'<span>foo[</span><span>]bar</span>',
  1267 		'foo[]<span style=display:none>bar</span>baz',
  1268 		'foo[]<script>bar</script>baz',
  1269 		'fo[]&ouml;bar',
  1270 		'fo[]o&#x308;bar',
  1271 		'fo[]o&#x308;&#x327;bar',
  1272 		'[]&ouml;bar',
  1273 		'[]o&#x308;bar',
  1274 		'[]o&#x308;&#x327;bar',
  1276 		'[]&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;&#x5dd;',
  1277 		'&#x5e9;&#x5c1;&#x5b8;&#x5dc;[]&#x5d5;&#x5b9;&#x5dd;',
  1279 		'<p>foo[]</p><p>bar</p>',
  1280 		'<p>foo[]</p>bar',
  1281 		'foo[]<p>bar</p>',
  1282 		'<p>foo[]<br></p><p>bar</p>',
  1283 		'<p>foo[]<br></p>bar',
  1284 		'foo[]<br><p>bar</p>',
  1286 		'<p>{}<br></p>foo',
  1287 		'<p>{}<span><br></span></p>foo',
  1288 		'foo{}<p><br>',
  1289 		'foo{}<p><span><br></span>',
  1290 		'foo{}<br><p><br>',
  1291 		'foo{}<span><br></span><p><br>',
  1292 		'foo{}<br><p><span><br></span>',
  1293 		'foo{}<span><br></span><p><span><br></span>',
  1294 		'foo{}<p>',
  1295 		'<table><tr><td>{}</table>foo',
  1296 		'<table><tr><td>{}<br></table>foo',
  1297 		'<table><tr><td>{}<span><br></span></table>foo',
  1299 		'<div><p>foo[]</p></div><p>bar</p>',
  1300 		'<p>foo[]</p><div><p>bar</p></div>',
  1301 		'<div><p>foo[]</p></div><div><p>bar</p></div>',
  1302 		'<div><p>foo[]</p></div>bar',
  1303 		'foo[]<div><p>bar</p></div>',
  1305 		'<div>foo[]</div><div>bar</div>',
  1306 		'<pre>foo[]</pre>bar',
  1308 		'foo[]<br>bar',
  1309 		'<b>foo[]</b><br>bar',
  1310 		'foo[]<hr>bar',
  1311 		'<p>foo[]<hr><p>bar',
  1312 		'<p>foo[]</p><br><p>bar</p>',
  1313 		'<p>foo[]</p><br><br><p>bar</p>',
  1314 		'<p>foo[]</p><img src=/img/lion.svg><p>bar',
  1315 		'foo[]<img src=/img/lion.svg>bar',
  1317 		'foo[]<a>bar</a>',
  1318 		'foo[]<a href=/>bar</a>',
  1319 		'foo[]<a name=abc>bar</a>',
  1320 		'foo[]<a href=/ name=abc>bar</a>',
  1321 		'foo[]<span><a>bar</a></span>',
  1322 		'foo[]<span><a href=/>bar</a></span>',
  1323 		'foo[]<span><a name=abc>bar</a></span>',
  1324 		'foo[]<span><a href=/ name=abc>bar</a></span>',
  1325 		'<a>foo[]</a>bar',
  1326 		'<a href=/>foo[]</a>bar',
  1327 		'<a name=abc>foo[]</a>bar',
  1328 		'<a href=/ name=abc>foo[]</a>bar',
  1330 		'foo []&nbsp;',
  1331 		'[]&nbsp; foo',
  1332 		'foo[] &nbsp;bar',
  1333 		'foo[]&nbsp; bar',
  1334 		'foo[]&nbsp;&nbsp;bar',
  1335 		'foo[]  bar',
  1336 		'foo[] &nbsp; bar',
  1337 		'foo []&nbsp; bar',
  1338 		'foo &nbsp;[] bar',
  1339 		'foo[] <span>&nbsp;</span> bar',
  1340 		'foo []<span>&nbsp;</span> bar',
  1341 		'foo <span>&nbsp;</span>[] bar',
  1342 		'<b>foo[] </b>&nbsp;bar',
  1343 		'<b>foo[]&nbsp;</b> bar',
  1344 		'<b>foo[]&nbsp;</b>&nbsp;bar',
  1345 		'<b>foo[] </b> bar',
  1347 		'<pre>foo []&nbsp;</pre>',
  1348 		'<pre>[]&nbsp; foo</pre>',
  1349 		'<pre>foo[] &nbsp;bar</pre>',
  1350 		'<pre>foo[]&nbsp; bar</pre>',
  1351 		'<pre>foo[]  bar</pre>',
  1353 		'<div style=white-space:pre>foo []&nbsp;</div>',
  1354 		'<div style=white-space:pre>[]&nbsp; foo</div>',
  1355 		'<div style=white-space:pre>foo[] &nbsp;bar</div>',
  1356 		'<div style=white-space:pre>foo[]&nbsp; bar</div>',
  1357 		'<div style=white-space:pre>foo[]  bar</div>',
  1359 		'<div style=white-space:pre-wrap>foo []&nbsp;</div>',
  1360 		'<div style=white-space:pre-wrap>[]&nbsp; foo</div>',
  1361 		'<div style=white-space:pre-wrap>foo[] &nbsp;bar</div>',
  1362 		'<div style=white-space:pre-wrap>foo[]&nbsp; bar</div>',
  1363 		'<div style=white-space:pre-wrap>foo[]  bar</div>',
  1365 		'<div style=white-space:pre-line>foo []&nbsp;</div>',
  1366 		'<div style=white-space:pre-line>[]&nbsp; foo</div>',
  1367 		'<div style=white-space:pre-line>foo[] &nbsp;bar</div>',
  1368 		'<div style=white-space:pre-line>foo[]&nbsp; bar</div>',
  1369 		'<div style=white-space:pre-line>foo[]  bar</div>',
  1371 		'<div style=white-space:nowrap>foo []&nbsp;</div>',
  1372 		'<div style=white-space:nowrap>[]&nbsp; foo</div>',
  1373 		'<div style=white-space:nowrap>foo[] &nbsp;bar</div>',
  1374 		'<div style=white-space:nowrap>foo[]&nbsp; bar</div>',
  1375 		'<div style=white-space:nowrap>foo[]  bar</div>',
  1377 		// Tables with collapsed selection
  1378 		'foo[]<table><tr><td>bar</table>baz',
  1379 		'foo<table><tr><td>bar[]</table>baz',
  1380 		'<p>foo[]<table><tr><td>bar</table><p>baz',
  1381 		'<table><tr><td>foo[]<td>bar</table>',
  1382 		'<table><tr><td>foo[]<tr><td>bar</table>',
  1384 		'foo[]<br><table><tr><td>bar</table>baz',
  1385 		'foo<table><tr><td>bar[]<br></table>baz',
  1386 		'<p>foo[]<br><table><tr><td>bar</table><p>baz',
  1387 		'<p>foo<table><tr><td>bar[]<br></table><p>baz',
  1388 		'<table><tr><td>foo[]<br><td>bar</table>',
  1389 		'<table><tr><td>foo[]<br><tr><td>bar</table>',
  1391 		'foo<table><tr><td>bar[]</table><br>baz',
  1392 		'foo[]<table><tr><td><hr>bar</table>baz',
  1393 		'<table><tr><td>foo[]<td><hr>bar</table>',
  1394 		'<table><tr><td>foo[]<tr><td><hr>bar</table>',
  1396 		// Lists with collapsed selection
  1397 		'foo[]<ol><li>bar<li>baz</ol>',
  1398 		'foo[]<br><ol><li>bar<li>baz</ol>',
  1399 		'<ol><li>foo[]<li>bar</ol>',
  1400 		'<ol><li>foo[]<br><li>bar</ol>',
  1401 		'<ol><li>foo[]<li>bar<br>baz</ol>',
  1403 		'<ol><li><p>foo[]<li>bar</ol>',
  1404 		'<ol><li>foo[]<li><p>bar</ol>',
  1405 		'<ol><li><p>foo[]<li><p>bar</ol>',
  1407 		'<ol><li>foo[]<ul><li>bar</ul></ol>',
  1408 		'foo[]<ol><ol><li>bar</ol></ol>',
  1409 		'foo[]<div><ol><li>bar</ol></div>',
  1411 		'foo[]<dl><dt>bar<dd>baz</dl>',
  1412 		'foo[]<dl><dd>bar</dl>',
  1413 		'<dl><dt>foo[]<dd>bar</dl>',
  1414 		'<dl><dt>foo[]<dt>bar<dd>baz</dl>',
  1415 		'<dl><dt>foo<dd>bar[]<dd>baz</dl>',
  1417 		'<ol><li>foo[]</ol>bar',
  1418 		'<ol><li>foo[]<br></ol>bar',
  1419 		'<ol><li>{}<br></ol>bar',
  1420 		'<ol><li>foo<li>{}<br></ol>bar',
  1422 		'<ol><li>foo[]</ol><p>bar',
  1423 		'<ol><li>foo[]<br></ol><p>bar',
  1424 		'<ol><li>{}<br></ol><p>bar',
  1425 		'<ol><li>foo<li>{}<br></ol><p>bar',
  1427 		'<ol><li>foo[]</ol><br>',
  1428 		'<ol><li>foo[]<br></ol><br>',
  1429 		'<ol><li>{}<br></ol><br>',
  1430 		'<ol><li>foo<li>{}<br></ol><br>',
  1432 		'<ol><li>foo[]</ol><p><br>',
  1433 		'<ol><li>foo[]<br></ol><p><br>',
  1434 		'<ol><li>{}<br></ol><p><br>',
  1435 		'<ol><li>foo<li>{}<br></ol><p><br>',
  1437 		// Indented stuff with collapsed selection
  1438 		'foo[]<blockquote>bar</blockquote>',
  1439 		'foo[]<blockquote><blockquote>bar</blockquote></blockquote>',
  1440 		'foo[]<blockquote><div>bar</div></blockquote>',
  1441 		'foo[]<blockquote style="color: blue">bar</blockquote>',
  1443 		'foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>',
  1444 		'foo[]<blockquote><div><p>bar<p>baz</div></blockquote>',
  1445 		'foo[]<blockquote style="color: blue"><p>bar<p>baz</blockquote>',
  1447 		'foo[]<blockquote><p><b>bar</b><p>baz</blockquote>',
  1448 		'foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>',
  1449 		'foo[]<blockquote><p><span>bar</span><p>baz</blockquote>',
  1451 		'foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra',
  1452 		'foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra',
  1453 		'foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra',
  1455 		// Invisible stuff with collapsed selection
  1456 		'foo[]<span></span>bar',
  1457 		'foo[]<span><span></span></span>bar',
  1458 		'foo[]<quasit></quasit>bar',
  1459 		'foo[]<span></span><br>bar',
  1460 		'<span>foo[]<span></span></span>bar',
  1461 		'foo[]<span></span><span>bar</span>',
  1462 		'foo[]<div><div><p>bar</div></div>',
  1463 		'foo[]<div><div><p><!--abc-->bar</div></div>',
  1464 		'foo[]<div><div><!--abc--><p>bar</div></div>',
  1465 		'foo[]<div><!--abc--><div><p>bar</div></div>',
  1466 		'foo[]<!--abc--><div><div><p>bar</div></div>',
  1467 		'<div><div><p>foo[]</div></div>bar',
  1468 		'<div><div><p>foo[]</div></div><!--abc-->bar',
  1469 		'<div><div><p>foo[]</div><!--abc--></div>bar',
  1470 		'<div><div><p>foo[]</p><!--abc--></div></div>bar',
  1471 		'<div><div><p>foo[]<!--abc--></div></div>bar',
  1472 		'<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>',
  1473 		'<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>',
  1474 		'<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>',
  1475 		'<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>',
  1476 		'<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>',
  1477 		'<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>',
  1478 		'<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>',
  1479 		'<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>',
  1481 		// Styled stuff with collapsed selection
  1482 		'<p style=color:blue>foo[]<p>bar',
  1483 		'<p style=color:blue>foo[]<p style=color:brown>bar',
  1484 		'<p>foo[]<p style=color:brown>bar',
  1485 		'<p><font color=blue>foo[]</font><p>bar',
  1486 		'<p><font color=blue>foo[]</font><p><font color=brown>bar</font>',
  1487 		'<p>foo[]<p><font color=brown>bar</font>',
  1488 		'<p><span style=color:blue>foo[]</font><p>bar',
  1489 		'<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>',
  1490 		'<p>foo[]<p><span style=color:brown>bar</font>',
  1492 		'<p style=background-color:aqua>foo[]<p>bar',
  1493 		'<p style=background-color:aqua>foo[]<p style=background-color:tan>bar',
  1494 		'<p>foo[]<p style=background-color:tan>bar',
  1495 		'<p><span style=background-color:aqua>foo[]</font><p>bar',
  1496 		'<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>',
  1497 		'<p>foo[]<p><span style=background-color:tan>bar</font>',
  1499 		'<p style=text-decoration:underline>foo[]<p>bar',
  1500 		'<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar',
  1501 		'<p>foo[]<p style=text-decoration:line-through>bar',
  1502 		'<p><u>foo[]</u><p>bar',
  1503 		'<p><u>foo[]</u><p><s>bar</s>',
  1504 		'<p>foo[]<p><s>bar</s>',
  1506 		'<p style=color:blue>foo[]</p>bar',
  1507 		'foo[]<p style=color:brown>bar',
  1508 		'<div style=color:blue><p style=color:green>foo[]</div>bar',
  1509 		'<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar',
  1510 		'<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar',
  1512 		// Uncollapsed selection (should be same as delete command)
  1513 		'foo[bar]baz',
  1514 		'<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
  1515 		'<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
  1516 		'<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
  1517 		'<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
  1518 		'<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
  1519 		'<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
  1520 		'<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
  1521 		'<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
  1523 		'foo<b>[bar]</b>baz',
  1524 		'foo<b>{bar}</b>baz',
  1525 		'foo{<b>bar</b>}baz',
  1526 		'foo<span>[bar]</span>baz',
  1527 		'foo<span>{bar}</span>baz',
  1528 		'foo{<span>bar</span>}baz',
  1529 		'<b>foo[bar</b><i>baz]quz</i>',
  1530 		'<p>foo</p><p>[bar]</p><p>baz</p>',
  1531 		'<p>foo</p><p>{bar}</p><p>baz</p>',
  1532 		'<p>foo</p><p>{bar</p>}<p>baz</p>',
  1533 		'<p>foo</p>{<p>bar}</p><p>baz</p>',
  1534 		'<p>foo</p>{<p>bar</p>}<p>baz</p>',
  1536 		'<p>foo[bar<p>baz]quz',
  1537 		'<p>foo[bar<div>baz]quz</div>',
  1538 		'<p>foo[bar<h1>baz]quz</h1>',
  1539 		'<div>foo[bar</div><p>baz]quz',
  1540 		'<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',
  1542 		'<p><b>foo[bar</b><p>baz]quz',
  1543 		'<div><p>foo[bar</div><p>baz]quz',
  1544 		'<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
  1545 		'<p>foo[bar<p style=color:blue>baz]quz',
  1546 		'<p>foo[bar<p><b>baz]quz</b>',
  1548 		'<div><p>foo<p>[bar<p>baz]</div>',
  1550 		'foo[<br>]bar',
  1551 		'<p>foo[</p><p>]bar</p>',
  1552 		'<p>foo[</p><p>]bar<br>baz</p>',
  1553 		'foo[<p>]bar</p>',
  1554 		'foo{<p>}bar</p>',
  1555 		'foo[<p>]bar<br>baz</p>',
  1556 		'foo[<p>]bar</p>baz',
  1557 		'foo{<p>bar</p>}baz',
  1558 		'foo<p>{bar</p>}baz',
  1559 		'foo{<p>bar}</p>baz',
  1560 		'<p>foo[</p>]bar',
  1561 		'<p>foo{</p>}bar',
  1562 		'<p>foo[</p>]bar<br>baz',
  1563 		'<p>foo[</p>]bar<p>baz</p>',
  1564 		'foo[<div><p>]bar</div>',
  1565 		'<div><p>foo[</p></div>]bar',
  1566 		'foo[<div><p>]bar</p>baz</div>',
  1567 		'foo[<div>]bar<p>baz</p></div>',
  1568 		'<div><p>foo</p>bar[</div>]baz',
  1569 		'<div>foo<p>bar[</p></div>]baz',
  1571 		'<p>foo<br>{</p>]bar',
  1572 		'<p>foo<br><br>{</p>]bar',
  1573 		'foo<br>{<p>]bar</p>',
  1574 		'foo<br><br>{<p>]bar</p>',
  1575 		'<p>foo<br>{</p><p>}bar</p>',
  1576 		'<p>foo<br><br>{</p><p>}bar</p>',
  1578 		'<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>',
  1579 		'<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
  1580 		'<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
  1581 		'<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>',
  1582 		'<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>',
  1583 		'<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>',
  1584 		'{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}',
  1585 		'<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>',
  1586 		'<p>fo[o<table><tr><td>b]ar</table><p>baz',
  1587 		'<p>foo<table><tr><td>ba[r</table><p>b]az',
  1588 		'<p>fo[o<table><tr><td>bar</table><p>b]az',
  1590 		'<p>foo<ol><li>ba[r<li>b]az</ol><p>quz',
  1591 		'<p>foo<ol><li>bar<li>[baz]</ol><p>quz',
  1592 		'<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz',
  1593 		'<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz',
  1594 		'<p>fo[o<ol><li>bar<li>b]az</ol><p>quz',
  1595 		'<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz',
  1597 		'<ol><li>fo[o</ol><ol><li>b]ar</ol>',
  1598 		'<ol><li>fo[o</ol><ul><li>b]ar</ul>',
  1600 		'foo[<ol><li>]bar</ol>',
  1601 		'<ol><li>foo[<li>]bar</ol>',
  1602 		'foo[<dl><dt>]bar<dd>baz</dl>',
  1603 		'foo[<dl><dd>]bar</dl>',
  1604 		'<dl><dt>foo[<dd>]bar</dl>',
  1605 		'<dl><dt>foo[<dt>]bar<dd>baz</dl>',
  1606 		'<dl><dt>foo<dd>bar[<dd>]baz</dl>',
  1608 		// https://bugs.webkit.org/show_bug.cgi?id=35281
  1609 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=13976
  1610 		'<ol><li>foo</ol>{}<br><ol><li>bar</ol>',
  1611 		'<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>',
  1612 		'<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>',
  1613 		'<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>',
  1614 		'<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
  1615 		'<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
  1616 		'<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>',
  1617 		'<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>',
  1618 		'<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>',
  1619 		'<ol><li>foo[</ol>bar]<ol><li>baz</ol>',
  1620 		'<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>',
  1621 		'<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>',
  1622 		'<ol><li>fo[]o</ol><ol><li>bar</ol>',
  1623 		'<ol><li>foo</ol>[bar<ol><li>]baz</ol>',
  1624 		'<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>',
  1625 		'<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>',
  1626 		'<ol><li>foo</ol><ol><li>[]bar</ol>',
  1627 		'<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>',
  1628 		'<ul><li>foo</ul>{}<br><ul><li>bar</ul>',
  1629 		'<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>',
  1630 		'<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>',
  1631 		'<ol><li>foo</ol>{}<br><ul><li>bar</ul>',
  1632 		'<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>',
  1633 		'<ul><li>foo</ul>{}<br><ol><li>bar</ol>',
  1634 		'<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>',
  1636 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=13831
  1637 		'<p><b>[foo]</b>',
  1638 		'<p><quasit>[foo]</quasit>',
  1639 		'<p><b><i>[foo]</i></b>',
  1640 		'<p><b>{foo}</b>',
  1641 		'<p>{<b>foo</b>}',
  1642 		'<p><b>[]f</b>',
  1643 		'<b>[foo]</b>',
  1644 		'<div><b>[foo]</b></div>',
  1645 	],
  1646 	//@}
  1647 	hilitecolor: [
  1648 	//@{
  1649 		'foo[]bar',
  1650 		'<p>[foo</p> <p>bar]</p>',
  1651 		'<span>[foo</span> <span>bar]</span>',
  1652 		'<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
  1653 		'<p>[foo<p><br><p>bar]',
  1654 		'<b>foo[]bar</b>',
  1655 		'<i>foo[]bar</i>',
  1656 		'<span>foo</span>{}<span>bar</span>',
  1657 		'<span>foo[</span><span>]bar</span>',
  1658 		'foo[bar]baz',
  1659 		'foo[bar<b>baz]qoz</b>quz',
  1660 		'foo[bar<i>baz]qoz</i>quz',
  1661 		'{<p><p> <p>foo</p>}',
  1663 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
  1664 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
  1665 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
  1666 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
  1667 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
  1668 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
  1670 		'<p style="background-color: rgb(0, 255, 255)">foo[bar]baz</p>',
  1671 		'<p style="background-color: #00ffff">foo[bar]baz</p>',
  1672 		'<p style="background-color: aqua">foo[bar]baz</p>',
  1673 		'{<p style="background-color: aqua">foo</p><p>bar</p>}',
  1674 		'<span style="background-color: aqua">foo<span style="background-color: tan">[bar]</span>baz</span>',
  1675 		'<span style="background-color: #00ffff">foo<span style="background-color: tan">[bar]</span>baz</span>',
  1676 		'<span style="background-color: #0ff">foo<span style="background-color: tan">[bar]</span>baz</span>',
  1677 		'<span style="background-color: rgb(0, 255, 255)">foo<span style="background-color: tan">[bar]</span>baz</span>',
  1678 		'<span style="background-color: aqua">foo<span style="background-color: tan">b[ar]</span>baz</span>',
  1679 		'<p style="background-color: aqua">foo<span style="background-color: tan">b[ar]</span>baz</p>',
  1680 		'<div style="background-color: aqua"><p style="background-color: tan">b[ar]</p></div>',
  1681 		'<span style="display: block; background-color: aqua"><span style="display: block; background-color: tan">b[ar]</span></span>',
  1683 		// Tests for queryCommandIndeterm() and queryCommandState()
  1684 		'fo[o<span style=background-color:tan>b]ar</span>baz',
  1685 		'foo<span style=background-color:tan>ba[r</span>b]az',
  1686 		'fo[o<span style=background-color:tan>bar</span>b]az',
  1687 		'foo[<span style=background-color:tan>b]ar</span>baz',
  1688 		'foo<span style=background-color:tan>ba[r</span>]baz',
  1689 		'foo[<span style=background-color:tan>bar</span>]baz',
  1690 		'foo<span style=background-color:tan>[bar]</span>baz',
  1691 		'foo{<span style=background-color:tan>bar</span>}baz',
  1692 		'<span style=background-color:tan>fo[o</span><span style=background-color:yellow>b]ar</span>',
  1693 		'<span style=background-color:tan>fo[o</span><span style=background-color:tan>b]ar</span>',
  1694 		'<span style=background-color:tan>fo[o<span style=background-color:transparent>b]ar</span></span>',
  1696 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=13829
  1697 		'!<font size=6>[foo]</font>',
  1698 		'!<span style=font-size:xx-large>[foo]</span>',
  1699 		'!<font size=6>foo[bar]baz</font>',
  1700 		'!<span style=font-size:xx-large>foo[bar]baz</span>',
  1701 		'![foo<font size=6>bar</font>baz]',
  1702 		'![foo<span style=font-size:xx-large>bar</span>baz]',
  1703 	],
  1704 	//@}
  1705 	indent: [
  1706 	//@{
  1707 		// All these have a trailing unselected paragraph, because otherwise
  1708 		// Gecko is unhappy: it throws exceptions in non-CSS mode, and in CSS
  1709 		// mode it adds the indentation invisibly to the wrapper div in many
  1710 		// cases.
  1711 		'foo[]bar<p>extra',
  1712 		'<span>foo</span>{}<span>bar</span><p>extra',
  1713 		'<span>foo[</span><span>]bar</span><p>extra',
  1714 		'foo[bar]baz<p>extra',
  1715 		'<p dir=rtl>פו[בר]בז<p dir=rtl>נוםף',
  1716 		'<p dir=rtl>פו[ברבז<p>Foobar]baz<p>Extra',
  1717 		'<p>Foo[barbaz<p dir=rtl>פובר]בז<p>Extra',
  1718 		'<div><p>Foo[barbaz<p dir=rtl>פובר]בז</div><p>Extra',
  1719 		'foo]bar[baz<p>extra',
  1720 		'{<p><p> <p>foo</p>}<p>extra',
  1721 		'foo[bar<i>baz]qoz</i>quz<p>extra',
  1722 		'[]foo<p>extra',
  1723 		'foo[]<p>extra',
  1724 		'<p>[]foo<p>extra',
  1725 		'<p>foo[]<p>extra',
  1726 		'<p>{}<br>foo</p><p>extra',
  1727 		'<p>foo<br>{}</p><p>extra',
  1728 		'<span>{}<br>foo</span>bar<p>extra',
  1729 		'<span>foo<br>{}</span>bar<p>extra',
  1730 		'<p>foo</p>{}<p>bar</p>',
  1732 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
  1733 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  1734 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  1735 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
  1736 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
  1737 		'{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
  1739 		'<p>foo[bar]</p><p>baz</p><p>extra',
  1740 		'<p>[foobar</p><p>ba]z</p><p>extra',
  1741 		'foo[bar]<br>baz<p>extra',
  1742 		'foo[bar]<br><br><br><br>baz<p>extra',
  1743 		'foobar<br>[ba]z<p>extra',
  1744 		'foobar<br><br><br><br>[ba]z<p>extra',
  1745 		'foo[bar<br>ba]z<p>extra',
  1746 		'<div>foo<p>[bar]</p>baz</div><p>extra',
  1748 		// These mimic existing indentation in various browsers, to see how
  1749 		// they cope with indenting twice.  This is spec, Gecko non-CSS, and
  1750 		// Opera:
  1751 		'<blockquote><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
  1752 		'<blockquote><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
  1753 		'<blockquote><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
  1754 		'<blockquote><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
  1755 		'<p>[foo]<blockquote><p>bar</blockquote><p>extra',
  1756 		'<p>[foo<blockquote><p>b]ar</blockquote><p>extra',
  1757 		'<p>foo<blockquote><p>bar</blockquote><p>[baz]<p>extra',
  1758 		'<p>foo<blockquote><p>[bar</blockquote><p>baz]<p>extra',
  1759 		'<p>[foo<blockquote><p>bar</blockquote><p>baz]<p>extra',
  1760 		'<blockquote><p>foo</blockquote><p>[bar]<blockquote><p>baz</blockquote><p>extra',
  1762 		'<blockquote>foo[bar]<br>baz</blockquote><p>extra',
  1763 		'<blockquote>foo[bar<br>b]az</blockquote><p>extra',
  1764 		'<blockquote>foo[bar]</blockquote>baz<p>extra',
  1765 		'<blockquote>foo[bar</blockquote>b]az<p>extra',
  1766 		'[foo]<blockquote>bar</blockquote><p>extra',
  1767 		'[foo<blockquote>b]ar</blockquote><p>extra',
  1768 		'foo<blockquote>bar</blockquote>[baz]<p>extra',
  1769 		'[foo<blockquote>bar</blockquote>baz]<p>extra',
  1770 		'<blockquote>foo</blockquote>[bar]<blockquote>baz</blockquote><p>extra',
  1772 		// IE:
  1773 		'<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
  1774 		'<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
  1775 		'<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
  1776 		'<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
  1777 		'<p>[foo]<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>extra',
  1778 		'<p>[foo<blockquote style="margin-right: 0" dir="ltr"><p>b]ar</blockquote><p>extra',
  1779 		'<p>foo<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>[baz]<p>extra',
  1780 		'<p>foo<blockquote style="margin-right: 0" dir="ltr"><p>[bar</blockquote><p>baz]<p>extra',
  1781 		'<p>[foo<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>baz]<p>extra',
  1782 		'<blockquote style="margin-right: 0" dir="ltr"><p>foo</blockquote><p>[bar]<blockquote style="margin-right: 0" dir="ltr"><p>baz</blockquote><p>extra',
  1784 		// Firefox CSS mode:
  1785 		'<p style="margin-left: 40px">foo[bar]</p><p style="margin-left: 40px">baz</p><p>extra',
  1786 		'<p style="margin-left: 40px">foo[bar</p><p style="margin-left: 40px">b]az</p><p>extra',
  1787 		'<p style="margin-left: 40px">foo[bar]</p><p>baz</p><p>extra',
  1788 		'<p style="margin-left: 40px">foo[bar</p><p>b]az</p><p>extra',
  1789 		'<p>[foo]<p style="margin-left: 40px">bar<p>extra',
  1790 		'<p>[foo<p style="margin-left: 40px">b]ar<p>extra',
  1791 		'<p>foo<p style="margin-left: 40px">bar<p>[baz]<p>extra',
  1792 		'<p>foo<p style="margin-left: 40px">[bar<p>baz]<p>extra',
  1793 		'<p>[foo<p style="margin-left: 40px">bar<p>baz]<p>extra',
  1794 		'<p style="margin-left: 40px">foo<p>[bar]<p style="margin-left: 40px">baz<p>extra',
  1796 		// WebKit:
  1797 		'<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
  1798 		'<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
  1799 		'<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
  1800 		'<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
  1801 		'<p>[foo]<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>extra',
  1802 		'<p>[foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>b]ar</blockquote><p>extra',
  1803 		'<p>foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>[baz]<p>extra',
  1804 		'<p>foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>[bar</blockquote><p>baz]<p>extra',
  1805 		'<p>[foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>baz]<p>extra',
  1806 		'<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo</blockquote><p>[bar]<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>baz</blockquote><p>extra',
  1808 		// MDC says "In Firefox, if the selection spans multiple lines at
  1809 		// different levels of indentation, only the least indented lines in
  1810 		// the selection will be indented."  Let's test that.
  1811 		'<blockquote>f[oo<blockquote>b]ar</blockquote></blockquote><p>extra',
  1813 		// Lists!
  1814 		'<ol><li>foo<li>[bar]<li>baz</ol>',
  1815 		'<ol data-start=1 data-end=2><li>foo<li>bar<li>baz</ol>',
  1816 		'<ol><li>foo</ol>[bar]',
  1817 		'<ol><li>[foo]<br>bar<li>baz</ol>',
  1818 		'<ol><li>foo<br>[bar]<li>baz</ol>',
  1819 		'<ol><li><div>[foo]</div>bar<li>baz</ol>',
  1820 		'<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
  1821 		'<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
  1822 		'<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
  1823 		'<ol><li>foo</li><ol data-start=0 data-end=1><li>bar<li>baz</ol><li>quz</ol>',
  1824 		'<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
  1825 		'<ol><li>foo</li><ol data-start=1 data-end=2><li>bar<li>baz</ol><li>quz</ol>',
  1826 		'<ol><li>foo<ol><li>b[a]r</ol><li>baz</ol>',
  1827 		'<ol><li>foo</li><ol><li>b[a]r</ol><li>baz</ol>',
  1828 		'<ol><li>foo{<ol><li>bar</ol>}<li>baz</ol>',
  1829 		'<ol><li>foo</li>{<ol><li>bar</ol>}<li>baz</ol>',
  1830 		'<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
  1831 		'<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
  1832 		'<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
  1833 		'<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
  1834 		'<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
  1835 		'<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
  1837 		// Lists with id's:
  1838 		// http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2009-July/020721.html
  1839 		'<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>',
  1840 		'<ol><ol><li id=i1>foo</ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>',
  1841 		'<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</li><ol><li id=i3>baz</ol></ol>',
  1842 		'<ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>',
  1843 		'<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</ol>',
  1845 		// Try indenting multiple items at once.
  1846 		'<ol><li>foo<li>b[ar<li>baz]</ol>',
  1847 		'<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
  1848 		'<ol><li>[foo</li><ol><li>bar]</ol><li>baz</ol>',
  1849 		'<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
  1850 		'<ol><li>foo</li><ol><li>b[ar</ol><li>b]az</ol>',
  1851 		'<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
  1852 		'<ol><li>[foo</li><ol><li>bar</ol><li>baz]</ol><p>extra',
  1854 		// We probably can't actually get this DOM . . .
  1855 		'<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
  1856 		'<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
  1857 		'<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
  1858 		'<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
  1860 		'foo<!--bar-->[baz]<p>extra',
  1861 		'[foo]<!--bar-->baz<p>extra',
  1862 		'<p>foo<!--bar-->{}<p>extra',
  1863 		'<p>{}<!--foo-->bar<p>extra',
  1865 		// Whitespace nodes
  1866 		'<blockquote><p>foo</blockquote> <p>[bar]',
  1867 		'<p>[foo]</p> <blockquote><p>bar</blockquote>',
  1868 		'<blockquote><p>foo</blockquote> <p>[bar]</p> <blockquote><p>baz</blockquote>',
  1869 		'<ol><li>foo</li><ol><li>bar</li> </ol><li>[baz]</ol>',
  1870 		'<ol><li>foo</li><ol><li>bar</li></ol> <li>[baz]</ol>',
  1871 		'<ol><li>foo</li><ol><li>bar</li> </ol> <li>[baz]</ol>',
  1872 		'<ol><li>foo<ol><li>bar</li> </ol></li><li>[baz]</ol>',
  1873 		'<ol><li>foo<ol><li>bar</li></ol></li> <li>[baz]</ol>',
  1874 		'<ol><li>foo<ol><li>bar</li> </ol></li> <li>[baz]</ol>',
  1875 		'<ol><li>foo<li>[bar]</li> <ol><li>baz</ol></ol>',
  1876 		'<ol><li>foo<li>[bar]</li><ol> <li>baz</ol></ol>',
  1877 		'<ol><li>foo<li>[bar]</li> <ol> <li>baz</ol></ol>',
  1878 		'<ol><li>foo<li>[bar] <ol><li>baz</ol></ol>',
  1879 		'<ol><li>foo<li>[bar]<ol> <li>baz</ol></ol>',
  1880 		'<ol><li>foo<li>[bar] <ol> <li>baz</ol></ol>',
  1882 		// https://bugs.webkit.org/show_bug.cgi?id=32003
  1883 		'<ul><li>a<br>{<br>}</li><li>b</li></ul>',
  1884 	],
  1885 	//@}
  1886 	inserthorizontalrule: [
  1887 	//@{
  1888 		'foo[]bar',
  1889 		'<span>foo</span>{}<span>bar</span>',
  1890 		'<span>foo[</span><span>]bar</span>',
  1891 		'<p>foo[bar<p>baz]quz',
  1892 		'<div><b>foo</b>{}<b>bar</b></div>',
  1893 		'<div><b>foo[</b><b>]bar</b></div>',
  1894 		'<div><b>foo</b>{<b>bar</b>}<b>baz</b></div>',
  1895 		'<b>foo[]bar</b>',
  1896 		'<b id=abc>foo[]bar</b>',
  1897 		["abc", 'foo[bar]baz'],
  1898 		'foo[bar]baz',
  1900 		'foo<b>[bar]</b>baz',
  1901 		'foo<b>{bar}</b>baz',
  1902 		'foo{<b>bar</b>}baz',
  1903 		'<p>foo<p>[bar]<p>baz',
  1904 		'<p>foo<p>{bar}<p>baz',
  1905 		'<p>foo{<p>bar</p>}<p>baz',
  1907 		'<p>foo[bar]baz</p>',
  1908 		'<p id=abc>foo[bar]baz</p>',
  1909 		'<h1>foo[bar]baz</h1>',
  1910 		'<p>foo<b>b[a]r</b>baz</p>',
  1912 		'<a>foo[bar]baz</a>',
  1913 		'<a href=/>foo[bar]baz</a>',
  1914 		'<abbr>foo[bar]baz</abbr>',
  1915 		'<address>foo[bar]baz</address>',
  1916 		'<article>foo[bar]baz</article>',
  1917 		'<aside>foo[bar]baz</aside>',
  1918 		'<b>foo[bar]baz</b>',
  1919 		'<bdi>foo[bar]baz</bdi>',
  1920 		'<bdo dir=rtl>foo[bar]baz</bdo>',
  1921 		'<blockquote>foo[bar]baz</blockquote>',
  1922 		'<table><caption>foo[bar]baz</caption><tr><td>quz</table>',
  1923 		'<cite>foo[bar]baz</cite>',
  1924 		'<code>foo[bar]baz</code>',
  1925 		'<dl><dd>foo[bar]baz</dd></dl>',
  1926 		'<del>foo[bar]baz</del>',
  1927 		'<details>foo[bar]baz</details>',
  1928 		'<dfn>foo[bar]baz</dfn>',
  1929 		'<div>foo[bar]baz</div>',
  1930 		'<dl><dt>foo[bar]baz</dt></dl>',
  1931 		'<em>foo[bar]baz</em>',
  1932 		'<figure><figcaption>foo[bar]baz</figcaption>quz</figure>',
  1933 		'<figure>foo[bar]baz</figure>',
  1934 		'<footer>foo[bar]baz</footer>',
  1935 		'<h1>foo[bar]baz</h1>',
  1936 		'<h2>foo[bar]baz</h2>',
  1937 		'<h3>foo[bar]baz</h3>',
  1938 		'<h4>foo[bar]baz</h4>',
  1939 		'<h5>foo[bar]baz</h5>',
  1940 		'<h6>foo[bar]baz</h6>',
  1941 		'<header>foo[bar]baz</header>',
  1942 		'<hgroup>foo[bar]baz</hgroup>',
  1943 		'<hgroup><h1>foo[bar]baz</h1></hgroup>',
  1944 		'<i>foo[bar]baz</i>',
  1945 		'<ins>foo[bar]baz</ins>',
  1946 		'<kbd>foo[bar]baz</kbd>',
  1947 		'<mark>foo[bar]baz</mark>',
  1948 		'<nav>foo[bar]baz</nav>',
  1949 		'<ol><li>foo[bar]baz</li></ol>',
  1950 		'<p>foo[bar]baz</p>',
  1951 		'<pre>foo[bar]baz</pre>',
  1952 		'<q>foo[bar]baz</q>',
  1953 		'<ruby>foo[bar]baz<rt>quz</rt></ruby>',
  1954 		'<ruby>foo<rt>bar[baz]quz</rt></ruby>',
  1955 		'<ruby>foo<rp>bar[baz]quz</rp><rt>qoz</rt><rp>qiz</rp></ruby>',
  1956 		'<s>foo[bar]baz</s>',
  1957 		'<samp>foo[bar]baz</samp>',
  1958 		'<section>foo[bar]baz</section>',
  1959 		'<small>foo[bar]baz</small>',
  1960 		'<span>foo[bar]baz</span>',
  1961 		'<strong>foo[bar]baz</strong>',
  1962 		'<sub>foo[bar]baz</sub>',
  1963 		'<sup>foo[bar]baz</sup>',
  1964 		'<table><tr><td>foo[bar]baz</td></table>',
  1965 		'<table><tr><th>foo[bar]baz</th></table>',
  1966 		'<u>foo[bar]baz</u>',
  1967 		'<ul><li>foo[bar]baz</li></ul>',
  1968 		'<var>foo[bar]baz</var>',
  1970 		'<acronym>foo[bar]baz</acronym>',
  1971 		'<big>foo[bar]baz</big>',
  1972 		'<blink>foo[bar]baz</blink>',
  1973 		'<center>foo[bar]baz</center>',
  1974 		'<dir>foo[bar]baz</dir>',
  1975 		'<dir><li>foo[bar]baz</li></dir>',
  1976 		'<font>foo[bar]baz</font>',
  1977 		'<listing>foo[bar]baz</listing>',
  1978 		'<marquee>foo[bar]baz</marquee>',
  1979 		'<nobr>foo[bar]baz</nobr>',
  1980 		'<strike>foo[bar]baz</strike>',
  1981 		'<tt>foo[bar]baz</tt>',
  1982 		'<xmp>foo[bar]baz</xmp>',
  1984 		'<quasit>foo[bar]baz</quasit>',
  1986 		'<table><tr><td>fo[o<td>b]ar</table>',
  1987 		'fo[o<span contenteditable=false>bar</span>b]az',
  1988 	],
  1989 	//@}
  1990 	inserthtml: [
  1991 	//@{
  1992 		'foo[]bar',
  1993 		'foo[bar]baz',
  1994 		'foo<span style=color:#aBcDeF>[bar]</span>baz',
  1995 		'foo<span style=color:#aBcDeF>{bar}</span>baz',
  1996 		'foo{<span style=color:#aBcDeF>bar</span>}baz',
  1997 		'[foo<span style=color:#aBcDeF>bar]</span>baz',
  1998 		'{foo<span style=color:#aBcDeF>bar}</span>baz',
  1999 		'foo<span style=color:#aBcDeF>[bar</span>baz]',
  2000 		'foo<span style=color:#aBcDeF>{bar</span>baz}',
  2001 		'foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
  2003 		['', 'foo[bar]baz'],
  2004 		['\0', 'foo[bar]baz'],
  2005 		['\x07', 'foo[bar]baz'],
  2006 		// The following line makes Firefox 7.0a2 go into an infinite loop on
  2007 		// my machine.
  2008 		//['\ud800', 'foo[bar]baz'],
  2010 		['<b>', 'foo[bar]baz'],
  2011 		['<b>abc', 'foo[bar]baz'],
  2012 		['<p>abc', '<p>foo[bar]baz'],
  2013 		['<li>abc', '<p>foo[bar]baz'],
  2014 		['<p>abc', '<ol>{<li>foo</li>}<li>bar</ol>'],
  2015 		['<p>abc', '<ol><li>foo</li>{<li>bar</li>}<li>baz</ol>'],
  2016 		['<p>abc', '<ol><li>[foo]</li><li>bar</ol>'],
  2018 		['abc', '<xmp>f[o]o</xmp>'],
  2019 		['<b>abc</b>', '<xmp>f[o]o</xmp>'],
  2020 		['abc', '<script>f[o]o</script>bar'],
  2021 		['<b>abc</b>', '<script>f[o]o</script>bar'],
  2023 		['<a>abc</a>', '<a>f[o]o</a>'],
  2024 		['<a href=/>abc</a>', '<a href=.>f[o]o</a>'],
  2025 		['<hr>', '<p>f[o]o'],
  2026 		['<hr>', '<b>f[o]o</b>'],
  2027 		['<h2>abc</h2>', '<h1>f[o]o</h1>'],
  2028 		['<td>abc</td>', '<table><tr><td>f[o]o</table>'],
  2029 		['<td>abc</td>', 'f[o]o'],
  2031 		['<dt>abc</dt>', '<dl><dt>f[o]o<dd>bar</dl>'],
  2032 		['<dt>abc</dt>', '<dl><dt>foo<dd>b[a]r</dl>'],
  2033 		['<dd>abc</dd>', '<dl><dt>f[o]o<dd>bar</dl>'],
  2034 		['<dd>abc</dd>', '<dl><dt>foo<dd>b[a]r</dl>'],
  2035 		['<dt>abc</dt>', 'f[o]o'],
  2036 		['<dt>abc</dt>', '<ol><li>f[o]o</ol>'],
  2037 		['<dd>abc</dd>', 'f[o]o'],
  2038 		['<dd>abc</dd>', '<ol><li>f[o]o</ol>'],
  2040 		['<li>abc</li>', '<dir><li>f[o]o</dir>'],
  2041 		['<li>abc</li>', '<ol><li>f[o]o</ol>'],
  2042 		['<li>abc</li>', '<ul><li>f[o]o</ul>'],
  2043 		['<dir><li>abc</dir>', '<dir><li>f[o]o</dir>'],
  2044 		['<dir><li>abc</dir>', '<ol><li>f[o]o</ol>'],
  2045 		['<dir><li>abc</dir>', '<ul><li>f[o]o</ul>'],
  2046 		['<ol><li>abc</ol>', '<dir><li>f[o]o</dir>'],
  2047 		['<ol><li>abc</ol>', '<ol><li>f[o]o</ol>'],
  2048 		['<ol><li>abc</ol>', '<ul><li>f[o]o</ul>'],
  2049 		['<ul><li>abc</ul>', '<dir><li>f[o]o</dir>'],
  2050 		['<ul><li>abc</ul>', '<ol><li>f[o]o</ol>'],
  2051 		['<ul><li>abc</ul>', '<ul><li>f[o]o</ul>'],
  2052 		['<li>abc</li>', 'f[o]o'],
  2054 		['<nobr>abc</nobr>', '<nobr>f[o]o</nobr>'],
  2055 		['<nobr>abc</nobr>', 'f[o]o'],
  2057 		['<p>abc', '<font color=blue>foo[]bar</font>'],
  2058 		['<p>abc', '<span style=color:blue>foo[]bar</span>'],
  2059 		['<p>abc', '<span style=font-variant:small-caps>foo[]bar</span>'],
  2060 		[' ', '<p>[foo]</p>'],
  2061 		['<span style=display:none></span>', '<p>[foo]</p>'],
  2062 		['<!--abc-->', '<p>[foo]</p>'],
  2064 		['abc', '<p>{}<br></p>'],
  2065 		['<!--abc-->', '<p>{}<br></p>'],
  2066 		['abc', '<p><!--foo-->{}<span><br></span><!--bar--></p>'],
  2067 		['<!--abc-->', '<p><!--foo-->{}<span><br></span><!--bar--></p>'],
  2068 		['abc', '<p>{}<span><!--foo--><br><!--bar--></span></p>'],
  2069 		['<!--abc-->', '<p>{}<span><!--foo--><br><!--bar--></span></p>'],
  2071 		['abc', '<p><br>{}</p>'],
  2072 		['<!--abc-->', '<p><br>{}</p>'],
  2073 		['abc', '<p><!--foo--><span><br></span>{}<!--bar--></p>'],
  2074 		['<!--abc-->', '<p><!--foo--><span><br></span>{}<!--bar--></p>'],
  2075 		['abc', '<p><span><!--foo--><br><!--bar--></span>{}</p>'],
  2076 		['<!--abc-->', '<p><span><!--foo--><br><!--bar--></span>{}</p>'],
  2077 	],
  2078 	//@}
  2079 	insertimage: [
  2080 	//@{
  2081 		'foo[]bar',
  2082 		'<span>foo</span>{}<span>bar</span>',
  2083 		'<span>foo[</span><span>]bar</span>',
  2084 		["", 'foo[bar]baz'],
  2085 		'foo[bar]baz',
  2086 		'foo<span style=color:#aBcDeF>[bar]</span>baz',
  2087 		'foo<span style=color:#aBcDeF>{bar}</span>baz',
  2088 		'foo{<span style=color:#aBcDeF>bar</span>}baz',
  2089 		'[foo<span style=color:#aBcDeF>bar]</span>baz',
  2090 		'{foo<span style=color:#aBcDeF>bar}</span>baz',
  2091 		'foo<span style=color:#aBcDeF>[bar</span>baz]',
  2092 		'foo<span style=color:#aBcDeF>{bar</span>baz}',
  2093 		'foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
  2095 		'foo<b>[bar]</b>baz',
  2096 		'foo<b>{bar}</b>baz',
  2097 		'foo{<b>bar</b>}baz',
  2098 		'foo<span>[bar]</span>baz',
  2099 		'foo<span>{bar}</span>baz',
  2100 		'foo{<span>bar</span>}baz',
  2101 		'<b>foo[bar</b><i>baz]quz</i>',
  2102 		'<p>foo</p><p>[bar]</p><p>baz</p>',
  2103 		'<p>foo</p><p>{bar}</p><p>baz</p>',
  2104 		'<p>foo</p>{<p>bar</p>}<p>baz</p>',
  2106 		'<p>foo[bar<p>baz]quz',
  2107 		'<p>foo[bar<div>baz]quz</div>',
  2108 		'<p>foo[bar<h1>baz]quz</h1>',
  2109 		'<div>foo[bar</div><p>baz]quz',
  2110 		'<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',
  2112 		'<p><b>foo[bar</b><p>baz]quz',
  2113 		'<div><p>foo[bar</div><p>baz]quz',
  2114 		'<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
  2115 		'<p>foo[bar<p style=color:blue>baz]quz',
  2116 		'<p>foo[bar<p><b>baz]quz</b>',
  2118 		'<div><p>foo<p>[bar<p>baz]</div>',
  2120 		'foo[<br>]bar',
  2121 		'<p>foo[</p><p>]bar</p>',
  2122 		'<p>foo[</p><p>]bar<br>baz</p>',
  2123 		'foo[<p>]bar</p>',
  2124 		'foo[<p>]bar<br>baz</p>',
  2125 		'foo[<p>]bar</p>baz',
  2126 		'<p>foo[</p>]bar',
  2127 		'<p>foo[</p>]bar<br>baz',
  2128 		'<p>foo[</p>]bar<p>baz</p>',
  2129 		'foo[<div><p>]bar</div>',
  2130 		'<div><p>foo[</p></div>]bar',
  2131 		'foo[<div><p>]bar</p>baz</div>',
  2132 		'foo[<div>]bar<p>baz</p></div>',
  2133 		'<div><p>foo</p>bar[</div>]baz',
  2134 		'<div>foo<p>bar[</p></div>]baz',
  2135 	],
  2136 	//@}
  2137 	insertlinebreak: [
  2138 	//@{ Same as insertparagraph (set below)
  2139 	],
  2140 	//@}
  2141 	insertorderedlist: [
  2142 	//@{
  2143 		'foo[]bar',
  2144 		'foo[bar]baz',
  2145 		'foo<br>[bar]',
  2146 		'f[oo<br>b]ar<br>baz',
  2147 		'<p>[foo]<br>bar</p>',
  2148 		'[foo<ol><li>bar]</ol>baz',
  2149 		'foo<ol><li>[bar</ol>baz]',
  2150 		'[foo<ul><li>bar]</ul>baz',
  2151 		'foo<ul><li>[bar</ul>baz]',
  2152 		'foo<ul><li>[bar</ul><ol><li>baz]</ol>quz',
  2153 		'foo<ol><li>[bar</ol><ul><li>baz]</ul>quz',
  2155 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
  2156 		'<table><tbody><tr><td>fo[o<td>b]ar<td>baz</table>',
  2157 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
  2159 		'<p>foo<p>[bar]<p>baz',
  2160 		'<p>foo<blockquote>[bar]</blockquote><p>baz',
  2161 		'<dl><dt>foo<dd>[bar]<dt>baz<dd>quz</dl>',
  2162 		'<dl><dt>foo<dd>bar<dt>[baz]<dd>quz</dl>',
  2164 		'<p>[foo<p>bar]<p>baz',
  2165 		'<p>[foo<blockquote>bar]</blockquote><p>baz',
  2166 		'<dl><dt>[foo<dd>bar]<dt>baz<dd>quz</dl>',
  2167 		'<dl><dt>foo<dd>[bar<dt>baz]<dd>quz</dl>',
  2169 		'<p>[foo<blockquote><p>bar]<p>baz</blockquote>',
  2172 		// Various <ol> stuff
  2173 		'<ol><li>foo<li>[bar]<li>baz</ol>',
  2174 		'<ol><li>foo</ol>[bar]',
  2175 		'[foo]<ol><li>bar</ol>',
  2176 		'<ol><li>foo</ol>[bar]<ol><li>baz</ol>',
  2177 		'<ol><ol><li>[foo]</ol></ol>',
  2178 		'<ol><li>[foo]<br>bar<li>baz</ol>',
  2179 		'<ol><li>foo<br>[bar]<li>baz</ol>',
  2180 		'<ol><li><div>[foo]</div>bar<li>baz</ol>',
  2181 		'<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
  2182 		'<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
  2183 		'<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
  2184 		'<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
  2185 		'<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
  2186 		'<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
  2187 		'<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
  2188 		'<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
  2189 		'<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
  2190 		'<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
  2192 		// Multiple items at once.
  2193 		'<ol><li>foo<li>[bar<li>baz]</ol>',
  2194 		'<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
  2195 		'<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
  2196 		'<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
  2198 		// We probably can't actually get this DOM . . .
  2199 		'<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
  2200 		'<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
  2201 		'<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
  2202 		'<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
  2205 		// Same stuff but with <ul>
  2206 		'<ul><li>foo<li>[bar]<li>baz</ul>',
  2207 		'<ul><li>foo</ul>[bar]',
  2208 		'[foo]<ul><li>bar</ul>',
  2209 		'<ul><li>foo</ul>[bar]<ul><li>baz</ul>',
  2210 		'<ul><ul><li>[foo]</ul></ul>',
  2211 		'<ul><li>[foo]<br>bar<li>baz</ul>',
  2212 		'<ul><li>foo<br>[bar]<li>baz</ul>',
  2213 		'<ul><li><div>[foo]</div>bar<li>baz</ul>',
  2214 		'<ul><li>foo<ul><li>[bar]<li>baz</ul><li>quz</ul>',
  2215 		'<ul><li>foo<ul><li>bar<li>[baz]</ul><li>quz</ul>',
  2216 		'<ul><li>foo</li><ul><li>[bar]<li>baz</ul><li>quz</ul>',
  2217 		'<ul><li>foo</li><ul><li>bar<li>[baz]</ul><li>quz</ul>',
  2218 		'<ul><li>[foo]<ul><li>bar</ul><li>baz</ul>',
  2219 		'<ul><li>[foo]</li><ul><li>bar</ul><li>baz</ul>',
  2220 		'<ul><li>foo<li>[bar]<ul><li>baz</ul><li>quz</ul>',
  2221 		'<ul><li>foo<li>[bar]</li><ul><li>baz</ul><li>quz</ul>',
  2222 		'<ul><li>foo<ul><li>bar<li>baz</ul><li>[quz]</ul>',
  2223 		'<ul><li>foo</li><ul><li>bar<li>baz</ul><li>[quz]</ul>',
  2225 		// Multiple items at once.
  2226 		'<ul><li>foo<li>[bar<li>baz]</ul>',
  2227 		'<ul><li>[foo<ul><li>bar]</ul><li>baz</ul>',
  2228 		'<ul><li>foo<ul><li>b[ar</ul><li>b]az</ul>',
  2229 		'<ul><li>[foo<ul><li>bar</ul><li>baz]</ul><p>extra',
  2231 		// We probably can't actually get this DOM . . .
  2232 		'<ul><li>[foo]<ul><li>bar</ul>baz</ul>',
  2233 		'<ul><li>foo<ul><li>[bar]</ul>baz</ul>',
  2234 		'<ul><li>foo<ul><li>bar</ul>[baz]</ul>',
  2235 		'<ul><li>[foo<ul><li>bar]</ul>baz</ul>',
  2238 		// Mix of <ol> and <ul>
  2239 		'foo<ol><li>bar</ol><ul><li>[baz]</ul>quz',
  2240 		'foo<ol><li>bar</ol><ul><li>[baz</ul>quz]',
  2241 		'foo<ul><li>[bar]</ul><ol><li>baz</ol>quz',
  2242 		'[foo<ul><li>bar]</ul><ol><li>baz</ol>quz',
  2244 		// Interaction with indentation
  2245 		'[foo]<blockquote>bar</blockquote>baz',
  2246 		'foo<blockquote>[bar]</blockquote>baz',
  2247 		'[foo<blockquote>bar]</blockquote>baz',
  2248 		'<ol><li>foo</ol><blockquote>[bar]</blockquote>baz',
  2249 		'[foo]<blockquote><ol><li>bar</ol></blockquote>baz',
  2250 		'foo<blockquote>[bar]<br>baz</blockquote>',
  2251 		'[foo<blockquote>bar]<br>baz</blockquote>',
  2252 		'<ol><li>foo</ol><blockquote>[bar]<br>baz</blockquote>',
  2254 		'<p>[foo]<blockquote><p>bar</blockquote><p>baz',
  2255 		'<p>foo<blockquote><p>[bar]</blockquote><p>baz',
  2256 		'<p>[foo<blockquote><p>bar]</blockquote><p>baz',
  2257 		'<ol><li>foo</ol><blockquote><p>[bar]</blockquote><p>baz',
  2259 		// Attributes
  2260 		'<ul id=abc><li>foo<li>[bar]<li>baz</ul>',
  2261 		'<ul style=color:blue><li>foo<li>[bar]<li>baz</ul>',
  2262 		'<ul style=text-indent:1em><li>foo<li>[bar]<li>baz</ul>',
  2263 		'<ul id=abc><li>[foo]<li>bar<li>baz</ul>',
  2264 		'<ul style=color:blue><li>[foo]<li>bar<li>baz</ul>',
  2265 		'<ul style=text-indent:1em><li>[foo]<li>bar<li>baz</ul>',
  2266 		'<ul id=abc><li>foo<li>bar<li>[baz]</ul>',
  2267 		'<ul style=color:blue><li>foo<li>bar<li>[baz]</ul>',
  2268 		'<ul style=text-indent:1em><li>foo<li>bar<li>[baz]</ul>',
  2270 		// Whitespace nodes
  2271 		'<ol><li>foo</ol> <p>[bar]',
  2272 		'<p>[foo]</p> <ol><li>bar</ol>',
  2273 		'<ol><li>foo</ol> <p>[bar]</p> <ol><li>baz</ol>',
  2275 		// This caused an infinite loop at one point due to a bug in "fix
  2276 		// disallowed ancestors".  Disabled because I'm not sure how we want it
  2277 		// to behave:
  2278 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=14578
  2279 		'!<span contenteditable=true>foo[]</span>',
  2280 	],
  2281 	//@}
  2282 	insertparagraph: [
  2283 	//@{
  2284 		'foo[bar]baz',
  2285 		'fo[o<table><tr><td>b]ar</table>',
  2286 		'<table><tr><td>[foo<td>bar]<tr><td>baz<td>quz</table>',
  2287 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<tr><td>baz<td>quz</table>',
  2288 		'<table><tr><td>fo[o</table>b]ar',
  2289 		'<table><tr><td>fo[o<td>b]ar<td>baz</table>',
  2290 		'{<table><tr><td>foo</table>}',
  2291 		'<table><tr><td>[foo]</table>',
  2292 		'<ol><li>[foo]<li>bar</ol>',
  2293 		'<ol><li>f[o]o<li>bar</ol>',
  2295 		'[]foo',
  2296 		'foo[]',
  2297 		'<span>foo[]</span>',
  2298 		'foo[]<br>',
  2299 		'foo[]bar',
  2300 		'<address>[]foo</address>',
  2301 		'<address>foo[]</address>',
  2302 		'<address>foo[]<br></address>',
  2303 		'<address>foo[]bar</address>',
  2304 		'<div>[]foo</div>',
  2305 		'<div>foo[]</div>',
  2306 		'<div>foo[]<br></div>',
  2307 		'<div>foo[]bar</div>',
  2308 		'<dl><dt>[]foo<dd>bar</dl>',
  2309 		'<dl><dt>foo[]<dd>bar</dl>',
  2310 		'<dl><dt>foo[]<br><dd>bar</dl>',
  2311 		'<dl><dt>foo[]bar<dd>baz</dl>',
  2312 		'<dl><dt>foo<dd>[]bar</dl>',
  2313 		'<dl><dt>foo<dd>bar[]</dl>',
  2314 		'<dl><dt>foo<dd>bar[]<br></dl>',
  2315 		'<dl><dt>foo<dd>bar[]baz</dl>',
  2316 		'<h1>[]foo</h1>',
  2317 		'<h1>foo[]</h1>',
  2318 		'<h1>foo[]<br></h1>',
  2319 		'<h1>foo[]bar</h1>',
  2320 		'<ol><li>[]foo</ol>',
  2321 		'<ol><li>foo[]</ol>',
  2322 		'<ol><li>foo[]<br></ol>',
  2323 		'<ol><li>foo[]bar</ol>',
  2324 		'<p>[]foo</p>',
  2325 		'<p>foo[]</p>',
  2326 		'<p>foo[]<br></p>',
  2327 		'<p>foo[]bar</p>',
  2328 		'<pre>[]foo</pre>',
  2329 		'<pre>foo[]</pre>',
  2330 		'<pre>foo[]<br></pre>',
  2331 		'<pre>foo[]bar</pre>',
  2333 		'<pre>foo[]<br><br></pre>',
  2334 		'<pre>foo<br>{}<br></pre>',
  2335 		'<pre>foo&#10;[]</pre>',
  2336 		'<pre>foo[]&#10;</pre>',
  2337 		'<pre>foo&#10;[]&#10;</pre>',
  2339 		'<xmp>foo[]bar</xmp>',
  2340 		'<script>foo[]bar</script>baz',
  2341 		'<div style=display:none>foo[]bar</div>baz',
  2342 		'<listing>foo[]bar</listing>',
  2344 		'<ol><li>{}<br></li></ol>',
  2345 		'foo<ol><li>{}<br></li></ol>',
  2346 		'<ol><li>{}<br></li></ol>foo',
  2347 		'<ol><li>foo<li>{}<br></ol>',
  2348 		'<ol><li>{}<br><li>bar</ol>',
  2349 		'<ol><li>foo</li><ul><li>{}<br></ul></ol>',
  2351 		'<dl><dt>{}<br></dt></dl>',
  2352 		'<dl><dt>foo<dd>{}<br></dl>',
  2353 		'<dl><dt>{}<br><dd>bar</dl>',
  2354 		'<dl><dt>foo<dd>bar<dl><dt>{}<br><dd>baz</dl></dl>',
  2355 		'<dl><dt>foo<dd>bar<dl><dt>baz<dd>{}<br></dl></dl>',
  2357 		'<h1>foo[bar</h1><p>baz]quz</p>',
  2358 		'<p>foo[bar</p><h1>baz]quz</h1>',
  2359 		'<p>foo</p>{}<br>',
  2360 		'{}<br><p>foo</p>',
  2361 		'<p>foo</p>{}<br><h1>bar</h1>',
  2362 		'<h1>foo</h1>{}<br><p>bar</p>',
  2363 		'<h1>foo</h1>{}<br><h2>bar</h2>',
  2364 		'<p>foo</p><h1>[bar]</h1><p>baz</p>',
  2365 		'<p>foo</p>{<h1>bar</h1>}<p>baz</p>',
  2367 		'<table><tr><td>foo[]bar</table>',
  2368 		'<table><tr><td><p>foo[]bar</table>',
  2370 		'<blockquote>[]foo</blockquote>',
  2371 		'<blockquote>foo[]</blockquote>',
  2372 		'<blockquote>foo[]<br></blockquote>',
  2373 		'<blockquote>foo[]bar</blockquote>',
  2374 		'<blockquote><p>[]foo</blockquote>',
  2375 		'<blockquote><p>foo[]</blockquote>',
  2376 		'<blockquote><p>foo[]bar</blockquote>',
  2377 		'<blockquote><p>foo[]<p>bar</blockquote>',
  2378 		'<blockquote><p>foo[]bar<p>baz</blockquote>',
  2380 		'<span>foo[]bar</span>',
  2381 		'<span>foo[]bar</span>baz',
  2382 		'<b>foo[]bar</b>',
  2383 		'<b>foo[]bar</b>baz',
  2384 		'<b>foo[]</b>bar',
  2385 		'foo<b>[]bar</b>',
  2386 		'<b>foo[]</b><i>bar</i>',
  2387 		'<b id=x class=y>foo[]bar</b>',
  2388 		'<i><b>foo[]bar</b>baz</i>',
  2390 		'<p><b>foo[]bar</b></p>',
  2391 		'<p><b>[]foo</b></p>',
  2392 		'<p><b id=x class=y>foo[]bar</b></p>',
  2393 		'<div><b>foo[]bar</b></div>',
  2395 		'<a href=foo>foo[]bar</a>',
  2396 		'<a href=foo>foo[]bar</a>baz',
  2397 		'<a href=foo>foo[]</a>bar',
  2398 		'foo<a href=foo>[]bar</a>',
  2400 		'<p>foo[]<!--bar-->',
  2401 		'<p><!--foo-->[]bar',
  2403 		'<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
  2404 		'<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
  2405 		'<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
  2406 		'<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
  2407 		'<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
  2408 		'<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
  2409 		'<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
  2410 		'<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
  2412 		// https://bugs.webkit.org/show_bug.cgi?id=5036
  2413 		'<ul contenteditable><li>{}<br></ul>',
  2414 		'<ul contenteditable><li>foo[]</ul>',
  2415 		'<div contenteditable=false><ul contenteditable><li>{}<br></ul></div>',
  2416 		'<div contenteditable=false><ul contenteditable><li>foo[]</ul></div>',
  2418 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=13841
  2419 		// https://bugs.webkit.org/show_bug.cgi?id=23507
  2420 		'<address><p>foo[]</address>',
  2421 		'<dl><dt><p>foo[]</dl>',
  2422 		'<dl><dd><p>foo[]</dl>',
  2423 		'<ol><li><p>foo[]</ol>',
  2424 		'<ul><li><p>foo[]</ul>',
  2425 		'<address><div>foo[]</address>',
  2426 		'<dl><dt><div>foo[]</dl>',
  2427 		'<dl><dd><div>foo[]</dl>',
  2428 		'<ol><li><div>foo[]</ol>',
  2429 		'<ul><li><div>foo[]</ul>',
  2430 		'<div><p>foo[]</div>',
  2431 		'<div><div>foo[]</div>',
  2433 		'<address><p>[]foo</address>',
  2434 		'<dl><dt><p>[]foo</dl>',
  2435 		'<dl><dd><p>[]foo</dl>',
  2436 		'<ol><li><p>[]foo</ol>',
  2437 		'<ul><li><p>[]foo</ul>',
  2438 		'<address><div>[]foo</address>',
  2439 		'<dl><dt><div>[]foo</dl>',
  2440 		'<dl><dd><div>[]foo</dl>',
  2441 		'<ol><li><div>[]foo</ol>',
  2442 		'<ul><li><div>[]foo</ul>',
  2443 		'<div><p>[]foo</div>',
  2444 		'<div><div>[]foo</div>',
  2446 		'<address><p>foo[]bar</address>',
  2447 		'<dl><dt><p>foo[]bar</dl>',
  2448 		'<dl><dd><p>foo[]bar</dl>',
  2449 		'<ol><li><p>foo[]bar</ol>',
  2450 		'<ul><li><p>foo[]bar</ul>',
  2451 		'<address><div>foo[]bar</address>',
  2452 		'<dl><dt><div>foo[]bar</dl>',
  2453 		'<dl><dd><div>foo[]bar</dl>',
  2454 		'<ol><li><div>foo[]bar</ol>',
  2455 		'<ul><li><div>foo[]bar</ul>',
  2456 		'<div><p>foo[]bar</div>',
  2457 		'<div><div>foo[]bar</div>',
  2459 		'<ol><li class=a id=x><p class=b id=y>foo[]</ol>',
  2460 		'<div class=a id=x><div class=b id=y>foo[]</div></div>',
  2461 		'<div class=a id=x><p class=b id=y>foo[]</div>',
  2462 		'<ol><li class=a id=x><p class=b id=y>[]foo</ol>',
  2463 		'<div class=a id=x><div class=b id=y>[]foo</div></div>',
  2464 		'<div class=a id=x><p class=b id=y>[]foo</div>',
  2465 		'<ol><li class=a id=x><p class=b id=y>foo[]bar</ol>',
  2466 		'<div class=a id=x><div class=b id=y>foo[]bar</div></div>',
  2467 		'<div class=a id=x><p class=b id=y>foo[]bar</div>',
  2468 	],
  2469 	//@}
  2470 	inserttext: [
  2471 	//@{
  2472 		'foo[bar]baz',
  2473 		['', 'foo[bar]baz'],
  2475 		['\t', 'foo[]bar'],
  2476 		['&', 'foo[]bar'],
  2477 		['\n', 'foo[]bar'],
  2478 		['abc\ndef', 'foo[]bar'],
  2479 		['\x07', 'foo[]bar'],
  2481 		['<b>hi</b>', 'foo[]bar'],
  2482 		['<', 'foo[]bar'],
  2483 		['&amp;', 'foo[]bar'],
  2485 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=14254
  2486 		['!\r', 'foo[]bar'],
  2487 		['!\r\n', 'foo[]bar'],
  2488 		['!\0', 'foo[]bar'],
  2489 		['!\ud800', 'foo[]bar'],
  2491 		// Whitespace tests!  The following two bugs are relevant to some of
  2492 		// these:
  2493 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=14119
  2494 		// https://bugzilla.mozilla.org/show_bug.cgi?id=681626
  2495 		[' ', 'foo[]bar'],
  2496 		[' ', 'foo []bar'],
  2497 		[' ', 'foo[] bar'],
  2498 		[' ', 'foo &nbsp;[]bar'],
  2499 		[' ', 'foo []&nbsp;bar'],
  2500 		[' ', 'foo[] &nbsp;bar'],
  2501 		[' ', 'foo&nbsp; []bar'],
  2502 		[' ', 'foo&nbsp;[] bar'],
  2503 		[' ', 'foo[]&nbsp; bar'],
  2504 		[' ', 'foo&nbsp;&nbsp;[]bar'],
  2505 		[' ', 'foo&nbsp;[]&nbsp;bar'],
  2506 		[' ', 'foo[]&nbsp;&nbsp;bar'],
  2507 		[' ', 'foo []&nbsp;        bar'],
  2508 		[' ', 'foo  []bar'],
  2509 		[' ', 'foo []&nbsp;&nbsp; &nbsp; bar'],
  2511 		[' ', '[]foo'],
  2512 		[' ', '{}foo'],
  2513 		[' ', 'foo[]'],
  2514 		[' ', 'foo{}'],
  2515 		[' ', 'foo&nbsp;[]'],
  2516 		[' ', 'foo&nbsp;{}'],
  2517 		[' ', 'foo&nbsp;&nbsp;[]'],
  2518 		[' ', 'foo&nbsp;&nbsp;{}'],
  2519 		[' ', '<b>foo[]</b>bar'],
  2520 		[' ', 'foo[]<b>bar</b>'],
  2522 		[' ', 'foo[] '],
  2523 		[' ', ' foo   []   '],
  2524 		[' ', 'foo[]<span> </span>'],
  2525 		[' ', 'foo[]<span> </span> '],
  2526 		[' ', ' []foo'],
  2527 		[' ', '   []   foo '],
  2528 		[' ', '<span> </span>[]foo'],
  2529 		[' ', ' <span> </span>[]foo'],
  2531 		[' ', '{}<br>'],
  2532 		[' ', '<p>{}<br>'],
  2534 		[' ', '<p>foo[]<p>bar'],
  2535 		[' ', '<p>foo&nbsp;[]<p>bar'],
  2536 		[' ', '<p>foo[]<p>&nbsp;bar'],
  2538 		// Some of the same tests as above, repeated with various values of
  2539 		// white-space.
  2540 		[' ', '<pre>foo[]bar</pre>'],
  2541 		[' ', '<pre>foo []bar</pre>'],
  2542 		[' ', '<pre>foo[] bar</pre>'],
  2543 		[' ', '<pre>foo &nbsp;[]bar</pre>'],
  2544 		[' ', '<pre>[]foo</pre>'],
  2545 		[' ', '<pre>foo[]</pre>'],
  2546 		[' ', '<pre>foo&nbsp;[]</pre>'],
  2547 		[' ', '<pre> foo   []   </pre>'],
  2549 		[' ', '<div style=white-space:pre>foo[]bar</div>'],
  2550 		[' ', '<div style=white-space:pre>foo []bar</div>'],
  2551 		[' ', '<div style=white-space:pre>foo[] bar</div>'],
  2552 		[' ', '<div style=white-space:pre>foo &nbsp;[]bar</div>'],
  2553 		[' ', '<div style=white-space:pre>[]foo</div>'],
  2554 		[' ', '<div style=white-space:pre>foo[]</div>'],
  2555 		[' ', '<div style=white-space:pre>foo&nbsp;[]</div>'],
  2556 		[' ', '<div style=white-space:pre> foo   []   </div>'],
  2558 		[' ', '<div style=white-space:pre-wrap>foo[]bar</div>'],
  2559 		[' ', '<div style=white-space:pre-wrap>foo []bar</div>'],
  2560 		[' ', '<div style=white-space:pre-wrap>foo[] bar</div>'],
  2561 		[' ', '<div style=white-space:pre-wrap>foo &nbsp;[]bar</div>'],
  2562 		[' ', '<div style=white-space:pre-wrap>[]foo</div>'],
  2563 		[' ', '<div style=white-space:pre-wrap>foo[]</div>'],
  2564 		[' ', '<div style=white-space:pre-wrap>foo&nbsp;[]</div>'],
  2565 		[' ', '<div style=white-space:pre-wrap> foo   []   </div>'],
  2567 		[' ', '<div style=white-space:pre-line>foo[]bar</div>'],
  2568 		[' ', '<div style=white-space:pre-line>foo []bar</div>'],
  2569 		[' ', '<div style=white-space:pre-line>foo[] bar</div>'],
  2570 		[' ', '<div style=white-space:pre-line>foo &nbsp;[]bar</div>'],
  2571 		[' ', '<div style=white-space:pre-line>[]foo</div>'],
  2572 		[' ', '<div style=white-space:pre-line>foo[]</div>'],
  2573 		[' ', '<div style=white-space:pre-line>foo&nbsp;[]</div>'],
  2574 		[' ', '<div style=white-space:pre-line> foo   []   </div>'],
  2576 		[' ', '<div style=white-space:nowrap>foo[]bar</div>'],
  2577 		[' ', '<div style=white-space:nowrap>foo []bar</div>'],
  2578 		[' ', '<div style=white-space:nowrap>foo[] bar</div>'],
  2579 		[' ', '<div style=white-space:nowrap>foo &nbsp;[]bar</div>'],
  2580 		[' ', '<div style=white-space:nowrap>[]foo</div>'],
  2581 		[' ', '<div style=white-space:nowrap>foo[]</div>'],
  2582 		[' ', '<div style=white-space:nowrap>foo&nbsp;[]</div>'],
  2583 		[' ', '<div style=white-space:nowrap> foo   []   </div>'],
  2585 		// End whitespace tests
  2587 		// Autolinking tests
  2588 		[' ', 'http://a[]'],
  2589 		[' ', 'ftp://a[]'],
  2590 		[' ', 'quasit://a[]'],
  2591 		[' ', '.x-++-.://a[]'],
  2592 		[' ', '(http://a)[]'],
  2593 		[' ', '&lt;http://a>[]'],
  2594 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=14744
  2595 		['! ', '&#x5b;http://a&#x5d;[]'],
  2596 		['! ', '&#x7b;http://a&#x7d;[]'],
  2597 		[' ', 'http://a![]'],
  2598 		[' ', '!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~http://a!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~[]'],
  2599 		[' ', 'http://a!"\'(),-.:;&lt;>`[]'],
  2600 		[' ', 'http://a#$%&amp;*+/=?\^_|~[]'],
  2601 		[' ', 'mailto:a[]'],
  2602 		[' ', 'a@b[]'],
  2603 		[' ', 'a@[]'],
  2604 		[' ', '@b[]'],
  2605 		[' ', '#@x[]'],
  2606 		[' ', 'a@.[]'],
  2607 		[' ', '!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~a@b!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~[]'],
  2608 		[' ', '<b>a@b</b>{}'],
  2609 		[' ', '<b>a</b><i>@</i><u>b</u>{}'],
  2610 		[' ', 'a@b<b>[]c</b>'],
  2611 		[' ', '<p>a@b</p><p>[]c</p>'],
  2612 		['a', 'http://a[]'],
  2613 		['\t', 'http://a[]'],
  2614 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=14254
  2615 		['!\r', 'http://a[]'],
  2616 		// http://www.w3.org/Bugs/Public/show_bug.cgi?id=14745
  2617 		['!\n', 'http://a[]'],
  2618 		['\f', 'http://a[]'],
  2619 		['\u00A0', 'http://a[]'],
  2621 		['   ', 'foo[]'],
  2623 		'foo[]bar',
  2624 		'foo&nbsp;[]',
  2625 		'foo\xa0[]',
  2626 		'<p>foo[]',
  2627 		'<p>foo</p>{}',
  2628 		'<p>[]foo',
  2629 		'<p>{}foo',
  2630 		'{}<p>foo',
  2631 		'<p>foo</p>{}<p>bar</p>',
  2632 		'<b>foo[]</b>bar',
  2633 		'<b>foo</b>[]bar',
  2634 		'foo<b>{}</b>bar',
  2635 		'<a>foo[]</a>bar',
  2636 		'<a>foo</a>[]bar',
  2637 		'<a href=/>foo[]</a>bar',
  2638 		'<a href=/>foo</a>[]bar',
  2639 		'<p>fo[o<p>b]ar',
  2640 		'<p>fo[o<p>bar<p>b]az',
  2641 		'{}<br>',
  2642 		'<p>{}<br>',
  2643 		'<p><span>{}<br></span>',
  2644 		'<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
  2645 		'<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
  2646 		'<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
  2647 		'<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
  2648 		'<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
  2649 		'<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
  2650 		'<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
  2651 		'<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
  2654 		// These are like the corresponding tests in the multitest section, but
  2655 		// because the selection isn't collapsed, we don't need to do
  2656 		// multitests to set overrides.
  2657 		'foo<b>[bar]</b>baz',
  2658 		'foo<i>[bar]</i>baz',
  2659 		'foo<s>[bar]</s>baz',
  2660 		'foo<sub>[bar]</sub>baz',
  2661 		'foo<sup>[bar]</sup>baz',
  2662 		'foo<u>[bar]</u>baz',
  2663 		'foo<a href=http://www.google.com>[bar]</a>baz',
  2664 		'foo<font face=sans-serif>[bar]</font>baz',
  2665 		'foo<font size=4>[bar]</font>baz',
  2666 		'foo<font color=#0000FF>[bar]</font>baz',
  2667 		'foo<span style=background-color:#00FFFF>[bar]</span>baz',
  2668 		'foo<a href=http://www.google.com><font color=blue>[bar]</font></a>baz',
  2669 		'foo<font color=blue><a href=http://www.google.com>[bar]</a></font>baz',
  2670 		'foo<a href=http://www.google.com><font color=brown>[bar]</font></a>baz',
  2671 		'foo<font color=brown><a href=http://www.google.com>[bar]</a></font>baz',
  2672 		'foo<a href=http://www.google.com><font color=black>[bar]</font></a>baz',
  2673 		'foo<a href=http://www.google.com><u>[bar]</u></a>baz',
  2674 		'foo<u><a href=http://www.google.com>[bar]</a></u>baz',
  2675 		'foo<sub><font size=2>[bar]</font></sub>baz',
  2676 		'foo<font size=2><sub>[bar]</sub></font>baz',
  2677 		'foo<sub><font size=3>[bar]</font></sub>baz',
  2678 		'foo<font size=3><sub>[bar]</sub></font>baz',
  2680 		// Now repeat but with different selections.
  2681 		'[foo<b>bar]</b>baz',
  2682 		'[foo<i>bar]</i>baz',
  2683 		'[foo<s>bar]</s>baz',
  2684 		'[foo<sub>bar]</sub>baz',
  2685 		'[foo<sup>bar]</sup>baz',
  2686 		'[foo<u>bar]</u>baz',
  2687 		'[foo<a href=http://www.google.com>bar]</a>baz',
  2688 		'[foo<font face=sans-serif>bar]</font>baz',
  2689 		'[foo<font size=4>bar]</font>baz',
  2690 		'[foo<font color=#0000FF>bar]</font>baz',
  2691 		'[foo<span style=background-color:#00FFFF>bar]</span>baz',
  2692 		'[foo<a href=http://www.google.com><font color=blue>bar]</font></a>baz',
  2693 		'[foo<font color=blue><a href=http://www.google.com>bar]</a></font>baz',
  2694 		'[foo<a href=http://www.google.com><font color=brown>bar]</font></a>baz',
  2695 		'[foo<font color=brown><a href=http://www.google.com>bar]</a></font>baz',
  2696 		'[foo<a href=http://www.google.com><font color=black>bar]</font></a>baz',
  2697 		'[foo<a href=http://www.google.com><u>bar]</u></a>baz',
  2698 		'[foo<u><a href=http://www.google.com>bar]</a></u>baz',
  2699 		'[foo<sub><font size=2>bar]</font></sub>baz',
  2700 		'[foo<font size=2><sub>bar]</sub></font>baz',
  2701 		'[foo<sub><font size=3>bar]</font></sub>baz',
  2702 		'[foo<font size=3><sub>bar]</sub></font>baz',
  2704 		'foo<b>[bar</b>baz]',
  2705 		'foo<i>[bar</i>baz]',
  2706 		'foo<s>[bar</s>baz]',
  2707 		'foo<sub>[bar</sub>baz]',
  2708 		'foo<sup>[bar</sup>baz]',
  2709 		'foo<u>[bar</u>baz]',
  2710 		'foo<a href=http://www.google.com>[bar</a>baz]',
  2711 		'foo<font face=sans-serif>[bar</font>baz]',
  2712 		'foo<font size=4>[bar</font>baz]',
  2713 		'foo<font color=#0000FF>[bar</font>baz]',
  2714 		'foo<span style=background-color:#00FFFF>[bar</span>baz]',
  2715 		'foo<a href=http://www.google.com><font color=blue>[bar</font></a>baz]',
  2716 		'foo<font color=blue><a href=http://www.google.com>[bar</a></font>baz]',
  2717 		'foo<a href=http://www.google.com><font color=brown>[bar</font></a>baz]',
  2718 		'foo<font color=brown><a href=http://www.google.com>[bar</a></font>baz]',
  2719 		'foo<a href=http://www.google.com><font color=black>[bar</font></a>baz]',
  2720 		'foo<a href=http://www.google.com><u>[bar</u></a>baz]',
  2721 		'foo<u><a href=http://www.google.com>[bar</a></u>baz]',
  2722 		'foo<sub><font size=2>[bar</font></sub>baz]',
  2723 		'foo<font size=2><sub>[bar</sub></font>baz]',
  2724 		'foo<sub><font size=3>[bar</font></sub>baz]',
  2725 		'foo<font size=3><sub>[bar</sub></font>baz]',
  2727 		// https://bugs.webkit.org/show_bug.cgi?id=19702
  2728 		'<blockquote><font color=blue>[foo]</font></blockquote>',
  2729 	],
  2730 	//@}
  2731 	insertunorderedlist: [
  2732 	//@{
  2733 		'foo[]bar',
  2734 		'foo[bar]baz',
  2735 		'foo<br>[bar]',
  2736 		'f[oo<br>b]ar<br>baz',
  2737 		'<p>[foo]<br>bar</p>',
  2738 		'[foo<ol><li>bar]</ol>baz',
  2739 		'foo<ol><li>[bar</ol>baz]',
  2740 		'[foo<ul><li>bar]</ul>baz',
  2741 		'foo<ul><li>[bar</ul>baz]',
  2742 		'foo<ul><li>[bar</ul><ol><li>baz]</ol>quz',
  2743 		'foo<ol><li>[bar</ol><ul><li>baz]</ul>quz',
  2745 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
  2746 		'<table><tbody><tr><td>fo[o<td>b]ar<td>baz</table>',
  2747 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
  2749 		'<p>foo<p>[bar]<p>baz',
  2750 		'<p>foo<blockquote>[bar]</blockquote><p>baz',
  2751 		'<dl><dt>foo<dd>[bar]<dt>baz<dd>quz</dl>',
  2752 		'<dl><dt>foo<dd>bar<dt>[baz]<dd>quz</dl>',
  2754 		'<p>[foo<p>bar]<p>baz',
  2755 		'<p>[foo<blockquote>bar]</blockquote><p>baz',
  2756 		'<dl><dt>[foo<dd>bar]<dt>baz<dd>quz</dl>',
  2757 		'<dl><dt>foo<dd>[bar<dt>baz]<dd>quz</dl>',
  2759 		'<p>[foo<blockquote><p>bar]<p>baz</blockquote>',
  2762 		// Various <ol> stuff
  2763 		'<ol><li>foo<li>[bar]<li>baz</ol>',
  2764 		'<ol><li>foo</ol>[bar]',
  2765 		'[foo]<ol><li>bar</ol>',
  2766 		'<ol><li>foo</ol>[bar]<ol><li>baz</ol>',
  2767 		'<ol><ol><li>[foo]</ol></ol>',
  2768 		'<ol><li>[foo]<br>bar<li>baz</ol>',
  2769 		'<ol><li>foo<br>[bar]<li>baz</ol>',
  2770 		'<ol><li><div>[foo]</div>bar<li>baz</ol>',
  2771 		'<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
  2772 		'<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
  2773 		'<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
  2774 		'<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
  2775 		'<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
  2776 		'<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
  2777 		'<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
  2778 		'<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
  2779 		'<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
  2780 		'<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
  2782 		// Multiple items at once.
  2783 		'<ol><li>foo<li>[bar<li>baz]</ol>',
  2784 		'<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
  2785 		'<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
  2786 		'<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
  2788 		// We probably can't actually get this DOM . . .
  2789 		'<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
  2790 		'<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
  2791 		'<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
  2792 		'<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
  2795 		// Same stuff but with <ul>
  2796 		'<ul><li>foo<li>[bar]<li>baz</ul>',
  2797 		'<ul><li>foo</ul>[bar]',
  2798 		'[foo]<ul><li>bar</ul>',
  2799 		'<ul><li>foo</ul>[bar]<ul><li>baz</ul>',
  2800 		'<ul><ul><li>[foo]</ul></ul>',
  2801 		'<ul><li>[foo]<br>bar<li>baz</ul>',
  2802 		'<ul><li>foo<br>[bar]<li>baz</ul>',
  2803 		'<ul><li><div>[foo]</div>bar<li>baz</ul>',
  2804 		'<ul><li>foo<ul><li>[bar]<li>baz</ul><li>quz</ul>',
  2805 		'<ul><li>foo<ul><li>bar<li>[baz]</ul><li>quz</ul>',
  2806 		'<ul><li>foo</li><ul><li>[bar]<li>baz</ul><li>quz</ul>',
  2807 		'<ul><li>foo</li><ul><li>bar<li>[baz]</ul><li>quz</ul>',
  2808 		'<ul><li>[foo]<ul><li>bar</ul><li>baz</ul>',
  2809 		'<ul><li>[foo]</li><ul><li>bar</ul><li>baz</ul>',
  2810 		'<ul><li>foo<li>[bar]<ul><li>baz</ul><li>quz</ul>',
  2811 		'<ul><li>foo<li>[bar]</li><ul><li>baz</ul><li>quz</ul>',
  2812 		'<ul><li>foo<ul><li>bar<li>baz</ul><li>[quz]</ul>',
  2813 		'<ul><li>foo</li><ul><li>bar<li>baz</ul><li>[quz]</ul>',
  2815 		// Multiple items at once.
  2816 		'<ul><li>foo<li>[bar<li>baz]</ul>',
  2817 		'<ul><li>[foo<ul><li>bar]</ul><li>baz</ul>',
  2818 		'<ul><li>foo<ul><li>b[ar</ul><li>b]az</ul>',
  2819 		'<ul><li>[foo<ul><li>bar</ul><li>baz]</ul><p>extra',
  2821 		// We probably can't actually get this DOM . . .
  2822 		'<ul><li>[foo]<ul><li>bar</ul>baz</ul>',
  2823 		'<ul><li>foo<ul><li>[bar]</ul>baz</ul>',
  2824 		'<ul><li>foo<ul><li>bar</ul>[baz]</ul>',
  2825 		'<ul><li>[foo<ul><li>bar]</ul>baz</ul>',
  2828 		// Mix of <ol> and <ul>
  2829 		'foo<ol><li>bar</ol><ul><li>[baz]</ul>quz',
  2830 		'foo<ol><li>bar</ol><ul><li>[baz</ul>quz]',
  2831 		'foo<ul><li>[bar]</ul><ol><li>baz</ol>quz',
  2832 		'[foo<ul><li>bar]</ul><ol><li>baz</ol>quz',
  2834 		// Interaction with indentation
  2835 		'[foo]<blockquote>bar</blockquote>baz',
  2836 		'foo<blockquote>[bar]</blockquote>baz',
  2837 		'[foo<blockquote>bar]</blockquote>baz',
  2838 		'<ol><li>foo</ol><blockquote>[bar]</blockquote>baz',
  2839 		'[foo]<blockquote><ol><li>bar</ol></blockquote>baz',
  2840 		'foo<blockquote>[bar]<br>baz</blockquote>',
  2841 		'[foo<blockquote>bar]<br>baz</blockquote>',
  2842 		'<ol><li>foo</ol><blockquote>[bar]<br>baz</blockquote>',
  2844 		'<p>[foo]<blockquote><p>bar</blockquote><p>baz',
  2845 		'<p>foo<blockquote><p>[bar]</blockquote><p>baz',
  2846 		'<p>[foo<blockquote><p>bar]</blockquote><p>baz',
  2847 		'<ol><li>foo</ol><blockquote><p>[bar]</blockquote><p>baz',
  2849 		// Attributes
  2850 		'<ul id=abc><li>foo<li>[bar]<li>baz</ul>',
  2851 		'<ul style=color:blue><li>foo<li>[bar]<li>baz</ul>',
  2852 		'<ul style=text-indent:1em><li>foo<li>[bar]<li>baz</ul>',
  2853 		'<ul id=abc><li>[foo]<li>bar<li>baz</ul>',
  2854 		'<ul style=color:blue><li>[foo]<li>bar<li>baz</ul>',
  2855 		'<ul style=text-indent:1em><li>[foo]<li>bar<li>baz</ul>',
  2856 		'<ul id=abc><li>foo<li>bar<li>[baz]</ul>',
  2857 		'<ul style=color:blue><li>foo<li>bar<li>[baz]</ul>',
  2858 		'<ul style=text-indent:1em><li>foo<li>bar<li>[baz]</ul>',
  2860 		// Whitespace nodes
  2861 		'<ul><li>foo</ul> <p>[bar]',
  2862 		'<p>[foo]</p> <ul><li>bar</ul>',
  2863 		'<ul><li>foo</ul> <p>[bar]</p> <ul><li>baz</ul>',
  2865 		// https://bugs.webkit.org/show_bug.cgi?id=24167
  2866 		'{<div style="font-size: 1.3em">1</div><div style="font-size: 1.1em">2</div>}',
  2867 	],
  2868 	//@}
  2869 	italic: [
  2870 	//@{
  2871 		'foo[]bar',
  2872 		'<p>[foo</p> <p>bar]</p>',
  2873 		'<span>[foo</span> <span>bar]</span>',
  2874 		'<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
  2875 		'<p>[foo<p><br><p>bar]',
  2876 		'<b>foo[]bar</b>',
  2877 		'<i>foo[]bar</i>',
  2878 		'<span>foo</span>{}<span>bar</span>',
  2879 		'<span>foo[</span><span>]bar</span>',
  2880 		'foo[bar]baz',
  2881 		'foo[bar<b>baz]qoz</b>quz',
  2882 		'foo[bar<i>baz]qoz</i>quz',
  2883 		'{<p><p> <p>foo</p>}',
  2885 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
  2886 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
  2887 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
  2888 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
  2889 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
  2890 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
  2892 		'foo<span style="font-style: italic">[bar]</span>baz',
  2893 		'foo<address>[bar]</address>baz',
  2894 		'foo<cite>[bar]</cite>baz',
  2895 		'foo<dfn>[bar]</dfn>baz',
  2896 		'foo<em>[bar]</em>baz',
  2897 		'foo<i>[bar]</i>baz',
  2898 		'foo<var>[bar]</var>baz',
  2900 		'foo{<address>bar</address>}baz',
  2901 		'foo{<cite>bar</cite>}baz',
  2902 		'foo{<dfn>bar</dfn>}baz',
  2903 		'foo{<em>bar</em>}baz',
  2904 		'foo{<i>bar</i>}baz',
  2905 		'foo{<var>bar</var>}baz',
  2907 		'foo<address>b[a]r</address>baz',
  2908 		'foo<cite>b[a]r</cite>baz',
  2909 		'foo<dfn>b[a]r</dfn>baz',
  2910 		'foo<em>b[a]r</em>baz',
  2911 		'foo<i>b[a]r</i>baz',
  2912 		'foo<var>b[a]r</var>baz',
  2914 		'fo[o<address>bar</address>b]az',
  2915 		'fo[o<cite>bar</cite>b]az',
  2916 		'fo[o<dfn>bar</dfn>b]az',
  2917 		'fo[o<em>bar</em>b]az',
  2918 		'fo[o<i>bar</i>b]az',
  2919 		'fo[o<var>bar</var>b]az',
  2921 		'foo[<address>bar</address>baz]',
  2922 		'foo[<cite>bar</cite>baz]',
  2923 		'foo[<dfn>bar</dfn>baz]',
  2924 		'foo[<em>bar</em>baz]',
  2925 		'foo[<i>bar</i>baz]',
  2926 		'foo[<var>bar</var>baz]',
  2928 		'[foo<address>bar</address>]baz',
  2929 		'[foo<cite>bar</cite>]baz',
  2930 		'[foo<dfn>bar</dfn>]baz',
  2931 		'[foo<em>bar</em>]baz',
  2932 		'[foo<i>bar</i>]baz',
  2933 		'[foo<var>bar</var>]baz',
  2935 		'foo<span style="font-style: italic">[bar]</span>baz',
  2936 		'foo<span style="font-style: oblique">[bar]</span>baz',
  2937 		'foo<span style="font-style: oblique">b[a]r</span>baz',
  2939 		'<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>',
  2940 		'<i><p>foo[<b>bar</b>}</p><p>baz</p></i>',
  2941 		'foo [bar <b>baz] qoz</b> quz sic',
  2942 		'foo bar <b>baz [qoz</b> quz] sic',
  2943 		'foo [bar <i>baz] qoz</i> quz sic',
  2944 		'foo bar <i>baz [qoz</i> quz] sic',
  2946 		// Tests for queryCommandIndeterm() and queryCommandState()
  2947 		'fo[o<i>b]ar</i>baz',
  2948 		'foo<i>ba[r</i>b]az',
  2949 		'fo[o<i>bar</i>b]az',
  2950 		'foo[<i>b]ar</i>baz',
  2951 		'foo<i>ba[r</i>]baz',
  2952 		'foo[<i>bar</i>]baz',
  2953 		'foo<i>[bar]</i>baz',
  2954 		'foo{<i>bar</i>}baz',
  2955 		'fo[o<span style=font-style:italic>b]ar</span>baz',
  2956 		'fo[o<span style=font-style:oblique>b]ar</span>baz',
  2957 		'<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b]ar</span>',
  2958 		'<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b]ar</span>',
  2959 		'<i>fo[o</i><address>b]ar</address>',
  2960 	],
  2961 	//@}
  2962 	justifycenter: [
  2963 	//@{
  2964 		'foo[]bar<p>extra',
  2965 		'<span>foo</span>{}<span>bar</span><p>extra',
  2966 		'<span>foo[</span><span>]bar</span><p>extra',
  2967 		'foo[bar]baz<p>extra',
  2968 		'foo[bar<b>baz]qoz</b>quz<p>extra',
  2969 		'<p>foo[]bar<p>extra',
  2970 		'<p>foo[bar]baz<p>extra',
  2971 		'<h1>foo[bar]baz</h1><p>extra',
  2972 		'<pre>foo[bar]baz</pre><p>extra',
  2973 		'<xmp>foo[bar]baz</xmp><p>extra',
  2974 		'<center><p>[foo]<p>bar</center><p>extra',
  2975 		'<center><p>[foo<p>bar]</center><p>extra',
  2977 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
  2978 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  2979 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  2980 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
  2981 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
  2982 		'{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
  2984 		'<table align=center><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
  2985 		'<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  2986 		'<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  2987 		'<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
  2988 		'<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
  2989 		'{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra',
  2991 		'<table><tbody align=center><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
  2992 		'<table><tbody align=center><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  2993 		'<table><tbody align=center><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  2994 		'<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
  2995 		'<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra',
  2996 		'{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra',
  2998 		'<table><tbody><tr align=center><td>foo<td>b[a]r<td>baz</table><p>extra',
  2999 		'<table><tbody><tr align=center data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3000 		'<table><tbody><tr align=center data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3001 		'<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra',
  3002 		'<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra',
  3003 		'{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra',
  3005 		'<div align=center><p>[foo]<p>bar</div><p>extra',
  3006 		'<div align=center><p>[foo<p>bar}</div><p>extra',
  3007 		'<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
  3008 		'<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
  3010 		'<div align=justify><p>[foo]<p>bar</div><p>extra',
  3011 		'<div align=justify><p>[foo<p>bar}</div><p>extra',
  3012 		'<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
  3013 		'<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
  3015 		'<div align=left><p>[foo]<p>bar</div><p>extra',
  3016 		'<div align=left><p>[foo<p>bar}</div><p>extra',
  3017 		'<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
  3018 		'<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
  3020 		'<div align=right><p>[foo]<p>bar</div><p>extra',
  3021 		'<div align=right><p>[foo<p>bar}</div><p>extra',
  3022 		'<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
  3023 		'<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
  3025 		'<center>foo</center>[bar]<p>extra',
  3026 		'[foo]<center>bar</center><p>extra',
  3027 		'<center>foo</center>[bar]<center>baz</center><p>extra',
  3028 		'<div align=center>foo</div>[bar]<p>extra',
  3029 		'[foo]<div align=center>bar</div><p>extra',
  3030 		'<div align=center>foo</div>[bar]<div align=center>baz</div><p>extra',
  3031 		'<div align=center><p>foo</div><p>[bar]<p>extra',
  3032 		'<p>[foo]<div align=center><p>bar</div><p>extra',
  3033 		'<div align=center><p>foo</div><p>[bar]<div align=center><p>baz</div><p>extra',
  3034 		'<div style=text-align:center>foo</div>[bar]<p>extra',
  3035 		'[foo]<div style=text-align:center>bar</div><p>extra',
  3036 		'<div style=text-align:center>foo</div>[bar]<div style=text-align:center>baz</div><p>extra',
  3037 		'<div style=text-align:center><p>foo</div><p>[bar]<p>extra',
  3038 		'<p>[foo]<div style=text-align:center><p>bar</div><p>extra',
  3039 		'<div style=text-align:center><p>foo</div><p>[bar]<div style=text-align:center><p>baz</div><p>extra',
  3040 		'<p align=center>foo<p>[bar]<p>extra',
  3041 		'<p>[foo]<p align=center>bar<p>extra',
  3042 		'<p align=center>foo<p>[bar]<p align=center>baz<p>extra',
  3044 		'<center>[foo</center>bar]<p>extra',
  3045 		'<center>fo[o</center>b]ar<p>extra',
  3046 		'<div align=center>[foo</div>bar]<p>extra',
  3047 		'<div align=center>fo[o</div>b]ar<p>extra',
  3048 		'<div style=text-align:center>[foo</div>bar]<p>extra',
  3049 		'<div style=text-align:center>fo[o</div>b]ar<p>extra',
  3050 		'<span style=text-align:center>[foo]</span><p>extra',
  3051 		'<span style=text-align:center>f[o]o</span><p>extra',
  3053 		'<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
  3055 		'<div align=nonsense><p>[foo]</div><p>extra',
  3056 		'<div style=text-align:inherit><p>[foo]</div><p>extra',
  3057 		'<quasit align=right><p>[foo]</p></quasit><p>extra',
  3059 		'<div align=center>{<div align=left>foo</div>}</div>',
  3060 		'<div align=left>{<div align=center>foo</div>}</div>',
  3061 		'<div align=center>{<div align=left>foo</div>bar}</div>',
  3062 		'<div align=left>{<div align=center>foo</div>bar}</div>',
  3063 		'<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>',
  3064 		'<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>',
  3065 		'<div align=center>{<div align=left>foo</div><!-- bar -->}</div>',
  3066 		'<div align=left>{<div align=center>foo</div><!-- bar -->}</div>',
  3068 		'<div style=text-align:start>[foo]</div><p>extra',
  3069 		'<div style=text-align:end>[foo]</div><p>extra',
  3070 		'<div dir=rtl style=text-align:start>[foo]</div><p>extra',
  3071 		'<div dir=rtl style=text-align:end>[foo]</div><p>extra',
  3073 		// Whitespace nodes
  3074 		'<div style=text-align:center><p>foo</div> <p>[bar]',
  3075 		'<div align=center><p>foo</div> <p>[bar]',
  3076 		'<center><p>foo</center> <p>[bar]',
  3077 		'<p>[foo]</p> <div style=text-align:center><p>bar</div>',
  3078 		'<p>[foo]</p> <div align=center><p>bar</div>',
  3079 		'<p>[foo]</p> <center><p>bar</center>',
  3080 		'<div style=text-align:center><p>foo</div> <p>[bar]</p> <div style=text-align:center><p>baz</div>',
  3081 		'<div align=center><p>foo</div> <p>[bar]</p> <div align=center><p>baz</div>',
  3082 		'<center><p>foo</center> <p>[bar]</p> <center><p>baz</center>',
  3083 	],
  3084 	//@}
  3085 	justifyfull: [
  3086 	//@{
  3087 		'foo[]bar<p>extra',
  3088 		'<span>foo</span>{}<span>bar</span><p>extra',
  3089 		'<span>foo[</span><span>]bar</span><p>extra',
  3090 		'foo[bar]baz<p>extra',
  3091 		'foo[bar<b>baz]qoz</b>quz<p>extra',
  3092 		'<p>foo[]bar<p>extra',
  3093 		'<p>foo[bar]baz<p>extra',
  3094 		'<h1>foo[bar]baz</h1><p>extra',
  3095 		'<pre>foo[bar]baz</pre><p>extra',
  3096 		'<xmp>foo[bar]baz</xmp><p>extra',
  3097 		'<center><p>[foo]<p>bar</center><p>extra',
  3098 		'<center><p>[foo<p>bar]</center><p>extra',
  3100 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
  3101 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3102 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3103 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
  3104 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
  3105 		'{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
  3107 		'<table align=justify><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
  3108 		'<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3109 		'<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3110 		'<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
  3111 		'<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
  3112 		'{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra',
  3114 		'<table><tbody align=justify><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
  3115 		'<table><tbody align=justify><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3116 		'<table><tbody align=justify><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3117 		'<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
  3118 		'<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra',
  3119 		'{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra',
  3121 		'<table><tbody><tr align=justify><td>foo<td>b[a]r<td>baz</table><p>extra',
  3122 		'<table><tbody><tr align=justify data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3123 		'<table><tbody><tr align=justify data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3124 		'<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra',
  3125 		'<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra',
  3126 		'{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra',
  3128 		'<div align=center><p>[foo]<p>bar</div><p>extra',
  3129 		'<div align=center><p>[foo<p>bar}</div><p>extra',
  3130 		'<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
  3131 		'<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
  3133 		'<div align=justify><p>[foo]<p>bar</div><p>extra',
  3134 		'<div align=justify><p>[foo<p>bar}</div><p>extra',
  3135 		'<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
  3136 		'<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
  3138 		'<div align=left><p>[foo]<p>bar</div><p>extra',
  3139 		'<div align=left><p>[foo<p>bar}</div><p>extra',
  3140 		'<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
  3141 		'<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
  3143 		'<div align=right><p>[foo]<p>bar</div><p>extra',
  3144 		'<div align=right><p>[foo<p>bar}</div><p>extra',
  3145 		'<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
  3146 		'<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
  3148 		'<div align=justify>foo</div>[bar]<p>extra',
  3149 		'[foo]<div align=justify>bar</div><p>extra',
  3150 		'<div align=justify>foo</div>[bar]<div align=justify>baz</div><p>extra',
  3151 		'<div align=justify><p>foo</div><p>[bar]<p>extra',
  3152 		'<p>[foo]<div align=justify><p>bar</div><p>extra',
  3153 		'<div align=justify><p>foo</div><p>[bar]<div align=justify><p>baz</div><p>extra',
  3154 		'<div style=text-align:justify>foo</div>[bar]<p>extra',
  3155 		'[foo]<div style=text-align:justify>bar</div><p>extra',
  3156 		'<div style=text-align:justify>foo</div>[bar]<div style=text-align:justify>baz</div><p>extra',
  3157 		'<div style=text-align:justify><p>foo</div><p>[bar]<p>extra',
  3158 		'<p>[foo]<div style=text-align:justify><p>bar</div><p>extra',
  3159 		'<div style=text-align:justify><p>foo</div><p>[bar]<div style=text-align:justify><p>baz</div><p>extra',
  3160 		'<p align=justify>foo<p>[bar]<p>extra',
  3161 		'<p>[foo]<p align=justify>bar<p>extra',
  3162 		'<p align=justify>foo<p>[bar]<p align=justify>baz<p>extra',
  3164 		'<div align=justify>[foo</div>bar]<p>extra',
  3165 		'<div align=justify>fo[o</div>b]ar<p>extra',
  3166 		'<div style=text-align:justify>[foo</div>bar]<p>extra',
  3167 		'<div style=text-align:justify>fo[o</div>b]ar<p>extra',
  3168 		'<span style=text-align:justify>[foo]</span><p>extra',
  3169 		'<span style=text-align:justify>f[o]o</span><p>extra',
  3171 		'<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
  3173 		'<div align=nonsense><p>[foo]</div><p>extra',
  3174 		'<div style=text-align:inherit><p>[foo]</div><p>extra',
  3175 		'<quasit align=center><p>[foo]</p></quasit><p>extra',
  3177 		'<div style=text-align:start>[foo]</div><p>extra',
  3178 		'<div style=text-align:end>[foo]</div><p>extra',
  3179 		'<div dir=rtl style=text-align:start>[foo]</div><p>extra',
  3180 		'<div dir=rtl style=text-align:end>[foo]</div><p>extra',
  3182 		// Whitespace nodes
  3183 		'<div style=text-align:justify><p>foo</div> <p>[bar]',
  3184 		'<div align=justify><p>foo</div> <p>[bar]',
  3185 		'<p>[foo]</p> <div style=text-align:justify><p>bar</div>',
  3186 		'<p>[foo]</p> <div align=justify><p>bar</div>',
  3187 		'<div style=text-align:justify><p>foo</div> <p>[bar]</p> <div style=text-align:justify><p>baz</div>',
  3188 		'<div align=justify><p>foo</div> <p>[bar]</p> <div align=justify><p>baz</div>',
  3189 	],
  3190 	//@}
  3191 	justifyleft: [
  3192 	//@{
  3193 		'foo[]bar<p>extra',
  3194 		'<span>foo</span>{}<span>bar</span><p>extra',
  3195 		'<span>foo[</span><span>]bar</span><p>extra',
  3196 		'foo[bar]baz<p>extra',
  3197 		'foo[bar<b>baz]qoz</b>quz<p>extra',
  3198 		'<p>foo[]bar<p>extra',
  3199 		'<p>foo[bar]baz<p>extra',
  3200 		'<h1>foo[bar]baz</h1><p>extra',
  3201 		'<pre>foo[bar]baz</pre><p>extra',
  3202 		'<xmp>foo[bar]baz</xmp><p>extra',
  3203 		'<center><p>[foo]<p>bar</center><p>extra',
  3204 		'<center><p>[foo<p>bar]</center><p>extra',
  3206 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
  3207 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3208 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3209 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
  3210 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
  3211 		'{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
  3213 		'<table align=left><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
  3214 		'<table align=left><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3215 		'<table align=left><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3216 		'<table align=left><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
  3217 		'<table align=left data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
  3218 		'{<table align=left><tr><td>foo<td>bar<td>baz</table>}<p>extra',
  3220 		'<table><tbody align=left><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
  3221 		'<table><tbody align=left><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3222 		'<table><tbody align=left><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3223 		'<table><tbody align=left data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
  3224 		'<table data-start=0 data-end=1><tbody align=left><tr><td>foo<td>bar<td>baz</table><p>extra',
  3225 		'{<table><tbody align=left><tr><td>foo<td>bar<td>baz</table>}<p>extra',
  3227 		'<table><tbody><tr align=left><td>foo<td>b[a]r<td>baz</table><p>extra',
  3228 		'<table><tbody><tr align=left data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3229 		'<table><tbody><tr align=left data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3230 		'<table><tbody data-start=0 data-end=1><tr align=left><td>foo<td>bar<td>baz</table><p>extra',
  3231 		'<table data-start=0 data-end=1><tbody><tr align=left><td>foo<td>bar<td>baz</table><p>extra',
  3232 		'{<table><tr align=left><td>foo<td>bar<td>baz</table>}<p>extra',
  3234 		'<div align=center><p>[foo]<p>bar</div><p>extra',
  3235 		'<div align=center><p>[foo<p>bar}</div><p>extra',
  3236 		'<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
  3237 		'<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
  3239 		'<div align=justify><p>[foo]<p>bar</div><p>extra',
  3240 		'<div align=justify><p>[foo<p>bar}</div><p>extra',
  3241 		'<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
  3242 		'<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
  3244 		'<div align=left><p>[foo]<p>bar</div><p>extra',
  3245 		'<div align=left><p>[foo<p>bar}</div><p>extra',
  3246 		'<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
  3247 		'<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
  3249 		'<div align=right><p>[foo]<p>bar</div><p>extra',
  3250 		'<div align=right><p>[foo<p>bar}</div><p>extra',
  3251 		'<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
  3252 		'<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
  3254 		'<div align=left>foo</div>[bar]<p>extra',
  3255 		'[foo]<div align=left>bar</div><p>extra',
  3256 		'<div align=left>foo</div>[bar]<div align=left>baz</div><p>extra',
  3257 		'<div align=left><p>foo</div><p>[bar]<p>extra',
  3258 		'<p>[foo]<div align=left><p>bar</div><p>extra',
  3259 		'<div align=left><p>foo</div><p>[bar]<div align=left><p>baz</div><p>extra',
  3260 		'<div style=text-align:left>foo</div>[bar]<p>extra',
  3261 		'[foo]<div style=text-align:left>bar</div><p>extra',
  3262 		'<div style=text-align:left>foo</div>[bar]<div style=text-align:left>baz</div><p>extra',
  3263 		'<div style=text-align:left><p>foo</div><p>[bar]<p>extra',
  3264 		'<p>[foo]<div style=text-align:left><p>bar</div><p>extra',
  3265 		'<div style=text-align:left><p>foo</div><p>[bar]<div style=text-align:left><p>baz</div><p>extra',
  3266 		'<p align=left>foo<p>[bar]<p>extra',
  3267 		'<p>[foo]<p align=left>bar<p>extra',
  3268 		'<p align=left>foo<p>[bar]<p align=left>baz<p>extra',
  3270 		'<div align=left>[foo</div>bar]<p>extra',
  3271 		'<div align=left>fo[o</div>b]ar<p>extra',
  3272 		'<div style=text-align:left>[foo</div>bar]<p>extra',
  3273 		'<div style=text-align:left>fo[o</div>b]ar<p>extra',
  3274 		'<span style=text-align:left>[foo]</span><p>extra',
  3275 		'<span style=text-align:left>f[o]o</span><p>extra',
  3277 		'<div style=text-align:left>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
  3279 		'<div align=nonsense><p>[foo]</div><p>extra',
  3280 		'<div style=text-align:inherit><p>[foo]</div><p>extra',
  3281 		'<quasit align=center><p>[foo]</p></quasit><p>extra',
  3283 		'<div style=text-align:start>[foo]</div><p>extra',
  3284 		'<div style=text-align:end>[foo]</div><p>extra',
  3285 		'<div dir=rtl style=text-align:start>[foo]</div><p>extra',
  3286 		'<div dir=rtl style=text-align:end>[foo]</div><p>extra',
  3288 		// Whitespace nodes
  3289 		'<div style=text-align:left><p>foo</div> <p>[bar]',
  3290 		'<div align=left><p>foo</div> <p>[bar]',
  3291 		'<p>[foo]</p> <div style=text-align:left><p>bar</div>',
  3292 		'<p>[foo]</p> <div align=left><p>bar</div>',
  3293 		'<div style=text-align:left><p>foo</div> <p>[bar]</p> <div style=text-align:left><p>baz</div>',
  3294 		'<div align=left><p>foo</div> <p>[bar]</p> <div align=left><p>baz</div>',
  3295 	],
  3296 	//@}
  3297 	justifyright: [
  3298 	//@{
  3299 		'foo[]bar<p>extra',
  3300 		'<span>foo</span>{}<span>bar</span><p>extra',
  3301 		'<span>foo[</span><span>]bar</span><p>extra',
  3302 		'foo[bar]baz<p>extra',
  3303 		'foo[bar<b>baz]qoz</b>quz<p>extra',
  3304 		'<p>foo[]bar<p>extra',
  3305 		'<p>foo[bar]baz<p>extra',
  3306 		'<h1>foo[bar]baz</h1><p>extra',
  3307 		'<pre>foo[bar]baz</pre><p>extra',
  3308 		'<xmp>foo[bar]baz</xmp><p>extra',
  3309 		'<center><p>[foo]<p>bar</center><p>extra',
  3310 		'<center><p>[foo<p>bar]</center><p>extra',
  3312 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
  3313 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3314 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3315 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
  3316 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
  3317 		'{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
  3319 		'<table align=right><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
  3320 		'<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3321 		'<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3322 		'<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
  3323 		'<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
  3324 		'{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra',
  3326 		'<table><tbody align=right><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
  3327 		'<table><tbody align=right><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3328 		'<table><tbody align=right><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3329 		'<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
  3330 		'<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra',
  3331 		'{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra',
  3333 		'<table><tbody><tr align=right><td>foo<td>b[a]r<td>baz</table><p>extra',
  3334 		'<table><tbody><tr align=right data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3335 		'<table><tbody><tr align=right data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
  3336 		'<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra',
  3337 		'<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra',
  3338 		'{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra',
  3340 		'<div align=center><p>[foo]<p>bar</div><p>extra',
  3341 		'<div align=center><p>[foo<p>bar}</div><p>extra',
  3342 		'<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
  3343 		'<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
  3345 		'<div align=justify><p>[foo]<p>bar</div><p>extra',
  3346 		'<div align=justify><p>[foo<p>bar}</div><p>extra',
  3347 		'<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
  3348 		'<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
  3350 		'<div align=left><p>[foo]<p>bar</div><p>extra',
  3351 		'<div align=left><p>[foo<p>bar}</div><p>extra',
  3352 		'<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
  3353 		'<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
  3355 		'<div align=right><p>[foo]<p>bar</div><p>extra',
  3356 		'<div align=right><p>[foo<p>bar}</div><p>extra',
  3357 		'<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
  3358 		'<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
  3360 		'<div align=right>foo</div>[bar]<p>extra',
  3361 		'[foo]<div align=right>bar</div><p>extra',
  3362 		'<div align=right>foo</div>[bar]<div align=right>baz</div><p>extra',
  3363 		'<div align=right><p>foo</div><p>[bar]<p>extra',
  3364 		'<p>[foo]<div align=right><p>bar</div><p>extra',
  3365 		'<div align=right><p>foo</div><p>[bar]<div align=right><p>baz</div><p>extra',
  3366 		'<div style=text-align:right>foo</div>[bar]<p>extra',
  3367 		'[foo]<div style=text-align:right>bar</div><p>extra',
  3368 		'<div style=text-align:right>foo</div>[bar]<div style=text-align:right>baz</div><p>extra',
  3369 		'<div style=text-align:right><p>foo</div><p>[bar]<p>extra',
  3370 		'<p>[foo]<div style=text-align:right><p>bar</div><p>extra',
  3371 		'<div style=text-align:right><p>foo</div><p>[bar]<div style=text-align:right><p>baz</div><p>extra',
  3372 		'<p align=right>foo<p>[bar]<p>extra',
  3373 		'<p>[foo]<p align=right>bar<p>extra',
  3374 		'<p align=right>foo<p>[bar]<p align=right>baz<p>extra',
  3376 		'<div align=right>[foo</div>bar]<p>extra',
  3377 		'<div align=right>fo[o</div>b]ar<p>extra',
  3378 		'<div style=text-align:right>[foo</div>bar]<p>extra',
  3379 		'<div style=text-align:right>fo[o</div>b]ar<p>extra',
  3380 		'<span style=text-align:right>[foo]</span><p>extra',
  3381 		'<span style=text-align:right>f[o]o</span><p>extra',
  3383 		'<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
  3385 		'<div align=nonsense><p>[foo]</div><p>extra',
  3386 		'<div style=text-align:inherit><p>[foo]</div><p>extra',
  3387 		'<quasit align=center><p>[foo]</p></quasit><p>extra',
  3389 		'<div style=text-align:start>[foo]</div><p>extra',
  3390 		'<div style=text-align:end>[foo]</div><p>extra',
  3391 		'<div dir=rtl style=text-align:start>[foo]</div><p>extra',
  3392 		'<div dir=rtl style=text-align:end>[foo]</div><p>extra',
  3394 		// Whitespace nodes
  3395 		'<div style=text-align:right><p>foo</div> <p>[bar]',
  3396 		'<div align=right><p>foo</div> <p>[bar]',
  3397 		'<p>[foo]</p> <div style=text-align:right><p>bar</div>',
  3398 		'<p>[foo]</p> <div align=right><p>bar</div>',
  3399 		'<div style=text-align:right><p>foo</div> <p>[bar]</p> <div style=text-align:right><p>baz</div>',
  3400 		'<div align=right><p>foo</div> <p>[bar]</p> <div align=right><p>baz</div>',
  3401 	],
  3402 	//@}
  3403 	outdent: [
  3404 	//@{
  3405 		// These mimic existing indentation in various browsers, to see how
  3406 		// they cope with outdenting various things.  This is spec, Gecko
  3407 		// non-CSS, and Opera:
  3408 		'<blockquote><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
  3409 		'<blockquote><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
  3410 		'<blockquote><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
  3411 		'<blockquote><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
  3413 		// IE:
  3414 		'<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
  3415 		'<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
  3416 		'<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
  3417 		'<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
  3419 		// Firefox CSS mode:
  3420 		'<p style="margin-left: 40px">foo[bar]</p><p style="margin-left: 40px">baz</p><p>extra',
  3421 		'<p style="margin-left: 40px">foo[bar</p><p style="margin-left: 40px">b]az</p><p>extra',
  3422 		'<p style="margin-left: 40px">foo[bar]</p><p>baz</p><p>extra',
  3423 		'<p style="margin-left: 40px">foo[bar</p><p>b]az</p><p>extra',
  3425 		// WebKit:
  3426 		'<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
  3427 		'<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
  3428 		'<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
  3429 		'<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
  3431 		// Now let's try nesting lots of stuff and see what happens.
  3432 		'<blockquote><blockquote>foo[bar]baz</blockquote></blockquote>',
  3433 		'<blockquote><blockquote data-abc=def>foo[bar]baz</blockquote></blockquote>',
  3434 		'<blockquote data-abc=def><blockquote>foo[bar]baz</blockquote></blockquote>',
  3435 		'<blockquote><div>foo[bar]baz</div></blockquote>',
  3436 		'<blockquote><div id=abc>foo[bar]baz</div></blockquote>',
  3437 		'<blockquote id=abc>foo[bar]baz</blockquote>',
  3438 		'<blockquote style="color: blue">foo[bar]baz</blockquote>',
  3440 		'<blockquote><blockquote><p>foo[bar]<p>baz</blockquote></blockquote>',
  3441 		'<blockquote><blockquote data-abc=def><p>foo[bar]<p>baz</blockquote></blockquote>',
  3442 		'<blockquote data-abc=def><blockquote><p>foo[bar]<p>baz</blockquote></blockquote>',
  3443 		'<blockquote><div><p>foo[bar]<p>baz</div></blockquote>',
  3444 		'<blockquote><div id=abc><p>foo[bar]<p>baz</div></blockquote>',
  3445 		'<blockquote id=abc><p>foo[bar]<p>baz</blockquote>',
  3446 		'<blockquote style="color: blue"><p>foo[bar]<p>baz</blockquote>',
  3448 		'<blockquote><p><b>foo[bar]</b><p>baz</blockquote>',
  3449 		'<blockquote><p><strong>foo[bar]</strong><p>baz</blockquote>',
  3450 		'<blockquote><p><span>foo[bar]</span><p>baz</blockquote>',
  3451 		'<blockquote><blockquote style="color: blue"><p>foo[bar]</blockquote><p>baz</blockquote>',
  3452 		'<blockquote style="color: blue"><blockquote><p>foo[bar]</blockquote><p>baz</blockquote>',
  3454 		// Lists!
  3455 		'<ol><li>foo<li>[bar]<li>baz</ol>',
  3456 		'<ol data-start=1 data-end=2><li>foo<li>bar<li>baz</ol>',
  3457 		'<ol><li>foo</ol>[bar]',
  3458 		'<ol><li>[foo]<br>bar<li>baz</ol>',
  3459 		'<ol><li>foo<br>[bar]<li>baz</ol>',
  3460 		'<ol><li><div>[foo]</div>bar<li>baz</ol>',
  3461 		'<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
  3462 		'<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
  3463 		'<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
  3464 		'<ol><li>foo</li><ol data-start=0 data-end=1><li>bar<li>baz</ol><li>quz</ol>',
  3465 		'<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
  3466 		'<ol><li>foo</li><ol data-start=1 data-end=2><li>bar<li>baz</ol><li>quz</ol>',
  3467 		'<ol><li>foo<ol><li>b[a]r</ol><li>baz</ol>',
  3468 		'<ol><li>foo</li><ol><li>b[a]r</ol><li>baz</ol>',
  3469 		'<ol><li>foo{<ol><li>bar</ol>}<li>baz</ol>',
  3470 		'<ol><li>foo</li>{<ol><li>bar</ol>}<li>baz</ol>',
  3471 		'<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
  3472 		'<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
  3473 		'<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
  3474 		'<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
  3475 		'<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
  3476 		'<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
  3478 		// Try outdenting multiple items at once.
  3479 		'<ol><li>foo<li>b[ar<li>baz]</ol>',
  3480 		'<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
  3481 		'<ol><li>[foo</li><ol><li>bar]</ol><li>baz</ol>',
  3482 		'<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
  3483 		'<ol><li>foo</li><ol><li>b[ar</ol><li>b]az</ol>',
  3484 		'<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
  3485 		'<ol><li>[foo</li><ol><li>bar</ol><li>baz]</ol><p>extra',
  3487 		// We probably can't actually get this DOM . . .
  3488 		'<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
  3489 		'<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
  3490 		'<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
  3491 		'<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
  3493 		// Attribute handling on lists
  3494 		'foo<ol start=5><li>[bar]</ol>baz',
  3495 		'foo<ol id=abc><li>[bar]</ol>baz',
  3496 		'foo<ol style=color:blue><li>[bar]</ol>baz',
  3497 		'foo<ol><li value=5>[bar]</ol>baz',
  3498 		'foo<ol><li id=abc>[bar]</ol>baz',
  3499 		'foo<ol><li style=color:blue>[bar]</ol>baz',
  3500 		'<ol><li>foo</li><ol><li value=5>[bar]</ol></ol>',
  3501 		'<ul><li>foo</li><ol><li value=5>[bar]</ol></ul>',
  3502 		'<ol><li>foo</li><ol start=5><li>[bar]</ol><li>baz</ol>',
  3503 		'<ol><li>foo</li><ol id=abc><li>[bar]</ol><li>baz</ol>',
  3504 		'<ol><li>foo</li><ol style=color:blue><li>[bar]</ol><li>baz</ol>',
  3505 		'<ol><li>foo</li><ol style=text-indent:1em><li>[bar]</ol><li>baz</ol>',
  3506 		'<ol><li>foo</li><ol start=5><li>[bar<li>baz]</ol><li>quz</ol>',
  3507 		'<ol><li>foo</li><ol id=abc><li>[bar<li>baz]</ol><li>quz</ol>',
  3508 		'<ol><li>foo</li><ol style=color:blue><li>[bar<li>baz]</ol><li>quz</ol>',
  3509 		'<ol><li>foo</li><ol style=text-indent:1em><li>[bar<li>baz]</ol><li>quz</ol>',
  3511 		// List inside indentation element
  3512 		'<blockquote><ol><li>[foo]</ol></blockquote><p>extra',
  3513 		'<blockquote>foo<ol><li>[bar]</ol>baz</blockquote><p>extra',
  3514 		'<blockquote><ol><li>foo</li><ol><li>[bar]</ol><li>baz</ol></blockquote><p>extra',
  3516 		'<ol><li><h1>[foo]</h1></ol>',
  3517 		'<ol><li><xmp>[foo]</xmp></li></ol>',
  3518 		'<blockquote><ol><li>foo<div><ol><li>[bar]</ol></div><li>baz</ol></blockquote>',
  3520 		// Whitespace nodes
  3521 		'<blockquote> <p>[foo]</p></blockquote>',
  3522 		'<blockquote><p>[foo]</p> </blockquote>',
  3523 		'<blockquote> <p>[foo]</p> </blockquote>',
  3524 		'<ol> <li>[foo]</li></ol>',
  3525 		'<ol><li>[foo]</li> </ol>',
  3526 		'<ol> <li>[foo]</li> </ol>',
  3527 		'<ul> <li>[foo]</li></ul>',
  3528 		'<ul><li>[foo]</li> </ul>',
  3529 		'<ul> <li>[foo]</li> </ul>',
  3530 		'<blockquote> <p>[foo]</p> <p>bar</p> <p>baz</p></blockquote>',
  3531 		'<blockquote> <p>foo</p> <p>[bar]</p> <p>baz</p></blockquote>',
  3532 		'<blockquote> <p>foo</p> <p>bar</p> <p>[baz]</p></blockquote>',
  3533 		'<ol> <li>[foo]</li> <li>bar</li> <li>baz</li></ol>',
  3534 		'<ol> <li>foo</li> <li>[bar]</li> <li>baz</li></ol>',
  3535 		'<ol> <li>foo</li> <li>bar</li> <li>[baz]</li></ol>',
  3536 		'<ul> <li>[foo]</li> <li>bar</li> <li>baz</li></ul>',
  3537 		'<ul> <li>foo</li> <li>[bar]</li> <li>baz</li></ul>',
  3538 		'<ul> <li>foo</li> <li>bar</li> <li>[baz]</li></ul>',
  3540 		// https://bugs.webkit.org/show_bug.cgi?id=24249
  3541 		'<ol><li>[]a<table><tr><td><br></table></ol>',
  3542 		// https://bugs.webkit.org/show_bug.cgi?id=43447
  3543 		'<blockquote><span>foo<br>[bar]</span></blockquote>',
  3544 	],
  3545 	//@}
  3546 	removeformat: [
  3547 	//@{
  3548 		'foo[]bar',
  3549 		'<span>foo</span>{}<span>bar</span>',
  3550 		'<span>foo[</span><span>]bar</span>',
  3551 		'[foo<b>bar</b>baz]',
  3552 		'foo[<b>bar</b>baz]',
  3553 		'foo[<b>bar</b>]baz',
  3554 		'foo<b>[bar]</b>baz',
  3555 		'foo<b>b[a]r</b>baz',
  3556 		'[foo<strong>bar</strong>baz]',
  3557 		'[foo<span style="font-weight: bold">bar</span>baz]',
  3558 		'foo<span style="font-weight: bold">b[a]r</span>baz',
  3559 		'[foo<span style="font-variant: small-caps">bar</span>baz]',
  3560 		'foo<span style="font-variant: small-caps">b[a]r</span>baz',
  3561 		'[foo<b id=foo>bar</b>baz]',
  3562 		'foo<b id=foo>b[a]r</b>baz',
  3564 		// HTML has lots of inline elements, doesn't it?
  3565 		'[foo<a>bar</a>baz]',
  3566 		'foo<a>b[a]r</a>baz',
  3567 		'[foo<a href=foo>bar</a>baz]',
  3568 		'foo<a href=foo>b[a]r</a>baz',
  3569 		'[foo<abbr>bar</abbr>baz]',
  3570 		'foo<abbr>b[a]r</abbr>baz',
  3571 		'[foo<acronym>bar</acronym>baz]',
  3572 		'foo<acronym>b[a]r</acronym>baz',
  3573 		'[foo<b>bar</b>baz]',
  3574 		'foo<b>b[a]r</b>baz',
  3575 		'[foo<bdi dir=rtl>bar</bdi>baz]',
  3576 		'foo<bdi dir=rtl>b[a]r</bdi>baz',
  3577 		'[foo<bdo dir=rtl>bar</bdo>baz]',
  3578 		'foo<bdo dir=rtl>b[a]r</bdo>baz',
  3579 		'[foo<big>bar</big>baz]',
  3580 		'foo<big>b[a]r</big>baz',
  3581 		'[foo<blink>bar</blink>baz]',
  3582 		'foo<blink>b[a]r</blink>baz',
  3583 		'[foo<cite>bar</cite>baz]',
  3584 		'foo<cite>b[a]r</cite>baz',
  3585 		'[foo<code>bar</code>baz]',
  3586 		'foo<code>b[a]r</code>baz',
  3587 		'[foo<del>bar</del>baz]',
  3588 		'foo<del>b[a]r</del>baz',
  3589 		'[foo<dfn>bar</dfn>baz]',
  3590 		'foo<dfn>b[a]r</dfn>baz',
  3591 		'[foo<em>bar</em>baz]',
  3592 		'foo<em>b[a]r</em>baz',
  3593 		'[foo<font>bar</font>baz]',
  3594 		'foo<font>b[a]r</font>baz',
  3595 		'[foo<font color=blue>bar</font>baz]',
  3596 		'foo<font color=blue>b[a]r</font>baz',
  3597 		'[foo<i>bar</i>baz]',
  3598 		'foo<i>b[a]r</i>baz',
  3599 		'[foo<ins>bar</ins>baz]',
  3600 		'foo<ins>b[a]r</ins>baz',
  3601 		'[foo<kbd>bar</kbd>baz]',
  3602 		'foo<kbd>b[a]r</kbd>baz',
  3603 		'[foo<mark>bar</mark>baz]',
  3604 		'foo<mark>b[a]r</mark>baz',
  3605 		'[foo<nobr>bar</nobr>baz]',
  3606 		'foo<nobr>b[a]r</nobr>baz',
  3607 		'[foo<q>bar</q>baz]',
  3608 		'foo<q>b[a]r</q>baz',
  3609 		'[foo<samp>bar</samp>baz]',
  3610 		'foo<samp>b[a]r</samp>baz',
  3611 		'[foo<s>bar</s>baz]',
  3612 		'foo<s>b[a]r</s>baz',
  3613 		'[foo<small>bar</small>baz]',
  3614 		'foo<small>b[a]r</small>baz',
  3615 		'[foo<span>bar</span>baz]',
  3616 		'foo<span>b[a]r</span>baz',
  3617 		'[foo<strike>bar</strike>baz]',
  3618 		'foo<strike>b[a]r</strike>baz',
  3619 		'[foo<strong>bar</strong>baz]',
  3620 		'foo<strong>b[a]r</strong>baz',
  3621 		'[foo<sub>bar</sub>baz]',
  3622 		'foo<sub>b[a]r</sub>baz',
  3623 		'[foo<sup>bar</sup>baz]',
  3624 		'foo<sup>b[a]r</sup>baz',
  3625 		'[foo<tt>bar</tt>baz]',
  3626 		'foo<tt>b[a]r</tt>baz',
  3627 		'[foo<u>bar</u>baz]',
  3628 		'foo<u>b[a]r</u>baz',
  3629 		'[foo<var>bar</var>baz]',
  3630 		'foo<var>b[a]r</var>baz',
  3632 		// Empty and replaced elements
  3633 		'[foo<br>bar]',
  3634 		'[foo<hr>bar]',
  3635 		'[foo<wbr>bar]',
  3636 		'[foo<img>bar]',
  3637 		'[foo<img src=abc>bar]',
  3638 		'[foo<video></video>bar]',
  3639 		'[foo<video src=abc></video>bar]',
  3640 		'[foo<svg><circle fill=blue r=20 cx=20 cy=20 /></svg>bar]',
  3642 		// Unrecognized elements
  3643 		'[foo<nonexistentelement>bar</nonexistentelement>baz]',
  3644 		'foo<nonexistentelement>b[a]r</nonexistentelement>baz',
  3645 		'[foo<nonexistentelement style="display: block">bar</nonexistentelement>baz]',
  3646 		'foo<nonexistentelement style="display: block">b[a]r</nonexistentelement>baz',
  3648 		// Random stuff
  3649 		'[foo<span id=foo>bar</span>baz]',
  3650 		'foo<span id=foo>b[a]r</span>baz',
  3651 		'[foo<span class=foo>bar</span>baz]',
  3652 		'foo<span class=foo>b[a]r</span>baz',
  3653 		'[foo<b style="font-weight: normal">bar</b>baz]',
  3654 		'foo<b style="font-weight: normal">b[a]r</b>baz',
  3655 		'<p style="background-color: aqua">foo[bar]baz</p>',
  3656 		'<p><span style="background-color: aqua">foo[bar]baz</span></p>',
  3657 		'<p style="font-weight: bold">foo[bar]baz</p>',
  3658 		'<b><p style="font-weight: bold">foo[bar]baz</p></b>',
  3659 		'<p style="font-variant: small-caps">foo[bar]baz</p>',
  3660 		'{<p style="font-variant: small-caps">foobarbaz</p>}',
  3661 		'<p style="text-indent: 2em">foo[bar]baz</p>',
  3662 		'{<p style="text-indent: 2em">foobarbaz</p>}',
  3664 		// https://bugzilla.mozilla.org/show_bug.cgi?id=649138
  3665 		// Chrome 15 dev fails this for some unclear reason.
  3666 		'<table data-start=0 data-end=1><tr><td><b>foo</b></table>',
  3667 	],
  3668 	//@}
  3669 	strikethrough: [
  3670 	//@{
  3671 		'foo[]bar',
  3672 		'<p>[foo</p> <p>bar]</p>',
  3673 		'<span>[foo</span> <span>bar]</span>',
  3674 		'<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
  3675 		'<p>[foo<p><br><p>bar]',
  3676 		'<b>foo[]bar</b>',
  3677 		'<i>foo[]bar</i>',
  3678 		'<span>foo</span>{}<span>bar</span>',
  3679 		'<span>foo[</span><span>]bar</span>',
  3680 		'foo[bar]baz',
  3681 		'foo[bar<b>baz]qoz</b>quz',
  3682 		'foo[bar<i>baz]qoz</i>quz',
  3683 		'{<p><p> <p>foo</p>}',
  3685 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
  3686 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
  3687 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
  3688 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
  3689 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
  3690 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
  3692 		'foo<u>[bar]</u>baz',
  3693 		'foo<span style="text-decoration: underline">[bar]</span>baz',
  3694 		'<u>foo[bar]baz</u>',
  3695 		'<u>foo[b<span style="color:blue">ar]ba</span>z</u>',
  3696 		'<u>foo[b<span style="color:blue" id=foo>ar]ba</span>z</u>',
  3697 		'<u>foo[b<span style="font-size:3em">ar]ba</span>z</u>',
  3698 		'<u>foo[b<i>ar]ba</i>z</u>',
  3699 		'<p style="text-decoration: underline">foo[bar]baz</p>',
  3701 		'foo<s>[bar]</s>baz',
  3702 		'foo<span style="text-decoration: line-through">[bar]</span>baz',
  3703 		'<s>foo[bar]baz</s>',
  3704 		'<s>foo[b<span style="color:blue">ar]ba</span>z</s>',
  3705 		'<s>foo[b<span style="color:blue" id=foo>ar]ba</span>z</s>',
  3706 		'<s>foo[b<span style="font-size:3em">ar]ba</span>z</s>',
  3707 		'<s>foo[b<i>ar]ba</i>z</s>',
  3708 		'<p style="text-decoration: line-through">foo[bar]baz</p>',
  3710 		'foo<strike>[bar]</strike>baz',
  3711 		'<strike>foo[bar]baz</strike>',
  3712 		'<strike>foo[b<span style="color:blue">ar]ba</span>z</strike>',
  3713 		'<strike>foo[b<span style="color:blue" id=foo>ar]ba</span>z</strike>',
  3714 		'<strike>foo[b<span style="font-size:3em">ar]ba</span>z</strike>',
  3715 		'<strike>foo[b<i>ar]ba</i>z</strike>',
  3717 		'foo<ins>[bar]</ins>baz',
  3718 		'<ins>foo[bar]baz</ins>',
  3719 		'<ins>foo[b<span style="color:blue">ar]ba</span>z</ins>',
  3720 		'<ins>foo[b<span style="color:blue" id=foo>ar]ba</span>z</ins>',
  3721 		'<ins>foo[b<span style="font-size:3em">ar]ba</span>z</ins>',
  3722 		'<ins>foo[b<i>ar]ba</i>z</ins>',
  3724 		'foo<del>[bar]</del>baz',
  3725 		'<del>foo[bar]baz</del>',
  3726 		'<del>foo[b<span style="color:blue">ar]ba</span>z</del>',
  3727 		'<del>foo[b<span style="color:blue" id=foo>ar]ba</span>z</del>',
  3728 		'<del>foo[b<span style="font-size:3em">ar]ba</span>z</del>',
  3729 		'<del>foo[b<i>ar]ba</i>z</del>',
  3731 		'foo<span style="text-decoration: underline line-through">[bar]</span>baz',
  3732 		'foo<span style="text-decoration: underline line-through">b[a]r</span>baz',
  3733 		'foo<s style="text-decoration: underline">[bar]</s>baz',
  3734 		'foo<s style="text-decoration: underline">b[a]r</s>baz',
  3735 		'foo<u style="text-decoration: line-through">[bar]</u>baz',
  3736 		'foo<u style="text-decoration: line-through">b[a]r</u>baz',
  3737 		'foo<s style="text-decoration: overline">[bar]</s>baz',
  3738 		'foo<s style="text-decoration: overline">b[a]r</s>baz',
  3739 		'foo<u style="text-decoration: overline">[bar]</u>baz',
  3740 		'foo<u style="text-decoration: overline">b[a]r</u>baz',
  3742 		'<p style="text-decoration: line-through">foo[bar]baz</p>',
  3743 		'<p style="text-decoration: overline">foo[bar]baz</p>',
  3745 		'foo<span class="underline">[bar]</span>baz',
  3746 		'foo<span class="underline">b[a]r</span>baz',
  3747 		'foo<span class="line-through">[bar]</span>baz',
  3748 		'foo<span class="line-through">b[a]r</span>baz',
  3749 		'foo<span class="underline-and-line-through">[bar]</span>baz',
  3750 		'foo<span class="underline-and-line-through">b[a]r</span>baz',
  3752 		// Tests for queryCommandIndeterm() and queryCommandState()
  3753 		'fo[o<s>b]ar</s>baz',
  3754 		'foo<s>ba[r</s>b]az',
  3755 		'fo[o<s>bar</s>b]az',
  3756 		'foo[<s>b]ar</s>baz',
  3757 		'foo<s>ba[r</s>]baz',
  3758 		'foo[<s>bar</s>]baz',
  3759 		'foo<s>[bar]</s>baz',
  3760 		'foo{<s>bar</s>}baz',
  3761 		'fo[o<span style=text-decoration:line-through>b]ar</span>baz',
  3762 		'<strike>fo[o</strike><s>b]ar</s>',
  3763 		'<s>fo[o</s><del>b]ar</del>',
  3764 	],
  3765 	//@}
  3766 	subscript: [
  3767 	//@{
  3768 		'foo[]bar',
  3769 		'<p>[foo</p> <p>bar]</p>',
  3770 		'<span>[foo</span> <span>bar]</span>',
  3771 		'<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
  3772 		'<p>[foo<p><br><p>bar]',
  3773 		'<b>foo[]bar</b>',
  3774 		'<i>foo[]bar</i>',
  3775 		'<span>foo</span>{}<span>bar</span>',
  3776 		'<span>foo[</span><span>]bar</span>',
  3777 		'foo[bar]baz',
  3778 		'foo[bar<b>baz]qoz</b>quz',
  3779 		'foo[bar<i>baz]qoz</i>quz',
  3780 		'{<p><p> <p>foo</p>}',
  3782 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
  3783 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
  3784 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
  3785 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
  3786 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
  3787 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
  3789 		'foo<sub>[bar]</sub>baz',
  3790 		'foo<sub>b[a]r</sub>baz',
  3791 		'foo<sup>[bar]</sup>baz',
  3792 		'foo<sup>b[a]r</sup>baz',
  3794 		'foo<span style=vertical-align:sub>[bar]</span>baz',
  3795 		'foo<span style=vertical-align:super>[bar]</span>baz',
  3797 		'foo<sub><sub>[bar]</sub></sub>baz',
  3798 		'foo<sub><sub>b[a]r</sub></sub>baz',
  3799 		'foo<sub>b<sub>[a]</sub>r</sub>baz',
  3800 		'foo<sup><sup>[bar]</sup></sup>baz',
  3801 		'foo<sup><sup>b[a]r</sup></sup>baz',
  3802 		'foo<sup>b<sup>[a]</sup>r</sup>baz',
  3803 		'foo<sub><sup>[bar]</sup></sub>baz',
  3804 		'foo<sub><sup>b[a]r</sup></sub>baz',
  3805 		'foo<sub>b<sup>[a]</sup>r</sub>baz',
  3806 		'foo<sup><sub>[bar]</sub></sup>baz',
  3807 		'foo<sup><sub>b[a]r</sub></sup>baz',
  3808 		'foo<sup>b<sub>[a]</sub>r</sup>baz',
  3810 		// Tests for queryCommandIndeterm() and queryCommandState()
  3811 		'fo[o<sub>b]ar</sub>baz',
  3812 		'foo<sub>ba[r</sub>b]az',
  3813 		'fo[o<sub>bar</sub>b]az',
  3814 		'foo[<sub>b]ar</sub>baz',
  3815 		'foo<sub>ba[r</sub>]baz',
  3816 		'foo[<sub>bar</sub>]baz',
  3817 		'foo<sub>[bar]</sub>baz',
  3818 		'foo{<sub>bar</sub>}baz',
  3819 		'<sub>fo[o</sub><sup>b]ar</sup>',
  3820 		'<sub>fo[o</sub><span style=vertical-align:sub>b]ar</span>',
  3821 		'foo<span style=vertical-align:top>[bar]</span>baz',
  3822 		'<sub>fo[o</sub><span style=vertical-align:top>b]ar</span>',
  3823 	],
  3824 	//@}
  3825 	superscript: [
  3826 	//@{
  3827 		'foo[]bar',
  3828 		'<p>[foo</p> <p>bar]</p>',
  3829 		'<span>[foo</span> <span>bar]</span>',
  3830 		'<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
  3831 		'<p>[foo<p><br><p>bar]',
  3832 		'<b>foo[]bar</b>',
  3833 		'<i>foo[]bar</i>',
  3834 		'<span>foo</span>{}<span>bar</span>',
  3835 		'<span>foo[</span><span>]bar</span>',
  3836 		'foo[bar]baz',
  3837 		'foo[bar<b>baz]qoz</b>quz',
  3838 		'foo[bar<i>baz]qoz</i>quz',
  3839 		'{<p><p> <p>foo</p>}',
  3841 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
  3842 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
  3843 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
  3844 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
  3845 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
  3846 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
  3848 		'foo<sub>[bar]</sub>baz',
  3849 		'foo<sub>b[a]r</sub>baz',
  3850 		'foo<sup>[bar]</sup>baz',
  3851 		'foo<sup>b[a]r</sup>baz',
  3853 		'foo<span style=vertical-align:sub>[bar]</span>baz',
  3854 		'foo<span style=vertical-align:super>[bar]</span>baz',
  3856 		'foo<sub><sub>[bar]</sub></sub>baz',
  3857 		'foo<sub><sub>b[a]r</sub></sub>baz',
  3858 		'foo<sub>b<sub>[a]</sub>r</sub>baz',
  3859 		'foo<sup><sup>[bar]</sup></sup>baz',
  3860 		'foo<sup><sup>b[a]r</sup></sup>baz',
  3861 		'foo<sup>b<sup>[a]</sup>r</sup>baz',
  3862 		'foo<sub><sup>[bar]</sup></sub>baz',
  3863 		'foo<sub><sup>b[a]r</sup></sub>baz',
  3864 		'foo<sub>b<sup>[a]</sup>r</sub>baz',
  3865 		'foo<sup><sub>[bar]</sub></sup>baz',
  3866 		'foo<sup><sub>b[a]r</sub></sup>baz',
  3867 		'foo<sup>b<sub>[a]</sub>r</sup>baz',
  3869 		// Tests for queryCommandIndeterm() and queryCommandState()
  3870 		'fo[o<sup>b]ar</sup>baz',
  3871 		'foo<sup>ba[r</sup>b]az',
  3872 		'fo[o<sup>bar</sup>b]az',
  3873 		'foo[<sup>b]ar</sup>baz',
  3874 		'foo<sup>ba[r</sup>]baz',
  3875 		'foo[<sup>bar</sup>]baz',
  3876 		'foo<sup>[bar]</sup>baz',
  3877 		'foo{<sup>bar</sup>}baz',
  3878 		'<sup>fo[o</sup><sub>b]ar</sub>',
  3879 		'<sup>fo[o</sup><span style=vertical-align:super>b]ar</span>',
  3880 		'foo<span style=vertical-align:bottom>[bar]</span>baz',
  3881 		'<sup>fo[o</sup><span style=vertical-align:bottom>b]ar</span>',
  3883 		// https://bugs.webkit.org/show_bug.cgi?id=28472
  3884 		'foo<sup>[bar]<br></sup>',
  3885 	],
  3886 	//@}
  3887 	underline: [
  3888 	//@{
  3889 		'foo[]bar',
  3890 		'<p>[foo</p> <p>bar]</p>',
  3891 		'<span>[foo</span> <span>bar]</span>',
  3892 		'<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
  3893 		'<p>[foo<p><br><p>bar]',
  3894 		'<b>foo[]bar</b>',
  3895 		'<i>foo[]bar</i>',
  3896 		'<span>foo</span>{}<span>bar</span>',
  3897 		'<span>foo[</span><span>]bar</span>',
  3898 		'foo[bar]baz',
  3899 		'foo[bar<b>baz]qoz</b>quz',
  3900 		'foo[bar<i>baz]qoz</i>quz',
  3901 		'{<p><p> <p>foo</p>}',
  3903 		'<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
  3904 		'<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
  3905 		'<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
  3906 		'<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
  3907 		'<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
  3908 		'{<table><tr><td>foo<td>bar<td>baz</table>}',
  3910 		'foo<u>[bar]</u>baz',
  3911 		'foo<span style="text-decoration: underline">[bar]</span>baz',
  3912 		'<u>foo[bar]baz</u>',
  3913 		'<u>foo[b<span style="color:blue">ar]ba</span>z</u>',
  3914 		'<u>foo[b<span style="color:blue" id=foo>ar]ba</span>z</u>',
  3915 		'<u>foo[b<span style="font-size:3em">ar]ba</span>z</u>',
  3916 		'<u>foo[b<i>ar]ba</i>z</u>',
  3917 		'<p style="text-decoration: underline">foo[bar]baz</p>',
  3919 		'foo<s>[bar]</s>baz',
  3920 		'foo<span style="text-decoration: line-through">[bar]</span>baz',
  3921 		'<s>foo[bar]baz</s>',
  3922 		'<s>foo[b<span style="color:blue">ar]ba</span>z</s>',
  3923 		'<s>foo[b<span style="color:blue" id=foo>ar]ba</span>z</s>',
  3924 		'<s>foo[b<span style="font-size:3em">ar]ba</span>z</s>',
  3925 		'<s>foo[b<i>ar]ba</i>z</s>',
  3926 		'<p style="text-decoration: line-through">foo[bar]baz</p>',
  3928 		'foo<strike>[bar]</strike>baz',
  3929 		'<strike>foo[bar]baz</strike>',
  3930 		'<strike>foo[b<span style="color:blue">ar]ba</span>z</strike>',
  3931 		'<strike>foo[b<span style="color:blue" id=foo>ar]ba</span>z</strike>',
  3932 		'<strike>foo[b<span style="font-size:3em">ar]ba</span>z</strike>',
  3933 		'<strike>foo[b<i>ar]ba</i>z</strike>',
  3935 		'foo<ins>[bar]</ins>baz',
  3936 		'<ins>foo[bar]baz</ins>',
  3937 		'<ins>foo[b<span style="color:blue">ar]ba</span>z</ins>',
  3938 		'<ins>foo[b<span style="color:blue" id=foo>ar]ba</span>z</ins>',
  3939 		'<ins>foo[b<span style="font-size:3em">ar]ba</span>z</ins>',
  3940 		'<ins>foo[b<i>ar]ba</i>z</ins>',
  3942 		'foo<del>[bar]</del>baz',
  3943 		'<del>foo[bar]baz</del>',
  3944 		'<del>foo[b<span style="color:blue">ar]ba</span>z</del>',
  3945 		'<del>foo[b<span style="color:blue" id=foo>ar]ba</span>z</del>',
  3946 		'<del>foo[b<span style="font-size:3em">ar]ba</span>z</del>',
  3947 		'<del>foo[b<i>ar]ba</i>z</del>',
  3949 		'foo<span style="text-decoration: underline line-through">[bar]</span>baz',
  3950 		'foo<span style="text-decoration: underline line-through">b[a]r</span>baz',
  3951 		'foo<s style="text-decoration: underline">[bar]</s>baz',
  3952 		'foo<s style="text-decoration: underline">b[a]r</s>baz',
  3953 		'foo<u style="text-decoration: line-through">[bar]</u>baz',
  3954 		'foo<u style="text-decoration: line-through">b[a]r</u>baz',
  3955 		'foo<s style="text-decoration: overline">[bar]</s>baz',
  3956 		'foo<s style="text-decoration: overline">b[a]r</s>baz',
  3957 		'foo<u style="text-decoration: overline">[bar]</u>baz',
  3958 		'foo<u style="text-decoration: overline">b[a]r</u>baz',
  3960 		'<p style="text-decoration: line-through">foo[bar]baz</p>',
  3961 		'<p style="text-decoration: overline">foo[bar]baz</p>',
  3963 		'foo<span class="underline">[bar]</span>baz',
  3964 		'foo<span class="underline">b[a]r</span>baz',
  3965 		'foo<span class="line-through">[bar]</span>baz',
  3966 		'foo<span class="line-through">b[a]r</span>baz',
  3967 		'foo<span class="underline-and-line-through">[bar]</span>baz',
  3968 		'foo<span class="underline-and-line-through">b[a]r</span>baz',
  3970 		// Tests for queryCommandIndeterm() and queryCommandState()
  3971 		'fo[o<u>b]ar</u>baz',
  3972 		'foo<u>ba[r</u>b]az',
  3973 		'fo[o<u>bar</u>b]az',
  3974 		'foo[<u>b]ar</u>baz',
  3975 		'foo<u>ba[r</u>]baz',
  3976 		'foo[<u>bar</u>]baz',
  3977 		'foo<u>[bar]</u>baz',
  3978 		'foo{<u>bar</u>}baz',
  3979 		'fo[o<span style=text-decoration:underline>b]ar</span>baz',
  3980 		'<ins>fo[o</ins><u>b]ar</u>',
  3981 		'<u>fo[o</u><ins>b]ar</ins>',
  3982 	],
  3983 	//@}
  3984 	unlink: [
  3985 	//@{
  3986 		'foo[]bar',
  3987 		'<p>[foo</p> <p>bar]</p>',
  3988 		'<span>[foo</span> <span>bar]</span>',
  3989 		'<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
  3990 		'<b>foo[]bar</b>',
  3991 		'<i>foo[]bar</i>',
  3992 		'<span>foo</span>{}<span>bar</span>',
  3993 		'<span>foo[</span><span>]bar</span>',
  3994 		'foo[bar]baz',
  3995 		'foo[bar<b>baz]qoz</b>quz',
  3996 		'foo[bar<i>baz]qoz</i>quz',
  3997 		'{<p><p> <p>foo</p>}',
  3999 		'<a href=http://www.google.com/>foo[bar]baz</a>',
  4000 		'<a href=http://www.google.com/>foo[barbaz</a>}',
  4001 		'{<a href=http://www.google.com/>foobar]baz</a>',
  4002 		'{<a href=http://www.google.com/>foobarbaz</a>}',
  4003 		'<a href=http://www.google.com/>[foobarbaz]</a>',
  4005 		'foo<a href=http://www.google.com/>b[]ar</a>baz',
  4006 		'foo<a href=http://www.google.com/>[bar]</a>baz',
  4007 		'foo[<a href=http://www.google.com/>bar</a>]baz',
  4008 		'foo<a href=http://www.google.com/>[bar</a>baz]',
  4009 		'[foo<a href=http://www.google.com/>bar]</a>baz',
  4010 		'[foo<a href=http://www.google.com/>bar</a>baz]',
  4012 		'<a id=foo href=http://www.google.com/>foobar[]baz</a>',
  4013 		'<a id=foo href=http://www.google.com/>foo[bar]baz</a>',
  4014 		'<a id=foo href=http://www.google.com/>[foobarbaz]</a>',
  4015 		'foo<a id=foo href=http://www.google.com/>[bar]</a>baz',
  4016 		'foo[<a id=foo href=http://www.google.com/>bar</a>]baz',
  4017 		'[foo<a id=foo href=http://www.google.com/>bar</a>baz]',
  4019 		'<a name=foo>foobar[]baz</a>',
  4020 		'<a name=foo>foo[bar]baz</a>',
  4021 		'<a name=foo>[foobarbaz]</a>',
  4022 		'foo<a name=foo>[bar]</a>baz',
  4023 		'foo[<a name=foo>bar</a>]baz',
  4024 		'[foo<a name=foo>bar</a>baz]',
  4025 	],
  4026 	//@}
  4027 	copy: ['!foo[bar]baz'],
  4028 	cut: ['!foo[bar]baz'],
  4029 	defaultparagraphseparator: [
  4030 	//@{
  4031 		['', 'foo[bar]baz'],
  4032 		['div', 'foo[bar]baz'],
  4033 		['p', 'foo[bar]baz'],
  4034 		['DIV', 'foo[bar]baz'],
  4035 		['P', 'foo[bar]baz'],
  4036 		[' div ', 'foo[bar]baz'],
  4037 		[' p ', 'foo[bar]baz'],
  4038 		['<div>', 'foo[bar]baz'],
  4039 		['<p>', 'foo[bar]baz'],
  4040 		['li', 'foo[bar]baz'],
  4041 		['blockquote', 'foo[bar]baz'],
  4042 	],
  4043 	//@}
  4044 	paste: ['!foo[bar]baz'],
  4045 	selectall: ['foo[bar]baz'],
  4046 	stylewithcss: [
  4047 	//@{
  4048 		['true', 'foo[bar]baz'],
  4049 		['TRUE', 'foo[bar]baz'],
  4050 		['TrUe', 'foo[bar]baz'],
  4051 		['true ', 'foo[bar]baz'],
  4052 		[' true', 'foo[bar]baz'],
  4053 		['truer', 'foo[bar]baz'],
  4054 		[' true ', 'foo[bar]baz'],
  4055 		[' TrUe', 'foo[bar]baz'],
  4056 		['', 'foo[bar]baz'],
  4057 		[' ', 'foo[bar]baz'],
  4058 		['false', 'foo[bar]baz'],
  4059 		['FALSE', 'foo[bar]baz'],
  4060 		['FaLsE', 'foo[bar]baz'],
  4061 		[' false', 'foo[bar]baz'],
  4062 		['false ', 'foo[bar]baz'],
  4063 		['falser', 'foo[bar]baz'],
  4064 		['falsé', 'foo[bar]baz'],
  4065 	],
  4066 	//@}
  4067 	usecss: [
  4068 	//@{
  4069 		['true', 'foo[bar]baz'],
  4070 		['TRUE', 'foo[bar]baz'],
  4071 		['TrUe', 'foo[bar]baz'],
  4072 		['true ', 'foo[bar]baz'],
  4073 		[' true', 'foo[bar]baz'],
  4074 		['truer', 'foo[bar]baz'],
  4075 		[' true ', 'foo[bar]baz'],
  4076 		[' TrUe', 'foo[bar]baz'],
  4077 		['', 'foo[bar]baz'],
  4078 		[' ', 'foo[bar]baz'],
  4079 		['false', 'foo[bar]baz'],
  4080 		['FALSE', 'foo[bar]baz'],
  4081 		['FaLsE', 'foo[bar]baz'],
  4082 		[' false', 'foo[bar]baz'],
  4083 		['false ', 'foo[bar]baz'],
  4084 		['falser', 'foo[bar]baz'],
  4085 		['falsé', 'foo[bar]baz'],
  4086 	],
  4087 	//@}
  4088 	quasit: ['foo[bar]baz'],
  4089 	multitest: [
  4090 	//@{
  4091 		// Insertion-affecting state.  Test that insertText works right, and
  4092 		// test that various block commands preserve (or don't preserve) the
  4093 		// state.
  4094 		['foo[]bar', 'bold', 'inserttext'],
  4095 		['foo[]bar', 'bold', 'delete'],
  4096 		['foo[]bar', 'bold', 'delete', 'inserttext'],
  4097 		['foo[]bar', 'bold', 'formatblock'],
  4098 		['foo[]bar', 'bold', 'formatblock', 'inserttext'],
  4099 		['foo[]bar', 'bold', 'forwarddelete'],
  4100 		['foo[]bar', 'bold', 'forwarddelete', 'inserttext'],
  4101 		['foo[]bar', 'bold', 'indent'],
  4102 		['foo[]bar', 'bold', 'indent', 'inserttext'],
  4103 		['foo[]bar', 'bold', 'inserthorizontalrule'],
  4104 		['foo[]bar', 'bold', 'inserthorizontalrule', 'inserttext'],
  4105 		['foo[]bar', 'bold', 'inserthtml'],
  4106 		['foo[]bar', 'bold', 'inserthtml', 'inserttext'],
  4107 		['foo[]bar', 'bold', 'insertimage'],
  4108 		['foo[]bar', 'bold', 'insertimage', 'inserttext'],
  4109 		['foo[]bar', 'bold', 'insertlinebreak'],
  4110 		['foo[]bar', 'bold', 'insertlinebreak', 'inserttext'],
  4111 		['foo[]bar', 'bold', 'insertorderedlist'],
  4112 		['foo[]bar', 'bold', 'insertorderedlist', 'inserttext'],
  4113 		['foo[]bar', 'bold', 'insertparagraph'],
  4114 		['foo[]bar', 'bold', 'insertparagraph', 'inserttext'],
  4115 		['foo[]bar', 'bold', 'insertunorderedlist'],
  4116 		['foo[]bar', 'bold', 'insertunorderedlist', 'inserttext'],
  4117 		['foo[]bar', 'bold', 'justifycenter'],
  4118 		['foo[]bar', 'bold', 'justifycenter', 'inserttext'],
  4119 		['foo[]bar', 'bold', 'justifyfull'],
  4120 		['foo[]bar', 'bold', 'justifyfull', 'inserttext'],
  4121 		['foo[]bar', 'bold', 'justifyleft'],
  4122 		['foo[]bar', 'bold', 'justifyleft', 'inserttext'],
  4123 		['foo[]bar', 'bold', 'justifyright'],
  4124 		['foo[]bar', 'bold', 'justifyright', 'inserttext'],
  4125 		['foo[]bar', 'bold', 'outdent'],
  4126 		['foo[]bar', 'bold', 'outdent', 'inserttext'],
  4128 		['foo[]bar', 'italic', 'inserttext'],
  4129 		['foo[]bar', 'italic', 'delete'],
  4130 		['foo[]bar', 'italic', 'delete', 'inserttext'],
  4131 		['foo[]bar', 'italic', 'formatblock'],
  4132 		['foo[]bar', 'italic', 'formatblock', 'inserttext'],
  4133 		['foo[]bar', 'italic', 'forwarddelete'],
  4134 		['foo[]bar', 'italic', 'forwarddelete', 'inserttext'],
  4135 		['foo[]bar', 'italic', 'indent'],
  4136 		['foo[]bar', 'italic', 'indent', 'inserttext'],
  4137 		['foo[]bar', 'italic', 'inserthorizontalrule'],
  4138 		['foo[]bar', 'italic', 'inserthorizontalrule', 'inserttext'],
  4139 		['foo[]bar', 'italic', 'inserthtml'],
  4140 		['foo[]bar', 'italic', 'inserthtml', 'inserttext'],
  4141 		['foo[]bar', 'italic', 'insertimage'],
  4142 		['foo[]bar', 'italic', 'insertimage', 'inserttext'],
  4143 		['foo[]bar', 'italic', 'insertlinebreak'],
  4144 		['foo[]bar', 'italic', 'insertlinebreak', 'inserttext'],
  4145 		['foo[]bar', 'italic', 'insertorderedlist'],
  4146 		['foo[]bar', 'italic', 'insertorderedlist', 'inserttext'],
  4147 		['foo[]bar', 'italic', 'insertparagraph'],
  4148 		['foo[]bar', 'italic', 'insertparagraph', 'inserttext'],
  4149 		['foo[]bar', 'italic', 'insertunorderedlist'],
  4150 		['foo[]bar', 'italic', 'insertunorderedlist', 'inserttext'],
  4151 		['foo[]bar', 'italic', 'justifycenter'],
  4152 		['foo[]bar', 'italic', 'justifycenter', 'inserttext'],
  4153 		['foo[]bar', 'italic', 'justifyfull'],
  4154 		['foo[]bar', 'italic', 'justifyfull', 'inserttext'],
  4155 		['foo[]bar', 'italic', 'justifyleft'],
  4156 		['foo[]bar', 'italic', 'justifyleft', 'inserttext'],
  4157 		['foo[]bar', 'italic', 'justifyright'],
  4158 		['foo[]bar', 'italic', 'justifyright', 'inserttext'],
  4159 		['foo[]bar', 'italic', 'outdent'],
  4160 		['foo[]bar', 'italic', 'outdent', 'inserttext'],
  4162 		['foo[]bar', 'strikethrough', 'inserttext'],
  4163 		['foo[]bar', 'strikethrough', 'delete'],
  4164 		['foo[]bar', 'strikethrough', 'delete', 'inserttext'],
  4165 		['foo[]bar', 'strikethrough', 'formatblock'],
  4166 		['foo[]bar', 'strikethrough', 'formatblock', 'inserttext'],
  4167 		['foo[]bar', 'strikethrough', 'forwarddelete'],
  4168 		['foo[]bar', 'strikethrough', 'forwarddelete', 'inserttext'],
  4169 		['foo[]bar', 'strikethrough', 'indent'],
  4170 		['foo[]bar', 'strikethrough', 'indent', 'inserttext'],
  4171 		['foo[]bar', 'strikethrough', 'inserthorizontalrule'],
  4172 		['foo[]bar', 'strikethrough', 'inserthorizontalrule', 'inserttext'],
  4173 		['foo[]bar', 'strikethrough', 'inserthtml'],
  4174 		['foo[]bar', 'strikethrough', 'inserthtml', 'inserttext'],
  4175 		['foo[]bar', 'strikethrough', 'insertimage'],
  4176 		['foo[]bar', 'strikethrough', 'insertimage', 'inserttext'],
  4177 		['foo[]bar', 'strikethrough', 'insertlinebreak'],
  4178 		['foo[]bar', 'strikethrough', 'insertlinebreak', 'inserttext'],
  4179 		['foo[]bar', 'strikethrough', 'insertorderedlist'],
  4180 		['foo[]bar', 'strikethrough', 'insertorderedlist', 'inserttext'],
  4181 		['foo[]bar', 'strikethrough', 'insertparagraph'],
  4182 		['foo[]bar', 'strikethrough', 'insertparagraph', 'inserttext'],
  4183 		['foo[]bar', 'strikethrough', 'insertunorderedlist'],
  4184 		['foo[]bar', 'strikethrough', 'insertunorderedlist', 'inserttext'],
  4185 		['foo[]bar', 'strikethrough', 'justifycenter'],
  4186 		['foo[]bar', 'strikethrough', 'justifycenter', 'inserttext'],
  4187 		['foo[]bar', 'strikethrough', 'justifyfull'],
  4188 		['foo[]bar', 'strikethrough', 'justifyfull', 'inserttext'],
  4189 		['foo[]bar', 'strikethrough', 'justifyleft'],
  4190 		['foo[]bar', 'strikethrough', 'justifyleft', 'inserttext'],
  4191 		['foo[]bar', 'strikethrough', 'justifyright'],
  4192 		['foo[]bar', 'strikethrough', 'justifyright', 'inserttext'],
  4193 		['foo[]bar', 'strikethrough', 'outdent'],
  4194 		['foo[]bar', 'strikethrough', 'outdent', 'inserttext'],
  4196 		['foo[]bar', 'subscript', 'inserttext'],
  4197 		['foo[]bar', 'subscript', 'delete'],
  4198 		['foo[]bar', 'subscript', 'delete', 'inserttext'],
  4199 		['foo[]bar', 'subscript', 'formatblock'],
  4200 		['foo[]bar', 'subscript', 'formatblock', 'inserttext'],
  4201 		['foo[]bar', 'subscript', 'forwarddelete'],
  4202 		['foo[]bar', 'subscript', 'forwarddelete', 'inserttext'],
  4203 		['foo[]bar', 'subscript', 'indent'],
  4204 		['foo[]bar', 'subscript', 'indent', 'inserttext'],
  4205 		['foo[]bar', 'subscript', 'inserthorizontalrule'],
  4206 		['foo[]bar', 'subscript', 'inserthorizontalrule', 'inserttext'],
  4207 		['foo[]bar', 'subscript', 'inserthtml'],
  4208 		['foo[]bar', 'subscript', 'inserthtml', 'inserttext'],
  4209 		['foo[]bar', 'subscript', 'insertimage'],
  4210 		['foo[]bar', 'subscript', 'insertimage', 'inserttext'],
  4211 		['foo[]bar', 'subscript', 'insertlinebreak'],
  4212 		['foo[]bar', 'subscript', 'insertlinebreak', 'inserttext'],
  4213 		['foo[]bar', 'subscript', 'insertorderedlist'],
  4214 		['foo[]bar', 'subscript', 'insertorderedlist', 'inserttext'],
  4215 		['foo[]bar', 'subscript', 'insertparagraph'],
  4216 		['foo[]bar', 'subscript', 'insertparagraph', 'inserttext'],
  4217 		['foo[]bar', 'subscript', 'insertunorderedlist'],
  4218 		['foo[]bar', 'subscript', 'insertunorderedlist', 'inserttext'],
  4219 		['foo[]bar', 'subscript', 'justifycenter'],
  4220 		['foo[]bar', 'subscript', 'justifycenter', 'inserttext'],
  4221 		['foo[]bar', 'subscript', 'justifyfull'],
  4222 		['foo[]bar', 'subscript', 'justifyfull', 'inserttext'],
  4223 		['foo[]bar', 'subscript', 'justifyleft'],
  4224 		['foo[]bar', 'subscript', 'justifyleft', 'inserttext'],
  4225 		['foo[]bar', 'subscript', 'justifyright'],
  4226 		['foo[]bar', 'subscript', 'justifyright', 'inserttext'],
  4227 		['foo[]bar', 'subscript', 'outdent'],
  4228 		['foo[]bar', 'subscript', 'outdent', 'inserttext'],
  4230 		['foo[]bar', 'superscript', 'inserttext'],
  4231 		['foo[]bar', 'superscript', 'delete'],
  4232 		['foo[]bar', 'superscript', 'delete', 'inserttext'],
  4233 		['foo[]bar', 'superscript', 'formatblock'],
  4234 		['foo[]bar', 'superscript', 'formatblock', 'inserttext'],
  4235 		['foo[]bar', 'superscript', 'forwarddelete'],
  4236 		['foo[]bar', 'superscript', 'forwarddelete', 'inserttext'],
  4237 		['foo[]bar', 'superscript', 'indent'],
  4238 		['foo[]bar', 'superscript', 'indent', 'inserttext'],
  4239 		['foo[]bar', 'superscript', 'inserthorizontalrule'],
  4240 		['foo[]bar', 'superscript', 'inserthorizontalrule', 'inserttext'],
  4241 		['foo[]bar', 'superscript', 'inserthtml'],
  4242 		['foo[]bar', 'superscript', 'inserthtml', 'inserttext'],
  4243 		['foo[]bar', 'superscript', 'insertimage'],
  4244 		['foo[]bar', 'superscript', 'insertimage', 'inserttext'],
  4245 		['foo[]bar', 'superscript', 'insertlinebreak'],
  4246 		['foo[]bar', 'superscript', 'insertlinebreak', 'inserttext'],
  4247 		['foo[]bar', 'superscript', 'insertorderedlist'],
  4248 		['foo[]bar', 'superscript', 'insertorderedlist', 'inserttext'],
  4249 		['foo[]bar', 'superscript', 'insertparagraph'],
  4250 		['foo[]bar', 'superscript', 'insertparagraph', 'inserttext'],
  4251 		['foo[]bar', 'superscript', 'insertunorderedlist'],
  4252 		['foo[]bar', 'superscript', 'insertunorderedlist', 'inserttext'],
  4253 		['foo[]bar', 'superscript', 'justifycenter'],
  4254 		['foo[]bar', 'superscript', 'justifycenter', 'inserttext'],
  4255 		['foo[]bar', 'superscript', 'justifyfull'],
  4256 		['foo[]bar', 'superscript', 'justifyfull', 'inserttext'],
  4257 		['foo[]bar', 'superscript', 'justifyleft'],
  4258 		['foo[]bar', 'superscript', 'justifyleft', 'inserttext'],
  4259 		['foo[]bar', 'superscript', 'justifyright'],
  4260 		['foo[]bar', 'superscript', 'justifyright', 'inserttext'],
  4261 		['foo[]bar', 'superscript', 'outdent'],
  4262 		['foo[]bar', 'superscript', 'outdent', 'inserttext'],
  4264 		['foo[]bar', 'underline', 'inserttext'],
  4265 		['foo[]bar', 'underline', 'delete'],
  4266 		['foo[]bar', 'underline', 'delete', 'inserttext'],
  4267 		['foo[]bar', 'underline', 'formatblock'],
  4268 		['foo[]bar', 'underline', 'formatblock', 'inserttext'],
  4269 		['foo[]bar', 'underline', 'forwarddelete'],
  4270 		['foo[]bar', 'underline', 'forwarddelete', 'inserttext'],
  4271 		['foo[]bar', 'underline', 'indent'],
  4272 		['foo[]bar', 'underline', 'indent', 'inserttext'],
  4273 		['foo[]bar', 'underline', 'inserthorizontalrule'],
  4274 		['foo[]bar', 'underline', 'inserthorizontalrule', 'inserttext'],
  4275 		['foo[]bar', 'underline', 'inserthtml'],
  4276 		['foo[]bar', 'underline', 'inserthtml', 'inserttext'],
  4277 		['foo[]bar', 'underline', 'insertimage'],
  4278 		['foo[]bar', 'underline', 'insertimage', 'inserttext'],
  4279 		['foo[]bar', 'underline', 'insertlinebreak'],
  4280 		['foo[]bar', 'underline', 'insertlinebreak', 'inserttext'],
  4281 		['foo[]bar', 'underline', 'insertorderedlist'],
  4282 		['foo[]bar', 'underline', 'insertorderedlist', 'inserttext'],
  4283 		['foo[]bar', 'underline', 'insertparagraph'],
  4284 		['foo[]bar', 'underline', 'insertparagraph', 'inserttext'],
  4285 		['foo[]bar', 'underline', 'insertunorderedlist'],
  4286 		['foo[]bar', 'underline', 'insertunorderedlist', 'inserttext'],
  4287 		['foo[]bar', 'underline', 'justifycenter'],
  4288 		['foo[]bar', 'underline', 'justifycenter', 'inserttext'],
  4289 		['foo[]bar', 'underline', 'justifyfull'],
  4290 		['foo[]bar', 'underline', 'justifyfull', 'inserttext'],
  4291 		['foo[]bar', 'underline', 'justifyleft'],
  4292 		['foo[]bar', 'underline', 'justifyleft', 'inserttext'],
  4293 		['foo[]bar', 'underline', 'justifyright'],
  4294 		['foo[]bar', 'underline', 'justifyright', 'inserttext'],
  4295 		['foo[]bar', 'underline', 'outdent'],
  4296 		['foo[]bar', 'underline', 'outdent', 'inserttext'],
  4298 		// Insertion-affecting value.  Test that insertText works right, and
  4299 		// test that various block commands preserve (or don't preserve) the
  4300 		// value.
  4301 		['foo[]bar', 'backcolor', 'inserttext'],
  4302 		['foo[]bar', 'backcolor', 'delete'],
  4303 		['foo[]bar', 'backcolor', 'delete', 'inserttext'],
  4304 		['foo[]bar', 'backcolor', 'formatblock'],
  4305 		['foo[]bar', 'backcolor', 'formatblock', 'inserttext'],
  4306 		['foo[]bar', 'backcolor', 'forwarddelete'],
  4307 		['foo[]bar', 'backcolor', 'forwarddelete', 'inserttext'],
  4308 		['foo[]bar', 'backcolor', 'indent'],
  4309 		['foo[]bar', 'backcolor', 'indent', 'inserttext'],
  4310 		['foo[]bar', 'backcolor', 'inserthorizontalrule'],
  4311 		['foo[]bar', 'backcolor', 'inserthorizontalrule', 'inserttext'],
  4312 		['foo[]bar', 'backcolor', 'inserthtml'],
  4313 		['foo[]bar', 'backcolor', 'inserthtml', 'inserttext'],
  4314 		['foo[]bar', 'backcolor', 'insertimage'],
  4315 		['foo[]bar', 'backcolor', 'insertimage', 'inserttext'],
  4316 		['foo[]bar', 'backcolor', 'insertlinebreak'],
  4317 		['foo[]bar', 'backcolor', 'insertlinebreak', 'inserttext'],
  4318 		['foo[]bar', 'backcolor', 'insertorderedlist'],
  4319 		['foo[]bar', 'backcolor', 'insertorderedlist', 'inserttext'],
  4320 		['foo[]bar', 'backcolor', 'insertparagraph'],
  4321 		['foo[]bar', 'backcolor', 'insertparagraph', 'inserttext'],
  4322 		['foo[]bar', 'backcolor', 'insertunorderedlist'],
  4323 		['foo[]bar', 'backcolor', 'insertunorderedlist', 'inserttext'],
  4324 		['foo[]bar', 'backcolor', 'justifycenter'],
  4325 		['foo[]bar', 'backcolor', 'justifycenter', 'inserttext'],
  4326 		['foo[]bar', 'backcolor', 'justifyfull'],
  4327 		['foo[]bar', 'backcolor', 'justifyfull', 'inserttext'],
  4328 		['foo[]bar', 'backcolor', 'justifyleft'],
  4329 		['foo[]bar', 'backcolor', 'justifyleft', 'inserttext'],
  4330 		['foo[]bar', 'backcolor', 'justifyright'],
  4331 		['foo[]bar', 'backcolor', 'justifyright', 'inserttext'],
  4332 		['foo[]bar', 'backcolor', 'outdent'],
  4333 		['foo[]bar', 'backcolor', 'outdent', 'inserttext'],
  4335 		['foo[]bar', 'createlink', 'inserttext'],
  4336 		['foo[]bar', 'createlink', 'delete'],
  4337 		['foo[]bar', 'createlink', 'delete', 'inserttext'],
  4338 		['foo[]bar', 'createlink', 'formatblock'],
  4339 		['foo[]bar', 'createlink', 'formatblock', 'inserttext'],
  4340 		['foo[]bar', 'createlink', 'forwarddelete'],
  4341 		['foo[]bar', 'createlink', 'forwarddelete', 'inserttext'],
  4342 		['foo[]bar', 'createlink', 'indent'],
  4343 		['foo[]bar', 'createlink', 'indent', 'inserttext'],
  4344 		['foo[]bar', 'createlink', 'inserthorizontalrule'],
  4345 		['foo[]bar', 'createlink', 'inserthorizontalrule', 'inserttext'],
  4346 		['foo[]bar', 'createlink', 'inserthtml'],
  4347 		['foo[]bar', 'createlink', 'inserthtml', 'inserttext'],
  4348 		['foo[]bar', 'createlink', 'insertimage'],
  4349 		['foo[]bar', 'createlink', 'insertimage', 'inserttext'],
  4350 		['foo[]bar', 'createlink', 'insertlinebreak'],
  4351 		['foo[]bar', 'createlink', 'insertlinebreak', 'inserttext'],
  4352 		['foo[]bar', 'createlink', 'insertorderedlist'],
  4353 		['foo[]bar', 'createlink', 'insertorderedlist', 'inserttext'],
  4354 		['foo[]bar', 'createlink', 'insertparagraph'],
  4355 		['foo[]bar', 'createlink', 'insertparagraph', 'inserttext'],
  4356 		['foo[]bar', 'createlink', 'insertunorderedlist'],
  4357 		['foo[]bar', 'createlink', 'insertunorderedlist', 'inserttext'],
  4358 		['foo[]bar', 'createlink', 'justifycenter'],
  4359 		['foo[]bar', 'createlink', 'justifycenter', 'inserttext'],
  4360 		['foo[]bar', 'createlink', 'justifyfull'],
  4361 		['foo[]bar', 'createlink', 'justifyfull', 'inserttext'],
  4362 		['foo[]bar', 'createlink', 'justifyleft'],
  4363 		['foo[]bar', 'createlink', 'justifyleft', 'inserttext'],
  4364 		['foo[]bar', 'createlink', 'justifyright'],
  4365 		['foo[]bar', 'createlink', 'justifyright', 'inserttext'],
  4366 		['foo[]bar', 'createlink', 'outdent'],
  4367 		['foo[]bar', 'createlink', 'outdent', 'inserttext'],
  4369 		['foo[]bar', 'fontname', 'inserttext'],
  4370 		['foo[]bar', 'fontname', 'delete'],
  4371 		['foo[]bar', 'fontname', 'delete', 'inserttext'],
  4372 		['foo[]bar', 'fontname', 'formatblock'],
  4373 		['foo[]bar', 'fontname', 'formatblock', 'inserttext'],
  4374 		['foo[]bar', 'fontname', 'forwarddelete'],
  4375 		['foo[]bar', 'fontname', 'forwarddelete', 'inserttext'],
  4376 		['foo[]bar', 'fontname', 'indent'],
  4377 		['foo[]bar', 'fontname', 'indent', 'inserttext'],
  4378 		['foo[]bar', 'fontname', 'inserthorizontalrule'],
  4379 		['foo[]bar', 'fontname', 'inserthorizontalrule', 'inserttext'],
  4380 		['foo[]bar', 'fontname', 'inserthtml'],
  4381 		['foo[]bar', 'fontname', 'inserthtml', 'inserttext'],
  4382 		['foo[]bar', 'fontname', 'insertimage'],
  4383 		['foo[]bar', 'fontname', 'insertimage', 'inserttext'],
  4384 		['foo[]bar', 'fontname', 'insertlinebreak'],
  4385 		['foo[]bar', 'fontname', 'insertlinebreak', 'inserttext'],
  4386 		['foo[]bar', 'fontname', 'insertorderedlist'],
  4387 		['foo[]bar', 'fontname', 'insertorderedlist', 'inserttext'],
  4388 		['foo[]bar', 'fontname', 'insertparagraph'],
  4389 		['foo[]bar', 'fontname', 'insertparagraph', 'inserttext'],
  4390 		['foo[]bar', 'fontname', 'insertunorderedlist'],
  4391 		['foo[]bar', 'fontname', 'insertunorderedlist', 'inserttext'],
  4392 		['foo[]bar', 'fontname', 'justifycenter'],
  4393 		['foo[]bar', 'fontname', 'justifycenter', 'inserttext'],
  4394 		['foo[]bar', 'fontname', 'justifyfull'],
  4395 		['foo[]bar', 'fontname', 'justifyfull', 'inserttext'],
  4396 		['foo[]bar', 'fontname', 'justifyleft'],
  4397 		['foo[]bar', 'fontname', 'justifyleft', 'inserttext'],
  4398 		['foo[]bar', 'fontname', 'justifyright'],
  4399 		['foo[]bar', 'fontname', 'justifyright', 'inserttext'],
  4400 		['foo[]bar', 'fontname', 'outdent'],
  4401 		['foo[]bar', 'fontname', 'outdent', 'inserttext'],
  4403 		['foo[]bar', 'fontsize', 'inserttext'],
  4404 		['foo[]bar', 'fontsize', 'delete'],
  4405 		['foo[]bar', 'fontsize', 'delete', 'inserttext'],
  4406 		['foo[]bar', 'fontsize', 'formatblock'],
  4407 		['foo[]bar', 'fontsize', 'formatblock', 'inserttext'],
  4408 		['foo[]bar', 'fontsize', 'forwarddelete'],
  4409 		['foo[]bar', 'fontsize', 'forwarddelete', 'inserttext'],
  4410 		['foo[]bar', 'fontsize', 'indent'],
  4411 		['foo[]bar', 'fontsize', 'indent', 'inserttext'],
  4412 		['foo[]bar', 'fontsize', 'inserthorizontalrule'],
  4413 		['foo[]bar', 'fontsize', 'inserthorizontalrule', 'inserttext'],
  4414 		['foo[]bar', 'fontsize', 'inserthtml'],
  4415 		['foo[]bar', 'fontsize', 'inserthtml', 'inserttext'],
  4416 		['foo[]bar', 'fontsize', 'insertimage'],
  4417 		['foo[]bar', 'fontsize', 'insertimage', 'inserttext'],
  4418 		['foo[]bar', 'fontsize', 'insertlinebreak'],
  4419 		['foo[]bar', 'fontsize', 'insertlinebreak', 'inserttext'],
  4420 		['foo[]bar', 'fontsize', 'insertorderedlist'],
  4421 		['foo[]bar', 'fontsize', 'insertorderedlist', 'inserttext'],
  4422 		['foo[]bar', 'fontsize', 'insertparagraph'],
  4423 		['foo[]bar', 'fontsize', 'insertparagraph', 'inserttext'],
  4424 		['foo[]bar', 'fontsize', 'insertunorderedlist'],
  4425 		['foo[]bar', 'fontsize', 'insertunorderedlist', 'inserttext'],
  4426 		['foo[]bar', 'fontsize', 'justifycenter'],
  4427 		['foo[]bar', 'fontsize', 'justifycenter', 'inserttext'],
  4428 		['foo[]bar', 'fontsize', 'justifyfull'],
  4429 		['foo[]bar', 'fontsize', 'justifyfull', 'inserttext'],
  4430 		['foo[]bar', 'fontsize', 'justifyleft'],
  4431 		['foo[]bar', 'fontsize', 'justifyleft', 'inserttext'],
  4432 		['foo[]bar', 'fontsize', 'justifyright'],
  4433 		['foo[]bar', 'fontsize', 'justifyright', 'inserttext'],
  4434 		['foo[]bar', 'fontsize', 'outdent'],
  4435 		['foo[]bar', 'fontsize', 'outdent', 'inserttext'],
  4437 		['foo[]bar', 'forecolor', 'inserttext'],
  4438 		['foo[]bar', 'forecolor', 'delete'],
  4439 		['foo[]bar', 'forecolor', 'delete', 'inserttext'],
  4440 		['foo[]bar', 'forecolor', 'formatblock'],
  4441 		['foo[]bar', 'forecolor', 'formatblock', 'inserttext'],
  4442 		['foo[]bar', 'forecolor', 'forwarddelete'],
  4443 		['foo[]bar', 'forecolor', 'forwarddelete', 'inserttext'],
  4444 		['foo[]bar', 'forecolor', 'indent'],
  4445 		['foo[]bar', 'forecolor', 'indent', 'inserttext'],
  4446 		['foo[]bar', 'forecolor', 'inserthorizontalrule'],
  4447 		['foo[]bar', 'forecolor', 'inserthorizontalrule', 'inserttext'],
  4448 		['foo[]bar', 'forecolor', 'inserthtml'],
  4449 		['foo[]bar', 'forecolor', 'inserthtml', 'inserttext'],
  4450 		['foo[]bar', 'forecolor', 'insertimage'],
  4451 		['foo[]bar', 'forecolor', 'insertimage', 'inserttext'],
  4452 		['foo[]bar', 'forecolor', 'insertlinebreak'],
  4453 		['foo[]bar', 'forecolor', 'insertlinebreak', 'inserttext'],
  4454 		['foo[]bar', 'forecolor', 'insertorderedlist'],
  4455 		['foo[]bar', 'forecolor', 'insertorderedlist', 'inserttext'],
  4456 		['foo[]bar', 'forecolor', 'insertparagraph'],
  4457 		['foo[]bar', 'forecolor', 'insertparagraph', 'inserttext'],
  4458 		['foo[]bar', 'forecolor', 'insertunorderedlist'],
  4459 		['foo[]bar', 'forecolor', 'insertunorderedlist', 'inserttext'],
  4460 		['foo[]bar', 'forecolor', 'justifycenter'],
  4461 		['foo[]bar', 'forecolor', 'justifycenter', 'inserttext'],
  4462 		['foo[]bar', 'forecolor', 'justifyfull'],
  4463 		['foo[]bar', 'forecolor', 'justifyfull', 'inserttext'],
  4464 		['foo[]bar', 'forecolor', 'justifyleft'],
  4465 		['foo[]bar', 'forecolor', 'justifyleft', 'inserttext'],
  4466 		['foo[]bar', 'forecolor', 'justifyright'],
  4467 		['foo[]bar', 'forecolor', 'justifyright', 'inserttext'],
  4468 		['foo[]bar', 'forecolor', 'outdent'],
  4469 		['foo[]bar', 'forecolor', 'outdent', 'inserttext'],
  4471 		['foo[]bar', 'hilitecolor', 'inserttext'],
  4472 		['foo[]bar', 'hilitecolor', 'delete'],
  4473 		['foo[]bar', 'hilitecolor', 'delete', 'inserttext'],
  4474 		['foo[]bar', 'hilitecolor', 'formatblock'],
  4475 		['foo[]bar', 'hilitecolor', 'formatblock', 'inserttext'],
  4476 		['foo[]bar', 'hilitecolor', 'forwarddelete'],
  4477 		['foo[]bar', 'hilitecolor', 'forwarddelete', 'inserttext'],
  4478 		['foo[]bar', 'hilitecolor', 'indent'],
  4479 		['foo[]bar', 'hilitecolor', 'indent', 'inserttext'],
  4480 		['foo[]bar', 'hilitecolor', 'inserthorizontalrule'],
  4481 		['foo[]bar', 'hilitecolor', 'inserthorizontalrule', 'inserttext'],
  4482 		['foo[]bar', 'hilitecolor', 'inserthtml'],
  4483 		['foo[]bar', 'hilitecolor', 'inserthtml', 'inserttext'],
  4484 		['foo[]bar', 'hilitecolor', 'insertimage'],
  4485 		['foo[]bar', 'hilitecolor', 'insertimage', 'inserttext'],
  4486 		['foo[]bar', 'hilitecolor', 'insertlinebreak'],
  4487 		['foo[]bar', 'hilitecolor', 'insertlinebreak', 'inserttext'],
  4488 		['foo[]bar', 'hilitecolor', 'insertorderedlist'],
  4489 		['foo[]bar', 'hilitecolor', 'insertorderedlist', 'inserttext'],
  4490 		['foo[]bar', 'hilitecolor', 'insertparagraph'],
  4491 		['foo[]bar', 'hilitecolor', 'insertparagraph', 'inserttext'],
  4492 		['foo[]bar', 'hilitecolor', 'insertunorderedlist'],
  4493 		['foo[]bar', 'hilitecolor', 'insertunorderedlist', 'inserttext'],
  4494 		['foo[]bar', 'hilitecolor', 'justifycenter'],
  4495 		['foo[]bar', 'hilitecolor', 'justifycenter', 'inserttext'],
  4496 		['foo[]bar', 'hilitecolor', 'justifyfull'],
  4497 		['foo[]bar', 'hilitecolor', 'justifyfull', 'inserttext'],
  4498 		['foo[]bar', 'hilitecolor', 'justifyleft'],
  4499 		['foo[]bar', 'hilitecolor', 'justifyleft', 'inserttext'],
  4500 		['foo[]bar', 'hilitecolor', 'justifyright'],
  4501 		['foo[]bar', 'hilitecolor', 'justifyright', 'inserttext'],
  4502 		['foo[]bar', 'hilitecolor', 'outdent'],
  4503 		['foo[]bar', 'hilitecolor', 'outdent', 'inserttext'],
  4505 		// Test things that interfere with each other
  4506 		['foo[]bar', 'superscript', 'subscript', 'inserttext'],
  4507 		['foo[]bar', 'subscript', 'superscript', 'inserttext'],
  4509 		['foo[]bar', 'createlink', ['forecolor', '#0000FF'], 'inserttext'],
  4510 		['foo[]bar', ['forecolor', '#0000FF'], 'createlink', 'inserttext'],
  4511 		['foo[]bar', 'createlink', ['forecolor', 'blue'], 'inserttext'],
  4512 		['foo[]bar', ['forecolor', 'blue'], 'createlink', 'inserttext'],
  4513 		['foo[]bar', 'createlink', ['forecolor', 'brown'], 'inserttext'],
  4514 		['foo[]bar', ['forecolor', 'brown'], 'createlink', 'inserttext'],
  4515 		['foo[]bar', 'createlink', ['forecolor', 'black'], 'inserttext'],
  4516 		['foo[]bar', ['forecolor', 'black'], 'createlink', 'inserttext'],
  4517 		['foo[]bar', 'createlink', 'underline', 'inserttext'],
  4518 		['foo[]bar', 'underline', 'createlink', 'inserttext'],
  4519 		['foo[]bar', 'createlink', 'underline', 'underline', 'inserttext'],
  4520 		['foo[]bar', 'underline', 'underline', 'createlink', 'inserttext'],
  4522 		['foo[]bar', 'subscript', ['fontsize', '2'], 'inserttext'],
  4523 		['foo[]bar', ['fontsize', '2'], 'subscript', 'inserttext'],
  4524 		['foo[]bar', 'subscript', ['fontsize', '3'], 'inserttext'],
  4525 		['foo[]bar', ['fontsize', '3'], 'subscript', 'inserttext'],
  4527 		['foo[]bar', ['hilitecolor', 'aqua'], ['backcolor', 'tan'], 'inserttext'],
  4528 		['foo[]bar', ['backcolor', 'tan'], ['hilitecolor', 'aqua'], 'inserttext'],
  4531 		// The following are all just inserttext tests that we took from there,
  4532 		// but we first backspace the selected text instead of letting
  4533 		// inserttext handle it.  This tests that deletion correctly sets
  4534 		// overrides.
  4535 		['foo<b>[bar]</b>baz', 'delete', 'inserttext'],
  4536 		['foo<i>[bar]</i>baz', 'delete', 'inserttext'],
  4537 		['foo<s>[bar]</s>baz', 'delete', 'inserttext'],
  4538 		['foo<sub>[bar]</sub>baz', 'delete', 'inserttext'],
  4539 		['foo<sup>[bar]</sup>baz', 'delete', 'inserttext'],
  4540 		['foo<u>[bar]</u>baz', 'delete', 'inserttext'],
  4541 		['foo<a href=http://www.google.com>[bar]</a>baz', 'delete', 'inserttext'],
  4542 		['foo<font face=sans-serif>[bar]</font>baz', 'delete', 'inserttext'],
  4543 		['foo<font size=4>[bar]</font>baz', 'delete', 'inserttext'],
  4544 		['foo<font color=#0000FF>[bar]</font>baz', 'delete', 'inserttext'],
  4545 		['foo<span style=background-color:#00FFFF>[bar]</span>baz', 'delete', 'inserttext'],
  4546 		['foo<a href=http://www.google.com><font color=blue>[bar]</font></a>baz', 'delete', 'inserttext'],
  4547 		['foo<font color=blue><a href=http://www.google.com>[bar]</a></font>baz', 'delete', 'inserttext'],
  4548 		['foo<a href=http://www.google.com><font color=brown>[bar]</font></a>baz', 'delete', 'inserttext'],
  4549 		['foo<font color=brown><a href=http://www.google.com>[bar]</a></font>baz', 'delete', 'inserttext'],
  4550 		['foo<a href=http://www.google.com><font color=black>[bar]</font></a>baz', 'delete', 'inserttext'],
  4551 		['foo<a href=http://www.google.com><u>[bar]</u></a>baz', 'delete', 'inserttext'],
  4552 		['foo<u><a href=http://www.google.com>[bar]</a></u>baz', 'delete', 'inserttext'],
  4553 		['foo<sub><font size=2>[bar]</font></sub>baz', 'delete', 'inserttext'],
  4554 		['foo<font size=2><sub>[bar]</sub></font>baz', 'delete', 'inserttext'],
  4555 		['foo<sub><font size=3>[bar]</font></sub>baz', 'delete', 'inserttext'],
  4556 		['foo<font size=3><sub>[bar]</sub></font>baz', 'delete', 'inserttext'],
  4558 		// Now repeat but with different selections.
  4559 		['[foo<b>bar]</b>baz', 'delete', 'inserttext'],
  4560 		['[foo<i>bar]</i>baz', 'delete', 'inserttext'],
  4561 		['[foo<s>bar]</s>baz', 'delete', 'inserttext'],
  4562 		['[foo<sub>bar]</sub>baz', 'delete', 'inserttext'],
  4563 		['[foo<sup>bar]</sup>baz', 'delete', 'inserttext'],
  4564 		['[foo<u>bar]</u>baz', 'delete', 'inserttext'],
  4565 		['[foo<a href=http://www.google.com>bar]</a>baz', 'delete', 'inserttext'],
  4566 		['[foo<font face=sans-serif>bar]</font>baz', 'delete', 'inserttext'],
  4567 		['[foo<font size=4>bar]</font>baz', 'delete', 'inserttext'],
  4568 		['[foo<font color=#0000FF>bar]</font>baz', 'delete', 'inserttext'],
  4569 		['[foo<span style=background-color:#00FFFF>bar]</span>baz', 'delete', 'inserttext'],
  4570 		['[foo<a href=http://www.google.com><font color=blue>bar]</font></a>baz', 'delete', 'inserttext'],
  4571 		['[foo<font color=blue><a href=http://www.google.com>bar]</a></font>baz', 'delete', 'inserttext'],
  4572 		['[foo<a href=http://www.google.com><font color=brown>bar]</font></a>baz', 'delete', 'inserttext'],
  4573 		['[foo<font color=brown><a href=http://www.google.com>bar]</a></font>baz', 'delete', 'inserttext'],
  4574 		['[foo<a href=http://www.google.com><font color=black>bar]</font></a>baz', 'delete', 'inserttext'],
  4575 		['[foo<a href=http://www.google.com><u>bar]</u></a>baz', 'delete', 'inserttext'],
  4576 		['[foo<u><a href=http://www.google.com>bar]</a></u>baz', 'delete', 'inserttext'],
  4577 		['[foo<sub><font size=2>bar]</font></sub>baz', 'delete', 'inserttext'],
  4578 		['[foo<font size=2><sub>bar]</sub></font>baz', 'delete', 'inserttext'],
  4579 		['[foo<sub><font size=3>bar]</font></sub>baz', 'delete', 'inserttext'],
  4580 		['[foo<font size=3><sub>bar]</sub></font>baz', 'delete', 'inserttext'],
  4582 		['foo<b>[bar</b>baz]', 'delete', 'inserttext'],
  4583 		['foo<i>[bar</i>baz]', 'delete', 'inserttext'],
  4584 		['foo<s>[bar</s>baz]', 'delete', 'inserttext'],
  4585 		['foo<sub>[bar</sub>baz]', 'delete', 'inserttext'],
  4586 		['foo<sup>[bar</sup>baz]', 'delete', 'inserttext'],
  4587 		['foo<u>[bar</u>baz]', 'delete', 'inserttext'],
  4588 		['foo<a href=http://www.google.com>[bar</a>baz]', 'delete', 'inserttext'],
  4589 		['foo<font face=sans-serif>[bar</font>baz]', 'delete', 'inserttext'],
  4590 		['foo<font size=4>[bar</font>baz]', 'delete', 'inserttext'],
  4591 		['foo<font color=#0000FF>[bar</font>baz]', 'delete', 'inserttext'],
  4592 		['foo<span style=background-color:#00FFFF>[bar</span>baz]', 'delete', 'inserttext'],
  4593 		['foo<a href=http://www.google.com><font color=blue>[bar</font></a>baz]', 'delete', 'inserttext'],
  4594 		['foo<font color=blue><a href=http://www.google.com>[bar</a></font>baz]', 'delete', 'inserttext'],
  4595 		['foo<a href=http://www.google.com><font color=brown>[bar</font></a>baz]', 'delete', 'inserttext'],
  4596 		['foo<font color=brown><a href=http://www.google.com>[bar</a></font>baz]', 'delete', 'inserttext'],
  4597 		['foo<a href=http://www.google.com><font color=black>[bar</font></a>baz]', 'delete', 'inserttext'],
  4598 		['foo<a href=http://www.google.com><u>[bar</u></a>baz]', 'delete', 'inserttext'],
  4599 		['foo<u><a href=http://www.google.com>[bar</a></u>baz]', 'delete', 'inserttext'],
  4600 		['foo<sub><font size=2>[bar</font></sub>baz]', 'delete', 'inserttext'],
  4601 		['foo<font size=2><sub>[bar</sub></font>baz]', 'delete', 'inserttext'],
  4602 		['foo<sub><font size=3>[bar</font></sub>baz]', 'delete', 'inserttext'],
  4603 		['foo<font size=3><sub>[bar</sub></font>baz]', 'delete', 'inserttext'],
  4605 		// https://bugs.webkit.org/show_bug.cgi?id=19702
  4606 		['<blockquote><font color=blue>[foo]</font></blockquote>', 'delete', 'inserttext'],
  4607 	],
  4608 	//@}
  4609 };
  4610 tests.backcolor = tests.hilitecolor;
  4611 tests.insertlinebreak = tests.insertparagraph;
  4613 // Tests that start with "!" are believed to have bogus results and should be
  4614 // skipped until the relevant bugs are fixed.
  4615 var badTests = {};
  4616 (function(){
  4617 	for (var command in tests) {
  4618 		badTests[command] = [];
  4619 		for (var i = 0; i < tests[command].length; i++) {
  4620 			var test = tests[command][i];
  4621 			if (typeof test == "string" && test[0] == "!") {
  4622 				test = test.slice(1);
  4623 				tests[command][i] = test;
  4624 				badTests[command].push(test);
  4626 			if (typeof test == "object" && test[0][0] == "!") {
  4627 				test = [test[0].slice(1)].concat(test.slice(1));
  4628 				tests[command][i] = test;
  4629 				badTests[command].push(test);
  4633 })();
  4635 var defaultValues = {
  4636 //@{
  4637 	backcolor: "#00FFFF",
  4638 	createlink: "http://www.google.com/",
  4639 	fontname: "sans-serif",
  4640 	fontsize: "4",
  4641 	forecolor: "#0000FF",
  4642 	formatblock: "<div>",
  4643 	hilitecolor: "#00FFFF",
  4644 	inserthorizontalrule: "",
  4645 	inserthtml: "ab<b>c</b>d",
  4646 	insertimage: "/img/lion.svg",
  4647 	inserttext: "a",
  4648 	defaultparagraphseparator: "p",
  4649 	stylewithcss: "true",
  4650 	usecss: "true",
  4651 };
  4652 //@}
  4654 var notes = {
  4655 //@{
  4656 	fontname: 'Note that the body\'s font-family is "serif".',
  4657 };
  4658 //@}
  4660 var doubleTestingCommands = [
  4661 //@{
  4662 	"backcolor",
  4663 	"bold",
  4664 	"fontname",
  4665 	"fontsize",
  4666 	"forecolor",
  4667 	"italic",
  4668 	"justifycenter",
  4669 	"justifyfull",
  4670 	"justifyleft",
  4671 	"justifyright",
  4672 	"strikethrough",
  4673 	"stylewithcss",
  4674 	"subscript",
  4675 	"superscript",
  4676 	"underline",
  4677 	"usecss",
  4678 ];
  4679 //@}
  4681 function prettyPrint(value) {
  4682 //@{
  4683 	// Partly stolen from testharness.js
  4684 	if (typeof value != "string") {
  4685 		return String(value);
  4688 	value = value.replace(/\\/g, "\\\\")
  4689 		.replace(/"/g, '\\"');
  4691 	for (var i = 0; i < 32; i++) {
  4692 		var replace = "\\";
  4693 		switch (i) {
  4694 		case 0: replace += "0"; break;
  4695 		case 1: replace += "x01"; break;
  4696 		case 2: replace += "x02"; break;
  4697 		case 3: replace += "x03"; break;
  4698 		case 4: replace += "x04"; break;
  4699 		case 5: replace += "x05"; break;
  4700 		case 6: replace += "x06"; break;
  4701 		case 7: replace += "x07"; break;
  4702 		case 8: replace += "b"; break;
  4703 		case 9: replace += "t"; break;
  4704 		case 10: replace += "n"; break;
  4705 		case 11: replace += "v"; break;
  4706 		case 12: replace += "f"; break;
  4707 		case 13: replace += "r"; break;
  4708 		case 14: replace += "x0e"; break;
  4709 		case 15: replace += "x0f"; break;
  4710 		case 16: replace += "x10"; break;
  4711 		case 17: replace += "x11"; break;
  4712 		case 18: replace += "x12"; break;
  4713 		case 19: replace += "x13"; break;
  4714 		case 20: replace += "x14"; break;
  4715 		case 21: replace += "x15"; break;
  4716 		case 22: replace += "x16"; break;
  4717 		case 23: replace += "x17"; break;
  4718 		case 24: replace += "x18"; break;
  4719 		case 25: replace += "x19"; break;
  4720 		case 26: replace += "x1a"; break;
  4721 		case 27: replace += "x1b"; break;
  4722 		case 28: replace += "x1c"; break;
  4723 		case 29: replace += "x1d"; break;
  4724 		case 30: replace += "x1e"; break;
  4725 		case 31: replace += "x1f"; break;
  4727 		value = value.replace(new RegExp(String.fromCharCode(i), "g"), replace);
  4729 	return '"' + value + '"';
  4731 //@}
  4733 function doSetup(selector, idx) {
  4734 //@{
  4735 	var table = document.querySelectorAll(selector)[idx];
  4737 	var tr = document.createElement("tr");
  4738 	table.firstChild.appendChild(tr);
  4739 	tr.className = (tr.className + " active").trim();
  4741 	return tr;
  4743 //@}
  4745 function queryOutputHelper(beforeIndeterm, beforeState, beforeValue,
  4746                            afterIndeterm, afterState, afterValue,
  4747                            command, value) {
  4748 //@{
  4749 	var frag = document.createDocumentFragment();
  4750 	var beforeDiv = document.createElement("div");
  4751 	var afterDiv = document.createElement("div");
  4752 	frag.appendChild(beforeDiv);
  4753 	frag.appendChild(afterDiv);
  4754 	beforeDiv.className = afterDiv.className = "extra-results";
  4755 	beforeDiv.textContent = "Before: ";
  4756 	afterDiv.textContent = "After: ";
  4758 	beforeDiv.appendChild(document.createElement("span"));
  4759 	afterDiv.appendChild(document.createElement("span"));
  4760 	if ("indeterm" in commands[command]) {
  4761 		// We only know it has to be either true or false.
  4762 		if (beforeIndeterm !== true && beforeIndeterm !== false) {
  4763 			beforeDiv.lastChild.className = "bad-result";
  4765 	} else {
  4766 		// It always has to be false.
  4767 		beforeDiv.lastChild.className = beforeIndeterm === false
  4768 			? "good-result"
  4769 			: "bad-result";
  4771 	// After running the command, indeterminate must always be false, except if
  4772 	// it's an exception, or if it's insert*list and the state was true to
  4773 	// begin with.  And we can't help strikethrough/underline.
  4774 	if ((/^insert(un)?orderedlist$/.test(command) && beforeState)
  4775 	|| command == "strikethrough"
  4776 	|| command == "underline") {
  4777 		if (afterIndeterm !== true && afterIndeterm !== false) {
  4778 			afterDiv.lastChild.className = "bad-result";
  4780 	} else {
  4781 		afterDiv.lastChild.className =
  4782 			afterIndeterm === false
  4783 				? "good-result"
  4784 				: "bad-result";
  4786 	beforeDiv.lastChild.textContent = "indeterm " + prettyPrint(beforeIndeterm);
  4787 	afterDiv.lastChild.textContent = "indeterm " + prettyPrint(afterIndeterm);
  4789 	beforeDiv.appendChild(document.createTextNode(", "));
  4790 	afterDiv.appendChild(document.createTextNode(", "));
  4792 	beforeDiv.appendChild(document.createElement("span"));
  4793 	afterDiv.appendChild(document.createElement("span"));
  4794 	if (/^insert(un)?orderedlist$/.test(command)) {
  4795 		// If the before state is true, the after state could be either true or
  4796 		// false.  But if the before state is false, the after state has to be
  4797 		// true.
  4798 		if (beforeState !== true && beforeState !== false) {
  4799 			beforeDiv.lastChild.className = "bad-result";
  4801 		if (!beforeState) {
  4802 			afterDiv.lastChild.className = afterState === true
  4803 				? "good-result"
  4804 				: "bad-result";
  4805 		} else if (afterState !== true && afterState !== false) {
  4806 			afterDiv.lastChild.className = "bad-result";
  4808 	} else if (/^justify(center|full|left|right)$/.test(command)) {
  4809 		// We don't know about the before state, but the after state is always
  4810 		// supposed to be true.
  4811 		if (beforeState !== true && beforeState !== false) {
  4812 			beforeDiv.lastChild.className = "bad-result";
  4814 		afterDiv.lastChild.className = afterState === true
  4815 			? "good-result"
  4816 			: "bad-result";
  4817 	} else if (command == "strikethrough" || command == "underline") {
  4818 		// The only thing we can say is the before/after states need to be
  4819 		// either true or false.
  4820 		if (beforeState !== true && beforeState !== false) {
  4821 			beforeDiv.lastChild.className = "bad-result";
  4823 		if (afterState !== true && afterState !== false) {
  4824 			afterDiv.lastChild.className = "bad-result";
  4826 	} else {
  4827 		// The general rule is it must flip the state, unless there's no state
  4828 		// defined, in which case it should always be false.
  4829 		beforeDiv.lastChild.className =
  4830 		afterDiv.lastChild.className =
  4831 			("state" in commands[command] && typeof beforeState == "boolean" && typeof afterState == "boolean" && beforeState === !afterState)
  4832 			|| (!("state" in commands[command]) && beforeState === false && afterState === false)
  4833 				? "good-result"
  4834 				: "bad-result";
  4836 	beforeDiv.lastChild.textContent = "state " + prettyPrint(beforeState);
  4837 	afterDiv.lastChild.textContent = "state " + prettyPrint(afterState);
  4839 	beforeDiv.appendChild(document.createTextNode(", "));
  4840 	afterDiv.appendChild(document.createTextNode(", "));
  4842 	beforeDiv.appendChild(document.createElement("span"));
  4843 	afterDiv.appendChild(document.createElement("span"));
  4845 	// Direct equality comparison doesn't make sense in a bunch of cases.
  4846 	if (command == "backcolor" || command == "forecolor" || command == "hilitecolor") {
  4847 		if (/^([0-9a-fA-F]{3}){1,2}$/.test(value)) {
  4848 			value = "#" + value;
  4850 	} else if (command == "fontsize") {
  4851 		value = normalizeFontSize(value);
  4852 		if (value !== null) {
  4853 			value = String(cssSizeToLegacy(value));
  4855 	} else if (command == "formatblock") {
  4856 		value = value.replace(/^<(.*)>$/, "$1").toLowerCase();
  4857 	} else if (command == "defaultparagraphseparator") {
  4858 		value = value.toLowerCase();
  4859 		if (value != "p" && value != "div") {
  4860 			value = "";
  4864 	if (((command == "backcolor" || command == "forecolor" || command == "hilitecolor") && value.toLowerCase() == "currentcolor")
  4865 	|| (command == "fontsize" && value === null)
  4866 	|| (command == "formatblock" && formattableBlockNames.indexOf(value.replace(/^<(.*)>$/, "$1").trim()) == -1)
  4867 	|| (command == "defaultparagraphseparator" && value == "")) {
  4868 		afterDiv.lastChild.className = beforeValue === afterValue
  4869 			? "good-result"
  4870 			: "bad-result";
  4871 	} else if (/^justify(center|full|left|right)$/.test(command)) {
  4872 		// We know there are only four correct values beforehand, and afterward
  4873 		// the value has to be the one we set.
  4874 		if (!/^(center|justify|left|right)$/.test(beforeValue)) {
  4875 			beforeDiv.lastChild.className = "bad-result";
  4877 		var expectedValue = command == "justifyfull"
  4878 			? "justify"
  4879 			: command.replace("justify", "");
  4880 		afterDiv.lastChild.className = afterValue === expectedValue
  4881 			? "good-result"
  4882 			: "bad-result";
  4883 	} else if (!("value" in commands[command])) {
  4884 		// If it's not defined we want "".
  4885 		beforeDiv.lastChild.className = beforeValue === ""
  4886 			? "good-result"
  4887 			: "bad-result";
  4888 		afterDiv.lastChild.className = afterValue === ""
  4889 			? "good-result"
  4890 			: "bad-result";
  4891 	} else {
  4892 		// And in all other cases, the value afterwards has to be the one we
  4893 		// set.
  4894 		afterDiv.lastChild.className =
  4895 			areEquivalentValues(command, afterValue, value)
  4896 				? "good-result"
  4897 				: "bad-result";
  4899 	beforeDiv.lastChild.textContent = "value " + prettyPrint(beforeValue);
  4900 	afterDiv.lastChild.textContent = "value " + prettyPrint(afterValue);
  4902 	return frag;
  4904 //@}
  4906 function normalizeTest(command, test, styleWithCss) {
  4907 //@{
  4908 	// Our standard format for test processing is:
  4909 	//   [input HTML, [command1, value1], [command2, value2], ...]
  4910 	// But this is verbose, so we actually use three different formats in the
  4911 	// tests and multiTests arrays:
  4912 	//
  4913 	// 1) Plain string giving the input HTML.  The command is implicit from the
  4914 	// key of the tests array.  If the command takes values, the value is given
  4915 	// by defaultValues, otherwise it's "".  Has to be converted to
  4916 	// [input HTML, [command, value].
  4917 	//
  4918 	// 2) Two-element array [value, input HTML].  Has to be converted to
  4919 	// [input HTML, [command, value]].
  4920 	//
  4921 	// 3) An element of multiTests.  This just has to have values filled in.
  4922 	//
  4923 	// Optionally, a styleWithCss argument can be passed, either true or false.
  4924 	// If it is, we'll prepend a styleWithCss invocation.
  4925 	if (command == "multitest") {
  4926 		if (typeof test == "string") {
  4927 			test = JSON.parse(test);
  4929 		for (var i = 1; i < test.length; i++) {
  4930 			if (typeof test[i] == "string"
  4931 			&& test[i] in defaultValues) {
  4932 				test[i] = [test[i], defaultValues[test[i]]];
  4933 			} else if (typeof test[i] == "string") {
  4934 				test[i] = [test[i], ""];
  4937 		return test;
  4940 	if (typeof test == "string") {
  4941 		if (command in defaultValues) {
  4942 			test = [test, [command, defaultValues[command]]];
  4943 		} else {
  4944 			test = [test, [command, ""]];
  4946 	} else if (test.length == 2) {
  4947 		test = [test[1], [command, String(test[0])]];
  4950 	if (styleWithCss !== undefined) {
  4951 		test.splice(1, 0, ["stylewithcss", String(styleWithCss)]);
  4954 	return test;
  4956 //@}
  4958 function doInputCell(tr, test, command) {
  4959 //@{
  4960 	var testHtml = test[0];
  4962 	var msg = null;
  4963 	if (command in defaultValues) {
  4964 		// Single command with a value, possibly with a styleWithCss stuck
  4965 		// before.  We don't need to specify the command itself, since this
  4966 		// presumably isn't in multiTests, so the command is already given by
  4967 		// the section header.
  4968 		msg = 'value: ' + prettyPrint(test[test.length - 1][1]);
  4969 	} else if (command == "multitest") {
  4970 		// Uses a different input format
  4971 		msg = JSON.stringify(test);
  4973 	var inputCell = document.createElement("td");
  4974 	inputCell.innerHTML = "<div></div><div></div>";
  4975 	inputCell.firstChild.innerHTML = testHtml;
  4976 	inputCell.lastChild.textContent = inputCell.firstChild.innerHTML;
  4977 	if (msg !== null) {
  4978 		inputCell.lastChild.textContent += " (" + msg + ")";
  4981 	tr.appendChild(inputCell);
  4983 //@}
  4985 function doSpecCell(tr, test, command) {
  4986 //@{
  4987 	var specCell = document.createElement("td");
  4988 	tr.appendChild(specCell);
  4989 	try {
  4990 		var points = setupCell(specCell, test[0]);
  4991 		var range = document.createRange();
  4992 		range.setStart(points[0], points[1]);
  4993 		range.setEnd(points[2], points[3]);
  4994 		// The points might be backwards
  4995 		if (range.collapsed) {
  4996 			range.setEnd(points[0], points[1]);
  4998 		specCell.firstChild.contentEditable = "true";
  4999 		specCell.firstChild.spellcheck = false;
  5001 		if (command != "multitest") {
  5002 			try { var beforeIndeterm = myQueryCommandIndeterm(command, range) }
  5003 			catch(e) { beforeIndeterm = "Exception" }
  5004 			try { var beforeState = myQueryCommandState(command, range) }
  5005 			catch(e) { beforeState = "Exception" }
  5006 			try { var beforeValue = myQueryCommandValue(command, range) }
  5007 			catch(e) { beforeValue = "Exception" }
  5010 		for (var i = 1; i < test.length; i++) {
  5011 			myExecCommand(test[i][0], false, test[i][1], range);
  5014 		if (command != "multitest") {
  5015 			try { var afterIndeterm = myQueryCommandIndeterm(command, range) }
  5016 			catch(e) { afterIndeterm = "Exception" }
  5017 			try { var afterState = myQueryCommandState(command, range) }
  5018 			catch(e) { afterState = "Exception" }
  5019 			try { var afterValue = myQueryCommandValue(command, range) }
  5020 			catch(e) { afterValue = "Exception" }
  5023 		specCell.firstChild.contentEditable = "inherit";
  5024 		specCell.firstChild.removeAttribute("spellcheck");
  5025 		var compareDiv1 = specCell.firstChild.cloneNode(true);
  5027 		// Now do various sanity checks, and throw if they're violated.  First
  5028 		// just count children:
  5029 		if (specCell.childNodes.length != 2) {
  5030 			throw "The cell didn't have two children.  Did something spill outside the test div?";
  5033 		// Now verify that the DOM serializes.
  5034 		compareDiv1.normalize();
  5035 		var compareDiv2 = compareDiv1.cloneNode(false);
  5036 		compareDiv2.innerHTML = compareDiv1.innerHTML;
  5037 		// Oddly, IE9 sometimes produces two nodes that return true for
  5038 		// isEqualNode but have different innerHTML (omitting closing tags vs.
  5039 		// not).
  5040 		if (!compareDiv1.isEqualNode(compareDiv2)
  5041 		&& compareDiv1.innerHTML != compareDiv2.innerHTML) {
  5042 			throw "DOM does not round-trip through serialization!  "
  5043 				+ compareDiv1.innerHTML + " vs. " + compareDiv2.innerHTML;
  5045 		if (!compareDiv1.isEqualNode(compareDiv2)) {
  5046 			throw "DOM does not round-trip through serialization (although innerHTML is the same)!  "
  5047 				+ compareDiv1.innerHTML;
  5050 		// Check for attributes
  5051 		if (specCell.firstChild.attributes.length) {
  5052 			throw "Wrapper div has attributes!  " +
  5053 				specCell.innerHTML.replace(/<div><\/div>$/, "");
  5056 		// Final sanity check: make sure everything isAllowedChild() of its
  5057 		// parent.
  5058 		getDescendants(specCell.firstChild).forEach(function(descendant) {
  5059 			if (!isAllowedChild(descendant, descendant.parentNode)) {
  5060 				throw "Something here is not an allowed child of its parent: " + descendant;
  5062 		});
  5064 		addBrackets(range);
  5066 		specCell.lastChild.textContent = specCell.firstChild.innerHTML;
  5067 		if (command != "multitest") {
  5068 			specCell.lastChild.appendChild(queryOutputHelper(
  5069 				beforeIndeterm, beforeState, beforeValue,
  5070 				afterIndeterm, afterState, afterValue,
  5071 				command, test[test.length - 1][1]));
  5072 			if (specCell.querySelector(".bad-result")) {
  5073 				specCell.parentNode.className = "alert";
  5076 	} catch (e) {
  5077 		specCell.firstChild.contentEditable = "inherit";
  5078 		specCell.firstChild.removeAttribute("spellcheck");
  5079 		specCell.lastChild.textContent = "Exception: " + formatException(e);
  5081 		specCell.parentNode.className = "alert";
  5082 		specCell.lastChild.className = "alert";
  5084 		// Don't bother comparing to localStorage, this is always wrong no
  5085 		// matter what.
  5086 		return;
  5089 	if (command != "multitest") {
  5090 		// Old storage format
  5091 		var key = "execcommand-" + command
  5092 			+ "-" + (test.length == 2 || test[1][1] == "false" ? "0" : "1")
  5093 			+ "-" + tr.firstChild.lastChild.textContent;
  5094 	} else {
  5095 		var key = "execcommand-" + JSON.stringify(test);
  5098 	// Use getItem() instead of direct property access to work around Firefox
  5099 	// bug: https://bugzilla.mozilla.org/show_bug.cgi?id=532062
  5100 	var oldValue = localStorage.getItem(key);
  5101 	var newValue = specCell.lastChild.firstChild.textContent;
  5103 	// Ignore differences between {} and [].
  5104 	if (oldValue === null
  5105 	|| oldValue.replace("{}", "[]") !== newValue.replace("{}", "[]")) {
  5106 		specCell.parentNode.className = "alert";
  5107 		var alertDiv = document.createElement("div");
  5108 		specCell.lastChild.appendChild(alertDiv);
  5109 		alertDiv.className = "alert";
  5110 		if (oldValue === null) {
  5111 			alertDiv.textContent = "Newly added test result";
  5112 		} else if (oldValue.replace(/[\[\]{}]/g, "") == newValue.replace(/[\[\]{}]/g, "")) {
  5113 			alertDiv.textContent = "Last run produced a different selection: " + oldValue;
  5114 		} else {
  5115 			alertDiv.textContent = "Last run produced different markup: " + oldValue;
  5118 		var button = document.createElement("button");
  5119 		alertDiv.appendChild(button);
  5120 		button.textContent = "Store new result";
  5121 		button.className = "store-new-result";
  5122 		button.onclick = (function(key, val, alertDiv) { return function() {
  5123 			localStorage[key] = val;
  5124 			// Make it easier to do mass updates, and also to jump to the next
  5125 			// new result
  5126 			var buttons = document.getElementsByClassName("store-new-result");
  5127 			for (var i = 0; i < buttons.length; i++) {
  5128 				if (isDescendant(buttons[i], alertDiv)
  5129 				&& i + 1 < buttons.length) {
  5130 					buttons[i + 1].focus();
  5131 					break;
  5134 			var td = alertDiv;
  5135 			while (td.tagName != "TD") {
  5136 				td = td.parentNode;
  5138 			alertDiv.parentNode.removeChild(alertDiv);
  5139 			if (!td.querySelector(".alert")) {
  5140 				td.parentNode.className = (" " + td.parentNode.className + " ")
  5141 					.replace(/ alert /g, "")
  5142 					.replace(/^ | $/g, "");
  5144 		} })(key, newValue, alertDiv);
  5147 //@}
  5149 function browserCellException(e, testDiv, browserCell) {
  5150 //@{
  5151 	if (testDiv) {
  5152 		testDiv.contenteditable = "inherit";
  5153 		testDiv.removeAttribute("spellcheck");
  5155 	browserCell.lastChild.className = "alert";
  5156 	browserCell.lastChild.textContent = "Exception: " + formatException(e);
  5157 	if (testDiv && testDiv.parentNode != browserCell) {
  5158 		browserCell.insertBefore(testDiv, browserCell.firstChild);
  5161 //@}
  5163 function formatException(e) {
  5164 //@{
  5165 	if (typeof e == "object" && "stack" in e) {
  5166 		return e + " (stack: " + e.stack + ")";
  5168 	return String(e);
  5170 //@}
  5172 function doSameCell(tr) {
  5173 //@{
  5174 	tr.className = (" " + tr.className + " ").replace(" active ", "").trim();
  5175 	if (tr.className == "") {
  5176 		tr.removeAttribute("class");
  5179 	var sameCell = document.createElement("td");
  5180 	if (!document.querySelector("#browser-checkbox").checked) {
  5181 		sameCell.className = "maybe";
  5182 		sameCell.textContent = "?";
  5183 	} else {
  5184 		var exception = false;
  5185 		try {
  5186 			// Ad hoc normalization to avoid basically spurious mismatches.  For
  5187 			// now this includes ignoring where the selection goes.
  5188 			var normalizedSpecCell = tr.childNodes[1].lastChild.firstChild.textContent
  5189 				.replace(/[[\]{}]/g, "")
  5190 				.replace(/ style="margin: 0 0 0 40px; border: none; padding: 0px;"/g, '')
  5191 				.replace(/ style="margin-right: 0px;" dir="ltr"/g, '')
  5192 				.replace(/ style="margin-left: 0px;" dir="rtl"/g, '')
  5193 				.replace(/ style="margin-(left|right): 40px;"/g, '')
  5194 				.replace(/: /g, ":")
  5195 				.replace(/;? ?"/g, '"')
  5196 				.replace(/<(\/?)strong/g, '<$1b')
  5197 				.replace(/<(\/?)strike/g, '<$1s')
  5198 				.replace(/<(\/?)em/g, '<$1i')
  5199 				.replace(/#[0-9a-fA-F]{6}/g, function(match) { return match.toUpperCase(); });
  5200 			var normalizedBrowserCell = tr.childNodes[2].lastChild.firstChild.textContent
  5201 				.replace(/[[\]{}]/g, "")
  5202 				.replace(/ style="margin: 0 0 0 40px; border: none; padding: 0px;"/g, '')
  5203 				.replace(/ style="margin-right: 0px;" dir="ltr"/g, '')
  5204 				.replace(/ style="margin-left: 0px;" dir="rtl"/g, '')
  5205 				.replace(/ style="margin-(left|right): 40px;"/g, '')
  5206 				.replace(/: /g, ":")
  5207 				.replace(/;? ?"/g, '"')
  5208 				.replace(/<(\/?)strong/g, '<$1b')
  5209 				.replace(/<(\/?)strike/g, '<$1s')
  5210 				.replace(/<(\/?)em/g, '<$1i')
  5211 				.replace(/#[0-9a-fA-F]{6}/g, function(match) { return match.toUpperCase(); })
  5212 				.replace(/ size="2" width="100%"/g, '');
  5213 			if (navigator.userAgent.indexOf("MSIE") != -1) {
  5214 				// IE produces <font style> instead of <span style>, so let's
  5215 				// translate all <span>s to <font>s.
  5216 				normalizedSpecCell = normalizedSpecCell
  5217 					.replace(/<(\/?)span/g, '<$1font');
  5218 				normalizedBrowserCell = normalizedBrowserCell
  5219 					.replace(/<(\/?)span/g, '<$1font');
  5221 		} catch (e) {
  5222 			exception = true;
  5224 		if (!exception && normalizedSpecCell == normalizedBrowserCell) {
  5225 			sameCell.className = "yes";
  5226 			sameCell.textContent = "\u2713";
  5227 		} else {
  5228 			sameCell.className = "no";
  5229 			sameCell.textContent = "\u2717";
  5232 	tr.appendChild(sameCell);
  5234 	for (var i = 0; i <= 2; i++) {
  5235 		// Insert <wbr> so IE doesn't stretch the screen.  This is considerably
  5236 		// more complicated than it has to be, thanks to Firefox's lack of
  5237 		// support for outerHTML.
  5238 		var div = tr.childNodes[i].lastChild;
  5239 		if (div.firstChild) {
  5240 			var text = div.firstChild.textContent;
  5241 			div.removeChild(div.firstChild);
  5242 			div.insertBefore(document.createElement("div"), div.firstChild);
  5243 			div.firstChild.innerHTML = text
  5244 				.replace(/&/g, "&amp;")
  5245 				.replace(/</g, "&lt;")
  5246 				.replace(/>/g, "><wbr>")
  5247 				.replace(/&lt;/g, "<wbr>&lt;");
  5248 			while (div.firstChild.hasChildNodes()) {
  5249 				div.insertBefore(div.firstChild.lastChild, div.firstChild.nextSibling);
  5251 			div.removeChild(div.firstChild);
  5254 		// Add position: absolute span to not affect vertical layout
  5255 		getDescendants(tr.childNodes[i].firstChild)
  5256 		.filter(function(node) {
  5257 			return node.nodeType == Node.TEXT_NODE
  5258 				&& /^(\{\}?|\})$/.test(node.data);
  5259 		}).forEach(function(node) {
  5260 			var span = document.createElement("span");
  5261 			span.style.position = "absolute";
  5262 			span.textContent = node.data;
  5263 			node.parentNode.insertBefore(span, node);
  5264 			node.parentNode.removeChild(node);
  5265 		});
  5268 //@}
  5270 function doTearDown(command) {
  5271 //@{
  5272 	getSelection().removeAllRanges();
  5274 //@}
  5276 function setupCell(cell, html) {
  5277 //@{
  5278 	cell.innerHTML = "<div></div><div></div>";
  5280 	return setupDiv(cell.firstChild, html);
  5282 //@}
  5284 function setupDiv(node, html) {
  5285 //@{
  5286 	// A variety of checks to avoid simple errors.  Not foolproof, of course.
  5287 	var re = /\{|\[|data-start/g;
  5288 	var markers = [];
  5289 	var marker;
  5290 	while (marker = re.exec(html)) {
  5291 		markers.push(marker);
  5293 	if (markers.length != 1) {
  5294 		throw "Need exactly one start marker ([ or { or data-start), found " + markers.length;
  5297 	var re = /\}|\]|data-end/g;
  5298 	var markers = [];
  5299 	var marker;
  5300 	while (marker = re.exec(html)) {
  5301 		markers.push(marker);
  5303 	if (markers.length != 1) {
  5304 		throw "Need exactly one end marker (] or } or data-end), found " + markers.length;
  5307 	node.innerHTML = html;
  5309 	var startNode, startOffset, endNode, endOffset;
  5311 	// For braces that don't lie inside text nodes, we can't just set
  5312 	// innerHTML, because that might disturb the DOM.  For instance, if the
  5313 	// brace is right before a <tr>, it could get moved outside the table
  5314 	// entirely, which messes everything up pretty badly.  So we instead
  5315 	// allow using data attributes: data-start and data-end on the start and
  5316 	// end nodes, with a numeric value indicating the offset.  This format
  5317 	// doesn't allow the parent div to be a start or end node, but in that case
  5318 	// you can always use the curly braces.
  5319 	if (node.querySelector("[data-start]")) {
  5320 		startNode = node.querySelector("[data-start]");
  5321 		startOffset = startNode.getAttribute("data-start");
  5322 		startNode.removeAttribute("data-start");
  5324 	if (node.querySelector("[data-end]")) {
  5325 		endNode = node.querySelector("[data-end]");
  5326 		endOffset = endNode.getAttribute("data-end");
  5327 		endNode.removeAttribute("data-end");
  5330 	var cur = node;
  5331 	while (true) {
  5332 		if (!cur || (cur != node && !(cur.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINS))) {
  5333 			break;
  5336 		if (cur.nodeType != Node.TEXT_NODE) {
  5337 			cur = nextNode(cur);
  5338 			continue;
  5341 		var data = cur.data.replace(/\]/g, "");
  5342 		var startIdx = data.indexOf("[");
  5344 		data = cur.data.replace(/\[/g, "");
  5345 		var endIdx = data.indexOf("]");
  5347 		cur.data = cur.data.replace(/[\[\]]/g, "");
  5349 		if (startIdx != -1) {
  5350 			startNode = cur;
  5351 			startOffset = startIdx;
  5354 		if (endIdx != -1) {
  5355 			endNode = cur;
  5356 			endOffset = endIdx;
  5359 		// These are only legal as the first or last
  5360 		data = cur.data.replace(/\}/g, "");
  5361 		var elStartIdx = data.indexOf("{");
  5363 		data = cur.data.replace(/\{/g, "");
  5364 		var elEndIdx = data.indexOf("}");
  5366 		if (elStartIdx == 0) {
  5367 			startNode = cur.parentNode;
  5368 			startOffset = getNodeIndex(cur);
  5369 		} else if (elStartIdx != -1) {
  5370 			startNode = cur.parentNode;
  5371 			startOffset = getNodeIndex(cur) + 1;
  5373 		if (elEndIdx == 0) {
  5374 			endNode = cur.parentNode;
  5375 			endOffset = getNodeIndex(cur);
  5376 		} else if (elEndIdx != -1) {
  5377 			endNode = cur.parentNode;
  5378 			endOffset = getNodeIndex(cur) + 1;
  5381 		cur.data = cur.data.replace(/[{}]/g, "");
  5382 		if (!cur.data.length) {
  5383 			if (cur == startNode || cur == endNode) {
  5384 				throw "You put a square bracket where there was no text node . . .";
  5386 			var oldCur = cur;
  5387 			cur = nextNode(cur);
  5388 			oldCur.parentNode.removeChild(oldCur);
  5389 		} else {
  5390 			cur = nextNode(cur);
  5394 	return [startNode, startOffset, endNode, endOffset];
  5396 //@}
  5398 function setSelection(startNode, startOffset, endNode, endOffset) {
  5399 //@{
  5400 	if (navigator.userAgent.indexOf("Opera") != -1) {
  5401 		// Yes, browser sniffing is evil, but I can't be bothered to debug
  5402 		// Opera.
  5403 		var range = document.createRange();
  5404 		range.setStart(startNode, startOffset);
  5405 		range.setEnd(endNode, endOffset);
  5406 		if (range.collapsed) {
  5407 			range.setEnd(startNode, startOffset);
  5409 		getSelection().removeAllRanges();
  5410 		getSelection().addRange(range);
  5411 	} else if ("extend" in getSelection()) {
  5412 		// WebKit behaves unreasonably for collapse(), so do that manually.
  5413 		/*
  5414 		var range = document.createRange();
  5415 		range.setStart(startNode, startOffset);
  5416 		getSelection().removeAllRanges();
  5417 		getSelection().addRange(range);
  5418 		*/
  5419 		getSelection().collapse(startNode, startOffset);
  5420 		getSelection().extend(endNode, endOffset);
  5421 	} else {
  5422 		// IE9.  Selections have no direction, so we just make the selection
  5423 		// always forwards.
  5424 		var range;
  5425 		if (getSelection().rangeCount) {
  5426 			range = getSelection().getRangeAt(0);
  5427 		} else {
  5428 			range = document.createRange();
  5430 		range.setStart(startNode, startOffset);
  5431 		range.setEnd(endNode, endOffset);
  5432 		if (range.collapsed) {
  5433 			// Phooey, we got them backwards.
  5434 			range.setEnd(startNode, startOffset);
  5436 		if (!getSelection().rangeCount) {
  5437 			getSelection().addRange(range);
  5441 //@}
  5443 /**
  5444  * Add brackets at the start and end points of the given range, so that they're
  5445  * visible.
  5446  */
  5447 function addBrackets(range) {
  5448 //@{
  5449 	// Handle the collapsed case specially, to avoid confusingly getting the
  5450 	// markers backwards in some cases
  5451 	if (range.startContainer.nodeType == Node.TEXT_NODE
  5452 	|| range.startContainer.nodeType == Node.COMMENT_NODE) {
  5453 		if (range.collapsed) {
  5454 			range.startContainer.insertData(range.startOffset, "[]");
  5455 		} else {
  5456 			range.startContainer.insertData(range.startOffset, "[");
  5458 	} else {
  5459 		var marker = range.collapsed ? "{}" : "{";
  5460 		if (range.startOffset != range.startContainer.childNodes.length
  5461 		&& range.startContainer.childNodes[range.startOffset].nodeType == Node.TEXT_NODE) {
  5462 			range.startContainer.childNodes[range.startOffset].insertData(0, marker);
  5463 		} else if (range.startOffset != 0
  5464 		&& range.startContainer.childNodes[range.startOffset - 1].nodeType == Node.TEXT_NODE) {
  5465 			range.startContainer.childNodes[range.startOffset - 1].appendData(marker);
  5466 		} else {
  5467 			// Seems to serialize as I'd want even for tables . . . IE doesn't
  5468 			// allow undefined to be passed as the second argument (it throws
  5469 			// an exception), so we have to explicitly check the number of
  5470 			// children and pass null.
  5471 			range.startContainer.insertBefore(document.createTextNode(marker),
  5472 				range.startContainer.childNodes.length == range.startOffset
  5473 				? null
  5474 				: range.startContainer.childNodes[range.startOffset]);
  5477 	if (range.collapsed) {
  5478 		return;
  5480 	if (range.endContainer.nodeType == Node.TEXT_NODE
  5481 	|| range.endContainer.nodeType == Node.COMMENT_NODE) {
  5482 		range.endContainer.insertData(range.endOffset, "]");
  5483 	} else {
  5484 		if (range.endOffset != range.endContainer.childNodes.length
  5485 		&& range.endContainer.childNodes[range.endOffset].nodeType == Node.TEXT_NODE) {
  5486 			range.endContainer.childNodes[range.endOffset].insertData(0, "}");
  5487 		} else if (range.endOffset != 0
  5488 		&& range.endContainer.childNodes[range.endOffset - 1].nodeType == Node.TEXT_NODE) {
  5489 			range.endContainer.childNodes[range.endOffset - 1].appendData("}");
  5490 		} else {
  5491 			range.endContainer.insertBefore(document.createTextNode("}"),
  5492 				range.endContainer.childNodes.length == range.endOffset
  5493 				? null
  5494 				: range.endContainer.childNodes[range.endOffset]);
  5498 //@}
  5500 function normalizeSerializedStyle(wrapper) {
  5501 //@{
  5502 	// Inline CSS attribute serialization has terrible interop, so we fix
  5503 	// things up a bit to avoid spurious mismatches.  This needs to be removed
  5504 	// once CSSOM defines this stuff properly, but for now there's just no
  5505 	// standard for any of it.  This only normalizes descendants of wrapper,
  5506 	// not wrapper itself.
  5507 	[].forEach.call(wrapper.querySelectorAll("[style]"), function(node) {
  5508 		if (node.style.color != "") {
  5509 			var newColor = normalizeColor(node.style.color);
  5510 			node.style.color = "";
  5511 			node.style.color = newColor;
  5513 		if (node.style.backgroundColor != "") {
  5514 			var newBackgroundColor = normalizeColor(node.style.backgroundColor);
  5515 			node.style.backgroundColor = "";
  5516 			node.style.backgroundColor = newBackgroundColor;
  5518 		node.setAttribute("style", node.getAttribute("style")
  5519 			// Random spacing differences
  5520 			.replace(/; ?$/, "")
  5521 			.replace(/: /g, ":")
  5522 			// Gecko likes "transparent"
  5523 			.replace(/transparent/g, "rgba(0, 0, 0, 0)")
  5524 			// WebKit likes to look overly precise
  5525 			.replace(/, 0.496094\)/g, ", 0.5)")
  5526 			// Gecko converts anything with full alpha to "transparent" which
  5527 			// then becomes "rgba(0, 0, 0, 0)", so we have to make other
  5528 			// browsers match
  5529 			.replace(/rgba\([0-9]+, [0-9]+, [0-9]+, 0\)/g, "rgba(0, 0, 0, 0)")
  5530 		);
  5531 	});
  5533 //@}
  5535 /**
  5536  * Input is the same format as output of generateTest in gentest.html.
  5537  */
  5538 function runConformanceTest(browserTest) {
  5539 //@{
  5540 	document.getElementById("test-container").innerHTML = "<div contenteditable></div><p>test";
  5541 	var testName = JSON.stringify(browserTest[1]) + " " + format_value(browserTest[0]);
  5542 	var testDiv = document.querySelector("div[contenteditable]");
  5543 	var originalRootElement, newRootElement;
  5544 	var exception = null;
  5545 	var expectedExecCommandReturnValues = browserTest[3];
  5546 	var expectedQueryResults = browserTest[4];
  5547 	var actualQueryResults = {};
  5548 	var actualQueryExceptions = {};
  5550 	try {
  5551 		var points = setupDiv(testDiv, browserTest[0]);
  5553 		var range = document.createRange();
  5554 		range.setStart(points[0], points[1]);
  5555 		range.setEnd(points[2], points[3]);
  5556 		// The points might be backwards
  5557 		if (range.collapsed) {
  5558 			range.setEnd(points[0], points[1]);
  5560 		getSelection().removeAllRanges();
  5561 		getSelection().addRange(range);
  5563 		var originalRootElement = document.documentElement.cloneNode(true);
  5564 		originalRootElement.querySelector("[contenteditable]").parentNode
  5565 			.removeChild(originalRootElement.querySelector("[contenteditable]"));
  5566 		originalRootElement.querySelector("#log").parentNode
  5567 			.removeChild(originalRootElement.querySelector("#log"));
  5569 		for (var command in expectedQueryResults) {
  5570 			var results = [];
  5571 			var exceptions = {};
  5572 			try { results[0] = document.queryCommandIndeterm(command) }
  5573 			catch(e) { exceptions[0] = e }
  5574 			try { results[1] = document.queryCommandState(command) }
  5575 			catch(e) { exceptions[1] = e }
  5576 			try { results[2] = document.queryCommandValue(command) }
  5577 			catch(e) { exceptions[2] = e }
  5578 			actualQueryResults[command] = results;
  5579 			actualQueryExceptions[command] = exceptions;
  5581 	} catch(e) {
  5582 		exception = e;
  5585 	for (var i = 0; i < browserTest[1].length; i++) {
  5586 		test(function() {
  5587 			assert_equals(exception, null, "Setup must not throw an exception");
  5589 			assert_equals(document.execCommand(browserTest[1][i][0], false, browserTest[1][i][1]),
  5590 				expectedExecCommandReturnValues[i]);
  5591 		}, testName + ": execCommand(" + format_value(browserTest[1][i][0]) + ", false, " + format_value(browserTest[1][i][1]) + ") return value");
  5594 	if (exception === null) {
  5595 		try {
  5596 			for (var command in expectedQueryResults) {
  5597 				var results = actualQueryResults[command];
  5598 				var exceptions = actualQueryExceptions[command];
  5599 				try { results[3] = document.queryCommandIndeterm(command) }
  5600 				catch(e) { exceptions[3] = e }
  5601 				try { results[4] = document.queryCommandState(command) }
  5602 				catch(e) { exceptions[4] = e }
  5603 				try { results[5] = document.queryCommandValue(command) }
  5604 				catch(e) { exceptions[5] = e }
  5607 			var newRootElement = document.documentElement.cloneNode(true);
  5608 			newRootElement.querySelector("[contenteditable]").parentNode
  5609 				.removeChild(newRootElement.querySelector("[contenteditable]"));
  5610 			newRootElement.querySelector("#log").parentNode
  5611 				.removeChild(newRootElement.querySelector("#log"));
  5613 			normalizeSerializedStyle(testDiv);
  5614 		} catch(e) {
  5615 			exception = e;
  5619 	test(function() {
  5620 		assert_equals(exception, null, "Setup must not throw an exception");
  5622 		// Now test for modifications to non-editable content.  First just
  5623 		// count children:
  5624 		assert_equals(testDiv.parentNode.childNodes.length, 2,
  5625 			"The parent div must have two children.  Did something spill outside the test div?");
  5627 		// Check for attributes
  5628 		assert_equals(testDiv.attributes.length, 1,
  5629 			'Wrapper div must have only one attribute (<div contenteditable="">), but has more (' +
  5630 			formatStartTag(testDiv) + ")");
  5632 		assert_equals(document.body.attributes.length, 0,
  5633 			"Body element must have no attributes (<body>), but has more (" +
  5634 			formatStartTag(document.body) + ")");
  5636 		// Check that in general, nothing outside the test div was modified.
  5637 		// TODO: Less verbose error reporting, the way some of the range tests
  5638 		// do?
  5639 		assert_equals(newRootElement.innerHTML, originalRootElement.innerHTML,
  5640 			"Everything outside the editable div must be unchanged, but some change did occur");
  5641 	}, testName + " checks for modifications to non-editable content");
  5643 	test(function() {
  5644 		assert_equals(exception, null, "Setup must not throw an exception");
  5646 		assert_equals(testDiv.innerHTML,
  5647 			browserTest[2].replace(/[\[\]{}]/g, ""),
  5648 			"Unexpected innerHTML (after normalizing inline style)");
  5649 	}, testName + " compare innerHTML");
  5651 	for (var command in expectedQueryResults) {
  5652 		var descriptions = [
  5653 			'queryCommandIndeterm("' + command + '") before',
  5654 			'queryCommandState("' + command + '") before',
  5655 			'queryCommandValue("' + command + '") before',
  5656 			'queryCommandIndeterm("' + command + '") after',
  5657 			'queryCommandState("' + command + '") after',
  5658 			'queryCommandValue("' + command + '") after',
  5659 		];
  5660 		for (var i = 0; i < 6; i++) {
  5661 			test(function() {
  5662 				assert_equals(exception, null, "Setup must not throw an exception");
  5664 				if (expectedQueryResults[command][i] === null) {
  5665 					// Some ad hoc tests to verify that we have a real
  5666 					// DOMException.  FIXME: This should be made more rigorous,
  5667 					// with clear steps specified for checking that something
  5668 					// is really a DOMException.
  5669 					assert_true(i in actualQueryExceptions[command],
  5670 						"An exception must be thrown in this case");
  5671 					var e = actualQueryExceptions[command][i];
  5672 					assert_equals(typeof e, "object",
  5673 						"typeof thrown object");
  5674 					assert_idl_attribute(e, "code",
  5675 						"Thrown object must be a DOMException");
  5676 					assert_idl_attribute(e, "INVALID_ACCESS_ERR",
  5677 						"Thrown object must be a DOMException");
  5678 					assert_equals(e.code, e.INVALID_ACCESS_ERR,
  5679 						"Thrown object must be an INVALID_ACCESS_ERR, so its .code and .INVALID_ACCESS_ERR attributes must be equal");
  5680 				} else if ((i == 2 || i == 5)
  5681 				&& (command == "backcolor" || command == "forecolor" || command == "hilitecolor")
  5682 				&& typeof actualQueryResults[command][i] == "string") {
  5683 					assert_false(i in actualQueryExceptions[command],
  5684 						"An exception must not be thrown in this case");
  5685 					// We don't return the format that the color should be in:
  5686 					// that's up to CSSOM.  Thus we normalize before comparing.
  5687 					assert_equals(normalizeColor(actualQueryResults[command][i]),
  5688 						expectedQueryResults[command][i],
  5689 						"Wrong result returned (after color normalization)");
  5690 				} else {
  5691 					assert_false(i in actualQueryExceptions[command],
  5692 						"An exception must not be thrown in this case");
  5693 					assert_equals(actualQueryResults[command][i],
  5694 						expectedQueryResults[command][i],
  5695 						"Wrong result returned");
  5697 			}, testName + " " + descriptions[i]);
  5701 	// Silly Firefox
  5702 	document.body.removeAttribute("bgcolor");
  5704 //@}
  5706 /**
  5707  * Return a string like '<body bgcolor="#FFFFFF">'.
  5708  */
  5709 function formatStartTag(el) {
  5710 //@{
  5711 	var ret = "<" + el.tagName.toLowerCase();
  5712 	for (var i = 0; i < el.attributes.length; i++) {
  5713 		ret += " " + el.attributes[i].name + '="';
  5714 		ret += el.attributes[i].value.replace(/\&/g, "&amp;")
  5715 			.replace(/"/g, "&quot;");
  5716 		ret += '"';
  5718 	return ret + ">";
  5720 //@}
  5722 // vim: foldmarker=@{,@} foldmethod=marker

mercurial