tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

tests.js (258575B)


      1 // For the original (development) tests, we want to make a bunch of changes to
      2 // the page as it loads.  We don't want this for the conformance tests, so let
      3 // them opt out.
      4 if (typeof testsJsLibraryOnly == "undefined" || !testsJsLibraryOnly) {
      5    // Alert the reader of egregious Opera bug that will make the specced
      6    // implementation horribly buggy
      7    //@{
      8    (function() {
      9        var div = document.createElement("div");
     10        div.appendChild(document.createElement("br"));
     11        document.body.insertBefore(div, document.body.firstChild);
     12        var range = document.createRange();
     13        range.setStart(div, 1);
     14        div.insertBefore(document.createElement("p"), div.firstChild);
     15        if (range.startOffset > range.startContainer.childNodes.length) {
     16            var warningDiv = document.createElement("p");
     17            document.body.insertBefore(warningDiv, document.body.firstChild);
     18            warningDiv.style.fontWeight = "bold";
     19            warningDiv.style.fontSize = "2em";
     20            warningDiv.style.color = "red";
     21            warningDiv.innerHTML = 'Your browser suffers from an <a href="http://software.hixie.ch/utilities/js/live-dom-viewer/saved/1028">egregious bug</a> in range mutation that will give incorrect results for the spec columns in many cases.  To ensure that the spec column contains the output actually required by the spec, use a different browser.';
     22        }
     23        div.parentNode.removeChild(div);
     24    })();
     25    //@}
     26 
     27    // Insert the toolbar thingie as soon as the script file is loaded
     28    //@{
     29    (function() {
     30        var toolbarDiv = document.createElement("div");
     31        toolbarDiv.id = "toolbar";
     32        // Note: this is completely not a hack at all.
     33        toolbarDiv.innerHTML = "<style id=alerts>body > div > table > tbody > tr:not(.alert):not(:first-child):not(.active) { display: none }</style>"
     34            + "<label><input id=alert-checkbox type=checkbox accesskey=a checked onclick='updateAlertRowStyle()'> Display rows without spec <u>a</u>lerts</label>"
     35            + "<label><input id=browser-checkbox type=checkbox accesskey=b checked onclick='localStorage[\"display-browser-tests\"] = event.target.checked'> Run <u>b</u>rowser tests as well as spec tests</label>";
     36 
     37        document.body.appendChild(toolbarDiv);
     38    })();
     39    //@}
     40 
     41    // Confusingly, we're storing a string here, not a boolean.
     42    document.querySelector("#alert-checkbox").checked = localStorage["display-alerts"] != "false";
     43    document.querySelector("#browser-checkbox").checked = localStorage["display-browser-tests"] != "false";
     44 
     45    function updateAlertRowStyle() {
     46    //@{
     47        var checked = document.querySelector("#alert-checkbox").checked;
     48        document.querySelector("#alerts").disabled = checked;
     49        localStorage["display-alerts"] = checked;
     50    }
     51    //@}
     52    updateAlertRowStyle();
     53 
     54    // Feature-test whether the browser wraps at <wbr> or not, and set word-wrap:
     55    // break-word where necessary if not.  (IE and Opera don't wrap, Gecko and
     56    // WebKit do.)  word-wrap: break-word will break anywhere at all, so it looks
     57    // significantly uglier.
     58    //@{
     59    (function() {
     60        var wordWrapTestDiv = document.createElement("div");
     61        wordWrapTestDiv.style.width = "5em";
     62        document.body.appendChild(wordWrapTestDiv);
     63        wordWrapTestDiv.innerHTML = "abc";
     64        var height1 = getComputedStyle(wordWrapTestDiv).height;
     65        wordWrapTestDiv.innerHTML = "abc<wbr>abc<wbr>abc<wbr>abc<wbr>abc<wbr>abc";
     66        var height2 = getComputedStyle(wordWrapTestDiv).height;
     67        document.body.removeChild(wordWrapTestDiv);
     68        if (height1 == height2) {
     69            document.body.className = (document.body.className + " wbr-workaround").trim();
     70        }
     71    })();
     72    //@}
     73 }
     74 
     75 // Now for the meat of the file.
     76 var tests = {
     77    backcolor: [
     78    //@{ Same as hilitecolor (set below)
     79    ],
     80    //@}
     81    bold: [
     82    //@{
     83        'foo[]bar',
     84        '<p>[foo</p> <p>bar]</p>',
     85        '<span>[foo</span> <span>bar]</span>',
     86        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
     87        '<p>[foo<p><br><p>bar]',
     88        '<b>foo[]bar</b>',
     89        '<i>foo[]bar</i>',
     90        '<span>foo</span>{}<span>bar</span>',
     91        '<span>foo[</span><span>]bar</span>',
     92        'foo[bar]baz',
     93        'foo[bar<b>baz]qoz</b>quz',
     94        'foo[bar<i>baz]qoz</i>quz',
     95        '{<p><p> <p>foo</p>}',
     96 
     97        'foo<span contenteditable=false>[bar]</span>baz',
     98        'fo[o<span contenteditable=false>bar</span>b]az',
     99        'foo<span contenteditable=false>ba[r</span>b]az',
    100        'fo[o<span contenteditable=false>b]ar</span>baz',
    101        'fo[<b>o</b><span contenteditable=false>bar</span><b>b</b>]az',
    102        '<span contenteditable=false>foo<span contenteditable=true>[bar]</span>baz</span>',
    103        '<span contenteditable=false>fo[o<span contenteditable=true>bar</span>b]az</span>',
    104        '<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b]az</span>',
    105        '<span contenteditable=false>fo[o<span contenteditable=true>b]ar</span>baz</span>',
    106        '<span contenteditable=false>fo[<b>o<span contenteditable=true>bar</span>b</b>]az</span>',
    107 
    108        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
    109        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
    110        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
    111        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
    112        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
    113        '{<table><tr><td>foo<td>bar<td>baz</table>}',
    114 
    115        'foo<span style="font-weight: bold">[bar]</span>baz',
    116        'foo<b>[bar]</b>baz',
    117        'foo<b>bar</b>[baz]',
    118        '[foo]<b>bar</b>baz',
    119        '<b>foo</b>[bar]<b>baz</b>',
    120        'foo<strong>bar</strong>[baz]',
    121        '[foo]<strong>bar</strong>baz',
    122        '<strong>foo</strong>[bar]<strong>baz</strong>',
    123        '<b>foo</b>[bar]<strong>baz</strong>',
    124        '<strong>foo</strong>[bar]<b>baz</b>',
    125        'foo[<b>bar</b>]baz',
    126        'foo[<b>bar]</b>baz',
    127        'foo<b>[bar</b>]baz',
    128 
    129        'foo{<b></b>}baz',
    130        'foo{<i></i>}baz',
    131        'foo{<b><i></i></b>}baz',
    132        'foo{<i><b></b></i>}baz',
    133 
    134        'foo<strong>[bar]</strong>baz',
    135        'foo[<strong>bar</strong>]baz',
    136        'foo[<strong>bar]</strong>baz',
    137        'foo<strong>[bar</strong>]baz',
    138        'foo[<span style="font-weight: bold">bar</span>]baz',
    139        'foo[<span style="font-weight: bold">bar]</span>baz',
    140        'foo<span style="font-weight: bold">[bar</span>]baz',
    141 
    142        '<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>',
    143        '<b><p>foo[<i>bar</i>}</p><p>baz</p></b>',
    144 
    145        'foo [bar <b>baz] qoz</b> quz sic',
    146        'foo bar <b>baz [qoz</b> quz] sic',
    147 
    148        '<b id=purple>bar [baz] qoz</b>',
    149 
    150        'foo<span style="font-weight: 100">[bar]</span>baz',
    151        'foo<span style="font-weight: 200">[bar]</span>baz',
    152        'foo<span style="font-weight: 300">[bar]</span>baz',
    153        'foo<span style="font-weight: 400">[bar]</span>baz',
    154        'foo<span style="font-weight: 500">[bar]</span>baz',
    155        'foo<span style="font-weight: 600">[bar]</span>baz',
    156        'foo<span style="font-weight: 700">[bar]</span>baz',
    157        'foo<span style="font-weight: 800">[bar]</span>baz',
    158        'foo<span style="font-weight: 900">[bar]</span>baz',
    159        'foo<span style="font-weight: 400">[bar</span>]baz',
    160        'foo<span style="font-weight: 700">[bar</span>]baz',
    161        'foo[<span style="font-weight: 400">bar]</span>baz',
    162        'foo[<span style="font-weight: 700">bar]</span>baz',
    163        'foo[<span style="font-weight: 400">bar</span>]baz',
    164        'foo[<span style="font-weight: 700">bar</span>]baz',
    165        '<span style="font-weight: 100">foo[bar]baz</span>',
    166        '<span style="font-weight: 400">foo[bar]baz</span>',
    167        '<span style="font-weight: 700">foo[bar]baz</span>',
    168        '<span style="font-weight: 900">foo[bar]baz</span>',
    169        '{<span style="font-weight: 100">foobar]baz</span>',
    170        '{<span style="font-weight: 400">foobar]baz</span>',
    171        '{<span style="font-weight: 700">foobar]baz</span>',
    172        '{<span style="font-weight: 900">foobar]baz</span>',
    173        '<span style="font-weight: 100">foo[barbaz</span>}',
    174        '<span style="font-weight: 400">foo[barbaz</span>}',
    175        '<span style="font-weight: 700">foo[barbaz</span>}',
    176        '<span style="font-weight: 900">foo[barbaz</span>}',
    177 
    178        '<h3>foo[bar]baz</h3>',
    179        '{<h3>foobar]baz</h3>',
    180        '<h3>foo[barbaz</h3>}',
    181        '<h3>[foobarbaz]</h3>',
    182        '{<h3>foobarbaz]</h3>',
    183        '<h3>[foobarbaz</h3>}',
    184        '{<h3>foobarbaz</h3>}',
    185 
    186        '<b>foo<span style="font-weight: normal">bar<b>[baz]</b>quz</span>qoz</b>',
    187        '<b>foo<span style="font-weight: normal">[bar]</span>baz</b>',
    188 
    189        '{<b>foo</b> <b>bar</b>}',
    190        '{<h3>foo</h3><b>bar</b>}',
    191 
    192        '<i><b>foo</b></i>[bar]<i><b>baz</b></i>',
    193        '<i><b>foo</b></i>[bar]<b>baz</b>',
    194        '<b>foo</b>[bar]<i><b>baz</b></i>',
    195        '<font color=blue face=monospace><b>foo</b></font>[bar]',
    196 
    197        'foo<span style="font-weight: normal"><b>{bar}</b></span>baz',
    198        '[foo<span class=notbold>bar</span>baz]',
    199        '<b><span class=notbold>[foo]</span></b>',
    200        '<b><span class=notbold>foo[bar]baz</span></b>',
    201 
    202        '<p style="font-weight: bold">foo[bar]baz</p>',
    203 
    204        // Tests for queryCommandIndeterm() and queryCommandState()
    205        'fo[o<b>b]ar</b>baz',
    206        'foo<b>ba[r</b>b]az',
    207        'fo[o<b>bar</b>b]az',
    208        'foo[<b>b]ar</b>baz',
    209        'foo<b>ba[r</b>]baz',
    210        'foo{<b>bar</b>}baz',
    211        'fo[o<span style=font-weight:bold>b]ar</span>baz',
    212        '<span style=font-weight:800>fo[o</span><span style=font-weight:900>b]ar</span>',
    213        '<span style=font-weight:700>fo[o</span><span style=font-weight:800>b]ar</span>',
    214        '<span style=font-weight:600>fo[o</span><span style=font-weight:700>b]ar</span>',
    215        '<span style=font-weight:500>fo[o</span><span style=font-weight:600>b]ar</span>',
    216        '<span style=font-weight:400>fo[o</span><span style=font-weight:500>b]ar</span>',
    217        '<span style=font-weight:300>fo[o</span><span style=font-weight:400>b]ar</span>',
    218        '<span style=font-weight:200>fo[o</span><span style=font-weight:300>b]ar</span>',
    219        '<span style=font-weight:100>fo[o</span><span style=font-weight:200>b]ar</span>',
    220    ],
    221    //@}
    222    createlink: [
    223    //@{
    224        'foo[]bar',
    225        '<p>[foo</p> <p>bar]</p>',
    226        '<span>[foo</span> <span>bar]</span>',
    227        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
    228        '<p>[foo<p><br><p>bar]',
    229        '<b>foo[]bar</b>',
    230        '<i>foo[]bar</i>',
    231        '<span>foo</span>{}<span>bar</span>',
    232        '<span>foo[</span><span>]bar</span>',
    233        'foo[bar]baz',
    234        'foo[bar<b>baz]qoz</b>quz',
    235        'foo[bar<i>baz]qoz</i>quz',
    236        '{<p><p> <p>foo</p>}',
    237 
    238        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
    239        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
    240        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
    241        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
    242        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
    243        '{<table><tr><td>foo<td>bar<td>baz</table>}',
    244 
    245        '<a href=http://www.google.com/>foo[bar]baz</a>',
    246        '<a href=http://www.google.com/>foo[barbaz</a>}',
    247        '{<a href=http://www.google.com/>foobar]baz</a>',
    248        '{<a href=http://www.google.com/>foobarbaz</a>}',
    249        '<a href=http://www.google.com/>[foobarbaz]</a>',
    250 
    251        'foo<a href=http://www.google.com/>[bar]</a>baz',
    252        '[foo]<a href=http://www.google.com/>bar</a>baz',
    253        'foo<a href=http://www.google.com/>bar</a>[baz]',
    254        'foo[<a href=http://www.google.com/>bar</a>]baz',
    255        'foo<a href=http://www.google.com/>[bar</a>baz]',
    256        '[foo<a href=http://www.google.com/>bar]</a>baz',
    257        '[foo<a href=http://www.google.com/>bar</a>baz]',
    258 
    259        '<a href=otherurl>foo[bar]baz</a>',
    260        '<a href=otherurl>foo[barbaz</a>}',
    261        '{<a href=otherurl>foobar]baz</a>',
    262        '{<a href=otherurl>foobarbaz</a>}',
    263        '<a href=otherurl>[foobarbaz]</a>',
    264 
    265        'foo<a href=otherurl>[bar]</a>baz',
    266        'foo[<a href=otherurl>bar</a>]baz',
    267        'foo<a href=otherurl>[bar</a>baz]',
    268        '[foo<a href=otherurl>bar]</a>baz',
    269        '[foo<a href=otherurl>bar</a>baz]',
    270 
    271        '<a href=otherurl><b>foo[bar]baz</b></a>',
    272        '<a href=otherurl><b>foo[barbaz</b></a>}',
    273        '{<a href=otherurl><b>foobar]baz</b></a>',
    274        '<a href=otherurl><b>[foobarbaz]</b></a>',
    275 
    276        '<a name=abc>foo[bar]baz</a>',
    277        '<a name=abc><b>foo[bar]baz</b></a>',
    278 
    279        ['', 'foo[bar]baz'],
    280    ],
    281    //@}
    282    // Opera requires this to be quoted, contrary to ES5 11.1.5 which allows
    283    // PropertyName to be any IdentifierName, and see 7.6 which defines
    284    // IdentifierName to include ReservedWord; Identifier excludes it.
    285    "delete": [
    286    //@{
    287        // Collapsed selection
    288        //
    289        // These three commented-out test call Firefox 5.0a2 to blow up, not
    290        // just throwing exceptions on the tests themselves but on many
    291        // subsequent tests too.
    292        //'[]foo',
    293        //'<span>[]foo</span>',
    294        //'<p>[]foo</p>',
    295        'foo[]bar',
    296        '<span>foo</span>{}<span>bar</span>',
    297        '<span>foo[</span><span>]bar</span>',
    298        'foo<span style=display:none>bar</span>[]baz',
    299        'foo<script>bar</script>[]baz',
    300 
    301        'fo&ouml;[]bar',
    302        'foo&#x308;[]bar',
    303        'foo&#x308;&#x327;[]bar',
    304        '&ouml;[]bar',
    305        'o&#x308;[]bar',
    306        'o&#x308;&#x327;[]bar',
    307 
    308        '&#x5e9;&#x5c1;&#x5b8;[]&#x5dc;&#x5d5;&#x5b9;&#x5dd;',
    309        '&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;[]&#x5dd;',
    310 
    311        '<p>foo</p><p>[]bar</p>',
    312        '<p>foo</p>[]bar',
    313        'foo<p>[]bar</p>',
    314        '<p>foo<br></p><p>[]bar</p>',
    315        '<p>foo<br></p>[]bar',
    316        'foo<br><p>[]bar</p>',
    317        '<p>foo<br><br></p><p>[]bar</p>',
    318        '<p>foo<br><br></p>[]bar',
    319        'foo<br><br><p>[]bar</p>',
    320 
    321        '<div><p>foo</p></div><p>[]bar</p>',
    322        '<p>foo</p><div><p>[]bar</p></div>',
    323        '<div><p>foo</p></div><div><p>[]bar</p></div>',
    324        '<div><p>foo</p></div>[]bar',
    325        'foo<div><p>[]bar</p></div>',
    326 
    327        '<div>foo</div><div>[]bar</div>',
    328        '<pre>foo</pre>[]bar',
    329 
    330        'foo<br>[]bar',
    331        'foo<br><b>[]bar</b>',
    332        'foo<hr>[]bar',
    333        '<p>foo<hr><p>[]bar',
    334        '<p>foo</p><br><p>[]bar</p>',
    335        '<p>foo</p><br><br><p>[]bar</p>',
    336        '<p>foo</p><img src=/img/lion.svg><p>[]bar',
    337        'foo<img src=/img/lion.svg>[]bar',
    338 
    339        '<a>foo</a>[]bar',
    340        '<a href=/>foo</a>[]bar',
    341        '<a name=abc>foo</a>[]bar',
    342        '<a href=/ name=abc>foo</a>[]bar',
    343        '<span><a>foo</a></span>[]bar',
    344        '<span><a href=/>foo</a></span>[]bar',
    345        '<span><a name=abc>foo</a></span>[]bar',
    346        '<span><a href=/ name=abc>foo</a></span>[]bar',
    347        'foo<a>[]bar</a>',
    348        'foo<a href=/>[]bar</a>',
    349        'foo<a name=abc>[]bar</a>',
    350        'foo<a href=/ name=abc>[]bar</a>',
    351 
    352        'foo &nbsp;[]',
    353        '&nbsp;[] foo',
    354        'foo &nbsp;[]bar',
    355        'foo&nbsp; []bar',
    356        'foo&nbsp;&nbsp;[]bar',
    357        'foo  []bar',
    358        'foo []&nbsp; bar',
    359        'foo &nbsp;[] bar',
    360        'foo &nbsp; []bar',
    361        'foo []<span>&nbsp;</span> bar',
    362        'foo <span>&nbsp;</span>[] bar',
    363        'foo <span>&nbsp;</span> []bar',
    364        '<b>foo </b>&nbsp;[]bar',
    365        '<b>foo&nbsp;</b> []bar',
    366        '<b>foo&nbsp;</b>&nbsp;[]bar',
    367        '<b>foo </b> []bar',
    368        '<p>foo </p><p>[] bar</p>',
    369 
    370        '<pre>foo &nbsp;[]</pre>',
    371        '<pre>&nbsp;[] foo</pre>',
    372        '<pre>foo &nbsp;[]bar</pre>',
    373        '<pre>foo&nbsp; []bar</pre>',
    374        '<pre>foo  []bar</pre>',
    375 
    376        '<div style=white-space:pre>foo &nbsp;[]</div>',
    377        '<div style=white-space:pre>&nbsp;[] foo</div>',
    378        '<div style=white-space:pre>foo &nbsp;[]bar</div>',
    379        '<div style=white-space:pre>foo&nbsp; []bar</div>',
    380        '<div style=white-space:pre>foo  []bar</div>',
    381 
    382        '<div style=white-space:pre-wrap>foo &nbsp;[]</div>',
    383        '<div style=white-space:pre-wrap>&nbsp;[] foo</div>',
    384        '<div style=white-space:pre-wrap>foo &nbsp;[]bar</div>',
    385        '<div style=white-space:pre-wrap>foo&nbsp; []bar</div>',
    386        '<div style=white-space:pre-wrap>foo  []bar</div>',
    387 
    388        '<div style=white-space:pre-line>foo &nbsp;[]</div>',
    389        '<div style=white-space:pre-line>&nbsp;[] foo</div>',
    390        '<div style=white-space:pre-line>foo &nbsp;[]bar</div>',
    391        '<div style=white-space:pre-line>foo&nbsp; []bar</div>',
    392        '<div style=white-space:pre-line>foo  []bar</div>',
    393 
    394        '<div style=white-space:nowrap>foo &nbsp;[]</div>',
    395        '<div style=white-space:nowrap>&nbsp;[] foo</div>',
    396        '<div style=white-space:nowrap>foo &nbsp;[]bar</div>',
    397        '<div style=white-space:nowrap>foo&nbsp; []bar</div>',
    398        '<div style=white-space:nowrap>foo  []bar</div>',
    399 
    400        // Tables with collapsed selection
    401        'foo<table><tr><td>[]bar</table>baz',
    402        'foo<table><tr><td>bar</table>[]baz',
    403        '<p>foo<table><tr><td>[]bar</table><p>baz',
    404        '<p>foo<table><tr><td>bar</table><p>[]baz',
    405        '<table><tr><td>foo<td>[]bar</table>',
    406        '<table><tr><td>foo<tr><td>[]bar</table>',
    407 
    408        'foo<br><table><tr><td>[]bar</table>baz',
    409        'foo<table><tr><td>bar<br></table>[]baz',
    410        '<p>foo<br><table><tr><td>[]bar</table><p>baz',
    411        '<p>foo<table><tr><td>bar<br></table><p>[]baz',
    412        '<table><tr><td>foo<br><td>[]bar</table>',
    413        '<table><tr><td>foo<br><tr><td>[]bar</table>',
    414 
    415        'foo<br><br><table><tr><td>[]bar</table>baz',
    416        'foo<table><tr><td>bar<br><br></table>[]baz',
    417        '<p>foo<br><br><table><tr><td>[]bar</table><p>baz',
    418        '<p>foo<table><tr><td>bar<br><br></table><p>[]baz',
    419        '<table><tr><td>foo<br><br><td>[]bar</table>',
    420        '<table><tr><td>foo<br><br><tr><td>[]bar</table>',
    421 
    422        'foo<hr><table><tr><td>[]bar</table>baz',
    423        'foo<table><tr><td>bar<hr></table>[]baz',
    424        '<table><tr><td>foo<hr><td>[]bar</table>',
    425        '<table><tr><td>foo<hr><tr><td>[]bar</table>',
    426 
    427        // Lists with collapsed selection
    428        'foo<ol><li>[]bar<li>baz</ol>',
    429        'foo<br><ol><li>[]bar<li>baz</ol>',
    430        'foo<br><br><ol><li>[]bar<li>baz</ol>',
    431        '<ol><li>foo<li>[]bar</ol>',
    432        '<ol><li>foo<br><li>[]bar</ol>',
    433        '<ol><li>foo<br><br><li>[]bar</ol>',
    434        '<ol><li>foo<li>[]bar<br>baz</ol>',
    435        '<ol><li>foo<br>bar<li>[]baz</ol>',
    436 
    437        '<ol><li><p>foo</p>{}bar</ol>',
    438 
    439        '<ol><li><p>foo<li>[]bar</ol>',
    440        '<ol><li>foo<li><p>[]bar</ol>',
    441        '<ol><li><p>foo<li><p>[]bar</ol>',
    442 
    443        '<ol><li>foo<ul><li>[]bar</ul></ol>',
    444        'foo<ol><ol><li>[]bar</ol></ol>',
    445        'foo<div><ol><li>[]bar</ol></div>',
    446 
    447        'foo<dl><dt>[]bar<dd>baz</dl>',
    448        'foo<dl><dd>[]bar</dl>',
    449        '<dl><dt>foo<dd>[]bar</dl>',
    450        '<dl><dt>foo<dt>[]bar<dd>baz</dl>',
    451        '<dl><dt>foo<dd>bar<dd>[]baz</dl>',
    452 
    453        '<ol><li>foo</ol>[]bar',
    454        '<ol><li>foo<br></ol>[]bar',
    455        '<ol><li>foo<br><br></ol>[]bar',
    456        '<ol><li><br></ol>[]bar',
    457        '<ol><li>foo<li><br></ol>[]bar',
    458 
    459        '<ol><li>foo</ol><p>[]bar',
    460        '<ol><li>foo<br></ol><p>[]bar',
    461        '<ol><li>foo<br><br></ol><p>[]bar',
    462        '<ol><li><br></ol><p>[]bar',
    463        '<ol><li>foo<li><br></ol><p>[]bar',
    464 
    465        '<ol><li>foo</ol>{}<br>',
    466        '<ol><li>foo<br></ol>{}<br>',
    467        '<ol><li>foo<br><br></ol>{}<br>',
    468        '<ol><li><br></ol>{}<br>',
    469        '<ol><li>foo<li><br></ol>{}<br>',
    470 
    471        '<ol><li>foo</ol><p>{}<br>',
    472        '<ol><li>foo<br></ol><p>{}<br>',
    473        '<ol><li>foo<br><br></ol><p>{}<br>',
    474        '<ol><li><br></ol><p>{}<br>',
    475        '<ol><li>foo<li><br></ol><p>{}<br>',
    476 
    477        // Indented stuff with collapsed selection
    478        'foo<blockquote>[]bar</blockquote>',
    479        'foo<blockquote><blockquote>[]bar</blockquote></blockquote>',
    480        'foo<blockquote><div>[]bar</div></blockquote>',
    481        'foo<blockquote style="color: blue">[]bar</blockquote>',
    482 
    483        'foo<blockquote><blockquote><p>[]bar<p>baz</blockquote></blockquote>',
    484        'foo<blockquote><div><p>[]bar<p>baz</div></blockquote>',
    485        'foo<blockquote style="color: blue"><p>[]bar<p>baz</blockquote>',
    486 
    487        'foo<blockquote><p><b>[]bar</b><p>baz</blockquote>',
    488        'foo<blockquote><p><strong>[]bar</strong><p>baz</blockquote>',
    489        'foo<blockquote><p><span>[]bar</span><p>baz</blockquote>',
    490 
    491        'foo<blockquote><ol><li>[]bar</ol></blockquote><p>extra',
    492        'foo<blockquote>bar<ol><li>[]baz</ol>quz</blockquote><p>extra',
    493        'foo<blockquote><ol><li>bar</li><ol><li>[]baz</ol><li>quz</ol></blockquote><p>extra',
    494 
    495        // Invisible stuff with collapsed selection
    496        'foo<span></span>[]bar',
    497        'foo<span><span></span></span>[]bar',
    498        'foo<quasit></quasit>[]bar',
    499        'foo<br><span></span>[]bar',
    500        '<span>foo<span></span></span>[]bar',
    501        'foo<span></span><span>[]bar</span>',
    502        'foo<div><div><p>[]bar</div></div>',
    503        'foo<div><div><p><!--abc-->[]bar</div></div>',
    504        'foo<div><div><!--abc--><p>[]bar</div></div>',
    505        'foo<div><!--abc--><div><p>[]bar</div></div>',
    506        'foo<!--abc--><div><div><p>[]bar</div></div>',
    507        '<div><div><p>foo</div></div>[]bar',
    508        '<div><div><p>foo</div></div><!--abc-->[]bar',
    509        '<div><div><p>foo</div><!--abc--></div>[]bar',
    510        '<div><div><p>foo</p><!--abc--></div></div>[]bar',
    511        '<div><div><p>foo<!--abc--></div></div>[]bar',
    512        '<div><div><p>foo</p></div></div><div><div><div>[]bar</div></div></div>',
    513        '<div><div><p>foo<!--abc--></p></div></div><div><div><div>[]bar</div></div></div>',
    514        '<div><div><p>foo</p><!--abc--></div></div><div><div><div>[]bar</div></div></div>',
    515        '<div><div><p>foo</p></div><!--abc--></div><div><div><div>[]bar</div></div></div>',
    516        '<div><div><p>foo</p></div></div><!--abc--><div><div><div>[]bar</div></div></div>',
    517        '<div><div><p>foo</p></div></div><div><!--abc--><div><div>[]bar</div></div></div>',
    518        '<div><div><p>foo</p></div></div><div><div><!--abc--><div>[]bar</div></div></div>',
    519        '<div><div><p>foo</p></div></div><div><div><div><!--abc-->[]bar</div></div></div>',
    520 
    521        // Styled stuff with collapsed selection
    522        '<p style=color:blue>foo<p>[]bar',
    523        '<p style=color:blue>foo<p style=color:brown>[]bar',
    524        '<p style=color:blue>foo<p style=color:rgba(0,0,255,1)>[]bar',
    525        '<p style=color:transparent>foo<p style=color:rgba(0,0,0,0)>[]bar',
    526        '<p>foo<p style=color:brown>[]bar',
    527        '<p><font color=blue>foo</font><p>[]bar',
    528        '<p><font color=blue>foo</font><p><font color=brown>[]bar</font>',
    529        '<p>foo<p><font color=brown>[]bar</font>',
    530        '<p><span style=color:blue>foo</font><p>[]bar',
    531        '<p><span style=color:blue>foo</font><p><span style=color:brown>[]bar</font>',
    532        '<p>foo<p><span style=color:brown>[]bar</font>',
    533 
    534        '<p style=background-color:aqua>foo<p>[]bar',
    535        '<p style=background-color:aqua>foo<p style=background-color:tan>[]bar',
    536        '<p>foo<p style=background-color:tan>[]bar',
    537        '<p><span style=background-color:aqua>foo</font><p>[]bar',
    538        '<p><span style=background-color:aqua>foo</font><p><span style=background-color:tan>[]bar</font>',
    539        '<p>foo<p><span style=background-color:tan>[]bar</font>',
    540 
    541        '<p style=text-decoration:underline>foo<p>[]bar',
    542        '<p style=text-decoration:underline>foo<p style=text-decoration:line-through>[]bar',
    543        '<p>foo<p style=text-decoration:line-through>[]bar',
    544        '<p><u>foo</u><p>[]bar',
    545        '<p><u>foo</u><p><s>[]bar</s>',
    546        '<p>foo<p><s>[]bar</s>',
    547 
    548        '<p style=color:blue>foo</p>[]bar',
    549        'foo<p style=color:brown>[]bar',
    550        '<div style=color:blue><p style=color:green>foo</div>[]bar',
    551        '<div style=color:blue><p style=color:green>foo</div><p style=color:brown>[]bar',
    552        '<p style=color:blue>foo<div style=color:brown><p style=color:green>[]bar',
    553 
    554        // Uncollapsed selection
    555        'foo[bar]baz',
    556        '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
    557        '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
    558        '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
    559        '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
    560        '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
    561        '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
    562        '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
    563        '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
    564 
    565        'foo<b>[bar]</b>baz',
    566        'foo<b>{bar}</b>baz',
    567        'foo{<b>bar</b>}baz',
    568        'foo<span>[bar]</span>baz',
    569        'foo<span>{bar}</span>baz',
    570        'foo{<span>bar</span>}baz',
    571        '<b>foo[bar</b><i>baz]quz</i>',
    572        '<p>foo</p><p>[bar]</p><p>baz</p>',
    573        '<p>foo</p><p>{bar}</p><p>baz</p>',
    574        '<p>foo</p><p>{bar</p>}<p>baz</p>',
    575        '<p>foo</p>{<p>bar}</p><p>baz</p>',
    576        '<p>foo</p>{<p>bar</p>}<p>baz</p>',
    577 
    578        '<p>foo[bar<p>baz]quz',
    579        '<p>foo[bar<div>baz]quz</div>',
    580        '<p>foo[bar<h1>baz]quz</h1>',
    581        '<div>foo[bar</div><p>baz]quz',
    582        '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',
    583 
    584        '<p><b>foo[bar</b><p>baz]quz',
    585        '<div><p>foo[bar</div><p>baz]quz',
    586        '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
    587        '<p>foo[bar<p style=color:blue>baz]quz',
    588        '<p>foo[bar<p><b>baz]quz</b>',
    589 
    590        '<div><p>foo<p>[bar<p>baz]</div>',
    591 
    592        'foo[<br>]bar',
    593        '<p>foo[</p><p>]bar</p>',
    594        '<p>foo[</p><p>]bar<br>baz</p>',
    595        'foo[<p>]bar</p>',
    596        'foo{<p>}bar</p>',
    597        'foo[<p>]bar<br>baz</p>',
    598        'foo[<p>]bar</p>baz',
    599        'foo{<p>bar</p>}baz',
    600        'foo<p>{bar</p>}baz',
    601        'foo{<p>bar}</p>baz',
    602        '<p>foo[</p>]bar',
    603        '<p>foo{</p>}bar',
    604        '<p>foo[</p>]bar<br>baz',
    605        '<p>foo[</p>]bar<p>baz</p>',
    606        'foo[<div><p>]bar</div>',
    607        '<div><p>foo[</p></div>]bar',
    608        'foo[<div><p>]bar</p>baz</div>',
    609        'foo[<div>]bar<p>baz</p></div>',
    610        '<div><p>foo</p>bar[</div>]baz',
    611        '<div>foo<p>bar[</p></div>]baz',
    612 
    613        '<p>foo<br>{</p>]bar',
    614        '<p>foo<br><br>{</p>]bar',
    615        'foo<br>{<p>]bar</p>',
    616        'foo<br><br>{<p>]bar</p>',
    617        '<p>foo<br>{</p><p>}bar</p>',
    618        '<p>foo<br><br>{</p><p>}bar</p>',
    619 
    620        '<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>',
    621        '<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
    622        '<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
    623        '<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>',
    624        '<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>',
    625        '<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>',
    626        '{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}',
    627        '<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>',
    628        '<p>fo[o<table><tr><td>b]ar</table><p>baz',
    629        '<p>foo<table><tr><td>ba[r</table><p>b]az',
    630        '<p>fo[o<table><tr><td>bar</table><p>b]az',
    631 
    632        '<p>foo<ol><li>ba[r<li>b]az</ol><p>quz',
    633        '<p>foo<ol><li>bar<li>[baz]</ol><p>quz',
    634        '<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz',
    635        '<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz',
    636        '<p>fo[o<ol><li>bar<li>b]az</ol><p>quz',
    637        '<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz',
    638 
    639        '<ol><li>fo[o</ol><ol><li>b]ar</ol>',
    640        '<ol><li>fo[o</ol><ul><li>b]ar</ul>',
    641 
    642        'foo[<ol><li>]bar</ol>',
    643        '<ol><li>foo[<li>]bar</ol>',
    644        'foo[<dl><dt>]bar<dd>baz</dl>',
    645        'foo[<dl><dd>]bar</dl>',
    646        '<dl><dt>foo[<dd>]bar</dl>',
    647        '<dl><dt>foo[<dt>]bar<dd>baz</dl>',
    648        '<dl><dt>foo<dd>bar[<dd>]baz</dl>',
    649 
    650        '<b>foo [&nbsp;</b>bar]',
    651        'foo<b> [&nbsp;bar]</b>',
    652        '<b>[foo&nbsp;] </b>bar',
    653        '[foo<b>&nbsp;] bar</b>',
    654 
    655        // Do we merge based on element names or the display property?
    656        '<p style=display:inline>fo[o<p style=display:inline>b]ar',
    657        '<span style=display:block>fo[o</span><span style=display:block>b]ar</span>',
    658        '<span style=display:inline-block>fo[o</span><span style=display:inline-block>b]ar</span>',
    659        '<span style=display:inline-table>fo[o</span><span style=display:inline-table>b]ar</span>',
    660        '<span style=display:none>fo[o</span><span style=display:none>b]ar</span>',
    661        '<quasit style=display:block>fo[o</quasit><quasit style=display:block>b]ar</quasit>',
    662 
    663        // https://bugs.webkit.org/show_bug.cgi?id=35281
    664        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13976
    665        '<ol><li>foo</ol>{}<br><ol><li>bar</ol>',
    666        '<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>',
    667        '<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>',
    668        '<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>',
    669        '<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
    670        '<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
    671        '<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>',
    672        // Broken test: http://www.w3.org/Bugs/Public/show_bug.cgi?id=14727
    673        '!<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>',
    674        '<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>',
    675        '<ol><li>foo[</ol>bar]<ol><li>baz</ol>',
    676        '<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>',
    677        '<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>',
    678        '<ol><li>foo[]</ol><ol><li>bar</ol>',
    679        '<ol><li>foo</ol>[bar<ol><li>]baz</ol>',
    680        '<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>',
    681        '<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>',
    682        '<ol><li>foo</ol><ol><li>b[]ar</ol>',
    683        '<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>',
    684        '<ul><li>foo</ul>{}<br><ul><li>bar</ul>',
    685        '<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>',
    686        '<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>',
    687        '<ol><li>foo</ol>{}<br><ul><li>bar</ul>',
    688        '<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>',
    689        '<ul><li>foo</ul>{}<br><ol><li>bar</ol>',
    690        '<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>',
    691 
    692        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13831
    693        '<p><b>[foo]</b>',
    694        '<p><quasit>[foo]</quasit>',
    695        '<p><b><i>[foo]</i></b>',
    696        '<p><b>{foo}</b>',
    697        '<p>{<b>foo</b>}',
    698        '<p><b>f[]</b>',
    699        '<b>[foo]</b>',
    700        '<div><b>[foo]</b></div>',
    701    ],
    702    //@}
    703    fontname: [
    704    //@{
    705        'foo[]bar',
    706        '<p>[foo</p> <p>bar]</p>',
    707        '<span>[foo</span> <span>bar]</span>',
    708        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
    709        '<p>[foo<p><br><p>bar]',
    710        '<b>foo[]bar</b>',
    711        '<i>foo[]bar</i>',
    712        '<span>foo</span>{}<span>bar</span>',
    713        '<span>foo[</span><span>]bar</span>',
    714        'foo[bar]baz',
    715        'foo[bar<b>baz]qoz</b>quz',
    716        'foo[bar<i>baz]qoz</i>quz',
    717        '{<p><p> <p>foo</p>}',
    718 
    719        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
    720        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
    721        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
    722        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
    723        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
    724        '{<table><tr><td>foo<td>bar<td>baz</table>}',
    725 
    726        'foo<code>[bar]</code>baz',
    727        'foo<kbd>[bar]</kbd>baz',
    728        'foo<listing>[bar]</listing>baz',
    729        'foo<pre>[bar]</pre>baz',
    730        'foo<samp>[bar]</samp>baz',
    731        'foo<tt>[bar]</tt>baz',
    732 
    733        'foo<code>b[a]r</code>baz',
    734        'foo<kbd>b[a]r</kbd>baz',
    735        'foo<listing>b[a]r</listing>baz',
    736        'foo<pre>b[a]r</pre>baz',
    737        'foo<samp>b[a]r</samp>baz',
    738        'foo<tt>b[a]r</tt>baz',
    739 
    740        '[foo<code>bar</code>baz]',
    741        '[foo<kbd>bar</kbd>baz]',
    742        '[foo<listing>bar</listing>baz]',
    743        '[foo<pre>bar</pre>baz]',
    744        '[foo<samp>bar</samp>baz]',
    745        '[foo<tt>bar</tt>baz]',
    746 
    747        '[foo<code>ba]r</code>baz',
    748        '[foo<kbd>ba]r</kbd>baz',
    749        '[foo<listing>ba]r</listing>baz',
    750        '[foo<pre>ba]r</pre>baz',
    751        '[foo<samp>ba]r</samp>baz',
    752        '[foo<tt>ba]r</tt>baz',
    753 
    754        'foo<code>b[ar</code>baz]',
    755        'foo<kbd>b[ar</kbd>baz]',
    756        'foo<listing>b[ar</listing>baz]',
    757        'foo<pre>b[ar</pre>baz]',
    758        'foo<samp>b[ar</samp>baz]',
    759        'foo<tt>b[ar</tt>baz]',
    760 
    761        'foo<span style="font-family: sans-serif">[bar]</span>baz',
    762        'foo<span style="font-family: sans-serif">b[a]r</span>baz',
    763        'foo<span style="font-family: monospace">[bar]</span>baz',
    764        'foo<span style="font-family: monospace">b[a]r</span>baz',
    765 
    766        'foo<tt contenteditable=false>ba[r</tt>b]az',
    767        'fo[o<tt contenteditable=false>b]ar</tt>baz',
    768        'foo<tt>{}<br></tt>bar',
    769        'foo<tt>{<br></tt>}bar',
    770        'foo<tt>{<br></tt>b]ar',
    771 
    772        // Tests for queryCommandIndeterm() and queryCommandState()
    773        'fo[o<span style=font-family:monospace>b]ar</span>baz',
    774        'foo<span style=font-family:monospace>ba[r</span>b]az',
    775        'fo[o<span style=font-family:monospace>bar</span>b]az',
    776        'foo[<span style=font-family:monospace>b]ar</span>baz',
    777        'foo<span style=font-family:monospace>ba[r</span>]baz',
    778        'foo[<span style=font-family:monospace>bar</span>]baz',
    779        'foo<span style=font-family:monospace>[bar]</span>baz',
    780        'foo{<span style=font-family:monospace>bar</span>}baz',
    781        'fo[o<code>b]ar</code>',
    782        'fo[o<kbd>b]ar</kbd>',
    783        'fo[o<listing>b]ar</listing>',
    784        'fo[o<pre>b]ar</pre>',
    785        'fo[o<samp>b]ar</samp>',
    786        'fo[o<tt>b]ar</tt>',
    787        '<tt>fo[o</tt><code>b]ar</code>',
    788        '<pre>fo[o</pre><samp>b]ar</samp>',
    789        '<span style=font-family:monospace>fo[o</span><kbd>b]ar</kbd>',
    790    ],
    791    //@}
    792    fontsize: [
    793    //@{
    794        'foo[]bar',
    795        '<p>[foo</p> <p>bar]</p>',
    796        '<span>[foo</span> <span>bar]</span>',
    797        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
    798        '<p>[foo<p><br><p>bar]',
    799        '<b>foo[]bar</b>',
    800        '<i>foo[]bar</i>',
    801        '<span>foo</span>{}<span>bar</span>',
    802        '<span>foo[</span><span>]bar</span>',
    803        'foo[bar]baz',
    804        'foo[bar<b>baz]qoz</b>quz',
    805        'foo[bar<i>baz]qoz</i>quz',
    806        '{<p><p> <p>foo</p>}',
    807 
    808        ["1", 'foo[bar]baz'],
    809        ["0", 'foo[bar]baz'],
    810        ["-5", 'foo[bar]baz'],
    811        ["6", 'foo[bar]baz'],
    812        ["7", 'foo[bar]baz'],
    813        ["8", 'foo[bar]baz'],
    814        ["100", 'foo[bar]baz'],
    815        ["2em", 'foo[bar]baz'],
    816        ["20pt", 'foo[bar]baz'],
    817        ["xx-large", 'foo[bar]baz'],
    818        [" 1 ", 'foo[bar]baz'],
    819        ["1.", 'foo[bar]baz'],
    820        ["1.0", 'foo[bar]baz'],
    821        ["1.0e2", 'foo[bar]baz'],
    822        ["1.1", 'foo[bar]baz'],
    823        ["1.9", 'foo[bar]baz'],
    824        ["+0", 'foo[bar]baz'],
    825        ["+1", 'foo[bar]baz'],
    826        ["+9", 'foo[bar]baz'],
    827        ["-0", 'foo[bar]baz'],
    828        ["-1", 'foo[bar]baz'],
    829        ["-9", 'foo[bar]baz'],
    830        ["", 'foo[bar]baz'],
    831 
    832        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
    833        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
    834        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
    835        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
    836        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
    837        '{<table><tr><td>foo<td>bar<td>baz</table>}',
    838 
    839        'foo<font size=1>[bar]</font>baz',
    840        '<font size=1>foo[bar]baz</font>',
    841        'foo<font size=3>[bar]</font>baz',
    842        '<font size=3>foo[bar]baz</font>',
    843        'foo<font size=4>[bar]</font>baz',
    844        '<font size=4>foo[bar]baz</font>',
    845        'foo<font size=+1>[bar]</font>baz',
    846        '<font size=+1>foo[bar]baz</font>',
    847        '<font size=4>foo<font size=1>b[a]r</font>baz</font>',
    848 
    849        'foo<span style="font-size: xx-small">[bar]</span>baz',
    850        '<span style="font-size: xx-small">foo[bar]baz</span>',
    851        'foo<span style="font-size: medium">[bar]</span>baz',
    852        '<span style="font-size: medium">foo[bar]baz</span>',
    853        'foo<span style="font-size: large">[bar]</span>baz',
    854        '<span style="font-size: large">foo[bar]baz</span>',
    855        '<span style="font-size: large">foo<span style="font-size: xx-small">b[a]r</span>baz</span>',
    856 
    857        'foo<span style="font-size: 2em">[bar]</span>baz',
    858        '<span style="font-size: 2em">foo[bar]baz</span>',
    859 
    860        '<p style="font-size: xx-small">foo[bar]baz</p>',
    861        '<p style="font-size: medium">foo[bar]baz</p>',
    862        '<p style="font-size: large">foo[bar]baz</p>',
    863        '<p style="font-size: 2em">foo[bar]baz</p>',
    864 
    865        ["3", '<p style="font-size: xx-small">foo[bar]baz</p>'],
    866        ["3", '<p style="font-size: medium">foo[bar]baz</p>'],
    867        ["3", '<p style="font-size: large">foo[bar]baz</p>'],
    868        ["3", '<p style="font-size: 2em">foo[bar]baz</p>'],
    869 
    870        // Minor algorithm bug: this changes the size of the "b" and "r" in
    871        // "bar" when we pull down styles
    872        ["3", '<font size=6>foo <span style="font-size: 2em">b[a]r</span> baz</font>'],
    873 
    874        ["3", 'foo<big>[bar]</big>baz'],
    875        ["3", 'foo<big>b[a]r</big>baz'],
    876        ["3", 'foo<small>[bar]</small>baz'],
    877        ["3", 'foo<small>b[a]r</small>baz'],
    878 
    879        // Tests for queryCommandIndeterm() and queryCommandState()
    880        'fo[o<font size=2>b]ar</font>baz',
    881        'foo<font size=2>ba[r</font>b]az',
    882        'fo[o<font size=2>bar</font>b]az',
    883        'foo[<font size=2>b]ar</font>baz',
    884        'foo<font size=2>ba[r</font>]baz',
    885        'foo[<font size=2>bar</font>]baz',
    886        'foo<font size=2>[bar]</font>baz',
    887        'foo{<font size=2>bar</font>}baz',
    888        '<font size=1>fo[o</font><span style=font-size:xx-small>b]ar</span>',
    889        '<font size=2>fo[o</font><span style=font-size:small>b]ar</span>',
    890        '<font size=3>fo[o</font><span style=font-size:medium>b]ar</span>',
    891        '<font size=4>fo[o</font><span style=font-size:large>b]ar</span>',
    892        '<font size=5>fo[o</font><span style=font-size:x-large>b]ar</span>',
    893        '<font size=6>fo[o</font><span style=font-size:xx-large>b]ar</span>',
    894 
    895        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13829
    896        ["!6", '<span style=background-color:aqua>[foo]</span>'],
    897        ["!6", '<span style=background-color:aqua>foo[bar]baz</span>'],
    898        ["!6", '[foo<span style=background-color:aqua>bar</span>baz]'],
    899    ],
    900    //@}
    901    forecolor: [
    902    //@{
    903        'foo[]bar',
    904        '<p>[foo</p> <p>bar]</p>',
    905        '<span>[foo</span> <span>bar]</span>',
    906        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
    907        '<p>[foo<p><br><p>bar]',
    908        '<b>foo[]bar</b>',
    909        '<i>foo[]bar</i>',
    910        '<span>foo</span>{}<span>bar</span>',
    911        '<span>foo[</span><span>]bar</span>',
    912        'foo[bar]baz',
    913        'foo[bar<b>baz]qoz</b>quz',
    914        'foo[bar<i>baz]qoz</i>quz',
    915        '{<p><p> <p>foo</p>}',
    916 
    917        ['blue', 'foo[bar]baz'],
    918        ['f', 'foo[bar]baz'],
    919        ['#f', 'foo[bar]baz'],
    920        ['00f', 'foo[bar]baz'],
    921        ['#00f', 'foo[bar]baz'],
    922        ['0000ff', 'foo[bar]baz'],
    923        ['#0000ff', 'foo[bar]baz'],
    924        ['000000fff', 'foo[bar]baz'],
    925        ['#000000fff', 'foo[bar]baz'],
    926        ['rgb(0, 0, 255)', 'foo[bar]baz'],
    927        ['rgb(0%, 0%, 100%)', 'foo[bar]baz'],
    928        ['rgb( 0 ,0 ,255)', 'foo[bar]baz'],
    929        ['rgba(0, 0, 255, 0.0)', 'foo[bar]baz'],
    930        ['rgb(15, -10, 375)', 'foo[bar]baz'],
    931        ['rgba(0, 0, 0, 1)', 'foo[bar]baz'],
    932        ['rgba(255, 255, 255, 1)', 'foo[bar]baz'],
    933        ['rgba(0, 0, 255, 0.5)', 'foo[bar]baz'],
    934        ['hsl(240, 100%, 50%)', 'foo[bar]baz'],
    935        ['cornsilk', 'foo[bar]baz'],
    936        ['potato quiche', 'foo[bar]baz'],
    937        ['transparent', 'foo[bar]baz'],
    938        ['currentColor', 'foo[bar]baz'],
    939 
    940        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
    941        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
    942        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
    943        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
    944        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
    945        '{<table><tr><td>foo<td>bar<td>baz</table>}',
    946 
    947        'foo<font color=blue>[bar]</font>baz',
    948        'foo{<font color=blue>bar</font>}baz',
    949        '<span style="color: blue">foo<span style="color: brown">[bar]</span>baz</span>',
    950        '<span style="color: #00f">foo<span style="color: brown">[bar]</span>baz</span>',
    951        '<span style="color: #0000ff">foo<span style="color: brown">[bar]</span>baz</span>',
    952        '<span style="color: rgb(0, 0, 255)">foo<span style="color: brown">[bar]</span>baz</span>',
    953        '<font color=blue>foo<font color=brown>[bar]</font>baz</font>',
    954        '<span style="color: rgb(0, 0, 255)">foo<span style="color: brown">b[ar]</span>baz</span>',
    955        'foo<span id=purple>ba[r</span>ba]z',
    956        '<span style="color: rgb(0, 0, 255)">foo<span id=purple>b[a]r</span>baz</span>',
    957 
    958        ['blue', '<a href=http://www.google.com>foo[bar]baz</a>'],
    959        ['#0000ff', '<a href=http://www.google.com>foo[bar]baz</a>'],
    960        ['rgb(0,0,255)', '<a href=http://www.google.com>foo[bar]baz</a>'],
    961 
    962        // Tests for queryCommandValue()
    963        '<font color="blue">[foo]</font>',
    964        '<font color="0000ff">[foo]</font>',
    965        '<font color="#0000ff">[foo]</font>',
    966        '<span style="color: blue">[foo]</span>',
    967        '<span style="color: #0000ff">[foo]</span>',
    968        '<span style="color: rgb(0, 0, 255)">[foo]</span>',
    969        '<span style="color: rgb(0%, 0%, 100%)">[foo]</span>',
    970        '<span style="color: rgb( 0 ,0 ,255)">[foo]</span>',
    971        '<span style="color: rgba(0, 0, 255, 0.0)">[foo]</span>',
    972        '<span style="color: rgb(15, -10, 375)">[foo]</span>',
    973        '<span style="color: rgba(0, 0, 0, 1)">[foo]</span>',
    974        '<span style="color: rgba(255, 255, 255, 1)">[foo]</span>',
    975        '<span style="color: rgba(0, 0, 255, 0.5)">[foo]</span>',
    976        '<span style="color: hsl(240, 100%, 50%)">[foo]</span>',
    977        '<span style="color: cornsilk">[foo]</span>',
    978        '<span style="color: transparent">[foo]</span>',
    979        '<span style="color: currentColor">[foo]</span>',
    980 
    981        // Tests for queryCommandIndeterm() and queryCommandState()
    982        'fo[o<font color=brown>b]ar</font>baz',
    983        'foo<font color=brown>ba[r</font>b]az',
    984        'fo[o<font color=brown>bar</font>b]az',
    985        'foo[<font color=brown>b]ar</font>baz',
    986        'foo<font color=brown>ba[r</font>]baz',
    987        'foo[<font color=brown>bar</font>]baz',
    988        'foo<font color=brown>[bar]</font>baz',
    989        'foo{<font color=brown>bar</font>}baz',
    990        '<font color=brown>fo[o</font><span style=color:brown>b]ar</span>',
    991        '<span style=color:brown>fo[o</span><span style=color:#0000ff>b]ar</span>',
    992    ],
    993    //@}
    994    formatblock: [
    995    //@{
    996        'foo[]bar<p>extra',
    997        '<span>foo</span>{}<span>bar</span><p>extra',
    998        '<span>foo[</span><span>]bar</span><p>extra',
    999        'foo[bar]baz<p>extra',
   1000        'foo]bar[baz<p>extra',
   1001        '{<p><p> <p>foo</p>}',
   1002        'foo[bar<i>baz]qoz</i>quz<p>extra',
   1003 
   1004        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   1005        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
   1006        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
   1007        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
   1008        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
   1009        '{<table><tr><td>foo<td>bar<td>baz</table>}',
   1010 
   1011        '<div>[foobar]</div>',
   1012        '<p>[foobar]</p>',
   1013        '<blockquote>[foobar]</blockquote>',
   1014        '<h1>[foobar]</h1>',
   1015        '<h2>[foobar]</h2>',
   1016        '<h3>[foobar]</h3>',
   1017        '<h4>[foobar]</h4>',
   1018        '<h5>[foobar]</h5>',
   1019        '<h6>[foobar]</h6>',
   1020        '<dl><dt>[foo]<dd>bar</dl>',
   1021        '<dl><dt>foo<dd>[bar]</dl>',
   1022        '<dl><dt>[foo<dd>bar]</dl>',
   1023        '<ol><li>[foobar]</ol>',
   1024        '<ul><li>[foobar]</ul>',
   1025        '<address>[foobar]</address>',
   1026        '<pre>[foobar]</pre>',
   1027        '<article>[foobar]</article>',
   1028        '<ins>[foobar]</ins>',
   1029        '<del>[foobar]</del>',
   1030        '<quasit>[foobar]</quasit>',
   1031        '<quasit style="display: block">[foobar]</quasit>',
   1032 
   1033        ['<p>', 'foo[]bar<p>extra'],
   1034        ['<p>', '<span>foo</span>{}<span>bar</span><p>extra'],
   1035        ['<p>', '<span>foo[</span><span>]bar</span><p>extra'],
   1036        ['<p>', 'foo[bar]baz<p>extra'],
   1037        ['<p>', 'foo]bar[baz<p>extra'],
   1038        ['<p>', '{<p><p> <p>foo</p>}'],
   1039        ['<p>', 'foo[bar<i>baz]qoz</i>quz<p>extra'],
   1040 
   1041        ['<p>', '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>'],
   1042        ['<p>', '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>'],
   1043        ['<p>', '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>'],
   1044        ['<p>', '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>'],
   1045        ['<p>', '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>'],
   1046        ['<p>', '{<table><tr><td>foo<td>bar<td>baz</table>}'],
   1047 
   1048        ['<p>', '<div>[foobar]</div>'],
   1049        ['<p>', '<p>[foobar]</p>'],
   1050        ['<p>', '<blockquote>[foobar]</blockquote>'],
   1051        ['<p>', '<h1>[foobar]</h1>'],
   1052        ['<p>', '<h2>[foobar]</h2>'],
   1053        ['<p>', '<h3>[foobar]</h3>'],
   1054        ['<p>', '<h4>[foobar]</h4>'],
   1055        ['<p>', '<h5>[foobar]</h5>'],
   1056        ['<p>', '<h6>[foobar]</h6>'],
   1057        ['<p>', '<dl><dt>[foo]<dd>bar</dl>'],
   1058        ['<p>', '<dl><dt>foo<dd>[bar]</dl>'],
   1059        ['<p>', '<dl><dt>[foo<dd>bar]</dl>'],
   1060        ['<p>', '<ol><li>[foobar]</ol>'],
   1061        ['<p>', '<ul><li>[foobar]</ul>'],
   1062        ['<p>', '<address>[foobar]</address>'],
   1063        ['<p>', '<pre>[foobar]</pre>'],
   1064        ['<p>', '<listing>[foobar]</listing>'],
   1065        ['<p>', '<xmp>[foobar]</xmp>'],
   1066        ['<p>', '<article>[foobar]</article>'],
   1067        ['<p>', '<ins>[foobar]</ins>'],
   1068        ['<p>', '<del>[foobar]</del>'],
   1069        ['<p>', '<quasit>[foobar]</quasit>'],
   1070        ['<p>', '<quasit style="display: block">[foobar]</quasit>'],
   1071 
   1072        ['<blockquote>', '<blockquote>[foo]</blockquote><p>extra'],
   1073        ['<blockquote>', '<blockquote><p>[foo]<p>bar</blockquote><p>extra'],
   1074        ['<blockquote>', '[foo]<blockquote>bar</blockquote><p>extra'],
   1075        ['<blockquote>', '<p>[foo<p>bar]<p>baz'],
   1076        ['<blockquote>', '<section>[foo]</section>'],
   1077        ['<blockquote>', '<section><p>[foo]</section>'],
   1078        ['<blockquote>', '<section><hgroup><h1>[foo]</h1><h2>bar</h2></hgroup><p>baz</section>'],
   1079        ['<article>', '<section>[foo]</section>'],
   1080 
   1081        ['<address>', '<div>[foobar]</div>'],
   1082        ['<article>', '<div>[foobar]</div>'],
   1083        ['<blockquote>', '<div>[foobar]</div>'],
   1084        ['<dd>', '<div>[foobar]</div>'],
   1085        ['<del>', '<div>[foobar]</div>'],
   1086        ['<dl>', '<div>[foobar]</div>'],
   1087        ['<dt>', '<div>[foobar]</div>'],
   1088        ['<h1>', '<div>[foobar]</div>'],
   1089        ['<h2>', '<div>[foobar]</div>'],
   1090        ['<h3>', '<div>[foobar]</div>'],
   1091        ['<h4>', '<div>[foobar]</div>'],
   1092        ['<h5>', '<div>[foobar]</div>'],
   1093        ['<h6>', '<div>[foobar]</div>'],
   1094        ['<ins>', '<div>[foobar]</div>'],
   1095        ['<li>', '<div>[foobar]</div>'],
   1096        ['<ol>', '<div>[foobar]</div>'],
   1097        ['<pre>', '<div>[foobar]</div>'],
   1098        ['<ul>', '<div>[foobar]</div>'],
   1099        ['<quasit>', '<div>[foobar]</div>'],
   1100 
   1101        ['<address>', '<p>[foobar]</p>'],
   1102        ['<article>', '<p>[foobar]</p>'],
   1103        ['<aside>', '<p>[foobar]</p>'],
   1104        ['<blockquote>', '<p>[foobar]</p>'],
   1105        ['<body>', '<p>[foobar]</p>'],
   1106        ['<dd>', '<p>[foobar]</p>'],
   1107        ['<del>', '<p>[foobar]</p>'],
   1108        ['<details>', '<p>[foobar]</p>'],
   1109        ['<dir>', '<p>[foobar]</p>'],
   1110        ['<dl>', '<p>[foobar]</p>'],
   1111        ['<dt>', '<p>[foobar]</p>'],
   1112        ['<fieldset>', '<p>[foobar]</p>'],
   1113        ['<figcaption>', '<p>[foobar]</p>'],
   1114        ['<figure>', '<p>[foobar]</p>'],
   1115        ['<footer>', '<p>[foobar]</p>'],
   1116        ['<form>', '<p>[foobar]</p>'],
   1117        ['<h1>', '<p>[foobar]</p>'],
   1118        ['<h2>', '<p>[foobar]</p>'],
   1119        ['<h3>', '<p>[foobar]</p>'],
   1120        ['<h4>', '<p>[foobar]</p>'],
   1121        ['<h5>', '<p>[foobar]</p>'],
   1122        ['<h6>', '<p>[foobar]</p>'],
   1123        ['<header>', '<p>[foobar]</p>'],
   1124        ['<head>', '<p>[foobar]</p>'],
   1125        ['<hgroup>', '<p>[foobar]</p>'],
   1126        ['<hr>', '<p>[foobar]</p>'],
   1127        ['<html>', '<p>[foobar]</p>'],
   1128        ['<ins>', '<p>[foobar]</p>'],
   1129        ['<li>', '<p>[foobar]</p>'],
   1130        ['<listing>', '<p>[foobar]</p>'],
   1131        ['<menu>', '<p>[foobar]</p>'],
   1132        ['<nav>', '<p>[foobar]</p>'],
   1133        ['<ol>', '<p>[foobar]</p>'],
   1134        ['<plaintext>', '<p>[foobar]</p>'],
   1135        ['<pre>', '<p>[foobar]</p>'],
   1136        ['<section>', '<p>[foobar]</p>'],
   1137        ['<ul>', '<p>[foobar]</p>'],
   1138        ['<xmp>', '<p>[foobar]</p>'],
   1139        ['<quasit>', '<p>[foobar]</p>'],
   1140 
   1141        ['<address>', '<p>[foo<p>bar]'],
   1142        ['<article>', '<p>[foo<p>bar]'],
   1143        ['<aside>', '<p>[foo<p>bar]'],
   1144        ['<blockquote>', '<p>[foo<p>bar]'],
   1145        ['<body>', '<p>[foo<p>bar]'],
   1146        ['<dd>', '<p>[foo<p>bar]'],
   1147        ['<del>', '<p>[foo<p>bar]'],
   1148        ['<details>', '<p>[foo<p>bar]'],
   1149        ['<dir>', '<p>[foo<p>bar]'],
   1150        ['<div>', '<p>[foo<p>bar]'],
   1151        ['<dl>', '<p>[foo<p>bar]'],
   1152        ['<dt>', '<p>[foo<p>bar]'],
   1153        ['<fieldset>', '<p>[foo<p>bar]'],
   1154        ['<figcaption>', '<p>[foo<p>bar]'],
   1155        ['<figure>', '<p>[foo<p>bar]'],
   1156        ['<footer>', '<p>[foo<p>bar]'],
   1157        ['<form>', '<p>[foo<p>bar]'],
   1158        ['<h1>', '<p>[foo<p>bar]'],
   1159        ['<h2>', '<p>[foo<p>bar]'],
   1160        ['<h3>', '<p>[foo<p>bar]'],
   1161        ['<h4>', '<p>[foo<p>bar]'],
   1162        ['<h5>', '<p>[foo<p>bar]'],
   1163        ['<h6>', '<p>[foo<p>bar]'],
   1164        ['<header>', '<p>[foo<p>bar]'],
   1165        ['<head>', '<p>[foo<p>bar]'],
   1166        ['<hgroup>', '<p>[foo<p>bar]'],
   1167        ['<hr>', '<p>[foo<p>bar]'],
   1168        ['<html>', '<p>[foo<p>bar]'],
   1169        ['<ins>', '<p>[foo<p>bar]'],
   1170        ['<li>', '<p>[foo<p>bar]'],
   1171        ['<listing>', '<p>[foo<p>bar]'],
   1172        ['<menu>', '<p>[foo<p>bar]'],
   1173        ['<nav>', '<p>[foo<p>bar]'],
   1174        ['<ol>', '<p>[foo<p>bar]'],
   1175        ['<p>', '<p>[foo<p>bar]'],
   1176        ['<plaintext>', '<p>[foo<p>bar]'],
   1177        ['<pre>', '<p>[foo<p>bar]'],
   1178        ['<section>', '<p>[foo<p>bar]'],
   1179        ['<ul>', '<p>[foo<p>bar]'],
   1180        ['<xmp>', '<p>[foo<p>bar]'],
   1181        ['<quasit>', '<p>[foo<p>bar]'],
   1182 
   1183        ['p', '<div>[foobar]</div>'],
   1184 
   1185        '<ol><li>[foo]<li>bar</ol>',
   1186 
   1187        ['<p>', '<h1>[foo]<br>bar</h1>'],
   1188        ['<p>', '<h1>foo<br>[bar]</h1>'],
   1189        ['<p>', '<h1>[foo<br>bar]</h1>'],
   1190        ['<address>', '<h1>[foo]<br>bar</h1>'],
   1191        ['<address>', '<h1>foo<br>[bar]</h1>'],
   1192        ['<address>', '<h1>[foo<br>bar]</h1>'],
   1193        ['<pre>', '<h1>[foo]<br>bar</h1>'],
   1194        ['<pre>', '<h1>foo<br>[bar]</h1>'],
   1195        ['<pre>', '<h1>[foo<br>bar]</h1>'],
   1196        ['<h2>', '<h1>[foo]<br>bar</h1>'],
   1197        ['<h2>', '<h1>foo<br>[bar]</h1>'],
   1198        ['<h2>', '<h1>[foo<br>bar]</h1>'],
   1199 
   1200        ['<h1>', '<p>[foo]<br>bar</p>'],
   1201        ['<h1>', '<p>foo<br>[bar]</p>'],
   1202        ['<h1>', '<p>[foo<br>bar]</p>'],
   1203        ['<address>', '<p>[foo]<br>bar</p>'],
   1204        ['<address>', '<p>foo<br>[bar]</p>'],
   1205        ['<address>', '<p>[foo<br>bar]</p>'],
   1206        ['<pre>', '<p>[foo]<br>bar</p>'],
   1207        ['<pre>', '<p>foo<br>[bar]</p>'],
   1208        ['<pre>', '<p>[foo<br>bar]</p>'],
   1209 
   1210        ['<p>', '<address>[foo]<br>bar</address>'],
   1211        ['<p>', '<address>foo<br>[bar]</address>'],
   1212        ['<p>', '<address>[foo<br>bar]</address>'],
   1213        ['<pre>', '<address>[foo]<br>bar</address>'],
   1214        ['<pre>', '<address>foo<br>[bar]</address>'],
   1215        ['<pre>', '<address>[foo<br>bar]</address>'],
   1216        ['<h1>', '<address>[foo]<br>bar</address>'],
   1217        ['<h1>', '<address>foo<br>[bar]</address>'],
   1218        ['<h1>', '<address>[foo<br>bar]</address>'],
   1219 
   1220        ['<p>', '<pre>[foo]<br>bar</pre>'],
   1221        ['<p>', '<pre>foo<br>[bar]</pre>'],
   1222        ['<p>', '<pre>[foo<br>bar]</pre>'],
   1223        ['<address>', '<pre>[foo]<br>bar</pre>'],
   1224        ['<address>', '<pre>foo<br>[bar]</pre>'],
   1225        ['<address>', '<pre>[foo<br>bar]</pre>'],
   1226        ['<h1>', '<pre>[foo]<br>bar</pre>'],
   1227        ['<h1>', '<pre>foo<br>[bar]</pre>'],
   1228        ['<h1>', '<pre>[foo<br>bar]</pre>'],
   1229 
   1230        ['<h1>', '<p>[foo</p>bar]'],
   1231        ['<h1>', '[foo<p>bar]</p>'],
   1232        ['<p>', '<div>[foo<p>bar]</p></div>'],
   1233        ['<p>', '<xmp>[foo]</xmp>'],
   1234        ['<div>', '<xmp>[foo]</xmp>'],
   1235 
   1236        '<div><ol><li>[foo]</ol></div>',
   1237        '<div><table><tr><td>[foo]</table></div>',
   1238        '<p>[foo<h1>bar]</h1>',
   1239        '<h1>[foo</h1><h2>bar]</h2>',
   1240        '<div>[foo</div>bar]',
   1241 
   1242        // https://bugs.webkit.org/show_bug.cgi?id=47054
   1243        ['<p>', '<div style=color:blue>[foo]</div>'],
   1244        // https://bugs.webkit.org/show_bug.cgi?id=47574
   1245        ['<h1>', '{<p>foo</p>ba]r'],
   1246        ['<pre>', '&#10;[foo<p>bar]</p>'],
   1247        // From https://bugs.webkit.org/show_bug.cgi?id=47300
   1248        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14009
   1249        ['!<p>', '{<pre>&#10;foo&#10;&#10;bar&#10;</pre>}'],
   1250    ],
   1251    //@}
   1252    forwarddelete: [
   1253    //@{
   1254        // Collapsed selection
   1255        'foo[]',
   1256        '<span>foo[]</span>',
   1257        '<p>foo[]</p>',
   1258        'foo[]bar',
   1259        '<span>foo</span>{}<span>bar</span>',
   1260        '<span>foo[</span><span>]bar</span>',
   1261        'foo[]<span style=display:none>bar</span>baz',
   1262        'foo[]<script>bar</script>baz',
   1263        'fo[]&ouml;bar',
   1264        'fo[]o&#x308;bar',
   1265        'fo[]o&#x308;&#x327;bar',
   1266        '[]&ouml;bar',
   1267        '[]o&#x308;bar',
   1268        '[]o&#x308;&#x327;bar',
   1269 
   1270        '[]&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;&#x5dd;',
   1271        '&#x5e9;&#x5c1;&#x5b8;&#x5dc;[]&#x5d5;&#x5b9;&#x5dd;',
   1272 
   1273        '<p>foo[]</p><p>bar</p>',
   1274        '<p>foo[]</p>bar',
   1275        'foo[]<p>bar</p>',
   1276        '<p>foo[]<br></p><p>bar</p>',
   1277        '<p>foo[]<br></p>bar',
   1278        'foo[]<br><p>bar</p>',
   1279 
   1280        '<p>{}<br></p>foo',
   1281        '<p>{}<span><br></span></p>foo',
   1282        'foo{}<p><br>',
   1283        'foo{}<p><span><br></span>',
   1284        'foo{}<br><p><br>',
   1285        'foo{}<span><br></span><p><br>',
   1286        'foo{}<br><p><span><br></span>',
   1287        'foo{}<span><br></span><p><span><br></span>',
   1288        'foo{}<p>',
   1289        '<table><tr><td>{}</table>foo',
   1290        '<table><tr><td>{}<br></table>foo',
   1291        '<table><tr><td>{}<span><br></span></table>foo',
   1292 
   1293        '<div><p>foo[]</p></div><p>bar</p>',
   1294        '<p>foo[]</p><div><p>bar</p></div>',
   1295        '<div><p>foo[]</p></div><div><p>bar</p></div>',
   1296        '<div><p>foo[]</p></div>bar',
   1297        'foo[]<div><p>bar</p></div>',
   1298 
   1299        '<div>foo[]</div><div>bar</div>',
   1300        '<pre>foo[]</pre>bar',
   1301 
   1302        'foo[]<br>bar',
   1303        '<b>foo[]</b><br>bar',
   1304        'foo[]<hr>bar',
   1305        '<p>foo[]<hr><p>bar',
   1306        '<p>foo[]</p><br><p>bar</p>',
   1307        '<p>foo[]</p><br><br><p>bar</p>',
   1308        '<p>foo[]</p><img src=/img/lion.svg><p>bar',
   1309        'foo[]<img src=/img/lion.svg>bar',
   1310 
   1311        'foo[]<a>bar</a>',
   1312        'foo[]<a href=/>bar</a>',
   1313        'foo[]<a name=abc>bar</a>',
   1314        'foo[]<a href=/ name=abc>bar</a>',
   1315        'foo[]<span><a>bar</a></span>',
   1316        'foo[]<span><a href=/>bar</a></span>',
   1317        'foo[]<span><a name=abc>bar</a></span>',
   1318        'foo[]<span><a href=/ name=abc>bar</a></span>',
   1319        '<a>foo[]</a>bar',
   1320        '<a href=/>foo[]</a>bar',
   1321        '<a name=abc>foo[]</a>bar',
   1322        '<a href=/ name=abc>foo[]</a>bar',
   1323 
   1324        'foo []&nbsp;',
   1325        '[]&nbsp; foo',
   1326        'foo[] &nbsp;bar',
   1327        'foo[]&nbsp; bar',
   1328        'foo[]&nbsp;&nbsp;bar',
   1329        'foo[]  bar',
   1330        'foo[] &nbsp; bar',
   1331        'foo []&nbsp; bar',
   1332        'foo &nbsp;[] bar',
   1333        'foo[] <span>&nbsp;</span> bar',
   1334        'foo []<span>&nbsp;</span> bar',
   1335        'foo <span>&nbsp;</span>[] bar',
   1336        '<b>foo[] </b>&nbsp;bar',
   1337        '<b>foo[]&nbsp;</b> bar',
   1338        '<b>foo[]&nbsp;</b>&nbsp;bar',
   1339        '<b>foo[] </b> bar',
   1340 
   1341        '<pre>foo []&nbsp;</pre>',
   1342        '<pre>[]&nbsp; foo</pre>',
   1343        '<pre>foo[] &nbsp;bar</pre>',
   1344        '<pre>foo[]&nbsp; bar</pre>',
   1345        '<pre>foo[]  bar</pre>',
   1346 
   1347        '<div style=white-space:pre>foo []&nbsp;</div>',
   1348        '<div style=white-space:pre>[]&nbsp; foo</div>',
   1349        '<div style=white-space:pre>foo[] &nbsp;bar</div>',
   1350        '<div style=white-space:pre>foo[]&nbsp; bar</div>',
   1351        '<div style=white-space:pre>foo[]  bar</div>',
   1352 
   1353        '<div style=white-space:pre-wrap>foo []&nbsp;</div>',
   1354        '<div style=white-space:pre-wrap>[]&nbsp; foo</div>',
   1355        '<div style=white-space:pre-wrap>foo[] &nbsp;bar</div>',
   1356        '<div style=white-space:pre-wrap>foo[]&nbsp; bar</div>',
   1357        '<div style=white-space:pre-wrap>foo[]  bar</div>',
   1358 
   1359        '<div style=white-space:pre-line>foo []&nbsp;</div>',
   1360        '<div style=white-space:pre-line>[]&nbsp; foo</div>',
   1361        '<div style=white-space:pre-line>foo[] &nbsp;bar</div>',
   1362        '<div style=white-space:pre-line>foo[]&nbsp; bar</div>',
   1363        '<div style=white-space:pre-line>foo[]  bar</div>',
   1364 
   1365        '<div style=white-space:nowrap>foo []&nbsp;</div>',
   1366        '<div style=white-space:nowrap>[]&nbsp; foo</div>',
   1367        '<div style=white-space:nowrap>foo[] &nbsp;bar</div>',
   1368        '<div style=white-space:nowrap>foo[]&nbsp; bar</div>',
   1369        '<div style=white-space:nowrap>foo[]  bar</div>',
   1370 
   1371        // Tables with collapsed selection
   1372        'foo[]<table><tr><td>bar</table>baz',
   1373        'foo<table><tr><td>bar[]</table>baz',
   1374        '<p>foo[]<table><tr><td>bar</table><p>baz',
   1375        '<table><tr><td>foo[]<td>bar</table>',
   1376        '<table><tr><td>foo[]<tr><td>bar</table>',
   1377 
   1378        'foo[]<br><table><tr><td>bar</table>baz',
   1379        'foo<table><tr><td>bar[]<br></table>baz',
   1380        '<p>foo[]<br><table><tr><td>bar</table><p>baz',
   1381        '<p>foo<table><tr><td>bar[]<br></table><p>baz',
   1382        '<table><tr><td>foo[]<br><td>bar</table>',
   1383        '<table><tr><td>foo[]<br><tr><td>bar</table>',
   1384 
   1385        'foo<table><tr><td>bar[]</table><br>baz',
   1386        'foo[]<table><tr><td><hr>bar</table>baz',
   1387        '<table><tr><td>foo[]<td><hr>bar</table>',
   1388        '<table><tr><td>foo[]<tr><td><hr>bar</table>',
   1389 
   1390        // Lists with collapsed selection
   1391        'foo[]<ol><li>bar<li>baz</ol>',
   1392        'foo[]<br><ol><li>bar<li>baz</ol>',
   1393        '<ol><li>foo[]<li>bar</ol>',
   1394        '<ol><li>foo[]<br><li>bar</ol>',
   1395        '<ol><li>foo[]<li>bar<br>baz</ol>',
   1396 
   1397        '<ol><li><p>foo[]<li>bar</ol>',
   1398        '<ol><li>foo[]<li><p>bar</ol>',
   1399        '<ol><li><p>foo[]<li><p>bar</ol>',
   1400 
   1401        '<ol><li>foo[]<ul><li>bar</ul></ol>',
   1402        'foo[]<ol><ol><li>bar</ol></ol>',
   1403        'foo[]<div><ol><li>bar</ol></div>',
   1404 
   1405        'foo[]<dl><dt>bar<dd>baz</dl>',
   1406        'foo[]<dl><dd>bar</dl>',
   1407        '<dl><dt>foo[]<dd>bar</dl>',
   1408        '<dl><dt>foo[]<dt>bar<dd>baz</dl>',
   1409        '<dl><dt>foo<dd>bar[]<dd>baz</dl>',
   1410 
   1411        '<ol><li>foo[]</ol>bar',
   1412        '<ol><li>foo[]<br></ol>bar',
   1413        '<ol><li>{}<br></ol>bar',
   1414        '<ol><li>foo<li>{}<br></ol>bar',
   1415 
   1416        '<ol><li>foo[]</ol><p>bar',
   1417        '<ol><li>foo[]<br></ol><p>bar',
   1418        '<ol><li>{}<br></ol><p>bar',
   1419        '<ol><li>foo<li>{}<br></ol><p>bar',
   1420 
   1421        '<ol><li>foo[]</ol><br>',
   1422        '<ol><li>foo[]<br></ol><br>',
   1423        '<ol><li>{}<br></ol><br>',
   1424        '<ol><li>foo<li>{}<br></ol><br>',
   1425 
   1426        '<ol><li>foo[]</ol><p><br>',
   1427        '<ol><li>foo[]<br></ol><p><br>',
   1428        '<ol><li>{}<br></ol><p><br>',
   1429        '<ol><li>foo<li>{}<br></ol><p><br>',
   1430 
   1431        // Indented stuff with collapsed selection
   1432        'foo[]<blockquote>bar</blockquote>',
   1433        'foo[]<blockquote><blockquote>bar</blockquote></blockquote>',
   1434        'foo[]<blockquote><div>bar</div></blockquote>',
   1435        'foo[]<blockquote style="color: blue">bar</blockquote>',
   1436 
   1437        'foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>',
   1438        'foo[]<blockquote><div><p>bar<p>baz</div></blockquote>',
   1439        'foo[]<blockquote style="color: blue"><p>bar<p>baz</blockquote>',
   1440 
   1441        'foo[]<blockquote><p><b>bar</b><p>baz</blockquote>',
   1442        'foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>',
   1443        'foo[]<blockquote><p><span>bar</span><p>baz</blockquote>',
   1444 
   1445        'foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra',
   1446        'foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra',
   1447        'foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra',
   1448 
   1449        // Invisible stuff with collapsed selection
   1450        'foo[]<span></span>bar',
   1451        'foo[]<span><span></span></span>bar',
   1452        'foo[]<quasit></quasit>bar',
   1453        'foo[]<span></span><br>bar',
   1454        '<span>foo[]<span></span></span>bar',
   1455        'foo[]<span></span><span>bar</span>',
   1456        'foo[]<div><div><p>bar</div></div>',
   1457        'foo[]<div><div><p><!--abc-->bar</div></div>',
   1458        'foo[]<div><div><!--abc--><p>bar</div></div>',
   1459        'foo[]<div><!--abc--><div><p>bar</div></div>',
   1460        'foo[]<!--abc--><div><div><p>bar</div></div>',
   1461        '<div><div><p>foo[]</div></div>bar',
   1462        '<div><div><p>foo[]</div></div><!--abc-->bar',
   1463        '<div><div><p>foo[]</div><!--abc--></div>bar',
   1464        '<div><div><p>foo[]</p><!--abc--></div></div>bar',
   1465        '<div><div><p>foo[]<!--abc--></div></div>bar',
   1466        '<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>',
   1467        '<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>',
   1468        '<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>',
   1469        '<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>',
   1470        '<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>',
   1471        '<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>',
   1472        '<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>',
   1473        '<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>',
   1474 
   1475        // Styled stuff with collapsed selection
   1476        '<p style=color:blue>foo[]<p>bar',
   1477        '<p style=color:blue>foo[]<p style=color:brown>bar',
   1478        '<p>foo[]<p style=color:brown>bar',
   1479        '<p><font color=blue>foo[]</font><p>bar',
   1480        '<p><font color=blue>foo[]</font><p><font color=brown>bar</font>',
   1481        '<p>foo[]<p><font color=brown>bar</font>',
   1482        '<p><span style=color:blue>foo[]</font><p>bar',
   1483        '<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>',
   1484        '<p>foo[]<p><span style=color:brown>bar</font>',
   1485 
   1486        '<p style=background-color:aqua>foo[]<p>bar',
   1487        '<p style=background-color:aqua>foo[]<p style=background-color:tan>bar',
   1488        '<p>foo[]<p style=background-color:tan>bar',
   1489        '<p><span style=background-color:aqua>foo[]</font><p>bar',
   1490        '<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>',
   1491        '<p>foo[]<p><span style=background-color:tan>bar</font>',
   1492 
   1493        '<p style=text-decoration:underline>foo[]<p>bar',
   1494        '<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar',
   1495        '<p>foo[]<p style=text-decoration:line-through>bar',
   1496        '<p><u>foo[]</u><p>bar',
   1497        '<p><u>foo[]</u><p><s>bar</s>',
   1498        '<p>foo[]<p><s>bar</s>',
   1499 
   1500        '<p style=color:blue>foo[]</p>bar',
   1501        'foo[]<p style=color:brown>bar',
   1502        '<div style=color:blue><p style=color:green>foo[]</div>bar',
   1503        '<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar',
   1504        '<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar',
   1505 
   1506        // Uncollapsed selection (should be same as delete command)
   1507        'foo[bar]baz',
   1508        '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
   1509        '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
   1510        '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
   1511        '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
   1512        '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
   1513        '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
   1514        '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
   1515        '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
   1516 
   1517        'foo<b>[bar]</b>baz',
   1518        'foo<b>{bar}</b>baz',
   1519        'foo{<b>bar</b>}baz',
   1520        'foo<span>[bar]</span>baz',
   1521        'foo<span>{bar}</span>baz',
   1522        'foo{<span>bar</span>}baz',
   1523        '<b>foo[bar</b><i>baz]quz</i>',
   1524        '<p>foo</p><p>[bar]</p><p>baz</p>',
   1525        '<p>foo</p><p>{bar}</p><p>baz</p>',
   1526        '<p>foo</p><p>{bar</p>}<p>baz</p>',
   1527        '<p>foo</p>{<p>bar}</p><p>baz</p>',
   1528        '<p>foo</p>{<p>bar</p>}<p>baz</p>',
   1529 
   1530        '<p>foo[bar<p>baz]quz',
   1531        '<p>foo[bar<div>baz]quz</div>',
   1532        '<p>foo[bar<h1>baz]quz</h1>',
   1533        '<div>foo[bar</div><p>baz]quz',
   1534        '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',
   1535 
   1536        '<p><b>foo[bar</b><p>baz]quz',
   1537        '<div><p>foo[bar</div><p>baz]quz',
   1538        '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
   1539        '<p>foo[bar<p style=color:blue>baz]quz',
   1540        '<p>foo[bar<p><b>baz]quz</b>',
   1541 
   1542        '<div><p>foo<p>[bar<p>baz]</div>',
   1543 
   1544        'foo[<br>]bar',
   1545        '<p>foo[</p><p>]bar</p>',
   1546        '<p>foo[</p><p>]bar<br>baz</p>',
   1547        'foo[<p>]bar</p>',
   1548        'foo{<p>}bar</p>',
   1549        'foo[<p>]bar<br>baz</p>',
   1550        'foo[<p>]bar</p>baz',
   1551        'foo{<p>bar</p>}baz',
   1552        'foo<p>{bar</p>}baz',
   1553        'foo{<p>bar}</p>baz',
   1554        '<p>foo[</p>]bar',
   1555        '<p>foo{</p>}bar',
   1556        '<p>foo[</p>]bar<br>baz',
   1557        '<p>foo[</p>]bar<p>baz</p>',
   1558        'foo[<div><p>]bar</div>',
   1559        '<div><p>foo[</p></div>]bar',
   1560        'foo[<div><p>]bar</p>baz</div>',
   1561        'foo[<div>]bar<p>baz</p></div>',
   1562        '<div><p>foo</p>bar[</div>]baz',
   1563        '<div>foo<p>bar[</p></div>]baz',
   1564 
   1565        '<p>foo<br>{</p>]bar',
   1566        '<p>foo<br><br>{</p>]bar',
   1567        'foo<br>{<p>]bar</p>',
   1568        'foo<br><br>{<p>]bar</p>',
   1569        '<p>foo<br>{</p><p>}bar</p>',
   1570        '<p>foo<br><br>{</p><p>}bar</p>',
   1571 
   1572        '<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>',
   1573        '<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
   1574        '<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
   1575        '<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>',
   1576        '<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>',
   1577        '<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>',
   1578        '{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}',
   1579        '<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>',
   1580        '<p>fo[o<table><tr><td>b]ar</table><p>baz',
   1581        '<p>foo<table><tr><td>ba[r</table><p>b]az',
   1582        '<p>fo[o<table><tr><td>bar</table><p>b]az',
   1583 
   1584        '<p>foo<ol><li>ba[r<li>b]az</ol><p>quz',
   1585        '<p>foo<ol><li>bar<li>[baz]</ol><p>quz',
   1586        '<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz',
   1587        '<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz',
   1588        '<p>fo[o<ol><li>bar<li>b]az</ol><p>quz',
   1589        '<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz',
   1590 
   1591        '<ol><li>fo[o</ol><ol><li>b]ar</ol>',
   1592        '<ol><li>fo[o</ol><ul><li>b]ar</ul>',
   1593 
   1594        'foo[<ol><li>]bar</ol>',
   1595        '<ol><li>foo[<li>]bar</ol>',
   1596        'foo[<dl><dt>]bar<dd>baz</dl>',
   1597        'foo[<dl><dd>]bar</dl>',
   1598        '<dl><dt>foo[<dd>]bar</dl>',
   1599        '<dl><dt>foo[<dt>]bar<dd>baz</dl>',
   1600        '<dl><dt>foo<dd>bar[<dd>]baz</dl>',
   1601 
   1602        // https://bugs.webkit.org/show_bug.cgi?id=35281
   1603        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13976
   1604        '<ol><li>foo</ol>{}<br><ol><li>bar</ol>',
   1605        '<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>',
   1606        '<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>',
   1607        '<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>',
   1608        '<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
   1609        '<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
   1610        '<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>',
   1611        '<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>',
   1612        '<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>',
   1613        '<ol><li>foo[</ol>bar]<ol><li>baz</ol>',
   1614        '<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>',
   1615        '<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>',
   1616        '<ol><li>fo[]o</ol><ol><li>bar</ol>',
   1617        '<ol><li>foo</ol>[bar<ol><li>]baz</ol>',
   1618        '<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>',
   1619        '<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>',
   1620        '<ol><li>foo</ol><ol><li>[]bar</ol>',
   1621        '<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>',
   1622        '<ul><li>foo</ul>{}<br><ul><li>bar</ul>',
   1623        '<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>',
   1624        '<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>',
   1625        '<ol><li>foo</ol>{}<br><ul><li>bar</ul>',
   1626        '<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>',
   1627        '<ul><li>foo</ul>{}<br><ol><li>bar</ol>',
   1628        '<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>',
   1629 
   1630        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13831
   1631        '<p><b>[foo]</b>',
   1632        '<p><quasit>[foo]</quasit>',
   1633        '<p><b><i>[foo]</i></b>',
   1634        '<p><b>{foo}</b>',
   1635        '<p>{<b>foo</b>}',
   1636        '<p><b>[]f</b>',
   1637        '<b>[foo]</b>',
   1638        '<div><b>[foo]</b></div>',
   1639    ],
   1640    //@}
   1641    hilitecolor: [
   1642    //@{
   1643        'foo[]bar',
   1644        '<p>[foo</p> <p>bar]</p>',
   1645        '<span>[foo</span> <span>bar]</span>',
   1646        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
   1647        '<p>[foo<p><br><p>bar]',
   1648        '<b>foo[]bar</b>',
   1649        '<i>foo[]bar</i>',
   1650        '<span>foo</span>{}<span>bar</span>',
   1651        '<span>foo[</span><span>]bar</span>',
   1652        'foo[bar]baz',
   1653        'foo[bar<b>baz]qoz</b>quz',
   1654        'foo[bar<i>baz]qoz</i>quz',
   1655        '{<p><p> <p>foo</p>}',
   1656 
   1657        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   1658        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
   1659        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
   1660        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
   1661        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
   1662        '{<table><tr><td>foo<td>bar<td>baz</table>}',
   1663 
   1664        '<p style="background-color: rgb(0, 255, 255)">foo[bar]baz</p>',
   1665        '<p style="background-color: #00ffff">foo[bar]baz</p>',
   1666        '<p style="background-color: aqua">foo[bar]baz</p>',
   1667        '{<p style="background-color: aqua">foo</p><p>bar</p>}',
   1668        '<span style="background-color: aqua">foo<span style="background-color: tan">[bar]</span>baz</span>',
   1669        '<span style="background-color: #00ffff">foo<span style="background-color: tan">[bar]</span>baz</span>',
   1670        '<span style="background-color: #0ff">foo<span style="background-color: tan">[bar]</span>baz</span>',
   1671        '<span style="background-color: rgb(0, 255, 255)">foo<span style="background-color: tan">[bar]</span>baz</span>',
   1672        '<span style="background-color: aqua">foo<span style="background-color: tan">b[ar]</span>baz</span>',
   1673        '<p style="background-color: aqua">foo<span style="background-color: tan">b[ar]</span>baz</p>',
   1674        '<div style="background-color: aqua"><p style="background-color: tan">b[ar]</p></div>',
   1675        '<span style="display: block; background-color: aqua"><span style="display: block; background-color: tan">b[ar]</span></span>',
   1676 
   1677        // Tests for queryCommandIndeterm() and queryCommandState()
   1678        'fo[o<span style=background-color:tan>b]ar</span>baz',
   1679        'foo<span style=background-color:tan>ba[r</span>b]az',
   1680        'fo[o<span style=background-color:tan>bar</span>b]az',
   1681        'foo[<span style=background-color:tan>b]ar</span>baz',
   1682        'foo<span style=background-color:tan>ba[r</span>]baz',
   1683        'foo[<span style=background-color:tan>bar</span>]baz',
   1684        'foo<span style=background-color:tan>[bar]</span>baz',
   1685        'foo{<span style=background-color:tan>bar</span>}baz',
   1686        '<span style=background-color:tan>fo[o</span><span style=background-color:yellow>b]ar</span>',
   1687        '<span style=background-color:tan>fo[o</span><span style=background-color:tan>b]ar</span>',
   1688        '<span style=background-color:tan>fo[o<span style=background-color:transparent>b]ar</span></span>',
   1689 
   1690        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13829
   1691        '!<font size=6>[foo]</font>',
   1692        '!<span style=font-size:xx-large>[foo]</span>',
   1693        '!<font size=6>foo[bar]baz</font>',
   1694        '!<span style=font-size:xx-large>foo[bar]baz</span>',
   1695        '![foo<font size=6>bar</font>baz]',
   1696        '![foo<span style=font-size:xx-large>bar</span>baz]',
   1697    ],
   1698    //@}
   1699    indent: [
   1700    //@{
   1701        // All these have a trailing unselected paragraph, because otherwise
   1702        // Gecko is unhappy: it throws exceptions in non-CSS mode, and in CSS
   1703        // mode it adds the indentation invisibly to the wrapper div in many
   1704        // cases.
   1705        'foo[]bar<p>extra',
   1706        '<span>foo</span>{}<span>bar</span><p>extra',
   1707        '<span>foo[</span><span>]bar</span><p>extra',
   1708        'foo[bar]baz<p>extra',
   1709        '<p dir=rtl>פו[בר]בז<p dir=rtl>נוםף',
   1710        '<p dir=rtl>פו[ברבז<p>Foobar]baz<p>Extra',
   1711        '<p>Foo[barbaz<p dir=rtl>פובר]בז<p>Extra',
   1712        '<div><p>Foo[barbaz<p dir=rtl>פובר]בז</div><p>Extra',
   1713        'foo]bar[baz<p>extra',
   1714        '{<p><p> <p>foo</p>}<p>extra',
   1715        'foo[bar<i>baz]qoz</i>quz<p>extra',
   1716        '[]foo<p>extra',
   1717        'foo[]<p>extra',
   1718        '<p>[]foo<p>extra',
   1719        '<p>foo[]<p>extra',
   1720        '<p>{}<br>foo</p><p>extra',
   1721        '<p>foo<br>{}</p><p>extra',
   1722        '<span>{}<br>foo</span>bar<p>extra',
   1723        '<span>foo<br>{}</span>bar<p>extra',
   1724        '<p>foo</p>{}<p>bar</p>',
   1725 
   1726        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
   1727        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   1728        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   1729        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
   1730        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
   1731        '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
   1732 
   1733        '<p>foo[bar]</p><p>baz</p><p>extra',
   1734        '<p>[foobar</p><p>ba]z</p><p>extra',
   1735        'foo[bar]<br>baz<p>extra',
   1736        'foo[bar]<br><br><br><br>baz<p>extra',
   1737        'foobar<br>[ba]z<p>extra',
   1738        'foobar<br><br><br><br>[ba]z<p>extra',
   1739        'foo[bar<br>ba]z<p>extra',
   1740        '<div>foo<p>[bar]</p>baz</div><p>extra',
   1741 
   1742        // These mimic existing indentation in various browsers, to see how
   1743        // they cope with indenting twice.  This is spec, Gecko non-CSS, and
   1744        // Opera:
   1745        '<blockquote><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
   1746        '<blockquote><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
   1747        '<blockquote><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
   1748        '<blockquote><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
   1749        '<p>[foo]<blockquote><p>bar</blockquote><p>extra',
   1750        '<p>[foo<blockquote><p>b]ar</blockquote><p>extra',
   1751        '<p>foo<blockquote><p>bar</blockquote><p>[baz]<p>extra',
   1752        '<p>foo<blockquote><p>[bar</blockquote><p>baz]<p>extra',
   1753        '<p>[foo<blockquote><p>bar</blockquote><p>baz]<p>extra',
   1754        '<blockquote><p>foo</blockquote><p>[bar]<blockquote><p>baz</blockquote><p>extra',
   1755 
   1756        '<blockquote>foo[bar]<br>baz</blockquote><p>extra',
   1757        '<blockquote>foo[bar<br>b]az</blockquote><p>extra',
   1758        '<blockquote>foo[bar]</blockquote>baz<p>extra',
   1759        '<blockquote>foo[bar</blockquote>b]az<p>extra',
   1760        '[foo]<blockquote>bar</blockquote><p>extra',
   1761        '[foo<blockquote>b]ar</blockquote><p>extra',
   1762        'foo<blockquote>bar</blockquote>[baz]<p>extra',
   1763        '[foo<blockquote>bar</blockquote>baz]<p>extra',
   1764        '<blockquote>foo</blockquote>[bar]<blockquote>baz</blockquote><p>extra',
   1765 
   1766        // IE:
   1767        '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
   1768        '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
   1769        '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
   1770        '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
   1771        '<p>[foo]<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>extra',
   1772        '<p>[foo<blockquote style="margin-right: 0" dir="ltr"><p>b]ar</blockquote><p>extra',
   1773        '<p>foo<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>[baz]<p>extra',
   1774        '<p>foo<blockquote style="margin-right: 0" dir="ltr"><p>[bar</blockquote><p>baz]<p>extra',
   1775        '<p>[foo<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>baz]<p>extra',
   1776        '<blockquote style="margin-right: 0" dir="ltr"><p>foo</blockquote><p>[bar]<blockquote style="margin-right: 0" dir="ltr"><p>baz</blockquote><p>extra',
   1777 
   1778        // Firefox CSS mode:
   1779        '<p style="margin-left: 40px">foo[bar]</p><p style="margin-left: 40px">baz</p><p>extra',
   1780        '<p style="margin-left: 40px">foo[bar</p><p style="margin-left: 40px">b]az</p><p>extra',
   1781        '<p style="margin-left: 40px">foo[bar]</p><p>baz</p><p>extra',
   1782        '<p style="margin-left: 40px">foo[bar</p><p>b]az</p><p>extra',
   1783        '<p>[foo]<p style="margin-left: 40px">bar<p>extra',
   1784        '<p>[foo<p style="margin-left: 40px">b]ar<p>extra',
   1785        '<p>foo<p style="margin-left: 40px">bar<p>[baz]<p>extra',
   1786        '<p>foo<p style="margin-left: 40px">[bar<p>baz]<p>extra',
   1787        '<p>[foo<p style="margin-left: 40px">bar<p>baz]<p>extra',
   1788        '<p style="margin-left: 40px">foo<p>[bar]<p style="margin-left: 40px">baz<p>extra',
   1789 
   1790        // WebKit:
   1791        '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
   1792        '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
   1793        '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
   1794        '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
   1795        '<p>[foo]<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>extra',
   1796        '<p>[foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>b]ar</blockquote><p>extra',
   1797        '<p>foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>[baz]<p>extra',
   1798        '<p>foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>[bar</blockquote><p>baz]<p>extra',
   1799        '<p>[foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>baz]<p>extra',
   1800        '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>foo</blockquote><p>[bar]<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>baz</blockquote><p>extra',
   1801 
   1802        // MDC says "In Firefox, if the selection spans multiple lines at
   1803        // different levels of indentation, only the least indented lines in
   1804        // the selection will be indented."  Let's test that.
   1805        '<blockquote>f[oo<blockquote>b]ar</blockquote></blockquote><p>extra',
   1806 
   1807        // Lists!
   1808        '<ol><li>foo<li>[bar]<li>baz</ol>',
   1809        '<ol data-start=1 data-end=2><li>foo<li>bar<li>baz</ol>',
   1810        '<ol><li>foo</ol>[bar]',
   1811        '<ol><li>[foo]<br>bar<li>baz</ol>',
   1812        '<ol><li>foo<br>[bar]<li>baz</ol>',
   1813        '<ol><li><div>[foo]</div>bar<li>baz</ol>',
   1814        '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
   1815        '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
   1816        '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
   1817        '<ol><li>foo</li><ol data-start=0 data-end=1><li>bar<li>baz</ol><li>quz</ol>',
   1818        '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
   1819        '<ol><li>foo</li><ol data-start=1 data-end=2><li>bar<li>baz</ol><li>quz</ol>',
   1820        '<ol><li>foo<ol><li>b[a]r</ol><li>baz</ol>',
   1821        '<ol><li>foo</li><ol><li>b[a]r</ol><li>baz</ol>',
   1822        '<ol><li>foo{<ol><li>bar</ol>}<li>baz</ol>',
   1823        '<ol><li>foo</li>{<ol><li>bar</ol>}<li>baz</ol>',
   1824        '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
   1825        '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
   1826        '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
   1827        '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
   1828        '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
   1829        '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
   1830 
   1831        // Lists with id's:
   1832        // http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2009-July/020721.html
   1833        '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>',
   1834        '<ol><ol><li id=i1>foo</ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>',
   1835        '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</li><ol><li id=i3>baz</ol></ol>',
   1836        '<ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>',
   1837        '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</ol>',
   1838 
   1839        // Try indenting multiple items at once.
   1840        '<ol><li>foo<li>b[ar<li>baz]</ol>',
   1841        '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
   1842        '<ol><li>[foo</li><ol><li>bar]</ol><li>baz</ol>',
   1843        '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
   1844        '<ol><li>foo</li><ol><li>b[ar</ol><li>b]az</ol>',
   1845        '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
   1846        '<ol><li>[foo</li><ol><li>bar</ol><li>baz]</ol><p>extra',
   1847 
   1848        // We probably can't actually get this DOM . . .
   1849        '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
   1850        '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
   1851        '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
   1852        '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
   1853 
   1854        'foo<!--bar-->[baz]<p>extra',
   1855        '[foo]<!--bar-->baz<p>extra',
   1856        '<p>foo<!--bar-->{}<p>extra',
   1857        '<p>{}<!--foo-->bar<p>extra',
   1858 
   1859        // Whitespace nodes
   1860        '<blockquote><p>foo</blockquote> <p>[bar]',
   1861        '<p>[foo]</p> <blockquote><p>bar</blockquote>',
   1862        '<blockquote><p>foo</blockquote> <p>[bar]</p> <blockquote><p>baz</blockquote>',
   1863        '<ol><li>foo</li><ol><li>bar</li> </ol><li>[baz]</ol>',
   1864        '<ol><li>foo</li><ol><li>bar</li></ol> <li>[baz]</ol>',
   1865        '<ol><li>foo</li><ol><li>bar</li> </ol> <li>[baz]</ol>',
   1866        '<ol><li>foo<ol><li>bar</li> </ol></li><li>[baz]</ol>',
   1867        '<ol><li>foo<ol><li>bar</li></ol></li> <li>[baz]</ol>',
   1868        '<ol><li>foo<ol><li>bar</li> </ol></li> <li>[baz]</ol>',
   1869        '<ol><li>foo<li>[bar]</li> <ol><li>baz</ol></ol>',
   1870        '<ol><li>foo<li>[bar]</li><ol> <li>baz</ol></ol>',
   1871        '<ol><li>foo<li>[bar]</li> <ol> <li>baz</ol></ol>',
   1872        '<ol><li>foo<li>[bar] <ol><li>baz</ol></ol>',
   1873        '<ol><li>foo<li>[bar]<ol> <li>baz</ol></ol>',
   1874        '<ol><li>foo<li>[bar] <ol> <li>baz</ol></ol>',
   1875 
   1876        // https://bugs.webkit.org/show_bug.cgi?id=32003
   1877        '<ul><li>a<br>{<br>}</li><li>b</li></ul>',
   1878    ],
   1879    //@}
   1880    inserthorizontalrule: [
   1881    //@{
   1882        'foo[]bar',
   1883        '<span>foo</span>{}<span>bar</span>',
   1884        '<span>foo[</span><span>]bar</span>',
   1885        '<p>foo[bar<p>baz]quz',
   1886        '<div><b>foo</b>{}<b>bar</b></div>',
   1887        '<div><b>foo[</b><b>]bar</b></div>',
   1888        '<div><b>foo</b>{<b>bar</b>}<b>baz</b></div>',
   1889        '<b>foo[]bar</b>',
   1890        '<b id=abc>foo[]bar</b>',
   1891        ["abc", 'foo[bar]baz'],
   1892        'foo[bar]baz',
   1893 
   1894        'foo<b>[bar]</b>baz',
   1895        'foo<b>{bar}</b>baz',
   1896        'foo{<b>bar</b>}baz',
   1897        '<p>foo<p>[bar]<p>baz',
   1898        '<p>foo<p>{bar}<p>baz',
   1899        '<p>foo{<p>bar</p>}<p>baz',
   1900 
   1901        '<p>foo[bar]baz</p>',
   1902        '<p id=abc>foo[bar]baz</p>',
   1903        '<h1>foo[bar]baz</h1>',
   1904        '<p>foo<b>b[a]r</b>baz</p>',
   1905 
   1906        '<a>foo[bar]baz</a>',
   1907        '<a href=/>foo[bar]baz</a>',
   1908        '<abbr>foo[bar]baz</abbr>',
   1909        '<address>foo[bar]baz</address>',
   1910        '<article>foo[bar]baz</article>',
   1911        '<aside>foo[bar]baz</aside>',
   1912        '<b>foo[bar]baz</b>',
   1913        '<bdi>foo[bar]baz</bdi>',
   1914        '<bdo dir=rtl>foo[bar]baz</bdo>',
   1915        '<blockquote>foo[bar]baz</blockquote>',
   1916        '<table><caption>foo[bar]baz</caption><tr><td>quz</table>',
   1917        '<cite>foo[bar]baz</cite>',
   1918        '<code>foo[bar]baz</code>',
   1919        '<dl><dd>foo[bar]baz</dd></dl>',
   1920        '<del>foo[bar]baz</del>',
   1921        '<details>foo[bar]baz</details>',
   1922        '<dfn>foo[bar]baz</dfn>',
   1923        '<div>foo[bar]baz</div>',
   1924        '<dl><dt>foo[bar]baz</dt></dl>',
   1925        '<em>foo[bar]baz</em>',
   1926        '<figure><figcaption>foo[bar]baz</figcaption>quz</figure>',
   1927        '<figure>foo[bar]baz</figure>',
   1928        '<footer>foo[bar]baz</footer>',
   1929        '<h1>foo[bar]baz</h1>',
   1930        '<h2>foo[bar]baz</h2>',
   1931        '<h3>foo[bar]baz</h3>',
   1932        '<h4>foo[bar]baz</h4>',
   1933        '<h5>foo[bar]baz</h5>',
   1934        '<h6>foo[bar]baz</h6>',
   1935        '<header>foo[bar]baz</header>',
   1936        '<hgroup>foo[bar]baz</hgroup>',
   1937        '<hgroup><h1>foo[bar]baz</h1></hgroup>',
   1938        '<i>foo[bar]baz</i>',
   1939        '<ins>foo[bar]baz</ins>',
   1940        '<kbd>foo[bar]baz</kbd>',
   1941        '<mark>foo[bar]baz</mark>',
   1942        '<nav>foo[bar]baz</nav>',
   1943        '<ol><li>foo[bar]baz</li></ol>',
   1944        '<p>foo[bar]baz</p>',
   1945        '<pre>foo[bar]baz</pre>',
   1946        '<q>foo[bar]baz</q>',
   1947        '<ruby>foo[bar]baz<rt>quz</rt></ruby>',
   1948        '<ruby>foo<rt>bar[baz]quz</rt></ruby>',
   1949        '<ruby>foo<rp>bar[baz]quz</rp><rt>qoz</rt><rp>qiz</rp></ruby>',
   1950        '<s>foo[bar]baz</s>',
   1951        '<samp>foo[bar]baz</samp>',
   1952        '<section>foo[bar]baz</section>',
   1953        '<small>foo[bar]baz</small>',
   1954        '<span>foo[bar]baz</span>',
   1955        '<strong>foo[bar]baz</strong>',
   1956        '<sub>foo[bar]baz</sub>',
   1957        '<sup>foo[bar]baz</sup>',
   1958        '<table><tr><td>foo[bar]baz</td></table>',
   1959        '<table><tr><th>foo[bar]baz</th></table>',
   1960        '<u>foo[bar]baz</u>',
   1961        '<ul><li>foo[bar]baz</li></ul>',
   1962        '<var>foo[bar]baz</var>',
   1963 
   1964        '<acronym>foo[bar]baz</acronym>',
   1965        '<big>foo[bar]baz</big>',
   1966        '<blink>foo[bar]baz</blink>',
   1967        '<center>foo[bar]baz</center>',
   1968        '<dir>foo[bar]baz</dir>',
   1969        '<dir><li>foo[bar]baz</li></dir>',
   1970        '<font>foo[bar]baz</font>',
   1971        '<listing>foo[bar]baz</listing>',
   1972        '<marquee>foo[bar]baz</marquee>',
   1973        '<nobr>foo[bar]baz</nobr>',
   1974        '<strike>foo[bar]baz</strike>',
   1975        '<tt>foo[bar]baz</tt>',
   1976        '<xmp>foo[bar]baz</xmp>',
   1977 
   1978        '<quasit>foo[bar]baz</quasit>',
   1979 
   1980        '<table><tr><td>fo[o<td>b]ar</table>',
   1981        'fo[o<span contenteditable=false>bar</span>b]az',
   1982    ],
   1983    //@}
   1984    inserthtml: [
   1985    //@{
   1986        'foo[]bar',
   1987        'foo[bar]baz',
   1988        'foo<span style=color:#aBcDeF>[bar]</span>baz',
   1989        'foo<span style=color:#aBcDeF>{bar}</span>baz',
   1990        'foo{<span style=color:#aBcDeF>bar</span>}baz',
   1991        '[foo<span style=color:#aBcDeF>bar]</span>baz',
   1992        '{foo<span style=color:#aBcDeF>bar}</span>baz',
   1993        'foo<span style=color:#aBcDeF>[bar</span>baz]',
   1994        'foo<span style=color:#aBcDeF>{bar</span>baz}',
   1995        'foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
   1996 
   1997        ['', 'foo[bar]baz'],
   1998        ['\0', 'foo[bar]baz'],
   1999        ['\x07', 'foo[bar]baz'],
   2000        // The following line makes Firefox 7.0a2 go into an infinite loop on
   2001        // my machine.
   2002        //['\ud800', 'foo[bar]baz'],
   2003 
   2004        ['<b>', 'foo[bar]baz'],
   2005        ['<b>abc', 'foo[bar]baz'],
   2006        ['<p>abc', '<p>foo[bar]baz'],
   2007        ['<li>abc', '<p>foo[bar]baz'],
   2008        ['<p>abc', '<ol>{<li>foo</li>}<li>bar</ol>'],
   2009        ['<p>abc', '<ol><li>foo</li>{<li>bar</li>}<li>baz</ol>'],
   2010        ['<p>abc', '<ol><li>[foo]</li><li>bar</ol>'],
   2011 
   2012        ['abc', '<xmp>f[o]o</xmp>'],
   2013        ['<b>abc</b>', '<xmp>f[o]o</xmp>'],
   2014        ['abc', '<script>f[o]o</script>bar'],
   2015        ['<b>abc</b>', '<script>f[o]o</script>bar'],
   2016 
   2017        ['<a>abc</a>', '<a>f[o]o</a>'],
   2018        ['<a href=/>abc</a>', '<a href=.>f[o]o</a>'],
   2019        ['<hr>', '<p>f[o]o'],
   2020        ['<hr>', '<b>f[o]o</b>'],
   2021        ['<h2>abc</h2>', '<h1>f[o]o</h1>'],
   2022        ['<td>abc</td>', '<table><tr><td>f[o]o</table>'],
   2023        ['<td>abc</td>', 'f[o]o'],
   2024 
   2025        ['<dt>abc</dt>', '<dl><dt>f[o]o<dd>bar</dl>'],
   2026        ['<dt>abc</dt>', '<dl><dt>foo<dd>b[a]r</dl>'],
   2027        ['<dd>abc</dd>', '<dl><dt>f[o]o<dd>bar</dl>'],
   2028        ['<dd>abc</dd>', '<dl><dt>foo<dd>b[a]r</dl>'],
   2029        ['<dt>abc</dt>', 'f[o]o'],
   2030        ['<dt>abc</dt>', '<ol><li>f[o]o</ol>'],
   2031        ['<dd>abc</dd>', 'f[o]o'],
   2032        ['<dd>abc</dd>', '<ol><li>f[o]o</ol>'],
   2033 
   2034        ['<li>abc</li>', '<dir><li>f[o]o</dir>'],
   2035        ['<li>abc</li>', '<ol><li>f[o]o</ol>'],
   2036        ['<li>abc</li>', '<ul><li>f[o]o</ul>'],
   2037        ['<dir><li>abc</dir>', '<dir><li>f[o]o</dir>'],
   2038        ['<dir><li>abc</dir>', '<ol><li>f[o]o</ol>'],
   2039        ['<dir><li>abc</dir>', '<ul><li>f[o]o</ul>'],
   2040        ['<ol><li>abc</ol>', '<dir><li>f[o]o</dir>'],
   2041        ['<ol><li>abc</ol>', '<ol><li>f[o]o</ol>'],
   2042        ['<ol><li>abc</ol>', '<ul><li>f[o]o</ul>'],
   2043        ['<ul><li>abc</ul>', '<dir><li>f[o]o</dir>'],
   2044        ['<ul><li>abc</ul>', '<ol><li>f[o]o</ol>'],
   2045        ['<ul><li>abc</ul>', '<ul><li>f[o]o</ul>'],
   2046        ['<li>abc</li>', 'f[o]o'],
   2047 
   2048        ['<nobr>abc</nobr>', '<nobr>f[o]o</nobr>'],
   2049        ['<nobr>abc</nobr>', 'f[o]o'],
   2050 
   2051        ['<p>abc', '<font color=blue>foo[]bar</font>'],
   2052        ['<p>abc', '<span style=color:blue>foo[]bar</span>'],
   2053        ['<p>abc', '<span style=font-variant:small-caps>foo[]bar</span>'],
   2054        [' ', '<p>[foo]</p>'],
   2055        ['<span style=display:none></span>', '<p>[foo]</p>'],
   2056        ['<!--abc-->', '<p>[foo]</p>'],
   2057 
   2058        ['abc', '<p>{}<br></p>'],
   2059        ['<!--abc-->', '<p>{}<br></p>'],
   2060        ['abc', '<p><!--foo-->{}<span><br></span><!--bar--></p>'],
   2061        ['<!--abc-->', '<p><!--foo-->{}<span><br></span><!--bar--></p>'],
   2062        ['abc', '<p>{}<span><!--foo--><br><!--bar--></span></p>'],
   2063        ['<!--abc-->', '<p>{}<span><!--foo--><br><!--bar--></span></p>'],
   2064 
   2065        ['abc', '<p><br>{}</p>'],
   2066        ['<!--abc-->', '<p><br>{}</p>'],
   2067        ['abc', '<p><!--foo--><span><br></span>{}<!--bar--></p>'],
   2068        ['<!--abc-->', '<p><!--foo--><span><br></span>{}<!--bar--></p>'],
   2069        ['abc', '<p><span><!--foo--><br><!--bar--></span>{}</p>'],
   2070        ['<!--abc-->', '<p><span><!--foo--><br><!--bar--></span>{}</p>'],
   2071    ],
   2072    //@}
   2073    insertimage: [
   2074    //@{
   2075        'foo[]bar',
   2076        '<span>foo</span>{}<span>bar</span>',
   2077        '<span>foo[</span><span>]bar</span>',
   2078        ["", 'foo[bar]baz'],
   2079        'foo[bar]baz',
   2080        'foo<span style=color:#aBcDeF>[bar]</span>baz',
   2081        'foo<span style=color:#aBcDeF>{bar}</span>baz',
   2082        'foo{<span style=color:#aBcDeF>bar</span>}baz',
   2083        '[foo<span style=color:#aBcDeF>bar]</span>baz',
   2084        '{foo<span style=color:#aBcDeF>bar}</span>baz',
   2085        'foo<span style=color:#aBcDeF>[bar</span>baz]',
   2086        'foo<span style=color:#aBcDeF>{bar</span>baz}',
   2087        'foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
   2088 
   2089        'foo<b>[bar]</b>baz',
   2090        'foo<b>{bar}</b>baz',
   2091        'foo{<b>bar</b>}baz',
   2092        'foo<span>[bar]</span>baz',
   2093        'foo<span>{bar}</span>baz',
   2094        'foo{<span>bar</span>}baz',
   2095        '<b>foo[bar</b><i>baz]quz</i>',
   2096        '<p>foo</p><p>[bar]</p><p>baz</p>',
   2097        '<p>foo</p><p>{bar}</p><p>baz</p>',
   2098        '<p>foo</p>{<p>bar</p>}<p>baz</p>',
   2099 
   2100        '<p>foo[bar<p>baz]quz',
   2101        '<p>foo[bar<div>baz]quz</div>',
   2102        '<p>foo[bar<h1>baz]quz</h1>',
   2103        '<div>foo[bar</div><p>baz]quz',
   2104        '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',
   2105 
   2106        '<p><b>foo[bar</b><p>baz]quz',
   2107        '<div><p>foo[bar</div><p>baz]quz',
   2108        '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
   2109        '<p>foo[bar<p style=color:blue>baz]quz',
   2110        '<p>foo[bar<p><b>baz]quz</b>',
   2111 
   2112        '<div><p>foo<p>[bar<p>baz]</div>',
   2113 
   2114        'foo[<br>]bar',
   2115        '<p>foo[</p><p>]bar</p>',
   2116        '<p>foo[</p><p>]bar<br>baz</p>',
   2117        'foo[<p>]bar</p>',
   2118        'foo[<p>]bar<br>baz</p>',
   2119        'foo[<p>]bar</p>baz',
   2120        '<p>foo[</p>]bar',
   2121        '<p>foo[</p>]bar<br>baz',
   2122        '<p>foo[</p>]bar<p>baz</p>',
   2123        'foo[<div><p>]bar</div>',
   2124        '<div><p>foo[</p></div>]bar',
   2125        'foo[<div><p>]bar</p>baz</div>',
   2126        'foo[<div>]bar<p>baz</p></div>',
   2127        '<div><p>foo</p>bar[</div>]baz',
   2128        '<div>foo<p>bar[</p></div>]baz',
   2129    ],
   2130    //@}
   2131    insertlinebreak: [
   2132    //@{ Same as insertparagraph (set below)
   2133    ],
   2134    //@}
   2135    insertorderedlist: [
   2136    //@{
   2137        'foo[]bar',
   2138        'foo[bar]baz',
   2139        'foo<br>[bar]',
   2140        'f[oo<br>b]ar<br>baz',
   2141        '<p>[foo]<br>bar</p>',
   2142        '[foo<ol><li>bar]</ol>baz',
   2143        'foo<ol><li>[bar</ol>baz]',
   2144        '[foo<ul><li>bar]</ul>baz',
   2145        'foo<ul><li>[bar</ul>baz]',
   2146        'foo<ul><li>[bar</ul><ol><li>baz]</ol>quz',
   2147        'foo<ol><li>[bar</ol><ul><li>baz]</ul>quz',
   2148 
   2149        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   2150        '<table><tbody><tr><td>fo[o<td>b]ar<td>baz</table>',
   2151        '{<table><tr><td>foo<td>bar<td>baz</table>}',
   2152 
   2153        '<p>foo<p>[bar]<p>baz',
   2154        '<p>foo<blockquote>[bar]</blockquote><p>baz',
   2155        '<dl><dt>foo<dd>[bar]<dt>baz<dd>quz</dl>',
   2156        '<dl><dt>foo<dd>bar<dt>[baz]<dd>quz</dl>',
   2157 
   2158        '<p>[foo<p>bar]<p>baz',
   2159        '<p>[foo<blockquote>bar]</blockquote><p>baz',
   2160        '<dl><dt>[foo<dd>bar]<dt>baz<dd>quz</dl>',
   2161        '<dl><dt>foo<dd>[bar<dt>baz]<dd>quz</dl>',
   2162 
   2163        '<p>[foo<blockquote><p>bar]<p>baz</blockquote>',
   2164 
   2165 
   2166        // Various <ol> stuff
   2167        '<ol><li>foo<li>[bar]<li>baz</ol>',
   2168        '<ol><li>foo</ol>[bar]',
   2169        '[foo]<ol><li>bar</ol>',
   2170        '<ol><li>foo</ol>[bar]<ol><li>baz</ol>',
   2171        '<ol><ol><li>[foo]</ol></ol>',
   2172        '<ol><li>[foo]<br>bar<li>baz</ol>',
   2173        '<ol><li>foo<br>[bar]<li>baz</ol>',
   2174        '<ol><li><div>[foo]</div>bar<li>baz</ol>',
   2175        '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
   2176        '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
   2177        '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
   2178        '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
   2179        '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
   2180        '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
   2181        '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
   2182        '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
   2183        '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
   2184        '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
   2185 
   2186        // Multiple items at once.
   2187        '<ol><li>foo<li>[bar<li>baz]</ol>',
   2188        '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
   2189        '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
   2190        '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
   2191 
   2192        // We probably can't actually get this DOM . . .
   2193        '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
   2194        '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
   2195        '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
   2196        '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
   2197 
   2198 
   2199        // Same stuff but with <ul>
   2200        '<ul><li>foo<li>[bar]<li>baz</ul>',
   2201        '<ul><li>foo</ul>[bar]',
   2202        '[foo]<ul><li>bar</ul>',
   2203        '<ul><li>foo</ul>[bar]<ul><li>baz</ul>',
   2204        '<ul><ul><li>[foo]</ul></ul>',
   2205        '<ul><li>[foo]<br>bar<li>baz</ul>',
   2206        '<ul><li>foo<br>[bar]<li>baz</ul>',
   2207        '<ul><li><div>[foo]</div>bar<li>baz</ul>',
   2208        '<ul><li>foo<ul><li>[bar]<li>baz</ul><li>quz</ul>',
   2209        '<ul><li>foo<ul><li>bar<li>[baz]</ul><li>quz</ul>',
   2210        '<ul><li>foo</li><ul><li>[bar]<li>baz</ul><li>quz</ul>',
   2211        '<ul><li>foo</li><ul><li>bar<li>[baz]</ul><li>quz</ul>',
   2212        '<ul><li>[foo]<ul><li>bar</ul><li>baz</ul>',
   2213        '<ul><li>[foo]</li><ul><li>bar</ul><li>baz</ul>',
   2214        '<ul><li>foo<li>[bar]<ul><li>baz</ul><li>quz</ul>',
   2215        '<ul><li>foo<li>[bar]</li><ul><li>baz</ul><li>quz</ul>',
   2216        '<ul><li>foo<ul><li>bar<li>baz</ul><li>[quz]</ul>',
   2217        '<ul><li>foo</li><ul><li>bar<li>baz</ul><li>[quz]</ul>',
   2218 
   2219        // Multiple items at once.
   2220        '<ul><li>foo<li>[bar<li>baz]</ul>',
   2221        '<ul><li>[foo<ul><li>bar]</ul><li>baz</ul>',
   2222        '<ul><li>foo<ul><li>b[ar</ul><li>b]az</ul>',
   2223        '<ul><li>[foo<ul><li>bar</ul><li>baz]</ul><p>extra',
   2224 
   2225        // We probably can't actually get this DOM . . .
   2226        '<ul><li>[foo]<ul><li>bar</ul>baz</ul>',
   2227        '<ul><li>foo<ul><li>[bar]</ul>baz</ul>',
   2228        '<ul><li>foo<ul><li>bar</ul>[baz]</ul>',
   2229        '<ul><li>[foo<ul><li>bar]</ul>baz</ul>',
   2230 
   2231 
   2232        // Mix of <ol> and <ul>
   2233        'foo<ol><li>bar</ol><ul><li>[baz]</ul>quz',
   2234        'foo<ol><li>bar</ol><ul><li>[baz</ul>quz]',
   2235        'foo<ul><li>[bar]</ul><ol><li>baz</ol>quz',
   2236        '[foo<ul><li>bar]</ul><ol><li>baz</ol>quz',
   2237 
   2238        // Interaction with indentation
   2239        '[foo]<blockquote>bar</blockquote>baz',
   2240        'foo<blockquote>[bar]</blockquote>baz',
   2241        '[foo<blockquote>bar]</blockquote>baz',
   2242        '<ol><li>foo</ol><blockquote>[bar]</blockquote>baz',
   2243        '[foo]<blockquote><ol><li>bar</ol></blockquote>baz',
   2244        'foo<blockquote>[bar]<br>baz</blockquote>',
   2245        '[foo<blockquote>bar]<br>baz</blockquote>',
   2246        '<ol><li>foo</ol><blockquote>[bar]<br>baz</blockquote>',
   2247 
   2248        '<p>[foo]<blockquote><p>bar</blockquote><p>baz',
   2249        '<p>foo<blockquote><p>[bar]</blockquote><p>baz',
   2250        '<p>[foo<blockquote><p>bar]</blockquote><p>baz',
   2251        '<ol><li>foo</ol><blockquote><p>[bar]</blockquote><p>baz',
   2252 
   2253        // Attributes
   2254        '<ul id=abc><li>foo<li>[bar]<li>baz</ul>',
   2255        '<ul style=color:blue><li>foo<li>[bar]<li>baz</ul>',
   2256        '<ul style=text-indent:1em><li>foo<li>[bar]<li>baz</ul>',
   2257        '<ul id=abc><li>[foo]<li>bar<li>baz</ul>',
   2258        '<ul style=color:blue><li>[foo]<li>bar<li>baz</ul>',
   2259        '<ul style=text-indent:1em><li>[foo]<li>bar<li>baz</ul>',
   2260        '<ul id=abc><li>foo<li>bar<li>[baz]</ul>',
   2261        '<ul style=color:blue><li>foo<li>bar<li>[baz]</ul>',
   2262        '<ul style=text-indent:1em><li>foo<li>bar<li>[baz]</ul>',
   2263 
   2264        // Whitespace nodes
   2265        '<ol><li>foo</ol> <p>[bar]',
   2266        '<p>[foo]</p> <ol><li>bar</ol>',
   2267        '<ol><li>foo</ol> <p>[bar]</p> <ol><li>baz</ol>',
   2268 
   2269        // This caused an infinite loop at one point due to a bug in "fix
   2270        // disallowed ancestors".  Disabled because I'm not sure how we want it
   2271        // to behave:
   2272        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14578
   2273        '!<span contenteditable=true>foo[]</span>',
   2274    ],
   2275    //@}
   2276    insertparagraph: [
   2277    //@{
   2278        'foo[bar]baz',
   2279        'fo[o<table><tr><td>b]ar</table>',
   2280        '<table><tr><td>[foo<td>bar]<tr><td>baz<td>quz</table>',
   2281        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<tr><td>baz<td>quz</table>',
   2282        '<table><tr><td>fo[o</table>b]ar',
   2283        '<table><tr><td>fo[o<td>b]ar<td>baz</table>',
   2284        '{<table><tr><td>foo</table>}',
   2285        '<table><tr><td>[foo]</table>',
   2286        '<ol><li>[foo]<li>bar</ol>',
   2287        '<ol><li>f[o]o<li>bar</ol>',
   2288 
   2289        '[]foo',
   2290        'foo[]',
   2291        '<span>foo[]</span>',
   2292        'foo[]<br>',
   2293        'foo[]bar',
   2294        '<address>[]foo</address>',
   2295        '<address>foo[]</address>',
   2296        '<address>foo[]<br></address>',
   2297        '<address>foo[]bar</address>',
   2298        '<div>[]foo</div>',
   2299        '<div>foo[]</div>',
   2300        '<div>foo[]<br></div>',
   2301        '<div>foo[]bar</div>',
   2302        '<dl><dt>[]foo<dd>bar</dl>',
   2303        '<dl><dt>foo[]<dd>bar</dl>',
   2304        '<dl><dt>foo[]<br><dd>bar</dl>',
   2305        '<dl><dt>foo[]bar<dd>baz</dl>',
   2306        '<dl><dt>foo<dd>[]bar</dl>',
   2307        '<dl><dt>foo<dd>bar[]</dl>',
   2308        '<dl><dt>foo<dd>bar[]<br></dl>',
   2309        '<dl><dt>foo<dd>bar[]baz</dl>',
   2310        '<h1>[]foo</h1>',
   2311        '<h1>foo[]</h1>',
   2312        '<h1>foo[]<br></h1>',
   2313        '<h1>foo[]bar</h1>',
   2314        '<ol><li>[]foo</ol>',
   2315        '<ol><li>foo[]</ol>',
   2316        '<ol><li>foo[]<br></ol>',
   2317        '<ol><li>foo[]bar</ol>',
   2318        '<p>[]foo</p>',
   2319        '<p>foo[]</p>',
   2320        '<p>foo[]<br></p>',
   2321        '<p>foo[]bar</p>',
   2322        '<pre>[]foo</pre>',
   2323        '<pre>foo[]</pre>',
   2324        '<pre>foo[]<br></pre>',
   2325        '<pre>foo[]bar</pre>',
   2326 
   2327        '<pre>foo[]<br><br></pre>',
   2328        '<pre>foo<br>{}<br></pre>',
   2329        '<pre>foo&#10;[]</pre>',
   2330        '<pre>foo[]&#10;</pre>',
   2331        '<pre>foo&#10;[]&#10;</pre>',
   2332 
   2333        '<xmp>foo[]bar</xmp>',
   2334        '<script>foo[]bar</script>baz',
   2335        '<div style=display:none>foo[]bar</div>baz',
   2336        '<listing>foo[]bar</listing>',
   2337 
   2338        '<ol><li>{}<br></li></ol>',
   2339        'foo<ol><li>{}<br></li></ol>',
   2340        '<ol><li>{}<br></li></ol>foo',
   2341        '<ol><li>foo<li>{}<br></ol>',
   2342        '<ol><li>{}<br><li>bar</ol>',
   2343        '<ol><li>foo</li><ul><li>{}<br></ul></ol>',
   2344 
   2345        '<dl><dt>{}<br></dt></dl>',
   2346        '<dl><dt>foo<dd>{}<br></dl>',
   2347        '<dl><dt>{}<br><dd>bar</dl>',
   2348        '<dl><dt>foo<dd>bar<dl><dt>{}<br><dd>baz</dl></dl>',
   2349        '<dl><dt>foo<dd>bar<dl><dt>baz<dd>{}<br></dl></dl>',
   2350 
   2351        '<h1>foo[bar</h1><p>baz]quz</p>',
   2352        '<p>foo[bar</p><h1>baz]quz</h1>',
   2353        '<p>foo</p>{}<br>',
   2354        '{}<br><p>foo</p>',
   2355        '<p>foo</p>{}<br><h1>bar</h1>',
   2356        '<h1>foo</h1>{}<br><p>bar</p>',
   2357        '<h1>foo</h1>{}<br><h2>bar</h2>',
   2358        '<p>foo</p><h1>[bar]</h1><p>baz</p>',
   2359        '<p>foo</p>{<h1>bar</h1>}<p>baz</p>',
   2360 
   2361        '<table><tr><td>foo[]bar</table>',
   2362        '<table><tr><td><p>foo[]bar</table>',
   2363 
   2364        '<blockquote>[]foo</blockquote>',
   2365        '<blockquote>foo[]</blockquote>',
   2366        '<blockquote>foo[]<br></blockquote>',
   2367        '<blockquote>foo[]bar</blockquote>',
   2368        '<blockquote><p>[]foo</blockquote>',
   2369        '<blockquote><p>foo[]</blockquote>',
   2370        '<blockquote><p>foo[]bar</blockquote>',
   2371        '<blockquote><p>foo[]<p>bar</blockquote>',
   2372        '<blockquote><p>foo[]bar<p>baz</blockquote>',
   2373 
   2374        '<span>foo[]bar</span>',
   2375        '<span>foo[]bar</span>baz',
   2376        '<b>foo[]bar</b>',
   2377        '<b>foo[]bar</b>baz',
   2378        '<b>foo[]</b>bar',
   2379        'foo<b>[]bar</b>',
   2380        '<b>foo[]</b><i>bar</i>',
   2381        '<b id=x class=y>foo[]bar</b>',
   2382        '<i><b>foo[]bar</b>baz</i>',
   2383 
   2384        '<p><b>foo[]bar</b></p>',
   2385        '<p><b>[]foo</b></p>',
   2386        '<p><b id=x class=y>foo[]bar</b></p>',
   2387        '<div><b>foo[]bar</b></div>',
   2388 
   2389        '<a href=foo>foo[]bar</a>',
   2390        '<a href=foo>foo[]bar</a>baz',
   2391        '<a href=foo>foo[]</a>bar',
   2392        'foo<a href=foo>[]bar</a>',
   2393 
   2394        '<p>foo[]<!--bar-->',
   2395        '<p><!--foo-->[]bar',
   2396 
   2397        '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
   2398        '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
   2399        '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
   2400        '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
   2401        '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
   2402        '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
   2403        '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
   2404        '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
   2405 
   2406        // https://bugs.webkit.org/show_bug.cgi?id=5036
   2407        '<ul contenteditable><li>{}<br></ul>',
   2408        '<ul contenteditable><li>foo[]</ul>',
   2409        '<div contenteditable=false><ul contenteditable><li>{}<br></ul></div>',
   2410        '<div contenteditable=false><ul contenteditable><li>foo[]</ul></div>',
   2411 
   2412        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13841
   2413        // https://bugs.webkit.org/show_bug.cgi?id=23507
   2414        '<address><p>foo[]</address>',
   2415        '<dl><dt><p>foo[]</dl>',
   2416        '<dl><dd><p>foo[]</dl>',
   2417        '<ol><li><p>foo[]</ol>',
   2418        '<ul><li><p>foo[]</ul>',
   2419        '<address><div>foo[]</address>',
   2420        '<dl><dt><div>foo[]</dl>',
   2421        '<dl><dd><div>foo[]</dl>',
   2422        '<ol><li><div>foo[]</ol>',
   2423        '<ul><li><div>foo[]</ul>',
   2424        '<div><p>foo[]</div>',
   2425        '<div><div>foo[]</div>',
   2426 
   2427        '<address><p>[]foo</address>',
   2428        '<dl><dt><p>[]foo</dl>',
   2429        '<dl><dd><p>[]foo</dl>',
   2430        '<ol><li><p>[]foo</ol>',
   2431        '<ul><li><p>[]foo</ul>',
   2432        '<address><div>[]foo</address>',
   2433        '<dl><dt><div>[]foo</dl>',
   2434        '<dl><dd><div>[]foo</dl>',
   2435        '<ol><li><div>[]foo</ol>',
   2436        '<ul><li><div>[]foo</ul>',
   2437        '<div><p>[]foo</div>',
   2438        '<div><div>[]foo</div>',
   2439 
   2440        '<address><p>foo[]bar</address>',
   2441        '<dl><dt><p>foo[]bar</dl>',
   2442        '<dl><dd><p>foo[]bar</dl>',
   2443        '<ol><li><p>foo[]bar</ol>',
   2444        '<ul><li><p>foo[]bar</ul>',
   2445        '<address><div>foo[]bar</address>',
   2446        '<dl><dt><div>foo[]bar</dl>',
   2447        '<dl><dd><div>foo[]bar</dl>',
   2448        '<ol><li><div>foo[]bar</ol>',
   2449        '<ul><li><div>foo[]bar</ul>',
   2450        '<div><p>foo[]bar</div>',
   2451        '<div><div>foo[]bar</div>',
   2452 
   2453        '<ol><li class=a id=x><p class=b id=y>foo[]</ol>',
   2454        '<div class=a id=x><div class=b id=y>foo[]</div></div>',
   2455        '<div class=a id=x><p class=b id=y>foo[]</div>',
   2456        '<ol><li class=a id=x><p class=b id=y>[]foo</ol>',
   2457        '<div class=a id=x><div class=b id=y>[]foo</div></div>',
   2458        '<div class=a id=x><p class=b id=y>[]foo</div>',
   2459        '<ol><li class=a id=x><p class=b id=y>foo[]bar</ol>',
   2460        '<div class=a id=x><div class=b id=y>foo[]bar</div></div>',
   2461        '<div class=a id=x><p class=b id=y>foo[]bar</div>',
   2462    ],
   2463    //@}
   2464    inserttext: [
   2465    //@{
   2466        'foo[bar]baz',
   2467        ['', 'foo[bar]baz'],
   2468 
   2469        ['\t', 'foo[]bar'],
   2470        ['&', 'foo[]bar'],
   2471        ['\n', 'foo[]bar'],
   2472        ['abc\ndef', 'foo[]bar'],
   2473        ['\x07', 'foo[]bar'],
   2474 
   2475        ['<b>hi</b>', 'foo[]bar'],
   2476        ['<', 'foo[]bar'],
   2477        ['&amp;', 'foo[]bar'],
   2478 
   2479        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14254
   2480        ['!\r', 'foo[]bar'],
   2481        ['!\r\n', 'foo[]bar'],
   2482        ['!\0', 'foo[]bar'],
   2483        ['!\ud800', 'foo[]bar'],
   2484 
   2485        // Whitespace tests!  The following two bugs are relevant to some of
   2486        // these:
   2487        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14119
   2488        // https://bugzilla.mozilla.org/show_bug.cgi?id=681626
   2489        [' ', 'foo[]bar'],
   2490        [' ', 'foo []bar'],
   2491        [' ', 'foo[] bar'],
   2492        [' ', 'foo &nbsp;[]bar'],
   2493        [' ', 'foo []&nbsp;bar'],
   2494        [' ', 'foo[] &nbsp;bar'],
   2495        [' ', 'foo&nbsp; []bar'],
   2496        [' ', 'foo&nbsp;[] bar'],
   2497        [' ', 'foo[]&nbsp; bar'],
   2498        [' ', 'foo&nbsp;&nbsp;[]bar'],
   2499        [' ', 'foo&nbsp;[]&nbsp;bar'],
   2500        [' ', 'foo[]&nbsp;&nbsp;bar'],
   2501        [' ', 'foo []&nbsp;        bar'],
   2502        [' ', 'foo  []bar'],
   2503        [' ', 'foo []&nbsp;&nbsp; &nbsp; bar'],
   2504 
   2505        [' ', '[]foo'],
   2506        [' ', '{}foo'],
   2507        [' ', 'foo[]'],
   2508        [' ', 'foo{}'],
   2509        [' ', 'foo&nbsp;[]'],
   2510        [' ', 'foo&nbsp;{}'],
   2511        [' ', 'foo&nbsp;&nbsp;[]'],
   2512        [' ', 'foo&nbsp;&nbsp;{}'],
   2513        [' ', '<b>foo[]</b>bar'],
   2514        [' ', 'foo[]<b>bar</b>'],
   2515 
   2516        [' ', 'foo[] '],
   2517        [' ', ' foo   []   '],
   2518        [' ', 'foo[]<span> </span>'],
   2519        [' ', 'foo[]<span> </span> '],
   2520        [' ', ' []foo'],
   2521        [' ', '   []   foo '],
   2522        [' ', '<span> </span>[]foo'],
   2523        [' ', ' <span> </span>[]foo'],
   2524 
   2525        [' ', '{}<br>'],
   2526        [' ', '<p>{}<br>'],
   2527 
   2528        [' ', '<p>foo[]<p>bar'],
   2529        [' ', '<p>foo&nbsp;[]<p>bar'],
   2530        [' ', '<p>foo[]<p>&nbsp;bar'],
   2531 
   2532        // Some of the same tests as above, repeated with various values of
   2533        // white-space.
   2534        [' ', '<pre>foo[]bar</pre>'],
   2535        [' ', '<pre>foo []bar</pre>'],
   2536        [' ', '<pre>foo[] bar</pre>'],
   2537        [' ', '<pre>foo &nbsp;[]bar</pre>'],
   2538        [' ', '<pre>[]foo</pre>'],
   2539        [' ', '<pre>foo[]</pre>'],
   2540        [' ', '<pre>foo&nbsp;[]</pre>'],
   2541        [' ', '<pre> foo   []   </pre>'],
   2542 
   2543        [' ', '<div style=white-space:pre>foo[]bar</div>'],
   2544        [' ', '<div style=white-space:pre>foo []bar</div>'],
   2545        [' ', '<div style=white-space:pre>foo[] bar</div>'],
   2546        [' ', '<div style=white-space:pre>foo &nbsp;[]bar</div>'],
   2547        [' ', '<div style=white-space:pre>[]foo</div>'],
   2548        [' ', '<div style=white-space:pre>foo[]</div>'],
   2549        [' ', '<div style=white-space:pre>foo&nbsp;[]</div>'],
   2550        [' ', '<div style=white-space:pre> foo   []   </div>'],
   2551 
   2552        [' ', '<div style=white-space:pre-wrap>foo[]bar</div>'],
   2553        [' ', '<div style=white-space:pre-wrap>foo []bar</div>'],
   2554        [' ', '<div style=white-space:pre-wrap>foo[] bar</div>'],
   2555        [' ', '<div style=white-space:pre-wrap>foo &nbsp;[]bar</div>'],
   2556        [' ', '<div style=white-space:pre-wrap>[]foo</div>'],
   2557        [' ', '<div style=white-space:pre-wrap>foo[]</div>'],
   2558        [' ', '<div style=white-space:pre-wrap>foo&nbsp;[]</div>'],
   2559        [' ', '<div style=white-space:pre-wrap> foo   []   </div>'],
   2560 
   2561        [' ', '<div style=white-space:pre-line>foo[]bar</div>'],
   2562        [' ', '<div style=white-space:pre-line>foo []bar</div>'],
   2563        [' ', '<div style=white-space:pre-line>foo[] bar</div>'],
   2564        [' ', '<div style=white-space:pre-line>foo &nbsp;[]bar</div>'],
   2565        [' ', '<div style=white-space:pre-line>[]foo</div>'],
   2566        [' ', '<div style=white-space:pre-line>foo[]</div>'],
   2567        [' ', '<div style=white-space:pre-line>foo&nbsp;[]</div>'],
   2568        [' ', '<div style=white-space:pre-line> foo   []   </div>'],
   2569 
   2570        [' ', '<div style=white-space:nowrap>foo[]bar</div>'],
   2571        [' ', '<div style=white-space:nowrap>foo []bar</div>'],
   2572        [' ', '<div style=white-space:nowrap>foo[] bar</div>'],
   2573        [' ', '<div style=white-space:nowrap>foo &nbsp;[]bar</div>'],
   2574        [' ', '<div style=white-space:nowrap>[]foo</div>'],
   2575        [' ', '<div style=white-space:nowrap>foo[]</div>'],
   2576        [' ', '<div style=white-space:nowrap>foo&nbsp;[]</div>'],
   2577        [' ', '<div style=white-space:nowrap> foo   []   </div>'],
   2578 
   2579        // End whitespace tests
   2580 
   2581        // Autolinking tests
   2582        [' ', 'http://a[]'],
   2583        [' ', 'ftp://a[]'],
   2584        [' ', 'quasit://a[]'],
   2585        [' ', '.x-++-.://a[]'],
   2586        [' ', '(http://a)[]'],
   2587        [' ', '&lt;http://a>[]'],
   2588        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14744
   2589        ['! ', '&#x5b;http://a&#x5d;[]'],
   2590        ['! ', '&#x7b;http://a&#x7d;[]'],
   2591        [' ', 'http://a![]'],
   2592        [' ', '!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~http://a!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~[]'],
   2593        [' ', 'http://a!"\'(),-.:;&lt;>`[]'],
   2594        [' ', 'http://a#$%&amp;*+/=?\^_|~[]'],
   2595        [' ', 'mailto:a[]'],
   2596        [' ', 'a@b[]'],
   2597        [' ', 'a@[]'],
   2598        [' ', '@b[]'],
   2599        [' ', '#@x[]'],
   2600        [' ', 'a@.[]'],
   2601        [' ', '!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~a@b!"#$%&amp;\'()*+,-./:;&lt;=>?\^_`|~[]'],
   2602        [' ', '<b>a@b</b>{}'],
   2603        [' ', '<b>a</b><i>@</i><u>b</u>{}'],
   2604        [' ', 'a@b<b>[]c</b>'],
   2605        [' ', '<p>a@b</p><p>[]c</p>'],
   2606        ['a', 'http://a[]'],
   2607        ['\t', 'http://a[]'],
   2608        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14254
   2609        ['!\r', 'http://a[]'],
   2610        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14745
   2611        ['!\n', 'http://a[]'],
   2612        ['\f', 'http://a[]'],
   2613        ['\u00A0', 'http://a[]'],
   2614 
   2615        ['   ', 'foo[]'],
   2616 
   2617        'foo[]bar',
   2618        'foo&nbsp;[]',
   2619        'foo\xa0[]',
   2620        '<p>foo[]',
   2621        '<p>foo</p>{}',
   2622        '<p>[]foo',
   2623        '<p>{}foo',
   2624        '{}<p>foo',
   2625        '<p>foo</p>{}<p>bar</p>',
   2626        '<b>foo[]</b>bar',
   2627        '<b>foo</b>[]bar',
   2628        'foo<b>{}</b>bar',
   2629        '<a>foo[]</a>bar',
   2630        '<a>foo</a>[]bar',
   2631        '<a href=/>foo[]</a>bar',
   2632        '<a href=/>foo</a>[]bar',
   2633        '<p>fo[o<p>b]ar',
   2634        '<p>fo[o<p>bar<p>b]az',
   2635        '{}<br>',
   2636        '<p>{}<br>',
   2637        '<p><span>{}<br></span>',
   2638        '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
   2639        '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
   2640        '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
   2641        '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
   2642        '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
   2643        '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
   2644        '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
   2645        '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',
   2646 
   2647 
   2648        // These are like the corresponding tests in the multitest section, but
   2649        // because the selection isn't collapsed, we don't need to do
   2650        // multitests to set overrides.
   2651        'foo<b>[bar]</b>baz',
   2652        'foo<i>[bar]</i>baz',
   2653        'foo<s>[bar]</s>baz',
   2654        'foo<sub>[bar]</sub>baz',
   2655        'foo<sup>[bar]</sup>baz',
   2656        'foo<u>[bar]</u>baz',
   2657        'foo<a href=http://www.google.com>[bar]</a>baz',
   2658        'foo<font face=sans-serif>[bar]</font>baz',
   2659        'foo<font size=4>[bar]</font>baz',
   2660        'foo<font color=#0000FF>[bar]</font>baz',
   2661        'foo<span style=background-color:#00FFFF>[bar]</span>baz',
   2662        'foo<a href=http://www.google.com><font color=blue>[bar]</font></a>baz',
   2663        'foo<font color=blue><a href=http://www.google.com>[bar]</a></font>baz',
   2664        'foo<a href=http://www.google.com><font color=brown>[bar]</font></a>baz',
   2665        'foo<font color=brown><a href=http://www.google.com>[bar]</a></font>baz',
   2666        'foo<a href=http://www.google.com><font color=black>[bar]</font></a>baz',
   2667        'foo<a href=http://www.google.com><u>[bar]</u></a>baz',
   2668        'foo<u><a href=http://www.google.com>[bar]</a></u>baz',
   2669        'foo<sub><font size=2>[bar]</font></sub>baz',
   2670        'foo<font size=2><sub>[bar]</sub></font>baz',
   2671        'foo<sub><font size=3>[bar]</font></sub>baz',
   2672        'foo<font size=3><sub>[bar]</sub></font>baz',
   2673 
   2674        // Now repeat but with different selections.
   2675        '[foo<b>bar]</b>baz',
   2676        '[foo<i>bar]</i>baz',
   2677        '[foo<s>bar]</s>baz',
   2678        '[foo<sub>bar]</sub>baz',
   2679        '[foo<sup>bar]</sup>baz',
   2680        '[foo<u>bar]</u>baz',
   2681        '[foo<a href=http://www.google.com>bar]</a>baz',
   2682        '[foo<font face=sans-serif>bar]</font>baz',
   2683        '[foo<font size=4>bar]</font>baz',
   2684        '[foo<font color=#0000FF>bar]</font>baz',
   2685        '[foo<span style=background-color:#00FFFF>bar]</span>baz',
   2686        '[foo<a href=http://www.google.com><font color=blue>bar]</font></a>baz',
   2687        '[foo<font color=blue><a href=http://www.google.com>bar]</a></font>baz',
   2688        '[foo<a href=http://www.google.com><font color=brown>bar]</font></a>baz',
   2689        '[foo<font color=brown><a href=http://www.google.com>bar]</a></font>baz',
   2690        '[foo<a href=http://www.google.com><font color=black>bar]</font></a>baz',
   2691        '[foo<a href=http://www.google.com><u>bar]</u></a>baz',
   2692        '[foo<u><a href=http://www.google.com>bar]</a></u>baz',
   2693        '[foo<sub><font size=2>bar]</font></sub>baz',
   2694        '[foo<font size=2><sub>bar]</sub></font>baz',
   2695        '[foo<sub><font size=3>bar]</font></sub>baz',
   2696        '[foo<font size=3><sub>bar]</sub></font>baz',
   2697 
   2698        'foo<b>[bar</b>baz]',
   2699        'foo<i>[bar</i>baz]',
   2700        'foo<s>[bar</s>baz]',
   2701        'foo<sub>[bar</sub>baz]',
   2702        'foo<sup>[bar</sup>baz]',
   2703        'foo<u>[bar</u>baz]',
   2704        'foo<a href=http://www.google.com>[bar</a>baz]',
   2705        'foo<font face=sans-serif>[bar</font>baz]',
   2706        'foo<font size=4>[bar</font>baz]',
   2707        'foo<font color=#0000FF>[bar</font>baz]',
   2708        'foo<span style=background-color:#00FFFF>[bar</span>baz]',
   2709        'foo<a href=http://www.google.com><font color=blue>[bar</font></a>baz]',
   2710        'foo<font color=blue><a href=http://www.google.com>[bar</a></font>baz]',
   2711        'foo<a href=http://www.google.com><font color=brown>[bar</font></a>baz]',
   2712        'foo<font color=brown><a href=http://www.google.com>[bar</a></font>baz]',
   2713        'foo<a href=http://www.google.com><font color=black>[bar</font></a>baz]',
   2714        'foo<a href=http://www.google.com><u>[bar</u></a>baz]',
   2715        'foo<u><a href=http://www.google.com>[bar</a></u>baz]',
   2716        'foo<sub><font size=2>[bar</font></sub>baz]',
   2717        'foo<font size=2><sub>[bar</sub></font>baz]',
   2718        'foo<sub><font size=3>[bar</font></sub>baz]',
   2719        'foo<font size=3><sub>[bar</sub></font>baz]',
   2720 
   2721        // https://bugs.webkit.org/show_bug.cgi?id=19702
   2722        '<blockquote><font color=blue>[foo]</font></blockquote>',
   2723    ],
   2724    //@}
   2725    insertunorderedlist: [
   2726    //@{
   2727        'foo[]bar',
   2728        'foo[bar]baz',
   2729        'foo<br>[bar]',
   2730        'f[oo<br>b]ar<br>baz',
   2731        '<p>[foo]<br>bar</p>',
   2732        '[foo<ol><li>bar]</ol>baz',
   2733        'foo<ol><li>[bar</ol>baz]',
   2734        '[foo<ul><li>bar]</ul>baz',
   2735        'foo<ul><li>[bar</ul>baz]',
   2736        'foo<ul><li>[bar</ul><ol><li>baz]</ol>quz',
   2737        'foo<ol><li>[bar</ol><ul><li>baz]</ul>quz',
   2738 
   2739        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   2740        '<table><tbody><tr><td>fo[o<td>b]ar<td>baz</table>',
   2741        '{<table><tr><td>foo<td>bar<td>baz</table>}',
   2742 
   2743        '<p>foo<p>[bar]<p>baz',
   2744        '<p>foo<blockquote>[bar]</blockquote><p>baz',
   2745        '<dl><dt>foo<dd>[bar]<dt>baz<dd>quz</dl>',
   2746        '<dl><dt>foo<dd>bar<dt>[baz]<dd>quz</dl>',
   2747 
   2748        '<p>[foo<p>bar]<p>baz',
   2749        '<p>[foo<blockquote>bar]</blockquote><p>baz',
   2750        '<dl><dt>[foo<dd>bar]<dt>baz<dd>quz</dl>',
   2751        '<dl><dt>foo<dd>[bar<dt>baz]<dd>quz</dl>',
   2752 
   2753        '<p>[foo<blockquote><p>bar]<p>baz</blockquote>',
   2754 
   2755 
   2756        // Various <ol> stuff
   2757        '<ol><li>foo<li>[bar]<li>baz</ol>',
   2758        '<ol><li>foo</ol>[bar]',
   2759        '[foo]<ol><li>bar</ol>',
   2760        '<ol><li>foo</ol>[bar]<ol><li>baz</ol>',
   2761        '<ol><ol><li>[foo]</ol></ol>',
   2762        '<ol><li>[foo]<br>bar<li>baz</ol>',
   2763        '<ol><li>foo<br>[bar]<li>baz</ol>',
   2764        '<ol><li><div>[foo]</div>bar<li>baz</ol>',
   2765        '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
   2766        '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
   2767        '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
   2768        '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
   2769        '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
   2770        '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
   2771        '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
   2772        '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
   2773        '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
   2774        '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
   2775 
   2776        // Multiple items at once.
   2777        '<ol><li>foo<li>[bar<li>baz]</ol>',
   2778        '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
   2779        '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
   2780        '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
   2781 
   2782        // We probably can't actually get this DOM . . .
   2783        '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
   2784        '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
   2785        '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
   2786        '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
   2787 
   2788 
   2789        // Same stuff but with <ul>
   2790        '<ul><li>foo<li>[bar]<li>baz</ul>',
   2791        '<ul><li>foo</ul>[bar]',
   2792        '[foo]<ul><li>bar</ul>',
   2793        '<ul><li>foo</ul>[bar]<ul><li>baz</ul>',
   2794        '<ul><ul><li>[foo]</ul></ul>',
   2795        '<ul><li>[foo]<br>bar<li>baz</ul>',
   2796        '<ul><li>foo<br>[bar]<li>baz</ul>',
   2797        '<ul><li><div>[foo]</div>bar<li>baz</ul>',
   2798        '<ul><li>foo<ul><li>[bar]<li>baz</ul><li>quz</ul>',
   2799        '<ul><li>foo<ul><li>bar<li>[baz]</ul><li>quz</ul>',
   2800        '<ul><li>foo</li><ul><li>[bar]<li>baz</ul><li>quz</ul>',
   2801        '<ul><li>foo</li><ul><li>bar<li>[baz]</ul><li>quz</ul>',
   2802        '<ul><li>[foo]<ul><li>bar</ul><li>baz</ul>',
   2803        '<ul><li>[foo]</li><ul><li>bar</ul><li>baz</ul>',
   2804        '<ul><li>foo<li>[bar]<ul><li>baz</ul><li>quz</ul>',
   2805        '<ul><li>foo<li>[bar]</li><ul><li>baz</ul><li>quz</ul>',
   2806        '<ul><li>foo<ul><li>bar<li>baz</ul><li>[quz]</ul>',
   2807        '<ul><li>foo</li><ul><li>bar<li>baz</ul><li>[quz]</ul>',
   2808 
   2809        // Multiple items at once.
   2810        '<ul><li>foo<li>[bar<li>baz]</ul>',
   2811        '<ul><li>[foo<ul><li>bar]</ul><li>baz</ul>',
   2812        '<ul><li>foo<ul><li>b[ar</ul><li>b]az</ul>',
   2813        '<ul><li>[foo<ul><li>bar</ul><li>baz]</ul><p>extra',
   2814 
   2815        // We probably can't actually get this DOM . . .
   2816        '<ul><li>[foo]<ul><li>bar</ul>baz</ul>',
   2817        '<ul><li>foo<ul><li>[bar]</ul>baz</ul>',
   2818        '<ul><li>foo<ul><li>bar</ul>[baz]</ul>',
   2819        '<ul><li>[foo<ul><li>bar]</ul>baz</ul>',
   2820 
   2821 
   2822        // Mix of <ol> and <ul>
   2823        'foo<ol><li>bar</ol><ul><li>[baz]</ul>quz',
   2824        'foo<ol><li>bar</ol><ul><li>[baz</ul>quz]',
   2825        'foo<ul><li>[bar]</ul><ol><li>baz</ol>quz',
   2826        '[foo<ul><li>bar]</ul><ol><li>baz</ol>quz',
   2827 
   2828        // Interaction with indentation
   2829        '[foo]<blockquote>bar</blockquote>baz',
   2830        'foo<blockquote>[bar]</blockquote>baz',
   2831        '[foo<blockquote>bar]</blockquote>baz',
   2832        '<ol><li>foo</ol><blockquote>[bar]</blockquote>baz',
   2833        '[foo]<blockquote><ol><li>bar</ol></blockquote>baz',
   2834        'foo<blockquote>[bar]<br>baz</blockquote>',
   2835        '[foo<blockquote>bar]<br>baz</blockquote>',
   2836        '<ol><li>foo</ol><blockquote>[bar]<br>baz</blockquote>',
   2837 
   2838        '<p>[foo]<blockquote><p>bar</blockquote><p>baz',
   2839        '<p>foo<blockquote><p>[bar]</blockquote><p>baz',
   2840        '<p>[foo<blockquote><p>bar]</blockquote><p>baz',
   2841        '<ol><li>foo</ol><blockquote><p>[bar]</blockquote><p>baz',
   2842 
   2843        // Attributes
   2844        '<ul id=abc><li>foo<li>[bar]<li>baz</ul>',
   2845        '<ul style=color:blue><li>foo<li>[bar]<li>baz</ul>',
   2846        '<ul style=text-indent:1em><li>foo<li>[bar]<li>baz</ul>',
   2847        '<ul id=abc><li>[foo]<li>bar<li>baz</ul>',
   2848        '<ul style=color:blue><li>[foo]<li>bar<li>baz</ul>',
   2849        '<ul style=text-indent:1em><li>[foo]<li>bar<li>baz</ul>',
   2850        '<ul id=abc><li>foo<li>bar<li>[baz]</ul>',
   2851        '<ul style=color:blue><li>foo<li>bar<li>[baz]</ul>',
   2852        '<ul style=text-indent:1em><li>foo<li>bar<li>[baz]</ul>',
   2853 
   2854        // Whitespace nodes
   2855        '<ul><li>foo</ul> <p>[bar]',
   2856        '<p>[foo]</p> <ul><li>bar</ul>',
   2857        '<ul><li>foo</ul> <p>[bar]</p> <ul><li>baz</ul>',
   2858 
   2859        // https://bugs.webkit.org/show_bug.cgi?id=24167
   2860        '{<div style="font-size: 1.3em">1</div><div style="font-size: 1.1em">2</div>}',
   2861    ],
   2862    //@}
   2863    italic: [
   2864    //@{
   2865        'foo[]bar',
   2866        '<p>[foo</p> <p>bar]</p>',
   2867        '<span>[foo</span> <span>bar]</span>',
   2868        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
   2869        '<p>[foo<p><br><p>bar]',
   2870        '<b>foo[]bar</b>',
   2871        '<i>foo[]bar</i>',
   2872        '<span>foo</span>{}<span>bar</span>',
   2873        '<span>foo[</span><span>]bar</span>',
   2874        'foo[bar]baz',
   2875        'foo[bar<b>baz]qoz</b>quz',
   2876        'foo[bar<i>baz]qoz</i>quz',
   2877        '{<p><p> <p>foo</p>}',
   2878 
   2879        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   2880        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
   2881        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
   2882        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
   2883        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
   2884        '{<table><tr><td>foo<td>bar<td>baz</table>}',
   2885 
   2886        'foo<span style="font-style: italic">[bar]</span>baz',
   2887        'foo<address>[bar]</address>baz',
   2888        'foo<cite>[bar]</cite>baz',
   2889        'foo<dfn>[bar]</dfn>baz',
   2890        'foo<em>[bar]</em>baz',
   2891        'foo<i>[bar]</i>baz',
   2892        'foo<var>[bar]</var>baz',
   2893 
   2894        'foo{<address>bar</address>}baz',
   2895        'foo{<cite>bar</cite>}baz',
   2896        'foo{<dfn>bar</dfn>}baz',
   2897        'foo{<em>bar</em>}baz',
   2898        'foo{<i>bar</i>}baz',
   2899        'foo{<var>bar</var>}baz',
   2900 
   2901        'foo<address>b[a]r</address>baz',
   2902        'foo<cite>b[a]r</cite>baz',
   2903        'foo<dfn>b[a]r</dfn>baz',
   2904        'foo<em>b[a]r</em>baz',
   2905        'foo<i>b[a]r</i>baz',
   2906        'foo<var>b[a]r</var>baz',
   2907 
   2908        'fo[o<address>bar</address>b]az',
   2909        'fo[o<cite>bar</cite>b]az',
   2910        'fo[o<dfn>bar</dfn>b]az',
   2911        'fo[o<em>bar</em>b]az',
   2912        'fo[o<i>bar</i>b]az',
   2913        'fo[o<var>bar</var>b]az',
   2914 
   2915        'foo[<address>bar</address>baz]',
   2916        'foo[<cite>bar</cite>baz]',
   2917        'foo[<dfn>bar</dfn>baz]',
   2918        'foo[<em>bar</em>baz]',
   2919        'foo[<i>bar</i>baz]',
   2920        'foo[<var>bar</var>baz]',
   2921 
   2922        '[foo<address>bar</address>]baz',
   2923        '[foo<cite>bar</cite>]baz',
   2924        '[foo<dfn>bar</dfn>]baz',
   2925        '[foo<em>bar</em>]baz',
   2926        '[foo<i>bar</i>]baz',
   2927        '[foo<var>bar</var>]baz',
   2928 
   2929        'foo<span style="font-style: italic">[bar]</span>baz',
   2930        'foo<span style="font-style: oblique">[bar]</span>baz',
   2931        'foo<span style="font-style: oblique">b[a]r</span>baz',
   2932 
   2933        '<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>',
   2934        '<i><p>foo[<b>bar</b>}</p><p>baz</p></i>',
   2935        'foo [bar <b>baz] qoz</b> quz sic',
   2936        'foo bar <b>baz [qoz</b> quz] sic',
   2937        'foo [bar <i>baz] qoz</i> quz sic',
   2938        'foo bar <i>baz [qoz</i> quz] sic',
   2939 
   2940        // Tests for queryCommandIndeterm() and queryCommandState()
   2941        'fo[o<i>b]ar</i>baz',
   2942        'foo<i>ba[r</i>b]az',
   2943        'fo[o<i>bar</i>b]az',
   2944        'foo[<i>b]ar</i>baz',
   2945        'foo<i>ba[r</i>]baz',
   2946        'foo[<i>bar</i>]baz',
   2947        'foo<i>[bar]</i>baz',
   2948        'foo{<i>bar</i>}baz',
   2949        'fo[o<span style=font-style:italic>b]ar</span>baz',
   2950        'fo[o<span style=font-style:oblique>b]ar</span>baz',
   2951        '<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b]ar</span>',
   2952        '<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b]ar</span>',
   2953        '<i>fo[o</i><address>b]ar</address>',
   2954    ],
   2955    //@}
   2956    justifycenter: [
   2957    //@{
   2958        'foo[]bar<p>extra',
   2959        '<span>foo</span>{}<span>bar</span><p>extra',
   2960        '<span>foo[</span><span>]bar</span><p>extra',
   2961        'foo[bar]baz<p>extra',
   2962        'foo[bar<b>baz]qoz</b>quz<p>extra',
   2963        '<p>foo[]bar<p>extra',
   2964        '<p>foo[bar]baz<p>extra',
   2965        '<h1>foo[bar]baz</h1><p>extra',
   2966        '<pre>foo[bar]baz</pre><p>extra',
   2967        '<xmp>foo[bar]baz</xmp><p>extra',
   2968        '<center><p>[foo]<p>bar</center><p>extra',
   2969        '<center><p>[foo<p>bar]</center><p>extra',
   2970 
   2971        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
   2972        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   2973        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   2974        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
   2975        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
   2976        '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
   2977 
   2978        '<table align=center><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
   2979        '<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   2980        '<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   2981        '<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
   2982        '<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
   2983        '{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra',
   2984 
   2985        '<table><tbody align=center><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
   2986        '<table><tbody align=center><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   2987        '<table><tbody align=center><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   2988        '<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
   2989        '<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra',
   2990        '{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra',
   2991 
   2992        '<table><tbody><tr align=center><td>foo<td>b[a]r<td>baz</table><p>extra',
   2993        '<table><tbody><tr align=center data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   2994        '<table><tbody><tr align=center data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   2995        '<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra',
   2996        '<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra',
   2997        '{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra',
   2998 
   2999        '<div align=center><p>[foo]<p>bar</div><p>extra',
   3000        '<div align=center><p>[foo<p>bar}</div><p>extra',
   3001        '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
   3002        '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
   3003 
   3004        '<div align=justify><p>[foo]<p>bar</div><p>extra',
   3005        '<div align=justify><p>[foo<p>bar}</div><p>extra',
   3006        '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
   3007        '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
   3008 
   3009        '<div align=left><p>[foo]<p>bar</div><p>extra',
   3010        '<div align=left><p>[foo<p>bar}</div><p>extra',
   3011        '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
   3012        '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
   3013 
   3014        '<div align=right><p>[foo]<p>bar</div><p>extra',
   3015        '<div align=right><p>[foo<p>bar}</div><p>extra',
   3016        '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
   3017        '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
   3018 
   3019        '<center>foo</center>[bar]<p>extra',
   3020        '[foo]<center>bar</center><p>extra',
   3021        '<center>foo</center>[bar]<center>baz</center><p>extra',
   3022        '<div align=center>foo</div>[bar]<p>extra',
   3023        '[foo]<div align=center>bar</div><p>extra',
   3024        '<div align=center>foo</div>[bar]<div align=center>baz</div><p>extra',
   3025        '<div align=center><p>foo</div><p>[bar]<p>extra',
   3026        '<p>[foo]<div align=center><p>bar</div><p>extra',
   3027        '<div align=center><p>foo</div><p>[bar]<div align=center><p>baz</div><p>extra',
   3028        '<div style=text-align:center>foo</div>[bar]<p>extra',
   3029        '[foo]<div style=text-align:center>bar</div><p>extra',
   3030        '<div style=text-align:center>foo</div>[bar]<div style=text-align:center>baz</div><p>extra',
   3031        '<div style=text-align:center><p>foo</div><p>[bar]<p>extra',
   3032        '<p>[foo]<div style=text-align:center><p>bar</div><p>extra',
   3033        '<div style=text-align:center><p>foo</div><p>[bar]<div style=text-align:center><p>baz</div><p>extra',
   3034        '<p align=center>foo<p>[bar]<p>extra',
   3035        '<p>[foo]<p align=center>bar<p>extra',
   3036        '<p align=center>foo<p>[bar]<p align=center>baz<p>extra',
   3037 
   3038        '<center>[foo</center>bar]<p>extra',
   3039        '<center>fo[o</center>b]ar<p>extra',
   3040        '<div align=center>[foo</div>bar]<p>extra',
   3041        '<div align=center>fo[o</div>b]ar<p>extra',
   3042        '<div style=text-align:center>[foo</div>bar]<p>extra',
   3043        '<div style=text-align:center>fo[o</div>b]ar<p>extra',
   3044        '<span style=text-align:center>[foo]</span><p>extra',
   3045        '<span style=text-align:center>f[o]o</span><p>extra',
   3046 
   3047        '<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
   3048 
   3049        '<div align=nonsense><p>[foo]</div><p>extra',
   3050        '<div style=text-align:inherit><p>[foo]</div><p>extra',
   3051        '<quasit align=right><p>[foo]</p></quasit><p>extra',
   3052 
   3053        '<div align=center>{<div align=left>foo</div>}</div>',
   3054        '<div align=left>{<div align=center>foo</div>}</div>',
   3055        '<div align=center>{<div align=left>foo</div>bar}</div>',
   3056        '<div align=left>{<div align=center>foo</div>bar}</div>',
   3057        '<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>',
   3058        '<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>',
   3059        '<div align=center>{<div align=left>foo</div><!-- bar -->}</div>',
   3060        '<div align=left>{<div align=center>foo</div><!-- bar -->}</div>',
   3061 
   3062        '<div style=text-align:start>[foo]</div><p>extra',
   3063        '<div style=text-align:end>[foo]</div><p>extra',
   3064        '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
   3065        '<div dir=rtl style=text-align:end>[foo]</div><p>extra',
   3066 
   3067        // Whitespace nodes
   3068        '<div style=text-align:center><p>foo</div> <p>[bar]',
   3069        '<div align=center><p>foo</div> <p>[bar]',
   3070        '<center><p>foo</center> <p>[bar]',
   3071        '<p>[foo]</p> <div style=text-align:center><p>bar</div>',
   3072        '<p>[foo]</p> <div align=center><p>bar</div>',
   3073        '<p>[foo]</p> <center><p>bar</center>',
   3074        '<div style=text-align:center><p>foo</div> <p>[bar]</p> <div style=text-align:center><p>baz</div>',
   3075        '<div align=center><p>foo</div> <p>[bar]</p> <div align=center><p>baz</div>',
   3076        '<center><p>foo</center> <p>[bar]</p> <center><p>baz</center>',
   3077    ],
   3078    //@}
   3079    justifyfull: [
   3080    //@{
   3081        'foo[]bar<p>extra',
   3082        '<span>foo</span>{}<span>bar</span><p>extra',
   3083        '<span>foo[</span><span>]bar</span><p>extra',
   3084        'foo[bar]baz<p>extra',
   3085        'foo[bar<b>baz]qoz</b>quz<p>extra',
   3086        '<p>foo[]bar<p>extra',
   3087        '<p>foo[bar]baz<p>extra',
   3088        '<h1>foo[bar]baz</h1><p>extra',
   3089        '<pre>foo[bar]baz</pre><p>extra',
   3090        '<xmp>foo[bar]baz</xmp><p>extra',
   3091        '<center><p>[foo]<p>bar</center><p>extra',
   3092        '<center><p>[foo<p>bar]</center><p>extra',
   3093 
   3094        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
   3095        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3096        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3097        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
   3098        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
   3099        '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
   3100 
   3101        '<table align=justify><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
   3102        '<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3103        '<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3104        '<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
   3105        '<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
   3106        '{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra',
   3107 
   3108        '<table><tbody align=justify><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
   3109        '<table><tbody align=justify><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3110        '<table><tbody align=justify><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3111        '<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
   3112        '<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra',
   3113        '{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra',
   3114 
   3115        '<table><tbody><tr align=justify><td>foo<td>b[a]r<td>baz</table><p>extra',
   3116        '<table><tbody><tr align=justify data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3117        '<table><tbody><tr align=justify data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3118        '<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra',
   3119        '<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra',
   3120        '{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra',
   3121 
   3122        '<div align=center><p>[foo]<p>bar</div><p>extra',
   3123        '<div align=center><p>[foo<p>bar}</div><p>extra',
   3124        '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
   3125        '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
   3126 
   3127        '<div align=justify><p>[foo]<p>bar</div><p>extra',
   3128        '<div align=justify><p>[foo<p>bar}</div><p>extra',
   3129        '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
   3130        '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
   3131 
   3132        '<div align=left><p>[foo]<p>bar</div><p>extra',
   3133        '<div align=left><p>[foo<p>bar}</div><p>extra',
   3134        '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
   3135        '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
   3136 
   3137        '<div align=right><p>[foo]<p>bar</div><p>extra',
   3138        '<div align=right><p>[foo<p>bar}</div><p>extra',
   3139        '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
   3140        '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
   3141 
   3142        '<div align=justify>foo</div>[bar]<p>extra',
   3143        '[foo]<div align=justify>bar</div><p>extra',
   3144        '<div align=justify>foo</div>[bar]<div align=justify>baz</div><p>extra',
   3145        '<div align=justify><p>foo</div><p>[bar]<p>extra',
   3146        '<p>[foo]<div align=justify><p>bar</div><p>extra',
   3147        '<div align=justify><p>foo</div><p>[bar]<div align=justify><p>baz</div><p>extra',
   3148        '<div style=text-align:justify>foo</div>[bar]<p>extra',
   3149        '[foo]<div style=text-align:justify>bar</div><p>extra',
   3150        '<div style=text-align:justify>foo</div>[bar]<div style=text-align:justify>baz</div><p>extra',
   3151        '<div style=text-align:justify><p>foo</div><p>[bar]<p>extra',
   3152        '<p>[foo]<div style=text-align:justify><p>bar</div><p>extra',
   3153        '<div style=text-align:justify><p>foo</div><p>[bar]<div style=text-align:justify><p>baz</div><p>extra',
   3154        '<p align=justify>foo<p>[bar]<p>extra',
   3155        '<p>[foo]<p align=justify>bar<p>extra',
   3156        '<p align=justify>foo<p>[bar]<p align=justify>baz<p>extra',
   3157 
   3158        '<div align=justify>[foo</div>bar]<p>extra',
   3159        '<div align=justify>fo[o</div>b]ar<p>extra',
   3160        '<div style=text-align:justify>[foo</div>bar]<p>extra',
   3161        '<div style=text-align:justify>fo[o</div>b]ar<p>extra',
   3162        '<span style=text-align:justify>[foo]</span><p>extra',
   3163        '<span style=text-align:justify>f[o]o</span><p>extra',
   3164 
   3165        '<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
   3166 
   3167        '<div align=nonsense><p>[foo]</div><p>extra',
   3168        '<div style=text-align:inherit><p>[foo]</div><p>extra',
   3169        '<quasit align=center><p>[foo]</p></quasit><p>extra',
   3170 
   3171        '<div style=text-align:start>[foo]</div><p>extra',
   3172        '<div style=text-align:end>[foo]</div><p>extra',
   3173        '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
   3174        '<div dir=rtl style=text-align:end>[foo]</div><p>extra',
   3175 
   3176        // Whitespace nodes
   3177        '<div style=text-align:justify><p>foo</div> <p>[bar]',
   3178        '<div align=justify><p>foo</div> <p>[bar]',
   3179        '<p>[foo]</p> <div style=text-align:justify><p>bar</div>',
   3180        '<p>[foo]</p> <div align=justify><p>bar</div>',
   3181        '<div style=text-align:justify><p>foo</div> <p>[bar]</p> <div style=text-align:justify><p>baz</div>',
   3182        '<div align=justify><p>foo</div> <p>[bar]</p> <div align=justify><p>baz</div>',
   3183    ],
   3184    //@}
   3185    justifyleft: [
   3186    //@{
   3187        'foo[]bar<p>extra',
   3188        '<span>foo</span>{}<span>bar</span><p>extra',
   3189        '<span>foo[</span><span>]bar</span><p>extra',
   3190        'foo[bar]baz<p>extra',
   3191        'foo[bar<b>baz]qoz</b>quz<p>extra',
   3192        '<p>foo[]bar<p>extra',
   3193        '<p>foo[bar]baz<p>extra',
   3194        '<h1>foo[bar]baz</h1><p>extra',
   3195        '<pre>foo[bar]baz</pre><p>extra',
   3196        '<xmp>foo[bar]baz</xmp><p>extra',
   3197        '<center><p>[foo]<p>bar</center><p>extra',
   3198        '<center><p>[foo<p>bar]</center><p>extra',
   3199 
   3200        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
   3201        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3202        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3203        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
   3204        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
   3205        '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
   3206 
   3207        '<table align=left><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
   3208        '<table align=left><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3209        '<table align=left><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3210        '<table align=left><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
   3211        '<table align=left data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
   3212        '{<table align=left><tr><td>foo<td>bar<td>baz</table>}<p>extra',
   3213 
   3214        '<table><tbody align=left><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
   3215        '<table><tbody align=left><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3216        '<table><tbody align=left><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3217        '<table><tbody align=left data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
   3218        '<table data-start=0 data-end=1><tbody align=left><tr><td>foo<td>bar<td>baz</table><p>extra',
   3219        '{<table><tbody align=left><tr><td>foo<td>bar<td>baz</table>}<p>extra',
   3220 
   3221        '<table><tbody><tr align=left><td>foo<td>b[a]r<td>baz</table><p>extra',
   3222        '<table><tbody><tr align=left data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3223        '<table><tbody><tr align=left data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3224        '<table><tbody data-start=0 data-end=1><tr align=left><td>foo<td>bar<td>baz</table><p>extra',
   3225        '<table data-start=0 data-end=1><tbody><tr align=left><td>foo<td>bar<td>baz</table><p>extra',
   3226        '{<table><tr align=left><td>foo<td>bar<td>baz</table>}<p>extra',
   3227 
   3228        '<div align=center><p>[foo]<p>bar</div><p>extra',
   3229        '<div align=center><p>[foo<p>bar}</div><p>extra',
   3230        '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
   3231        '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
   3232 
   3233        '<div align=justify><p>[foo]<p>bar</div><p>extra',
   3234        '<div align=justify><p>[foo<p>bar}</div><p>extra',
   3235        '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
   3236        '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
   3237 
   3238        '<div align=left><p>[foo]<p>bar</div><p>extra',
   3239        '<div align=left><p>[foo<p>bar}</div><p>extra',
   3240        '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
   3241        '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
   3242 
   3243        '<div align=right><p>[foo]<p>bar</div><p>extra',
   3244        '<div align=right><p>[foo<p>bar}</div><p>extra',
   3245        '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
   3246        '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
   3247 
   3248        '<div align=left>foo</div>[bar]<p>extra',
   3249        '[foo]<div align=left>bar</div><p>extra',
   3250        '<div align=left>foo</div>[bar]<div align=left>baz</div><p>extra',
   3251        '<div align=left><p>foo</div><p>[bar]<p>extra',
   3252        '<p>[foo]<div align=left><p>bar</div><p>extra',
   3253        '<div align=left><p>foo</div><p>[bar]<div align=left><p>baz</div><p>extra',
   3254        '<div style=text-align:left>foo</div>[bar]<p>extra',
   3255        '[foo]<div style=text-align:left>bar</div><p>extra',
   3256        '<div style=text-align:left>foo</div>[bar]<div style=text-align:left>baz</div><p>extra',
   3257        '<div style=text-align:left><p>foo</div><p>[bar]<p>extra',
   3258        '<p>[foo]<div style=text-align:left><p>bar</div><p>extra',
   3259        '<div style=text-align:left><p>foo</div><p>[bar]<div style=text-align:left><p>baz</div><p>extra',
   3260        '<p align=left>foo<p>[bar]<p>extra',
   3261        '<p>[foo]<p align=left>bar<p>extra',
   3262        '<p align=left>foo<p>[bar]<p align=left>baz<p>extra',
   3263 
   3264        '<div align=left>[foo</div>bar]<p>extra',
   3265        '<div align=left>fo[o</div>b]ar<p>extra',
   3266        '<div style=text-align:left>[foo</div>bar]<p>extra',
   3267        '<div style=text-align:left>fo[o</div>b]ar<p>extra',
   3268        '<span style=text-align:left>[foo]</span><p>extra',
   3269        '<span style=text-align:left>f[o]o</span><p>extra',
   3270 
   3271        '<div style=text-align:left>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
   3272 
   3273        '<div align=nonsense><p>[foo]</div><p>extra',
   3274        '<div style=text-align:inherit><p>[foo]</div><p>extra',
   3275        '<quasit align=center><p>[foo]</p></quasit><p>extra',
   3276 
   3277        '<div style=text-align:start>[foo]</div><p>extra',
   3278        '<div style=text-align:end>[foo]</div><p>extra',
   3279        '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
   3280        '<div dir=rtl style=text-align:end>[foo]</div><p>extra',
   3281 
   3282        // Whitespace nodes
   3283        '<div style=text-align:left><p>foo</div> <p>[bar]',
   3284        '<div align=left><p>foo</div> <p>[bar]',
   3285        '<p>[foo]</p> <div style=text-align:left><p>bar</div>',
   3286        '<p>[foo]</p> <div align=left><p>bar</div>',
   3287        '<div style=text-align:left><p>foo</div> <p>[bar]</p> <div style=text-align:left><p>baz</div>',
   3288        '<div align=left><p>foo</div> <p>[bar]</p> <div align=left><p>baz</div>',
   3289    ],
   3290    //@}
   3291    justifyright: [
   3292    //@{
   3293        'foo[]bar<p>extra',
   3294        '<span>foo</span>{}<span>bar</span><p>extra',
   3295        '<span>foo[</span><span>]bar</span><p>extra',
   3296        'foo[bar]baz<p>extra',
   3297        'foo[bar<b>baz]qoz</b>quz<p>extra',
   3298        '<p>foo[]bar<p>extra',
   3299        '<p>foo[bar]baz<p>extra',
   3300        '<h1>foo[bar]baz</h1><p>extra',
   3301        '<pre>foo[bar]baz</pre><p>extra',
   3302        '<xmp>foo[bar]baz</xmp><p>extra',
   3303        '<center><p>[foo]<p>bar</center><p>extra',
   3304        '<center><p>[foo<p>bar]</center><p>extra',
   3305 
   3306        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
   3307        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3308        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3309        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
   3310        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
   3311        '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',
   3312 
   3313        '<table align=right><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
   3314        '<table align=right><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3315        '<table align=right><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3316        '<table align=right><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
   3317        '<table align=right data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
   3318        '{<table align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra',
   3319 
   3320        '<table><tbody align=right><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
   3321        '<table><tbody align=right><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3322        '<table><tbody align=right><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3323        '<table><tbody align=right data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
   3324        '<table data-start=0 data-end=1><tbody align=right><tr><td>foo<td>bar<td>baz</table><p>extra',
   3325        '{<table><tbody align=right><tr><td>foo<td>bar<td>baz</table>}<p>extra',
   3326 
   3327        '<table><tbody><tr align=right><td>foo<td>b[a]r<td>baz</table><p>extra',
   3328        '<table><tbody><tr align=right data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3329        '<table><tbody><tr align=right data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
   3330        '<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra',
   3331        '<table data-start=0 data-end=1><tbody><tr align=right><td>foo<td>bar<td>baz</table><p>extra',
   3332        '{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra',
   3333 
   3334        '<div align=center><p>[foo]<p>bar</div><p>extra',
   3335        '<div align=center><p>[foo<p>bar}</div><p>extra',
   3336        '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
   3337        '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',
   3338 
   3339        '<div align=justify><p>[foo]<p>bar</div><p>extra',
   3340        '<div align=justify><p>[foo<p>bar}</div><p>extra',
   3341        '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
   3342        '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',
   3343 
   3344        '<div align=left><p>[foo]<p>bar</div><p>extra',
   3345        '<div align=left><p>[foo<p>bar}</div><p>extra',
   3346        '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
   3347        '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',
   3348 
   3349        '<div align=right><p>[foo]<p>bar</div><p>extra',
   3350        '<div align=right><p>[foo<p>bar}</div><p>extra',
   3351        '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
   3352        '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',
   3353 
   3354        '<div align=right>foo</div>[bar]<p>extra',
   3355        '[foo]<div align=right>bar</div><p>extra',
   3356        '<div align=right>foo</div>[bar]<div align=right>baz</div><p>extra',
   3357        '<div align=right><p>foo</div><p>[bar]<p>extra',
   3358        '<p>[foo]<div align=right><p>bar</div><p>extra',
   3359        '<div align=right><p>foo</div><p>[bar]<div align=right><p>baz</div><p>extra',
   3360        '<div style=text-align:right>foo</div>[bar]<p>extra',
   3361        '[foo]<div style=text-align:right>bar</div><p>extra',
   3362        '<div style=text-align:right>foo</div>[bar]<div style=text-align:right>baz</div><p>extra',
   3363        '<div style=text-align:right><p>foo</div><p>[bar]<p>extra',
   3364        '<p>[foo]<div style=text-align:right><p>bar</div><p>extra',
   3365        '<div style=text-align:right><p>foo</div><p>[bar]<div style=text-align:right><p>baz</div><p>extra',
   3366        '<p align=right>foo<p>[bar]<p>extra',
   3367        '<p>[foo]<p align=right>bar<p>extra',
   3368        '<p align=right>foo<p>[bar]<p align=right>baz<p>extra',
   3369 
   3370        '<div align=right>[foo</div>bar]<p>extra',
   3371        '<div align=right>fo[o</div>b]ar<p>extra',
   3372        '<div style=text-align:right>[foo</div>bar]<p>extra',
   3373        '<div style=text-align:right>fo[o</div>b]ar<p>extra',
   3374        '<span style=text-align:right>[foo]</span><p>extra',
   3375        '<span style=text-align:right>f[o]o</span><p>extra',
   3376 
   3377        '<div style=text-align:right>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',
   3378 
   3379        '<div align=nonsense><p>[foo]</div><p>extra',
   3380        '<div style=text-align:inherit><p>[foo]</div><p>extra',
   3381        '<quasit align=center><p>[foo]</p></quasit><p>extra',
   3382 
   3383        '<div style=text-align:start>[foo]</div><p>extra',
   3384        '<div style=text-align:end>[foo]</div><p>extra',
   3385        '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
   3386        '<div dir=rtl style=text-align:end>[foo]</div><p>extra',
   3387 
   3388        // Whitespace nodes
   3389        '<div style=text-align:right><p>foo</div> <p>[bar]',
   3390        '<div align=right><p>foo</div> <p>[bar]',
   3391        '<p>[foo]</p> <div style=text-align:right><p>bar</div>',
   3392        '<p>[foo]</p> <div align=right><p>bar</div>',
   3393        '<div style=text-align:right><p>foo</div> <p>[bar]</p> <div style=text-align:right><p>baz</div>',
   3394        '<div align=right><p>foo</div> <p>[bar]</p> <div align=right><p>baz</div>',
   3395    ],
   3396    //@}
   3397    outdent: [
   3398    //@{
   3399        // These mimic existing indentation in various browsers, to see how
   3400        // they cope with outdenting various things.  This is spec, Gecko
   3401        // non-CSS, and Opera:
   3402        '<blockquote><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
   3403        '<blockquote><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
   3404        '<blockquote><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
   3405        '<blockquote><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
   3406 
   3407        // IE:
   3408        '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
   3409        '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
   3410        '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
   3411        '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
   3412 
   3413        // Firefox CSS mode:
   3414        '<p style="margin-left: 40px">foo[bar]</p><p style="margin-left: 40px">baz</p><p>extra',
   3415        '<p style="margin-left: 40px">foo[bar</p><p style="margin-left: 40px">b]az</p><p>extra',
   3416        '<p style="margin-left: 40px">foo[bar]</p><p>baz</p><p>extra',
   3417        '<p style="margin-left: 40px">foo[bar</p><p>b]az</p><p>extra',
   3418 
   3419        // WebKit:
   3420        '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
   3421        '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
   3422        '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
   3423        '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;"><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
   3424 
   3425        // Now let's try nesting lots of stuff and see what happens.
   3426        '<blockquote><blockquote>foo[bar]baz</blockquote></blockquote>',
   3427        '<blockquote><blockquote data-abc=def>foo[bar]baz</blockquote></blockquote>',
   3428        '<blockquote data-abc=def><blockquote>foo[bar]baz</blockquote></blockquote>',
   3429        '<blockquote><div>foo[bar]baz</div></blockquote>',
   3430        '<blockquote><div id=abc>foo[bar]baz</div></blockquote>',
   3431        '<blockquote id=abc>foo[bar]baz</blockquote>',
   3432        '<blockquote style="color: blue">foo[bar]baz</blockquote>',
   3433 
   3434        '<blockquote><blockquote><p>foo[bar]<p>baz</blockquote></blockquote>',
   3435        '<blockquote><blockquote data-abc=def><p>foo[bar]<p>baz</blockquote></blockquote>',
   3436        '<blockquote data-abc=def><blockquote><p>foo[bar]<p>baz</blockquote></blockquote>',
   3437        '<blockquote><div><p>foo[bar]<p>baz</div></blockquote>',
   3438        '<blockquote><div id=abc><p>foo[bar]<p>baz</div></blockquote>',
   3439        '<blockquote id=abc><p>foo[bar]<p>baz</blockquote>',
   3440        '<blockquote style="color: blue"><p>foo[bar]<p>baz</blockquote>',
   3441 
   3442        '<blockquote><p><b>foo[bar]</b><p>baz</blockquote>',
   3443        '<blockquote><p><strong>foo[bar]</strong><p>baz</blockquote>',
   3444        '<blockquote><p><span>foo[bar]</span><p>baz</blockquote>',
   3445        '<blockquote><blockquote style="color: blue"><p>foo[bar]</blockquote><p>baz</blockquote>',
   3446        '<blockquote style="color: blue"><blockquote><p>foo[bar]</blockquote><p>baz</blockquote>',
   3447 
   3448        // Lists!
   3449        '<ol><li>foo<li>[bar]<li>baz</ol>',
   3450        '<ol data-start=1 data-end=2><li>foo<li>bar<li>baz</ol>',
   3451        '<ol><li>foo</ol>[bar]',
   3452        '<ol><li>[foo]<br>bar<li>baz</ol>',
   3453        '<ol><li>foo<br>[bar]<li>baz</ol>',
   3454        '<ol><li><div>[foo]</div>bar<li>baz</ol>',
   3455        '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
   3456        '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
   3457        '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
   3458        '<ol><li>foo</li><ol data-start=0 data-end=1><li>bar<li>baz</ol><li>quz</ol>',
   3459        '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
   3460        '<ol><li>foo</li><ol data-start=1 data-end=2><li>bar<li>baz</ol><li>quz</ol>',
   3461        '<ol><li>foo<ol><li>b[a]r</ol><li>baz</ol>',
   3462        '<ol><li>foo</li><ol><li>b[a]r</ol><li>baz</ol>',
   3463        '<ol><li>foo{<ol><li>bar</ol>}<li>baz</ol>',
   3464        '<ol><li>foo</li>{<ol><li>bar</ol>}<li>baz</ol>',
   3465        '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
   3466        '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
   3467        '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
   3468        '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
   3469        '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
   3470        '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',
   3471 
   3472        // Try outdenting multiple items at once.
   3473        '<ol><li>foo<li>b[ar<li>baz]</ol>',
   3474        '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
   3475        '<ol><li>[foo</li><ol><li>bar]</ol><li>baz</ol>',
   3476        '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
   3477        '<ol><li>foo</li><ol><li>b[ar</ol><li>b]az</ol>',
   3478        '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
   3479        '<ol><li>[foo</li><ol><li>bar</ol><li>baz]</ol><p>extra',
   3480 
   3481        // We probably can't actually get this DOM . . .
   3482        '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
   3483        '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
   3484        '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
   3485        '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',
   3486 
   3487        // Attribute handling on lists
   3488        'foo<ol start=5><li>[bar]</ol>baz',
   3489        'foo<ol id=abc><li>[bar]</ol>baz',
   3490        'foo<ol style=color:blue><li>[bar]</ol>baz',
   3491        'foo<ol><li value=5>[bar]</ol>baz',
   3492        'foo<ol><li id=abc>[bar]</ol>baz',
   3493        'foo<ol><li style=color:blue>[bar]</ol>baz',
   3494        '<ol><li>foo</li><ol><li value=5>[bar]</ol></ol>',
   3495        '<ul><li>foo</li><ol><li value=5>[bar]</ol></ul>',
   3496        '<ol><li>foo</li><ol start=5><li>[bar]</ol><li>baz</ol>',
   3497        '<ol><li>foo</li><ol id=abc><li>[bar]</ol><li>baz</ol>',
   3498        '<ol><li>foo</li><ol style=color:blue><li>[bar]</ol><li>baz</ol>',
   3499        '<ol><li>foo</li><ol style=text-indent:1em><li>[bar]</ol><li>baz</ol>',
   3500        '<ol><li>foo</li><ol start=5><li>[bar<li>baz]</ol><li>quz</ol>',
   3501        '<ol><li>foo</li><ol id=abc><li>[bar<li>baz]</ol><li>quz</ol>',
   3502        '<ol><li>foo</li><ol style=color:blue><li>[bar<li>baz]</ol><li>quz</ol>',
   3503        '<ol><li>foo</li><ol style=text-indent:1em><li>[bar<li>baz]</ol><li>quz</ol>',
   3504 
   3505        // List inside indentation element
   3506        '<blockquote><ol><li>[foo]</ol></blockquote><p>extra',
   3507        '<blockquote>foo<ol><li>[bar]</ol>baz</blockquote><p>extra',
   3508        '<blockquote><ol><li>foo</li><ol><li>[bar]</ol><li>baz</ol></blockquote><p>extra',
   3509 
   3510        '<ol><li><h1>[foo]</h1></ol>',
   3511        '<ol><li><xmp>[foo]</xmp></li></ol>',
   3512        '<blockquote><ol><li>foo<div><ol><li>[bar]</ol></div><li>baz</ol></blockquote>',
   3513 
   3514        // Whitespace nodes
   3515        '<blockquote> <p>[foo]</p></blockquote>',
   3516        '<blockquote><p>[foo]</p> </blockquote>',
   3517        '<blockquote> <p>[foo]</p> </blockquote>',
   3518        '<ol> <li>[foo]</li></ol>',
   3519        '<ol><li>[foo]</li> </ol>',
   3520        '<ol> <li>[foo]</li> </ol>',
   3521        '<ul> <li>[foo]</li></ul>',
   3522        '<ul><li>[foo]</li> </ul>',
   3523        '<ul> <li>[foo]</li> </ul>',
   3524        '<blockquote> <p>[foo]</p> <p>bar</p> <p>baz</p></blockquote>',
   3525        '<blockquote> <p>foo</p> <p>[bar]</p> <p>baz</p></blockquote>',
   3526        '<blockquote> <p>foo</p> <p>bar</p> <p>[baz]</p></blockquote>',
   3527        '<ol> <li>[foo]</li> <li>bar</li> <li>baz</li></ol>',
   3528        '<ol> <li>foo</li> <li>[bar]</li> <li>baz</li></ol>',
   3529        '<ol> <li>foo</li> <li>bar</li> <li>[baz]</li></ol>',
   3530        '<ul> <li>[foo]</li> <li>bar</li> <li>baz</li></ul>',
   3531        '<ul> <li>foo</li> <li>[bar]</li> <li>baz</li></ul>',
   3532        '<ul> <li>foo</li> <li>bar</li> <li>[baz]</li></ul>',
   3533 
   3534        // https://bugs.webkit.org/show_bug.cgi?id=24249
   3535        '<ol><li>[]a<table><tr><td><br></table></ol>',
   3536        // https://bugs.webkit.org/show_bug.cgi?id=43447
   3537        '<blockquote><span>foo<br>[bar]</span></blockquote>',
   3538    ],
   3539    //@}
   3540    removeformat: [
   3541    //@{
   3542        'foo[]bar',
   3543        '<span>foo</span>{}<span>bar</span>',
   3544        '<span>foo[</span><span>]bar</span>',
   3545        '[foo<b>bar</b>baz]',
   3546        'foo[<b>bar</b>baz]',
   3547        'foo[<b>bar</b>]baz',
   3548        'foo<b>[bar]</b>baz',
   3549        'foo<b>b[a]r</b>baz',
   3550        '[foo<strong>bar</strong>baz]',
   3551        '[foo<span style="font-weight: bold">bar</span>baz]',
   3552        'foo<span style="font-weight: bold">b[a]r</span>baz',
   3553        '[foo<span style="font-variant: small-caps">bar</span>baz]',
   3554        'foo<span style="font-variant: small-caps">b[a]r</span>baz',
   3555        '[foo<b id=foo>bar</b>baz]',
   3556        'foo<b id=foo>b[a]r</b>baz',
   3557 
   3558        // HTML has lots of inline elements, doesn't it?
   3559        '[foo<a>bar</a>baz]',
   3560        'foo<a>b[a]r</a>baz',
   3561        '[foo<a href=foo>bar</a>baz]',
   3562        'foo<a href=foo>b[a]r</a>baz',
   3563        '[foo<abbr>bar</abbr>baz]',
   3564        'foo<abbr>b[a]r</abbr>baz',
   3565        '[foo<acronym>bar</acronym>baz]',
   3566        'foo<acronym>b[a]r</acronym>baz',
   3567        '[foo<b>bar</b>baz]',
   3568        'foo<b>b[a]r</b>baz',
   3569        '[foo<bdi dir=rtl>bar</bdi>baz]',
   3570        'foo<bdi dir=rtl>b[a]r</bdi>baz',
   3571        '[foo<bdo dir=rtl>bar</bdo>baz]',
   3572        'foo<bdo dir=rtl>b[a]r</bdo>baz',
   3573        '[foo<big>bar</big>baz]',
   3574        'foo<big>b[a]r</big>baz',
   3575        '[foo<blink>bar</blink>baz]',
   3576        'foo<blink>b[a]r</blink>baz',
   3577        '[foo<cite>bar</cite>baz]',
   3578        'foo<cite>b[a]r</cite>baz',
   3579        '[foo<code>bar</code>baz]',
   3580        'foo<code>b[a]r</code>baz',
   3581        '[foo<del>bar</del>baz]',
   3582        'foo<del>b[a]r</del>baz',
   3583        '[foo<dfn>bar</dfn>baz]',
   3584        'foo<dfn>b[a]r</dfn>baz',
   3585        '[foo<em>bar</em>baz]',
   3586        'foo<em>b[a]r</em>baz',
   3587        '[foo<font>bar</font>baz]',
   3588        'foo<font>b[a]r</font>baz',
   3589        '[foo<font color=blue>bar</font>baz]',
   3590        'foo<font color=blue>b[a]r</font>baz',
   3591        '[foo<i>bar</i>baz]',
   3592        'foo<i>b[a]r</i>baz',
   3593        '[foo<ins>bar</ins>baz]',
   3594        'foo<ins>b[a]r</ins>baz',
   3595        '[foo<kbd>bar</kbd>baz]',
   3596        'foo<kbd>b[a]r</kbd>baz',
   3597        '[foo<mark>bar</mark>baz]',
   3598        'foo<mark>b[a]r</mark>baz',
   3599        '[foo<nobr>bar</nobr>baz]',
   3600        'foo<nobr>b[a]r</nobr>baz',
   3601        '[foo<q>bar</q>baz]',
   3602        'foo<q>b[a]r</q>baz',
   3603        '[foo<samp>bar</samp>baz]',
   3604        'foo<samp>b[a]r</samp>baz',
   3605        '[foo<s>bar</s>baz]',
   3606        'foo<s>b[a]r</s>baz',
   3607        '[foo<small>bar</small>baz]',
   3608        'foo<small>b[a]r</small>baz',
   3609        '[foo<span>bar</span>baz]',
   3610        'foo<span>b[a]r</span>baz',
   3611        '[foo<strike>bar</strike>baz]',
   3612        'foo<strike>b[a]r</strike>baz',
   3613        '[foo<strong>bar</strong>baz]',
   3614        'foo<strong>b[a]r</strong>baz',
   3615        '[foo<sub>bar</sub>baz]',
   3616        'foo<sub>b[a]r</sub>baz',
   3617        '[foo<sup>bar</sup>baz]',
   3618        'foo<sup>b[a]r</sup>baz',
   3619        '[foo<tt>bar</tt>baz]',
   3620        'foo<tt>b[a]r</tt>baz',
   3621        '[foo<u>bar</u>baz]',
   3622        'foo<u>b[a]r</u>baz',
   3623        '[foo<var>bar</var>baz]',
   3624        'foo<var>b[a]r</var>baz',
   3625 
   3626        // Empty and replaced elements
   3627        '[foo<br>bar]',
   3628        '[foo<hr>bar]',
   3629        '[foo<wbr>bar]',
   3630        '[foo<img>bar]',
   3631        '[foo<img src=abc>bar]',
   3632        '[foo<video></video>bar]',
   3633        '[foo<video src=abc></video>bar]',
   3634        '[foo<svg><circle fill=blue r=20 cx=20 cy=20 /></svg>bar]',
   3635 
   3636        // Unrecognized elements
   3637        '[foo<nonexistentelement>bar</nonexistentelement>baz]',
   3638        'foo<nonexistentelement>b[a]r</nonexistentelement>baz',
   3639        '[foo<nonexistentelement style="display: block">bar</nonexistentelement>baz]',
   3640        'foo<nonexistentelement style="display: block">b[a]r</nonexistentelement>baz',
   3641 
   3642        // Random stuff
   3643        '[foo<span id=foo>bar</span>baz]',
   3644        'foo<span id=foo>b[a]r</span>baz',
   3645        '[foo<span class=foo>bar</span>baz]',
   3646        'foo<span class=foo>b[a]r</span>baz',
   3647        '[foo<b style="font-weight: normal">bar</b>baz]',
   3648        'foo<b style="font-weight: normal">b[a]r</b>baz',
   3649        '<p style="background-color: aqua">foo[bar]baz</p>',
   3650        '<p><span style="background-color: aqua">foo[bar]baz</span></p>',
   3651        '<p style="font-weight: bold">foo[bar]baz</p>',
   3652        '<b><p style="font-weight: bold">foo[bar]baz</p></b>',
   3653        '<p style="font-variant: small-caps">foo[bar]baz</p>',
   3654        '{<p style="font-variant: small-caps">foobarbaz</p>}',
   3655        '<p style="text-indent: 2em">foo[bar]baz</p>',
   3656        '{<p style="text-indent: 2em">foobarbaz</p>}',
   3657 
   3658        // https://bugzilla.mozilla.org/show_bug.cgi?id=649138
   3659        // Chrome 15 dev fails this for some unclear reason.
   3660        '<table data-start=0 data-end=1><tr><td><b>foo</b></table>',
   3661    ],
   3662    //@}
   3663    strikethrough: [
   3664    //@{
   3665        'foo[]bar',
   3666        '<p>[foo</p> <p>bar]</p>',
   3667        '<span>[foo</span> <span>bar]</span>',
   3668        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
   3669        '<p>[foo<p><br><p>bar]',
   3670        '<b>foo[]bar</b>',
   3671        '<i>foo[]bar</i>',
   3672        '<span>foo</span>{}<span>bar</span>',
   3673        '<span>foo[</span><span>]bar</span>',
   3674        'foo[bar]baz',
   3675        'foo[bar<b>baz]qoz</b>quz',
   3676        'foo[bar<i>baz]qoz</i>quz',
   3677        '{<p><p> <p>foo</p>}',
   3678 
   3679        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   3680        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
   3681        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
   3682        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
   3683        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
   3684        '{<table><tr><td>foo<td>bar<td>baz</table>}',
   3685 
   3686        'foo<u>[bar]</u>baz',
   3687        'foo<span style="text-decoration: underline">[bar]</span>baz',
   3688        '<u>foo[bar]baz</u>',
   3689        '<u>foo[b<span style="color:blue">ar]ba</span>z</u>',
   3690        '<u>foo[b<span style="color:blue" id=foo>ar]ba</span>z</u>',
   3691        '<u>foo[b<span style="font-size:3em">ar]ba</span>z</u>',
   3692        '<u>foo[b<i>ar]ba</i>z</u>',
   3693        '<p style="text-decoration: underline">foo[bar]baz</p>',
   3694 
   3695        'foo<s>[bar]</s>baz',
   3696        'foo<span style="text-decoration: line-through">[bar]</span>baz',
   3697        '<s>foo[bar]baz</s>',
   3698        '<s>foo[b<span style="color:blue">ar]ba</span>z</s>',
   3699        '<s>foo[b<span style="color:blue" id=foo>ar]ba</span>z</s>',
   3700        '<s>foo[b<span style="font-size:3em">ar]ba</span>z</s>',
   3701        '<s>foo[b<i>ar]ba</i>z</s>',
   3702        '<p style="text-decoration: line-through">foo[bar]baz</p>',
   3703 
   3704        'foo<strike>[bar]</strike>baz',
   3705        '<strike>foo[bar]baz</strike>',
   3706        '<strike>foo[b<span style="color:blue">ar]ba</span>z</strike>',
   3707        '<strike>foo[b<span style="color:blue" id=foo>ar]ba</span>z</strike>',
   3708        '<strike>foo[b<span style="font-size:3em">ar]ba</span>z</strike>',
   3709        '<strike>foo[b<i>ar]ba</i>z</strike>',
   3710 
   3711        'foo<ins>[bar]</ins>baz',
   3712        '<ins>foo[bar]baz</ins>',
   3713        '<ins>foo[b<span style="color:blue">ar]ba</span>z</ins>',
   3714        '<ins>foo[b<span style="color:blue" id=foo>ar]ba</span>z</ins>',
   3715        '<ins>foo[b<span style="font-size:3em">ar]ba</span>z</ins>',
   3716        '<ins>foo[b<i>ar]ba</i>z</ins>',
   3717 
   3718        'foo<del>[bar]</del>baz',
   3719        '<del>foo[bar]baz</del>',
   3720        '<del>foo[b<span style="color:blue">ar]ba</span>z</del>',
   3721        '<del>foo[b<span style="color:blue" id=foo>ar]ba</span>z</del>',
   3722        '<del>foo[b<span style="font-size:3em">ar]ba</span>z</del>',
   3723        '<del>foo[b<i>ar]ba</i>z</del>',
   3724 
   3725        'foo<span style="text-decoration: underline line-through">[bar]</span>baz',
   3726        'foo<span style="text-decoration: underline line-through">b[a]r</span>baz',
   3727        'foo<s style="text-decoration: underline">[bar]</s>baz',
   3728        'foo<s style="text-decoration: underline">b[a]r</s>baz',
   3729        'foo<u style="text-decoration: line-through">[bar]</u>baz',
   3730        'foo<u style="text-decoration: line-through">b[a]r</u>baz',
   3731        'foo<s style="text-decoration: overline">[bar]</s>baz',
   3732        'foo<s style="text-decoration: overline">b[a]r</s>baz',
   3733        'foo<u style="text-decoration: overline">[bar]</u>baz',
   3734        'foo<u style="text-decoration: overline">b[a]r</u>baz',
   3735 
   3736        '<p style="text-decoration: line-through">foo[bar]baz</p>',
   3737        '<p style="text-decoration: overline">foo[bar]baz</p>',
   3738 
   3739        'foo<span class="underline">[bar]</span>baz',
   3740        'foo<span class="underline">b[a]r</span>baz',
   3741        'foo<span class="line-through">[bar]</span>baz',
   3742        'foo<span class="line-through">b[a]r</span>baz',
   3743        'foo<span class="underline-and-line-through">[bar]</span>baz',
   3744        'foo<span class="underline-and-line-through">b[a]r</span>baz',
   3745 
   3746        // Tests for queryCommandIndeterm() and queryCommandState()
   3747        'fo[o<s>b]ar</s>baz',
   3748        'foo<s>ba[r</s>b]az',
   3749        'fo[o<s>bar</s>b]az',
   3750        'foo[<s>b]ar</s>baz',
   3751        'foo<s>ba[r</s>]baz',
   3752        'foo[<s>bar</s>]baz',
   3753        'foo<s>[bar]</s>baz',
   3754        'foo{<s>bar</s>}baz',
   3755        'fo[o<span style=text-decoration:line-through>b]ar</span>baz',
   3756        '<strike>fo[o</strike><s>b]ar</s>',
   3757        '<s>fo[o</s><del>b]ar</del>',
   3758    ],
   3759    //@}
   3760    subscript: [
   3761    //@{
   3762        'foo[]bar',
   3763        '<p>[foo</p> <p>bar]</p>',
   3764        '<span>[foo</span> <span>bar]</span>',
   3765        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
   3766        '<p>[foo<p><br><p>bar]',
   3767        '<b>foo[]bar</b>',
   3768        '<i>foo[]bar</i>',
   3769        '<span>foo</span>{}<span>bar</span>',
   3770        '<span>foo[</span><span>]bar</span>',
   3771        'foo[bar]baz',
   3772        'foo[bar<b>baz]qoz</b>quz',
   3773        'foo[bar<i>baz]qoz</i>quz',
   3774        '{<p><p> <p>foo</p>}',
   3775 
   3776        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   3777        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
   3778        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
   3779        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
   3780        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
   3781        '{<table><tr><td>foo<td>bar<td>baz</table>}',
   3782 
   3783        'foo<sub>[bar]</sub>baz',
   3784        'foo<sub>b[a]r</sub>baz',
   3785        'foo<sup>[bar]</sup>baz',
   3786        'foo<sup>b[a]r</sup>baz',
   3787 
   3788        'foo<span style=vertical-align:sub>[bar]</span>baz',
   3789        'foo<span style=vertical-align:super>[bar]</span>baz',
   3790 
   3791        'foo<sub><sub>[bar]</sub></sub>baz',
   3792        'foo<sub><sub>b[a]r</sub></sub>baz',
   3793        'foo<sub>b<sub>[a]</sub>r</sub>baz',
   3794        'foo<sup><sup>[bar]</sup></sup>baz',
   3795        'foo<sup><sup>b[a]r</sup></sup>baz',
   3796        'foo<sup>b<sup>[a]</sup>r</sup>baz',
   3797        'foo<sub><sup>[bar]</sup></sub>baz',
   3798        'foo<sub><sup>b[a]r</sup></sub>baz',
   3799        'foo<sub>b<sup>[a]</sup>r</sub>baz',
   3800        'foo<sup><sub>[bar]</sub></sup>baz',
   3801        'foo<sup><sub>b[a]r</sub></sup>baz',
   3802        'foo<sup>b<sub>[a]</sub>r</sup>baz',
   3803 
   3804        // Tests for queryCommandIndeterm() and queryCommandState()
   3805        'fo[o<sub>b]ar</sub>baz',
   3806        'foo<sub>ba[r</sub>b]az',
   3807        'fo[o<sub>bar</sub>b]az',
   3808        'foo[<sub>b]ar</sub>baz',
   3809        'foo<sub>ba[r</sub>]baz',
   3810        'foo[<sub>bar</sub>]baz',
   3811        'foo<sub>[bar]</sub>baz',
   3812        'foo{<sub>bar</sub>}baz',
   3813        '<sub>fo[o</sub><sup>b]ar</sup>',
   3814        '<sub>fo[o</sub><span style=vertical-align:sub>b]ar</span>',
   3815        'foo<span style=vertical-align:top>[bar]</span>baz',
   3816        '<sub>fo[o</sub><span style=vertical-align:top>b]ar</span>',
   3817    ],
   3818    //@}
   3819    superscript: [
   3820    //@{
   3821        'foo[]bar',
   3822        '<p>[foo</p> <p>bar]</p>',
   3823        '<span>[foo</span> <span>bar]</span>',
   3824        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
   3825        '<p>[foo<p><br><p>bar]',
   3826        '<b>foo[]bar</b>',
   3827        '<i>foo[]bar</i>',
   3828        '<span>foo</span>{}<span>bar</span>',
   3829        '<span>foo[</span><span>]bar</span>',
   3830        'foo[bar]baz',
   3831        'foo[bar<b>baz]qoz</b>quz',
   3832        'foo[bar<i>baz]qoz</i>quz',
   3833        '{<p><p> <p>foo</p>}',
   3834 
   3835        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   3836        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
   3837        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
   3838        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
   3839        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
   3840        '{<table><tr><td>foo<td>bar<td>baz</table>}',
   3841 
   3842        'foo<sub>[bar]</sub>baz',
   3843        'foo<sub>b[a]r</sub>baz',
   3844        'foo<sup>[bar]</sup>baz',
   3845        'foo<sup>b[a]r</sup>baz',
   3846 
   3847        'foo<span style=vertical-align:sub>[bar]</span>baz',
   3848        'foo<span style=vertical-align:super>[bar]</span>baz',
   3849 
   3850        'foo<sub><sub>[bar]</sub></sub>baz',
   3851        'foo<sub><sub>b[a]r</sub></sub>baz',
   3852        'foo<sub>b<sub>[a]</sub>r</sub>baz',
   3853        'foo<sup><sup>[bar]</sup></sup>baz',
   3854        'foo<sup><sup>b[a]r</sup></sup>baz',
   3855        'foo<sup>b<sup>[a]</sup>r</sup>baz',
   3856        'foo<sub><sup>[bar]</sup></sub>baz',
   3857        'foo<sub><sup>b[a]r</sup></sub>baz',
   3858        'foo<sub>b<sup>[a]</sup>r</sub>baz',
   3859        'foo<sup><sub>[bar]</sub></sup>baz',
   3860        'foo<sup><sub>b[a]r</sub></sup>baz',
   3861        'foo<sup>b<sub>[a]</sub>r</sup>baz',
   3862 
   3863        // Tests for queryCommandIndeterm() and queryCommandState()
   3864        'fo[o<sup>b]ar</sup>baz',
   3865        'foo<sup>ba[r</sup>b]az',
   3866        'fo[o<sup>bar</sup>b]az',
   3867        'foo[<sup>b]ar</sup>baz',
   3868        'foo<sup>ba[r</sup>]baz',
   3869        'foo[<sup>bar</sup>]baz',
   3870        'foo<sup>[bar]</sup>baz',
   3871        'foo{<sup>bar</sup>}baz',
   3872        '<sup>fo[o</sup><sub>b]ar</sub>',
   3873        '<sup>fo[o</sup><span style=vertical-align:super>b]ar</span>',
   3874        'foo<span style=vertical-align:bottom>[bar]</span>baz',
   3875        '<sup>fo[o</sup><span style=vertical-align:bottom>b]ar</span>',
   3876 
   3877        // https://bugs.webkit.org/show_bug.cgi?id=28472
   3878        'foo<sup>[bar]<br></sup>',
   3879    ],
   3880    //@}
   3881    underline: [
   3882    //@{
   3883        'foo[]bar',
   3884        '<p>[foo</p> <p>bar]</p>',
   3885        '<span>[foo</span> <span>bar]</span>',
   3886        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
   3887        '<p>[foo<p><br><p>bar]',
   3888        '<b>foo[]bar</b>',
   3889        '<i>foo[]bar</i>',
   3890        '<span>foo</span>{}<span>bar</span>',
   3891        '<span>foo[</span><span>]bar</span>',
   3892        'foo[bar]baz',
   3893        'foo[bar<b>baz]qoz</b>quz',
   3894        'foo[bar<i>baz]qoz</i>quz',
   3895        '{<p><p> <p>foo</p>}',
   3896 
   3897        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
   3898        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
   3899        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
   3900        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
   3901        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
   3902        '{<table><tr><td>foo<td>bar<td>baz</table>}',
   3903 
   3904        'foo<u>[bar]</u>baz',
   3905        'foo<span style="text-decoration: underline">[bar]</span>baz',
   3906        '<u>foo[bar]baz</u>',
   3907        '<u>foo[b<span style="color:blue">ar]ba</span>z</u>',
   3908        '<u>foo[b<span style="color:blue" id=foo>ar]ba</span>z</u>',
   3909        '<u>foo[b<span style="font-size:3em">ar]ba</span>z</u>',
   3910        '<u>foo[b<i>ar]ba</i>z</u>',
   3911        '<p style="text-decoration: underline">foo[bar]baz</p>',
   3912 
   3913        'foo<s>[bar]</s>baz',
   3914        'foo<span style="text-decoration: line-through">[bar]</span>baz',
   3915        '<s>foo[bar]baz</s>',
   3916        '<s>foo[b<span style="color:blue">ar]ba</span>z</s>',
   3917        '<s>foo[b<span style="color:blue" id=foo>ar]ba</span>z</s>',
   3918        '<s>foo[b<span style="font-size:3em">ar]ba</span>z</s>',
   3919        '<s>foo[b<i>ar]ba</i>z</s>',
   3920        '<p style="text-decoration: line-through">foo[bar]baz</p>',
   3921 
   3922        'foo<strike>[bar]</strike>baz',
   3923        '<strike>foo[bar]baz</strike>',
   3924        '<strike>foo[b<span style="color:blue">ar]ba</span>z</strike>',
   3925        '<strike>foo[b<span style="color:blue" id=foo>ar]ba</span>z</strike>',
   3926        '<strike>foo[b<span style="font-size:3em">ar]ba</span>z</strike>',
   3927        '<strike>foo[b<i>ar]ba</i>z</strike>',
   3928 
   3929        'foo<ins>[bar]</ins>baz',
   3930        '<ins>foo[bar]baz</ins>',
   3931        '<ins>foo[b<span style="color:blue">ar]ba</span>z</ins>',
   3932        '<ins>foo[b<span style="color:blue" id=foo>ar]ba</span>z</ins>',
   3933        '<ins>foo[b<span style="font-size:3em">ar]ba</span>z</ins>',
   3934        '<ins>foo[b<i>ar]ba</i>z</ins>',
   3935 
   3936        'foo<del>[bar]</del>baz',
   3937        '<del>foo[bar]baz</del>',
   3938        '<del>foo[b<span style="color:blue">ar]ba</span>z</del>',
   3939        '<del>foo[b<span style="color:blue" id=foo>ar]ba</span>z</del>',
   3940        '<del>foo[b<span style="font-size:3em">ar]ba</span>z</del>',
   3941        '<del>foo[b<i>ar]ba</i>z</del>',
   3942 
   3943        'foo<span style="text-decoration: underline line-through">[bar]</span>baz',
   3944        'foo<span style="text-decoration: underline line-through">b[a]r</span>baz',
   3945        'foo<s style="text-decoration: underline">[bar]</s>baz',
   3946        'foo<s style="text-decoration: underline">b[a]r</s>baz',
   3947        'foo<u style="text-decoration: line-through">[bar]</u>baz',
   3948        'foo<u style="text-decoration: line-through">b[a]r</u>baz',
   3949        'foo<s style="text-decoration: overline">[bar]</s>baz',
   3950        'foo<s style="text-decoration: overline">b[a]r</s>baz',
   3951        'foo<u style="text-decoration: overline">[bar]</u>baz',
   3952        'foo<u style="text-decoration: overline">b[a]r</u>baz',
   3953 
   3954        '<p style="text-decoration: line-through">foo[bar]baz</p>',
   3955        '<p style="text-decoration: overline">foo[bar]baz</p>',
   3956 
   3957        'foo<span class="underline">[bar]</span>baz',
   3958        'foo<span class="underline">b[a]r</span>baz',
   3959        'foo<span class="line-through">[bar]</span>baz',
   3960        'foo<span class="line-through">b[a]r</span>baz',
   3961        'foo<span class="underline-and-line-through">[bar]</span>baz',
   3962        'foo<span class="underline-and-line-through">b[a]r</span>baz',
   3963 
   3964        // Tests for queryCommandIndeterm() and queryCommandState()
   3965        'fo[o<u>b]ar</u>baz',
   3966        'foo<u>ba[r</u>b]az',
   3967        'fo[o<u>bar</u>b]az',
   3968        'foo[<u>b]ar</u>baz',
   3969        'foo<u>ba[r</u>]baz',
   3970        'foo[<u>bar</u>]baz',
   3971        'foo<u>[bar]</u>baz',
   3972        'foo{<u>bar</u>}baz',
   3973        'fo[o<span style=text-decoration:underline>b]ar</span>baz',
   3974        '<ins>fo[o</ins><u>b]ar</u>',
   3975        '<u>fo[o</u><ins>b]ar</ins>',
   3976    ],
   3977    //@}
   3978    unlink: [
   3979    //@{
   3980        'foo[]bar',
   3981        '<p>[foo</p> <p>bar]</p>',
   3982        '<span>[foo</span> <span>bar]</span>',
   3983        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
   3984        '<b>foo[]bar</b>',
   3985        '<i>foo[]bar</i>',
   3986        '<span>foo</span>{}<span>bar</span>',
   3987        '<span>foo[</span><span>]bar</span>',
   3988        'foo[bar]baz',
   3989        'foo[bar<b>baz]qoz</b>quz',
   3990        'foo[bar<i>baz]qoz</i>quz',
   3991        '{<p><p> <p>foo</p>}',
   3992 
   3993        '<a href=http://www.google.com/>foo[bar]baz</a>',
   3994        '<a href=http://www.google.com/>foo[barbaz</a>}',
   3995        '{<a href=http://www.google.com/>foobar]baz</a>',
   3996        '{<a href=http://www.google.com/>foobarbaz</a>}',
   3997        '<a href=http://www.google.com/>[foobarbaz]</a>',
   3998 
   3999        'foo<a href=http://www.google.com/>b[]ar</a>baz',
   4000        'foo<a href=http://www.google.com/>[bar]</a>baz',
   4001        'foo[<a href=http://www.google.com/>bar</a>]baz',
   4002        'foo<a href=http://www.google.com/>[bar</a>baz]',
   4003        '[foo<a href=http://www.google.com/>bar]</a>baz',
   4004        '[foo<a href=http://www.google.com/>bar</a>baz]',
   4005 
   4006        '<a id=foo href=http://www.google.com/>foobar[]baz</a>',
   4007        '<a id=foo href=http://www.google.com/>foo[bar]baz</a>',
   4008        '<a id=foo href=http://www.google.com/>[foobarbaz]</a>',
   4009        'foo<a id=foo href=http://www.google.com/>[bar]</a>baz',
   4010        'foo[<a id=foo href=http://www.google.com/>bar</a>]baz',
   4011        '[foo<a id=foo href=http://www.google.com/>bar</a>baz]',
   4012 
   4013        '<a name=foo>foobar[]baz</a>',
   4014        '<a name=foo>foo[bar]baz</a>',
   4015        '<a name=foo>[foobarbaz]</a>',
   4016        'foo<a name=foo>[bar]</a>baz',
   4017        'foo[<a name=foo>bar</a>]baz',
   4018        '[foo<a name=foo>bar</a>baz]',
   4019    ],
   4020    //@}
   4021    copy: ['!foo[bar]baz'],
   4022    cut: ['!foo[bar]baz'],
   4023    defaultparagraphseparator: [
   4024    //@{
   4025        ['', 'foo[bar]baz'],
   4026        ['div', 'foo[bar]baz'],
   4027        ['p', 'foo[bar]baz'],
   4028        ['DIV', 'foo[bar]baz'],
   4029        ['P', 'foo[bar]baz'],
   4030        [' div ', 'foo[bar]baz'],
   4031        [' p ', 'foo[bar]baz'],
   4032        ['<div>', 'foo[bar]baz'],
   4033        ['<p>', 'foo[bar]baz'],
   4034        ['li', 'foo[bar]baz'],
   4035        ['blockquote', 'foo[bar]baz'],
   4036    ],
   4037    //@}
   4038    paste: ['!foo[bar]baz'],
   4039    selectall: ['foo[bar]baz'],
   4040    stylewithcss: [
   4041    //@{
   4042        ['true', 'foo[bar]baz'],
   4043        ['TRUE', 'foo[bar]baz'],
   4044        ['TrUe', 'foo[bar]baz'],
   4045        ['true ', 'foo[bar]baz'],
   4046        [' true', 'foo[bar]baz'],
   4047        ['truer', 'foo[bar]baz'],
   4048        [' true ', 'foo[bar]baz'],
   4049        [' TrUe', 'foo[bar]baz'],
   4050        ['', 'foo[bar]baz'],
   4051        [' ', 'foo[bar]baz'],
   4052        ['false', 'foo[bar]baz'],
   4053        ['FALSE', 'foo[bar]baz'],
   4054        ['FaLsE', 'foo[bar]baz'],
   4055        [' false', 'foo[bar]baz'],
   4056        ['false ', 'foo[bar]baz'],
   4057        ['falser', 'foo[bar]baz'],
   4058        ['falsé', 'foo[bar]baz'],
   4059    ],
   4060    //@}
   4061    usecss: [
   4062    //@{
   4063        ['true', 'foo[bar]baz'],
   4064        ['TRUE', 'foo[bar]baz'],
   4065        ['TrUe', 'foo[bar]baz'],
   4066        ['true ', 'foo[bar]baz'],
   4067        [' true', 'foo[bar]baz'],
   4068        ['truer', 'foo[bar]baz'],
   4069        [' true ', 'foo[bar]baz'],
   4070        [' TrUe', 'foo[bar]baz'],
   4071        ['', 'foo[bar]baz'],
   4072        [' ', 'foo[bar]baz'],
   4073        ['false', 'foo[bar]baz'],
   4074        ['FALSE', 'foo[bar]baz'],
   4075        ['FaLsE', 'foo[bar]baz'],
   4076        [' false', 'foo[bar]baz'],
   4077        ['false ', 'foo[bar]baz'],
   4078        ['falser', 'foo[bar]baz'],
   4079        ['falsé', 'foo[bar]baz'],
   4080    ],
   4081    //@}
   4082    quasit: ['foo[bar]baz'],
   4083    multitest: [
   4084    //@{
   4085        // Insertion-affecting state.  Test that insertText works right, and
   4086        // test that various block commands preserve (or don't preserve) the
   4087        // state.
   4088        ['foo[]bar', 'bold', 'inserttext'],
   4089        ['foo[]bar', 'bold', 'delete'],
   4090        ['foo[]bar', 'bold', 'delete', 'inserttext'],
   4091        ['foo[]bar', 'bold', 'formatblock'],
   4092        ['foo[]bar', 'bold', 'formatblock', 'inserttext'],
   4093        ['foo[]bar', 'bold', 'forwarddelete'],
   4094        ['foo[]bar', 'bold', 'forwarddelete', 'inserttext'],
   4095        ['foo[]bar', 'bold', 'indent'],
   4096        ['foo[]bar', 'bold', 'indent', 'inserttext'],
   4097        ['foo[]bar', 'bold', 'inserthorizontalrule'],
   4098        ['foo[]bar', 'bold', 'inserthorizontalrule', 'inserttext'],
   4099        ['foo[]bar', 'bold', 'inserthtml'],
   4100        ['foo[]bar', 'bold', 'inserthtml', 'inserttext'],
   4101        ['foo[]bar', 'bold', 'insertimage'],
   4102        ['foo[]bar', 'bold', 'insertimage', 'inserttext'],
   4103        ['foo[]bar', 'bold', 'insertlinebreak'],
   4104        ['foo[]bar', 'bold', 'insertlinebreak', 'inserttext'],
   4105        ['foo[]bar', 'bold', 'insertorderedlist'],
   4106        ['foo[]bar', 'bold', 'insertorderedlist', 'inserttext'],
   4107        ['foo[]bar', 'bold', 'insertparagraph'],
   4108        ['foo[]bar', 'bold', 'insertparagraph', 'inserttext'],
   4109        ['foo[]bar', 'bold', 'insertunorderedlist'],
   4110        ['foo[]bar', 'bold', 'insertunorderedlist', 'inserttext'],
   4111        ['foo[]bar', 'bold', 'justifycenter'],
   4112        ['foo[]bar', 'bold', 'justifycenter', 'inserttext'],
   4113        ['foo[]bar', 'bold', 'justifyfull'],
   4114        ['foo[]bar', 'bold', 'justifyfull', 'inserttext'],
   4115        ['foo[]bar', 'bold', 'justifyleft'],
   4116        ['foo[]bar', 'bold', 'justifyleft', 'inserttext'],
   4117        ['foo[]bar', 'bold', 'justifyright'],
   4118        ['foo[]bar', 'bold', 'justifyright', 'inserttext'],
   4119        ['foo[]bar', 'bold', 'outdent'],
   4120        ['foo[]bar', 'bold', 'outdent', 'inserttext'],
   4121 
   4122        ['foo[]bar', 'italic', 'inserttext'],
   4123        ['foo[]bar', 'italic', 'delete'],
   4124        ['foo[]bar', 'italic', 'delete', 'inserttext'],
   4125        ['foo[]bar', 'italic', 'formatblock'],
   4126        ['foo[]bar', 'italic', 'formatblock', 'inserttext'],
   4127        ['foo[]bar', 'italic', 'forwarddelete'],
   4128        ['foo[]bar', 'italic', 'forwarddelete', 'inserttext'],
   4129        ['foo[]bar', 'italic', 'indent'],
   4130        ['foo[]bar', 'italic', 'indent', 'inserttext'],
   4131        ['foo[]bar', 'italic', 'inserthorizontalrule'],
   4132        ['foo[]bar', 'italic', 'inserthorizontalrule', 'inserttext'],
   4133        ['foo[]bar', 'italic', 'inserthtml'],
   4134        ['foo[]bar', 'italic', 'inserthtml', 'inserttext'],
   4135        ['foo[]bar', 'italic', 'insertimage'],
   4136        ['foo[]bar', 'italic', 'insertimage', 'inserttext'],
   4137        ['foo[]bar', 'italic', 'insertlinebreak'],
   4138        ['foo[]bar', 'italic', 'insertlinebreak', 'inserttext'],
   4139        ['foo[]bar', 'italic', 'insertorderedlist'],
   4140        ['foo[]bar', 'italic', 'insertorderedlist', 'inserttext'],
   4141        ['foo[]bar', 'italic', 'insertparagraph'],
   4142        ['foo[]bar', 'italic', 'insertparagraph', 'inserttext'],
   4143        ['foo[]bar', 'italic', 'insertunorderedlist'],
   4144        ['foo[]bar', 'italic', 'insertunorderedlist', 'inserttext'],
   4145        ['foo[]bar', 'italic', 'justifycenter'],
   4146        ['foo[]bar', 'italic', 'justifycenter', 'inserttext'],
   4147        ['foo[]bar', 'italic', 'justifyfull'],
   4148        ['foo[]bar', 'italic', 'justifyfull', 'inserttext'],
   4149        ['foo[]bar', 'italic', 'justifyleft'],
   4150        ['foo[]bar', 'italic', 'justifyleft', 'inserttext'],
   4151        ['foo[]bar', 'italic', 'justifyright'],
   4152        ['foo[]bar', 'italic', 'justifyright', 'inserttext'],
   4153        ['foo[]bar', 'italic', 'outdent'],
   4154        ['foo[]bar', 'italic', 'outdent', 'inserttext'],
   4155 
   4156        ['foo[]bar', 'strikethrough', 'inserttext'],
   4157        ['foo[]bar', 'strikethrough', 'delete'],
   4158        ['foo[]bar', 'strikethrough', 'delete', 'inserttext'],
   4159        ['foo[]bar', 'strikethrough', 'formatblock'],
   4160        ['foo[]bar', 'strikethrough', 'formatblock', 'inserttext'],
   4161        ['foo[]bar', 'strikethrough', 'forwarddelete'],
   4162        ['foo[]bar', 'strikethrough', 'forwarddelete', 'inserttext'],
   4163        ['foo[]bar', 'strikethrough', 'indent'],
   4164        ['foo[]bar', 'strikethrough', 'indent', 'inserttext'],
   4165        ['foo[]bar', 'strikethrough', 'inserthorizontalrule'],
   4166        ['foo[]bar', 'strikethrough', 'inserthorizontalrule', 'inserttext'],
   4167        ['foo[]bar', 'strikethrough', 'inserthtml'],
   4168        ['foo[]bar', 'strikethrough', 'inserthtml', 'inserttext'],
   4169        ['foo[]bar', 'strikethrough', 'insertimage'],
   4170        ['foo[]bar', 'strikethrough', 'insertimage', 'inserttext'],
   4171        ['foo[]bar', 'strikethrough', 'insertlinebreak'],
   4172        ['foo[]bar', 'strikethrough', 'insertlinebreak', 'inserttext'],
   4173        ['foo[]bar', 'strikethrough', 'insertorderedlist'],
   4174        ['foo[]bar', 'strikethrough', 'insertorderedlist', 'inserttext'],
   4175        ['foo[]bar', 'strikethrough', 'insertparagraph'],
   4176        ['foo[]bar', 'strikethrough', 'insertparagraph', 'inserttext'],
   4177        ['foo[]bar', 'strikethrough', 'insertunorderedlist'],
   4178        ['foo[]bar', 'strikethrough', 'insertunorderedlist', 'inserttext'],
   4179        ['foo[]bar', 'strikethrough', 'justifycenter'],
   4180        ['foo[]bar', 'strikethrough', 'justifycenter', 'inserttext'],
   4181        ['foo[]bar', 'strikethrough', 'justifyfull'],
   4182        ['foo[]bar', 'strikethrough', 'justifyfull', 'inserttext'],
   4183        ['foo[]bar', 'strikethrough', 'justifyleft'],
   4184        ['foo[]bar', 'strikethrough', 'justifyleft', 'inserttext'],
   4185        ['foo[]bar', 'strikethrough', 'justifyright'],
   4186        ['foo[]bar', 'strikethrough', 'justifyright', 'inserttext'],
   4187        ['foo[]bar', 'strikethrough', 'outdent'],
   4188        ['foo[]bar', 'strikethrough', 'outdent', 'inserttext'],
   4189 
   4190        ['foo[]bar', 'subscript', 'inserttext'],
   4191        ['foo[]bar', 'subscript', 'delete'],
   4192        ['foo[]bar', 'subscript', 'delete', 'inserttext'],
   4193        ['foo[]bar', 'subscript', 'formatblock'],
   4194        ['foo[]bar', 'subscript', 'formatblock', 'inserttext'],
   4195        ['foo[]bar', 'subscript', 'forwarddelete'],
   4196        ['foo[]bar', 'subscript', 'forwarddelete', 'inserttext'],
   4197        ['foo[]bar', 'subscript', 'indent'],
   4198        ['foo[]bar', 'subscript', 'indent', 'inserttext'],
   4199        ['foo[]bar', 'subscript', 'inserthorizontalrule'],
   4200        ['foo[]bar', 'subscript', 'inserthorizontalrule', 'inserttext'],
   4201        ['foo[]bar', 'subscript', 'inserthtml'],
   4202        ['foo[]bar', 'subscript', 'inserthtml', 'inserttext'],
   4203        ['foo[]bar', 'subscript', 'insertimage'],
   4204        ['foo[]bar', 'subscript', 'insertimage', 'inserttext'],
   4205        ['foo[]bar', 'subscript', 'insertlinebreak'],
   4206        ['foo[]bar', 'subscript', 'insertlinebreak', 'inserttext'],
   4207        ['foo[]bar', 'subscript', 'insertorderedlist'],
   4208        ['foo[]bar', 'subscript', 'insertorderedlist', 'inserttext'],
   4209        ['foo[]bar', 'subscript', 'insertparagraph'],
   4210        ['foo[]bar', 'subscript', 'insertparagraph', 'inserttext'],
   4211        ['foo[]bar', 'subscript', 'insertunorderedlist'],
   4212        ['foo[]bar', 'subscript', 'insertunorderedlist', 'inserttext'],
   4213        ['foo[]bar', 'subscript', 'justifycenter'],
   4214        ['foo[]bar', 'subscript', 'justifycenter', 'inserttext'],
   4215        ['foo[]bar', 'subscript', 'justifyfull'],
   4216        ['foo[]bar', 'subscript', 'justifyfull', 'inserttext'],
   4217        ['foo[]bar', 'subscript', 'justifyleft'],
   4218        ['foo[]bar', 'subscript', 'justifyleft', 'inserttext'],
   4219        ['foo[]bar', 'subscript', 'justifyright'],
   4220        ['foo[]bar', 'subscript', 'justifyright', 'inserttext'],
   4221        ['foo[]bar', 'subscript', 'outdent'],
   4222        ['foo[]bar', 'subscript', 'outdent', 'inserttext'],
   4223 
   4224        ['foo[]bar', 'superscript', 'inserttext'],
   4225        ['foo[]bar', 'superscript', 'delete'],
   4226        ['foo[]bar', 'superscript', 'delete', 'inserttext'],
   4227        ['foo[]bar', 'superscript', 'formatblock'],
   4228        ['foo[]bar', 'superscript', 'formatblock', 'inserttext'],
   4229        ['foo[]bar', 'superscript', 'forwarddelete'],
   4230        ['foo[]bar', 'superscript', 'forwarddelete', 'inserttext'],
   4231        ['foo[]bar', 'superscript', 'indent'],
   4232        ['foo[]bar', 'superscript', 'indent', 'inserttext'],
   4233        ['foo[]bar', 'superscript', 'inserthorizontalrule'],
   4234        ['foo[]bar', 'superscript', 'inserthorizontalrule', 'inserttext'],
   4235        ['foo[]bar', 'superscript', 'inserthtml'],
   4236        ['foo[]bar', 'superscript', 'inserthtml', 'inserttext'],
   4237        ['foo[]bar', 'superscript', 'insertimage'],
   4238        ['foo[]bar', 'superscript', 'insertimage', 'inserttext'],
   4239        ['foo[]bar', 'superscript', 'insertlinebreak'],
   4240        ['foo[]bar', 'superscript', 'insertlinebreak', 'inserttext'],
   4241        ['foo[]bar', 'superscript', 'insertorderedlist'],
   4242        ['foo[]bar', 'superscript', 'insertorderedlist', 'inserttext'],
   4243        ['foo[]bar', 'superscript', 'insertparagraph'],
   4244        ['foo[]bar', 'superscript', 'insertparagraph', 'inserttext'],
   4245        ['foo[]bar', 'superscript', 'insertunorderedlist'],
   4246        ['foo[]bar', 'superscript', 'insertunorderedlist', 'inserttext'],
   4247        ['foo[]bar', 'superscript', 'justifycenter'],
   4248        ['foo[]bar', 'superscript', 'justifycenter', 'inserttext'],
   4249        ['foo[]bar', 'superscript', 'justifyfull'],
   4250        ['foo[]bar', 'superscript', 'justifyfull', 'inserttext'],
   4251        ['foo[]bar', 'superscript', 'justifyleft'],
   4252        ['foo[]bar', 'superscript', 'justifyleft', 'inserttext'],
   4253        ['foo[]bar', 'superscript', 'justifyright'],
   4254        ['foo[]bar', 'superscript', 'justifyright', 'inserttext'],
   4255        ['foo[]bar', 'superscript', 'outdent'],
   4256        ['foo[]bar', 'superscript', 'outdent', 'inserttext'],
   4257 
   4258        ['foo[]bar', 'underline', 'inserttext'],
   4259        ['foo[]bar', 'underline', 'delete'],
   4260        ['foo[]bar', 'underline', 'delete', 'inserttext'],
   4261        ['foo[]bar', 'underline', 'formatblock'],
   4262        ['foo[]bar', 'underline', 'formatblock', 'inserttext'],
   4263        ['foo[]bar', 'underline', 'forwarddelete'],
   4264        ['foo[]bar', 'underline', 'forwarddelete', 'inserttext'],
   4265        ['foo[]bar', 'underline', 'indent'],
   4266        ['foo[]bar', 'underline', 'indent', 'inserttext'],
   4267        ['foo[]bar', 'underline', 'inserthorizontalrule'],
   4268        ['foo[]bar', 'underline', 'inserthorizontalrule', 'inserttext'],
   4269        ['foo[]bar', 'underline', 'inserthtml'],
   4270        ['foo[]bar', 'underline', 'inserthtml', 'inserttext'],
   4271        ['foo[]bar', 'underline', 'insertimage'],
   4272        ['foo[]bar', 'underline', 'insertimage', 'inserttext'],
   4273        ['foo[]bar', 'underline', 'insertlinebreak'],
   4274        ['foo[]bar', 'underline', 'insertlinebreak', 'inserttext'],
   4275        ['foo[]bar', 'underline', 'insertorderedlist'],
   4276        ['foo[]bar', 'underline', 'insertorderedlist', 'inserttext'],
   4277        ['foo[]bar', 'underline', 'insertparagraph'],
   4278        ['foo[]bar', 'underline', 'insertparagraph', 'inserttext'],
   4279        ['foo[]bar', 'underline', 'insertunorderedlist'],
   4280        ['foo[]bar', 'underline', 'insertunorderedlist', 'inserttext'],
   4281        ['foo[]bar', 'underline', 'justifycenter'],
   4282        ['foo[]bar', 'underline', 'justifycenter', 'inserttext'],
   4283        ['foo[]bar', 'underline', 'justifyfull'],
   4284        ['foo[]bar', 'underline', 'justifyfull', 'inserttext'],
   4285        ['foo[]bar', 'underline', 'justifyleft'],
   4286        ['foo[]bar', 'underline', 'justifyleft', 'inserttext'],
   4287        ['foo[]bar', 'underline', 'justifyright'],
   4288        ['foo[]bar', 'underline', 'justifyright', 'inserttext'],
   4289        ['foo[]bar', 'underline', 'outdent'],
   4290        ['foo[]bar', 'underline', 'outdent', 'inserttext'],
   4291 
   4292        // Insertion-affecting value.  Test that insertText works right, and
   4293        // test that various block commands preserve (or don't preserve) the
   4294        // value.
   4295        ['foo[]bar', 'backcolor', 'inserttext'],
   4296        ['foo[]bar', 'backcolor', 'delete'],
   4297        ['foo[]bar', 'backcolor', 'delete', 'inserttext'],
   4298        ['foo[]bar', 'backcolor', 'formatblock'],
   4299        ['foo[]bar', 'backcolor', 'formatblock', 'inserttext'],
   4300        ['foo[]bar', 'backcolor', 'forwarddelete'],
   4301        ['foo[]bar', 'backcolor', 'forwarddelete', 'inserttext'],
   4302        ['foo[]bar', 'backcolor', 'indent'],
   4303        ['foo[]bar', 'backcolor', 'indent', 'inserttext'],
   4304        ['foo[]bar', 'backcolor', 'inserthorizontalrule'],
   4305        ['foo[]bar', 'backcolor', 'inserthorizontalrule', 'inserttext'],
   4306        ['foo[]bar', 'backcolor', 'inserthtml'],
   4307        ['foo[]bar', 'backcolor', 'inserthtml', 'inserttext'],
   4308        ['foo[]bar', 'backcolor', 'insertimage'],
   4309        ['foo[]bar', 'backcolor', 'insertimage', 'inserttext'],
   4310        ['foo[]bar', 'backcolor', 'insertlinebreak'],
   4311        ['foo[]bar', 'backcolor', 'insertlinebreak', 'inserttext'],
   4312        ['foo[]bar', 'backcolor', 'insertorderedlist'],
   4313        ['foo[]bar', 'backcolor', 'insertorderedlist', 'inserttext'],
   4314        ['foo[]bar', 'backcolor', 'insertparagraph'],
   4315        ['foo[]bar', 'backcolor', 'insertparagraph', 'inserttext'],
   4316        ['foo[]bar', 'backcolor', 'insertunorderedlist'],
   4317        ['foo[]bar', 'backcolor', 'insertunorderedlist', 'inserttext'],
   4318        ['foo[]bar', 'backcolor', 'justifycenter'],
   4319        ['foo[]bar', 'backcolor', 'justifycenter', 'inserttext'],
   4320        ['foo[]bar', 'backcolor', 'justifyfull'],
   4321        ['foo[]bar', 'backcolor', 'justifyfull', 'inserttext'],
   4322        ['foo[]bar', 'backcolor', 'justifyleft'],
   4323        ['foo[]bar', 'backcolor', 'justifyleft', 'inserttext'],
   4324        ['foo[]bar', 'backcolor', 'justifyright'],
   4325        ['foo[]bar', 'backcolor', 'justifyright', 'inserttext'],
   4326        ['foo[]bar', 'backcolor', 'outdent'],
   4327        ['foo[]bar', 'backcolor', 'outdent', 'inserttext'],
   4328 
   4329        ['foo[]bar', 'createlink', 'inserttext'],
   4330        ['foo[]bar', 'createlink', 'delete'],
   4331        ['foo[]bar', 'createlink', 'delete', 'inserttext'],
   4332        ['foo[]bar', 'createlink', 'formatblock'],
   4333        ['foo[]bar', 'createlink', 'formatblock', 'inserttext'],
   4334        ['foo[]bar', 'createlink', 'forwarddelete'],
   4335        ['foo[]bar', 'createlink', 'forwarddelete', 'inserttext'],
   4336        ['foo[]bar', 'createlink', 'indent'],
   4337        ['foo[]bar', 'createlink', 'indent', 'inserttext'],
   4338        ['foo[]bar', 'createlink', 'inserthorizontalrule'],
   4339        ['foo[]bar', 'createlink', 'inserthorizontalrule', 'inserttext'],
   4340        ['foo[]bar', 'createlink', 'inserthtml'],
   4341        ['foo[]bar', 'createlink', 'inserthtml', 'inserttext'],
   4342        ['foo[]bar', 'createlink', 'insertimage'],
   4343        ['foo[]bar', 'createlink', 'insertimage', 'inserttext'],
   4344        ['foo[]bar', 'createlink', 'insertlinebreak'],
   4345        ['foo[]bar', 'createlink', 'insertlinebreak', 'inserttext'],
   4346        ['foo[]bar', 'createlink', 'insertorderedlist'],
   4347        ['foo[]bar', 'createlink', 'insertorderedlist', 'inserttext'],
   4348        ['foo[]bar', 'createlink', 'insertparagraph'],
   4349        ['foo[]bar', 'createlink', 'insertparagraph', 'inserttext'],
   4350        ['foo[]bar', 'createlink', 'insertunorderedlist'],
   4351        ['foo[]bar', 'createlink', 'insertunorderedlist', 'inserttext'],
   4352        ['foo[]bar', 'createlink', 'justifycenter'],
   4353        ['foo[]bar', 'createlink', 'justifycenter', 'inserttext'],
   4354        ['foo[]bar', 'createlink', 'justifyfull'],
   4355        ['foo[]bar', 'createlink', 'justifyfull', 'inserttext'],
   4356        ['foo[]bar', 'createlink', 'justifyleft'],
   4357        ['foo[]bar', 'createlink', 'justifyleft', 'inserttext'],
   4358        ['foo[]bar', 'createlink', 'justifyright'],
   4359        ['foo[]bar', 'createlink', 'justifyright', 'inserttext'],
   4360        ['foo[]bar', 'createlink', 'outdent'],
   4361        ['foo[]bar', 'createlink', 'outdent', 'inserttext'],
   4362 
   4363        ['foo[]bar', 'fontname', 'inserttext'],
   4364        ['foo[]bar', 'fontname', 'delete'],
   4365        ['foo[]bar', 'fontname', 'delete', 'inserttext'],
   4366        ['foo[]bar', 'fontname', 'formatblock'],
   4367        ['foo[]bar', 'fontname', 'formatblock', 'inserttext'],
   4368        ['foo[]bar', 'fontname', 'forwarddelete'],
   4369        ['foo[]bar', 'fontname', 'forwarddelete', 'inserttext'],
   4370        ['foo[]bar', 'fontname', 'indent'],
   4371        ['foo[]bar', 'fontname', 'indent', 'inserttext'],
   4372        ['foo[]bar', 'fontname', 'inserthorizontalrule'],
   4373        ['foo[]bar', 'fontname', 'inserthorizontalrule', 'inserttext'],
   4374        ['foo[]bar', 'fontname', 'inserthtml'],
   4375        ['foo[]bar', 'fontname', 'inserthtml', 'inserttext'],
   4376        ['foo[]bar', 'fontname', 'insertimage'],
   4377        ['foo[]bar', 'fontname', 'insertimage', 'inserttext'],
   4378        ['foo[]bar', 'fontname', 'insertlinebreak'],
   4379        ['foo[]bar', 'fontname', 'insertlinebreak', 'inserttext'],
   4380        ['foo[]bar', 'fontname', 'insertorderedlist'],
   4381        ['foo[]bar', 'fontname', 'insertorderedlist', 'inserttext'],
   4382        ['foo[]bar', 'fontname', 'insertparagraph'],
   4383        ['foo[]bar', 'fontname', 'insertparagraph', 'inserttext'],
   4384        ['foo[]bar', 'fontname', 'insertunorderedlist'],
   4385        ['foo[]bar', 'fontname', 'insertunorderedlist', 'inserttext'],
   4386        ['foo[]bar', 'fontname', 'justifycenter'],
   4387        ['foo[]bar', 'fontname', 'justifycenter', 'inserttext'],
   4388        ['foo[]bar', 'fontname', 'justifyfull'],
   4389        ['foo[]bar', 'fontname', 'justifyfull', 'inserttext'],
   4390        ['foo[]bar', 'fontname', 'justifyleft'],
   4391        ['foo[]bar', 'fontname', 'justifyleft', 'inserttext'],
   4392        ['foo[]bar', 'fontname', 'justifyright'],
   4393        ['foo[]bar', 'fontname', 'justifyright', 'inserttext'],
   4394        ['foo[]bar', 'fontname', 'outdent'],
   4395        ['foo[]bar', 'fontname', 'outdent', 'inserttext'],
   4396 
   4397        ['foo[]bar', 'fontsize', 'inserttext'],
   4398        ['foo[]bar', 'fontsize', 'delete'],
   4399        ['foo[]bar', 'fontsize', 'delete', 'inserttext'],
   4400        ['foo[]bar', 'fontsize', 'formatblock'],
   4401        ['foo[]bar', 'fontsize', 'formatblock', 'inserttext'],
   4402        ['foo[]bar', 'fontsize', 'forwarddelete'],
   4403        ['foo[]bar', 'fontsize', 'forwarddelete', 'inserttext'],
   4404        ['foo[]bar', 'fontsize', 'indent'],
   4405        ['foo[]bar', 'fontsize', 'indent', 'inserttext'],
   4406        ['foo[]bar', 'fontsize', 'inserthorizontalrule'],
   4407        ['foo[]bar', 'fontsize', 'inserthorizontalrule', 'inserttext'],
   4408        ['foo[]bar', 'fontsize', 'inserthtml'],
   4409        ['foo[]bar', 'fontsize', 'inserthtml', 'inserttext'],
   4410        ['foo[]bar', 'fontsize', 'insertimage'],
   4411        ['foo[]bar', 'fontsize', 'insertimage', 'inserttext'],
   4412        ['foo[]bar', 'fontsize', 'insertlinebreak'],
   4413        ['foo[]bar', 'fontsize', 'insertlinebreak', 'inserttext'],
   4414        ['foo[]bar', 'fontsize', 'insertorderedlist'],
   4415        ['foo[]bar', 'fontsize', 'insertorderedlist', 'inserttext'],
   4416        ['foo[]bar', 'fontsize', 'insertparagraph'],
   4417        ['foo[]bar', 'fontsize', 'insertparagraph', 'inserttext'],
   4418        ['foo[]bar', 'fontsize', 'insertunorderedlist'],
   4419        ['foo[]bar', 'fontsize', 'insertunorderedlist', 'inserttext'],
   4420        ['foo[]bar', 'fontsize', 'justifycenter'],
   4421        ['foo[]bar', 'fontsize', 'justifycenter', 'inserttext'],
   4422        ['foo[]bar', 'fontsize', 'justifyfull'],
   4423        ['foo[]bar', 'fontsize', 'justifyfull', 'inserttext'],
   4424        ['foo[]bar', 'fontsize', 'justifyleft'],
   4425        ['foo[]bar', 'fontsize', 'justifyleft', 'inserttext'],
   4426        ['foo[]bar', 'fontsize', 'justifyright'],
   4427        ['foo[]bar', 'fontsize', 'justifyright', 'inserttext'],
   4428        ['foo[]bar', 'fontsize', 'outdent'],
   4429        ['foo[]bar', 'fontsize', 'outdent', 'inserttext'],
   4430 
   4431        ['foo[]bar', 'forecolor', 'inserttext'],
   4432        ['foo[]bar', 'forecolor', 'delete'],
   4433        ['foo[]bar', 'forecolor', 'delete', 'inserttext'],
   4434        ['foo[]bar', 'forecolor', 'formatblock'],
   4435        ['foo[]bar', 'forecolor', 'formatblock', 'inserttext'],
   4436        ['foo[]bar', 'forecolor', 'forwarddelete'],
   4437        ['foo[]bar', 'forecolor', 'forwarddelete', 'inserttext'],
   4438        ['foo[]bar', 'forecolor', 'indent'],
   4439        ['foo[]bar', 'forecolor', 'indent', 'inserttext'],
   4440        ['foo[]bar', 'forecolor', 'inserthorizontalrule'],
   4441        ['foo[]bar', 'forecolor', 'inserthorizontalrule', 'inserttext'],
   4442        ['foo[]bar', 'forecolor', 'inserthtml'],
   4443        ['foo[]bar', 'forecolor', 'inserthtml', 'inserttext'],
   4444        ['foo[]bar', 'forecolor', 'insertimage'],
   4445        ['foo[]bar', 'forecolor', 'insertimage', 'inserttext'],
   4446        ['foo[]bar', 'forecolor', 'insertlinebreak'],
   4447        ['foo[]bar', 'forecolor', 'insertlinebreak', 'inserttext'],
   4448        ['foo[]bar', 'forecolor', 'insertorderedlist'],
   4449        ['foo[]bar', 'forecolor', 'insertorderedlist', 'inserttext'],
   4450        ['foo[]bar', 'forecolor', 'insertparagraph'],
   4451        ['foo[]bar', 'forecolor', 'insertparagraph', 'inserttext'],
   4452        ['foo[]bar', 'forecolor', 'insertunorderedlist'],
   4453        ['foo[]bar', 'forecolor', 'insertunorderedlist', 'inserttext'],
   4454        ['foo[]bar', 'forecolor', 'justifycenter'],
   4455        ['foo[]bar', 'forecolor', 'justifycenter', 'inserttext'],
   4456        ['foo[]bar', 'forecolor', 'justifyfull'],
   4457        ['foo[]bar', 'forecolor', 'justifyfull', 'inserttext'],
   4458        ['foo[]bar', 'forecolor', 'justifyleft'],
   4459        ['foo[]bar', 'forecolor', 'justifyleft', 'inserttext'],
   4460        ['foo[]bar', 'forecolor', 'justifyright'],
   4461        ['foo[]bar', 'forecolor', 'justifyright', 'inserttext'],
   4462        ['foo[]bar', 'forecolor', 'outdent'],
   4463        ['foo[]bar', 'forecolor', 'outdent', 'inserttext'],
   4464 
   4465        ['foo[]bar', 'hilitecolor', 'inserttext'],
   4466        ['foo[]bar', 'hilitecolor', 'delete'],
   4467        ['foo[]bar', 'hilitecolor', 'delete', 'inserttext'],
   4468        ['foo[]bar', 'hilitecolor', 'formatblock'],
   4469        ['foo[]bar', 'hilitecolor', 'formatblock', 'inserttext'],
   4470        ['foo[]bar', 'hilitecolor', 'forwarddelete'],
   4471        ['foo[]bar', 'hilitecolor', 'forwarddelete', 'inserttext'],
   4472        ['foo[]bar', 'hilitecolor', 'indent'],
   4473        ['foo[]bar', 'hilitecolor', 'indent', 'inserttext'],
   4474        ['foo[]bar', 'hilitecolor', 'inserthorizontalrule'],
   4475        ['foo[]bar', 'hilitecolor', 'inserthorizontalrule', 'inserttext'],
   4476        ['foo[]bar', 'hilitecolor', 'inserthtml'],
   4477        ['foo[]bar', 'hilitecolor', 'inserthtml', 'inserttext'],
   4478        ['foo[]bar', 'hilitecolor', 'insertimage'],
   4479        ['foo[]bar', 'hilitecolor', 'insertimage', 'inserttext'],
   4480        ['foo[]bar', 'hilitecolor', 'insertlinebreak'],
   4481        ['foo[]bar', 'hilitecolor', 'insertlinebreak', 'inserttext'],
   4482        ['foo[]bar', 'hilitecolor', 'insertorderedlist'],
   4483        ['foo[]bar', 'hilitecolor', 'insertorderedlist', 'inserttext'],
   4484        ['foo[]bar', 'hilitecolor', 'insertparagraph'],
   4485        ['foo[]bar', 'hilitecolor', 'insertparagraph', 'inserttext'],
   4486        ['foo[]bar', 'hilitecolor', 'insertunorderedlist'],
   4487        ['foo[]bar', 'hilitecolor', 'insertunorderedlist', 'inserttext'],
   4488        ['foo[]bar', 'hilitecolor', 'justifycenter'],
   4489        ['foo[]bar', 'hilitecolor', 'justifycenter', 'inserttext'],
   4490        ['foo[]bar', 'hilitecolor', 'justifyfull'],
   4491        ['foo[]bar', 'hilitecolor', 'justifyfull', 'inserttext'],
   4492        ['foo[]bar', 'hilitecolor', 'justifyleft'],
   4493        ['foo[]bar', 'hilitecolor', 'justifyleft', 'inserttext'],
   4494        ['foo[]bar', 'hilitecolor', 'justifyright'],
   4495        ['foo[]bar', 'hilitecolor', 'justifyright', 'inserttext'],
   4496        ['foo[]bar', 'hilitecolor', 'outdent'],
   4497        ['foo[]bar', 'hilitecolor', 'outdent', 'inserttext'],
   4498 
   4499        // Test things that interfere with each other
   4500        ['foo[]bar', 'superscript', 'subscript', 'inserttext'],
   4501        ['foo[]bar', 'subscript', 'superscript', 'inserttext'],
   4502 
   4503        ['foo[]bar', 'createlink', ['forecolor', '#0000FF'], 'inserttext'],
   4504        ['foo[]bar', ['forecolor', '#0000FF'], 'createlink', 'inserttext'],
   4505        ['foo[]bar', 'createlink', ['forecolor', 'blue'], 'inserttext'],
   4506        ['foo[]bar', ['forecolor', 'blue'], 'createlink', 'inserttext'],
   4507        ['foo[]bar', 'createlink', ['forecolor', 'brown'], 'inserttext'],
   4508        ['foo[]bar', ['forecolor', 'brown'], 'createlink', 'inserttext'],
   4509        ['foo[]bar', 'createlink', ['forecolor', 'black'], 'inserttext'],
   4510        ['foo[]bar', ['forecolor', 'black'], 'createlink', 'inserttext'],
   4511        ['foo[]bar', 'createlink', 'underline', 'inserttext'],
   4512        ['foo[]bar', 'underline', 'createlink', 'inserttext'],
   4513        ['foo[]bar', 'createlink', 'underline', 'underline', 'inserttext'],
   4514        ['foo[]bar', 'underline', 'underline', 'createlink', 'inserttext'],
   4515 
   4516        ['foo[]bar', 'subscript', ['fontsize', '2'], 'inserttext'],
   4517        ['foo[]bar', ['fontsize', '2'], 'subscript', 'inserttext'],
   4518        ['foo[]bar', 'subscript', ['fontsize', '3'], 'inserttext'],
   4519        ['foo[]bar', ['fontsize', '3'], 'subscript', 'inserttext'],
   4520 
   4521        ['foo[]bar', ['hilitecolor', 'aqua'], ['backcolor', 'tan'], 'inserttext'],
   4522        ['foo[]bar', ['backcolor', 'tan'], ['hilitecolor', 'aqua'], 'inserttext'],
   4523 
   4524 
   4525        // The following are all just inserttext tests that we took from there,
   4526        // but we first backspace the selected text instead of letting
   4527        // inserttext handle it.  This tests that deletion correctly sets
   4528        // overrides.
   4529        ['foo<b>[bar]</b>baz', 'delete', 'inserttext'],
   4530        ['foo<i>[bar]</i>baz', 'delete', 'inserttext'],
   4531        ['foo<s>[bar]</s>baz', 'delete', 'inserttext'],
   4532        ['foo<sub>[bar]</sub>baz', 'delete', 'inserttext'],
   4533        ['foo<sup>[bar]</sup>baz', 'delete', 'inserttext'],
   4534        ['foo<u>[bar]</u>baz', 'delete', 'inserttext'],
   4535        ['foo<a href=http://www.google.com>[bar]</a>baz', 'delete', 'inserttext'],
   4536        ['foo<font face=sans-serif>[bar]</font>baz', 'delete', 'inserttext'],
   4537        ['foo<font size=4>[bar]</font>baz', 'delete', 'inserttext'],
   4538        ['foo<font color=#0000FF>[bar]</font>baz', 'delete', 'inserttext'],
   4539        ['foo<span style=background-color:#00FFFF>[bar]</span>baz', 'delete', 'inserttext'],
   4540        ['foo<a href=http://www.google.com><font color=blue>[bar]</font></a>baz', 'delete', 'inserttext'],
   4541        ['foo<font color=blue><a href=http://www.google.com>[bar]</a></font>baz', 'delete', 'inserttext'],
   4542        ['foo<a href=http://www.google.com><font color=brown>[bar]</font></a>baz', 'delete', 'inserttext'],
   4543        ['foo<font color=brown><a href=http://www.google.com>[bar]</a></font>baz', 'delete', 'inserttext'],
   4544        ['foo<a href=http://www.google.com><font color=black>[bar]</font></a>baz', 'delete', 'inserttext'],
   4545        ['foo<a href=http://www.google.com><u>[bar]</u></a>baz', 'delete', 'inserttext'],
   4546        ['foo<u><a href=http://www.google.com>[bar]</a></u>baz', 'delete', 'inserttext'],
   4547        ['foo<sub><font size=2>[bar]</font></sub>baz', 'delete', 'inserttext'],
   4548        ['foo<font size=2><sub>[bar]</sub></font>baz', 'delete', 'inserttext'],
   4549        ['foo<sub><font size=3>[bar]</font></sub>baz', 'delete', 'inserttext'],
   4550        ['foo<font size=3><sub>[bar]</sub></font>baz', 'delete', 'inserttext'],
   4551 
   4552        // Now repeat but with different selections.
   4553        ['[foo<b>bar]</b>baz', 'delete', 'inserttext'],
   4554        ['[foo<i>bar]</i>baz', 'delete', 'inserttext'],
   4555        ['[foo<s>bar]</s>baz', 'delete', 'inserttext'],
   4556        ['[foo<sub>bar]</sub>baz', 'delete', 'inserttext'],
   4557        ['[foo<sup>bar]</sup>baz', 'delete', 'inserttext'],
   4558        ['[foo<u>bar]</u>baz', 'delete', 'inserttext'],
   4559        ['[foo<a href=http://www.google.com>bar]</a>baz', 'delete', 'inserttext'],
   4560        ['[foo<font face=sans-serif>bar]</font>baz', 'delete', 'inserttext'],
   4561        ['[foo<font size=4>bar]</font>baz', 'delete', 'inserttext'],
   4562        ['[foo<font color=#0000FF>bar]</font>baz', 'delete', 'inserttext'],
   4563        ['[foo<span style=background-color:#00FFFF>bar]</span>baz', 'delete', 'inserttext'],
   4564        ['[foo<a href=http://www.google.com><font color=blue>bar]</font></a>baz', 'delete', 'inserttext'],
   4565        ['[foo<font color=blue><a href=http://www.google.com>bar]</a></font>baz', 'delete', 'inserttext'],
   4566        ['[foo<a href=http://www.google.com><font color=brown>bar]</font></a>baz', 'delete', 'inserttext'],
   4567        ['[foo<font color=brown><a href=http://www.google.com>bar]</a></font>baz', 'delete', 'inserttext'],
   4568        ['[foo<a href=http://www.google.com><font color=black>bar]</font></a>baz', 'delete', 'inserttext'],
   4569        ['[foo<a href=http://www.google.com><u>bar]</u></a>baz', 'delete', 'inserttext'],
   4570        ['[foo<u><a href=http://www.google.com>bar]</a></u>baz', 'delete', 'inserttext'],
   4571        ['[foo<sub><font size=2>bar]</font></sub>baz', 'delete', 'inserttext'],
   4572        ['[foo<font size=2><sub>bar]</sub></font>baz', 'delete', 'inserttext'],
   4573        ['[foo<sub><font size=3>bar]</font></sub>baz', 'delete', 'inserttext'],
   4574        ['[foo<font size=3><sub>bar]</sub></font>baz', 'delete', 'inserttext'],
   4575 
   4576        ['foo<b>[bar</b>baz]', 'delete', 'inserttext'],
   4577        ['foo<i>[bar</i>baz]', 'delete', 'inserttext'],
   4578        ['foo<s>[bar</s>baz]', 'delete', 'inserttext'],
   4579        ['foo<sub>[bar</sub>baz]', 'delete', 'inserttext'],
   4580        ['foo<sup>[bar</sup>baz]', 'delete', 'inserttext'],
   4581        ['foo<u>[bar</u>baz]', 'delete', 'inserttext'],
   4582        ['foo<a href=http://www.google.com>[bar</a>baz]', 'delete', 'inserttext'],
   4583        ['foo<font face=sans-serif>[bar</font>baz]', 'delete', 'inserttext'],
   4584        ['foo<font size=4>[bar</font>baz]', 'delete', 'inserttext'],
   4585        ['foo<font color=#0000FF>[bar</font>baz]', 'delete', 'inserttext'],
   4586        ['foo<span style=background-color:#00FFFF>[bar</span>baz]', 'delete', 'inserttext'],
   4587        ['foo<a href=http://www.google.com><font color=blue>[bar</font></a>baz]', 'delete', 'inserttext'],
   4588        ['foo<font color=blue><a href=http://www.google.com>[bar</a></font>baz]', 'delete', 'inserttext'],
   4589        ['foo<a href=http://www.google.com><font color=brown>[bar</font></a>baz]', 'delete', 'inserttext'],
   4590        ['foo<font color=brown><a href=http://www.google.com>[bar</a></font>baz]', 'delete', 'inserttext'],
   4591        ['foo<a href=http://www.google.com><font color=black>[bar</font></a>baz]', 'delete', 'inserttext'],
   4592        ['foo<a href=http://www.google.com><u>[bar</u></a>baz]', 'delete', 'inserttext'],
   4593        ['foo<u><a href=http://www.google.com>[bar</a></u>baz]', 'delete', 'inserttext'],
   4594        ['foo<sub><font size=2>[bar</font></sub>baz]', 'delete', 'inserttext'],
   4595        ['foo<font size=2><sub>[bar</sub></font>baz]', 'delete', 'inserttext'],
   4596        ['foo<sub><font size=3>[bar</font></sub>baz]', 'delete', 'inserttext'],
   4597        ['foo<font size=3><sub>[bar</sub></font>baz]', 'delete', 'inserttext'],
   4598 
   4599        // https://bugs.webkit.org/show_bug.cgi?id=19702
   4600        ['<blockquote><font color=blue>[foo]</font></blockquote>', 'delete', 'inserttext'],
   4601    ],
   4602    //@}
   4603 };
   4604 tests.backcolor = tests.hilitecolor;
   4605 tests.insertlinebreak = tests.insertparagraph;
   4606 
   4607 // Tests that start with "!" are believed to have bogus results and should be
   4608 // skipped until the relevant bugs are fixed.
   4609 var badTests = {};
   4610 (function(){
   4611    for (var command in tests) {
   4612        badTests[command] = [];
   4613        for (var i = 0; i < tests[command].length; i++) {
   4614            var test = tests[command][i];
   4615            if (typeof test == "string" && test[0] == "!") {
   4616                test = test.slice(1);
   4617                tests[command][i] = test;
   4618                badTests[command].push(test);
   4619            }
   4620            if (typeof test == "object" && test[0][0] == "!") {
   4621                test = [test[0].slice(1)].concat(test.slice(1));
   4622                tests[command][i] = test;
   4623                badTests[command].push(test);
   4624            }
   4625        }
   4626    }
   4627 })();
   4628 
   4629 var defaultValues = {
   4630 //@{
   4631    backcolor: "#00FFFF",
   4632    createlink: "http://www.google.com/",
   4633    fontname: "sans-serif",
   4634    fontsize: "4",
   4635    forecolor: "#0000FF",
   4636    formatblock: "<div>",
   4637    hilitecolor: "#00FFFF",
   4638    inserthorizontalrule: "",
   4639    inserthtml: "ab<b>c</b>d",
   4640    insertimage: "/img/lion.svg",
   4641    inserttext: "a",
   4642    defaultparagraphseparator: "div",
   4643    stylewithcss: "true",
   4644    usecss: "true",
   4645 };
   4646 //@}
   4647 
   4648 var notes = {
   4649 //@{
   4650    fontname: 'Note that the body\'s font-family is "serif".',
   4651 };
   4652 //@}
   4653 
   4654 var doubleTestingCommands = [
   4655 //@{
   4656    "backcolor",
   4657    "bold",
   4658    "fontname",
   4659    "fontsize",
   4660    "forecolor",
   4661    "italic",
   4662    "justifycenter",
   4663    "justifyfull",
   4664    "justifyleft",
   4665    "justifyright",
   4666    "strikethrough",
   4667    "stylewithcss",
   4668    "subscript",
   4669    "superscript",
   4670    "underline",
   4671    "usecss",
   4672 ];
   4673 //@}
   4674 
   4675 function prettyPrint(value) {
   4676 //@{
   4677    // Partly stolen from testharness.js
   4678    if (typeof value != "string") {
   4679        return String(value);
   4680    }
   4681 
   4682    value = value.replace(/\\/g, "\\\\")
   4683        .replace(/"/g, '\\"');
   4684 
   4685    for (var i = 0; i < 32; i++) {
   4686        var replace = "\\";
   4687        switch (i) {
   4688        case 0: replace += "0"; break;
   4689        case 1: replace += "x01"; break;
   4690        case 2: replace += "x02"; break;
   4691        case 3: replace += "x03"; break;
   4692        case 4: replace += "x04"; break;
   4693        case 5: replace += "x05"; break;
   4694        case 6: replace += "x06"; break;
   4695        case 7: replace += "x07"; break;
   4696        case 8: replace += "b"; break;
   4697        case 9: replace += "t"; break;
   4698        case 10: replace += "n"; break;
   4699        case 11: replace += "v"; break;
   4700        case 12: replace += "f"; break;
   4701        case 13: replace += "r"; break;
   4702        case 14: replace += "x0e"; break;
   4703        case 15: replace += "x0f"; break;
   4704        case 16: replace += "x10"; break;
   4705        case 17: replace += "x11"; break;
   4706        case 18: replace += "x12"; break;
   4707        case 19: replace += "x13"; break;
   4708        case 20: replace += "x14"; break;
   4709        case 21: replace += "x15"; break;
   4710        case 22: replace += "x16"; break;
   4711        case 23: replace += "x17"; break;
   4712        case 24: replace += "x18"; break;
   4713        case 25: replace += "x19"; break;
   4714        case 26: replace += "x1a"; break;
   4715        case 27: replace += "x1b"; break;
   4716        case 28: replace += "x1c"; break;
   4717        case 29: replace += "x1d"; break;
   4718        case 30: replace += "x1e"; break;
   4719        case 31: replace += "x1f"; break;
   4720        }
   4721        value = value.replace(new RegExp(String.fromCharCode(i), "g"), replace);
   4722    }
   4723    return '"' + value + '"';
   4724 }
   4725 //@}
   4726 
   4727 function doSetup(selector, idx) {
   4728 //@{
   4729    var table = document.querySelectorAll(selector)[idx];
   4730 
   4731    var tr = document.createElement("tr");
   4732    table.firstChild.appendChild(tr);
   4733    tr.className = (tr.className + " active").trim();
   4734 
   4735    return tr;
   4736 }
   4737 //@}
   4738 
   4739 function queryOutputHelper(beforeIndeterm, beforeState, beforeValue,
   4740                           afterIndeterm, afterState, afterValue,
   4741                           command, value) {
   4742 //@{
   4743    var frag = document.createDocumentFragment();
   4744    var beforeDiv = document.createElement("div");
   4745    var afterDiv = document.createElement("div");
   4746    frag.appendChild(beforeDiv);
   4747    frag.appendChild(afterDiv);
   4748    beforeDiv.className = afterDiv.className = "extra-results";
   4749    beforeDiv.textContent = "Before: ";
   4750    afterDiv.textContent = "After: ";
   4751 
   4752    beforeDiv.appendChild(document.createElement("span"));
   4753    afterDiv.appendChild(document.createElement("span"));
   4754    if ("indeterm" in commands[command]) {
   4755        // We only know it has to be either true or false.
   4756        if (beforeIndeterm !== true && beforeIndeterm !== false) {
   4757            beforeDiv.lastChild.className = "bad-result";
   4758        }
   4759    } else {
   4760        // It always has to be false.
   4761        beforeDiv.lastChild.className = beforeIndeterm === false
   4762            ? "good-result"
   4763            : "bad-result";
   4764    }
   4765    // After running the command, indeterminate must always be false, except if
   4766    // it's an exception, or if it's insert*list and the state was true to
   4767    // begin with.  And we can't help strikethrough/underline.
   4768    if ((/^insert(un)?orderedlist$/.test(command) && beforeState)
   4769    || command == "strikethrough"
   4770    || command == "underline") {
   4771        if (afterIndeterm !== true && afterIndeterm !== false) {
   4772            afterDiv.lastChild.className = "bad-result";
   4773        }
   4774    } else {
   4775        afterDiv.lastChild.className =
   4776            afterIndeterm === false
   4777                ? "good-result"
   4778                : "bad-result";
   4779    }
   4780    beforeDiv.lastChild.textContent = "indeterm " + prettyPrint(beforeIndeterm);
   4781    afterDiv.lastChild.textContent = "indeterm " + prettyPrint(afterIndeterm);
   4782 
   4783    beforeDiv.appendChild(document.createTextNode(", "));
   4784    afterDiv.appendChild(document.createTextNode(", "));
   4785 
   4786    beforeDiv.appendChild(document.createElement("span"));
   4787    afterDiv.appendChild(document.createElement("span"));
   4788    if (/^insert(un)?orderedlist$/.test(command)) {
   4789        // If the before state is true, the after state could be either true or
   4790        // false.  But if the before state is false, the after state has to be
   4791        // true.
   4792        if (beforeState !== true && beforeState !== false) {
   4793            beforeDiv.lastChild.className = "bad-result";
   4794        }
   4795        if (!beforeState) {
   4796            afterDiv.lastChild.className = afterState === true
   4797                ? "good-result"
   4798                : "bad-result";
   4799        } else if (afterState !== true && afterState !== false) {
   4800            afterDiv.lastChild.className = "bad-result";
   4801        }
   4802    } else if (/^justify(center|full|left|right)$/.test(command)) {
   4803        // We don't know about the before state, but the after state is always
   4804        // supposed to be true.
   4805        if (beforeState !== true && beforeState !== false) {
   4806            beforeDiv.lastChild.className = "bad-result";
   4807        }
   4808        afterDiv.lastChild.className = afterState === true
   4809            ? "good-result"
   4810            : "bad-result";
   4811    } else if (command == "strikethrough" || command == "underline") {
   4812        // The only thing we can say is the before/after states need to be
   4813        // either true or false.
   4814        if (beforeState !== true && beforeState !== false) {
   4815            beforeDiv.lastChild.className = "bad-result";
   4816        }
   4817        if (afterState !== true && afterState !== false) {
   4818            afterDiv.lastChild.className = "bad-result";
   4819        }
   4820    } else {
   4821        // The general rule is it must flip the state, unless there's no state
   4822        // defined, in which case it should always be false.
   4823        beforeDiv.lastChild.className =
   4824        afterDiv.lastChild.className =
   4825            ("state" in commands[command] && typeof beforeState == "boolean" && typeof afterState == "boolean" && beforeState === !afterState)
   4826            || (!("state" in commands[command]) && beforeState === false && afterState === false)
   4827                ? "good-result"
   4828                : "bad-result";
   4829    }
   4830    beforeDiv.lastChild.textContent = "state " + prettyPrint(beforeState);
   4831    afterDiv.lastChild.textContent = "state " + prettyPrint(afterState);
   4832 
   4833    beforeDiv.appendChild(document.createTextNode(", "));
   4834    afterDiv.appendChild(document.createTextNode(", "));
   4835 
   4836    beforeDiv.appendChild(document.createElement("span"));
   4837    afterDiv.appendChild(document.createElement("span"));
   4838 
   4839    // Direct equality comparison doesn't make sense in a bunch of cases.
   4840    if (command == "backcolor" || command == "forecolor" || command == "hilitecolor") {
   4841        if (/^([0-9a-fA-F]{3}){1,2}$/.test(value)) {
   4842            value = "#" + value;
   4843        }
   4844    } else if (command == "fontsize") {
   4845        value = normalizeFontSize(value);
   4846        if (value !== null) {
   4847            value = String(cssSizeToLegacy(value));
   4848        }
   4849    } else if (command == "formatblock") {
   4850        value = value.replace(/^<(.*)>$/, "$1").toLowerCase();
   4851    } else if (command == "defaultparagraphseparator") {
   4852        value = value.toLowerCase();
   4853        if (value != "p" && value != "div") {
   4854            value = "";
   4855        }
   4856    }
   4857 
   4858    if (((command == "backcolor" || command == "forecolor" || command == "hilitecolor") && value.toLowerCase() == "currentcolor")
   4859    || (command == "fontsize" && value === null)
   4860    || (command == "formatblock" && formattableBlockNames.indexOf(value.replace(/^<(.*)>$/, "$1").trim()) == -1)
   4861    || (command == "defaultparagraphseparator" && value == "")) {
   4862        afterDiv.lastChild.className = beforeValue === afterValue
   4863            ? "good-result"
   4864            : "bad-result";
   4865    } else if (/^justify(center|full|left|right)$/.test(command)) {
   4866        // We know there are only four correct values beforehand, and afterward
   4867        // the value has to be the one we set.
   4868        if (!/^(center|justify|left|right)$/.test(beforeValue)) {
   4869            beforeDiv.lastChild.className = "bad-result";
   4870        }
   4871        var expectedValue = command == "justifyfull"
   4872            ? "justify"
   4873            : command.replace("justify", "");
   4874        afterDiv.lastChild.className = afterValue === expectedValue
   4875            ? "good-result"
   4876            : "bad-result";
   4877    } else if (!("value" in commands[command])) {
   4878        // If it's not defined we want "".
   4879        beforeDiv.lastChild.className = beforeValue === ""
   4880            ? "good-result"
   4881            : "bad-result";
   4882        afterDiv.lastChild.className = afterValue === ""
   4883            ? "good-result"
   4884            : "bad-result";
   4885    } else {
   4886        // And in all other cases, the value afterwards has to be the one we
   4887        // set.
   4888        afterDiv.lastChild.className =
   4889            areEquivalentValues(command, afterValue, value)
   4890                ? "good-result"
   4891                : "bad-result";
   4892    }
   4893    beforeDiv.lastChild.textContent = "value " + prettyPrint(beforeValue);
   4894    afterDiv.lastChild.textContent = "value " + prettyPrint(afterValue);
   4895 
   4896    return frag;
   4897 }
   4898 //@}
   4899 
   4900 function normalizeTest(command, test, styleWithCss) {
   4901 //@{
   4902    // Our standard format for test processing is:
   4903    //   [input HTML,
   4904    //     [command1, value1, optional_name_mod],
   4905    //     [command2, value2, optional_name_mod], ...]
   4906    // Where `optional_name_mod` is an optionally-specified string used when
   4907    // generating test names (necessary to ensure uniqueness for command
   4908    // sequences that use the same command multiple times). This format is
   4909    // verbose, so we actually use three different formats in the tests and
   4910    // multiTests arrays:
   4911    //
   4912    // 1) Plain string giving the input HTML.  The command is implicit from the
   4913    // key of the tests array.  If the command takes values, the value is given
   4914    // by defaultValues, otherwise it's "".  Has to be converted to
   4915    // [input HTML, [command, value].
   4916    //
   4917    // 2) Two-element array [value, input HTML].  Has to be converted to
   4918    // [input HTML, [command, value]].
   4919    //
   4920    // 3) An element of multiTests.  This just has to have values filled in.
   4921    //
   4922    // Optionally, a styleWithCss argument can be passed, either true or false.
   4923    // If it is, we'll prepend a styleWithCss invocation.
   4924    if (command == "multitest") {
   4925        if (typeof test == "string") {
   4926            test = JSON.parse(test);
   4927        }
   4928        for (var i = 1; i < test.length; i++) {
   4929            if (typeof test[i] == "string"
   4930            && test[i] in defaultValues) {
   4931                test[i] = [test[i], defaultValues[test[i]]];
   4932            } else if (typeof test[i] == "string") {
   4933                test[i] = [test[i], ""];
   4934            }
   4935        }
   4936        return test;
   4937    }
   4938 
   4939    if (typeof test == "string") {
   4940        if (command in defaultValues) {
   4941            test = [test, [command, defaultValues[command]]];
   4942        } else {
   4943            test = [test, [command, ""]];
   4944        }
   4945    } else if (test.length == 2) {
   4946        test = [test[1], [command, String(test[0])]];
   4947    }
   4948 
   4949    if (styleWithCss !== undefined) {
   4950        test.splice(1, 0, ["stylewithcss", String(styleWithCss)]);
   4951    }
   4952 
   4953    return test;
   4954 }
   4955 //@}
   4956 
   4957 function doInputCell(tr, test, command) {
   4958 //@{
   4959    var testHtml = test[0];
   4960 
   4961    var msg = null;
   4962    if (command in defaultValues) {
   4963        // Single command with a value, possibly with a styleWithCss stuck
   4964        // before.  We don't need to specify the command itself, since this
   4965        // presumably isn't in multiTests, so the command is already given by
   4966        // the section header.
   4967        msg = 'value: ' + prettyPrint(test[test.length - 1][1]);
   4968    } else if (command == "multitest") {
   4969        // Uses a different input format
   4970        msg = JSON.stringify(test);
   4971    }
   4972    var inputCell = document.createElement("td");
   4973    inputCell.innerHTML = "<div></div><div></div>";
   4974    inputCell.firstChild.innerHTML = testHtml;
   4975    inputCell.lastChild.textContent = inputCell.firstChild.innerHTML;
   4976    if (msg !== null) {
   4977        inputCell.lastChild.textContent += " (" + msg + ")";
   4978    }
   4979 
   4980    tr.appendChild(inputCell);
   4981 }
   4982 //@}
   4983 
   4984 function doSpecCell(tr, test, command) {
   4985 //@{
   4986    var specCell = document.createElement("td");
   4987    tr.appendChild(specCell);
   4988    try {
   4989        var points = setupCell(specCell, test[0]);
   4990        var range = document.createRange();
   4991        range.setStart(points[0], points[1]);
   4992        range.setEnd(points[2], points[3]);
   4993        // The points might be backwards
   4994        if (range.collapsed) {
   4995            range.setEnd(points[0], points[1]);
   4996        }
   4997        specCell.firstChild.contentEditable = "true";
   4998        specCell.firstChild.spellcheck = false;
   4999 
   5000        if (command != "multitest") {
   5001            try { var beforeIndeterm = myQueryCommandIndeterm(command, range) }
   5002            catch(e) { beforeIndeterm = "Exception" }
   5003            try { var beforeState = myQueryCommandState(command, range) }
   5004            catch(e) { beforeState = "Exception" }
   5005            try { var beforeValue = myQueryCommandValue(command, range) }
   5006            catch(e) { beforeValue = "Exception" }
   5007        }
   5008 
   5009        for (var i = 1; i < test.length; i++) {
   5010            myExecCommand(test[i][0], false, test[i][1], range);
   5011        }
   5012 
   5013        if (command != "multitest") {
   5014            try { var afterIndeterm = myQueryCommandIndeterm(command, range) }
   5015            catch(e) { afterIndeterm = "Exception" }
   5016            try { var afterState = myQueryCommandState(command, range) }
   5017            catch(e) { afterState = "Exception" }
   5018            try { var afterValue = myQueryCommandValue(command, range) }
   5019            catch(e) { afterValue = "Exception" }
   5020        }
   5021 
   5022        specCell.firstChild.contentEditable = "inherit";
   5023        specCell.firstChild.removeAttribute("spellcheck");
   5024        var compareDiv1 = specCell.firstChild.cloneNode(true);
   5025 
   5026        // Now do various sanity checks, and throw if they're violated.  First
   5027        // just count children:
   5028        if (specCell.childNodes.length != 2) {
   5029            throw "The cell didn't have two children.  Did something spill outside the test div?";
   5030        }
   5031 
   5032        // Now verify that the DOM serializes.
   5033        compareDiv1.normalize();
   5034        var compareDiv2 = compareDiv1.cloneNode(false);
   5035        compareDiv2.innerHTML = compareDiv1.innerHTML;
   5036        // Oddly, IE9 sometimes produces two nodes that return true for
   5037        // isEqualNode but have different innerHTML (omitting closing tags vs.
   5038        // not).
   5039        if (!compareDiv1.isEqualNode(compareDiv2)
   5040        && compareDiv1.innerHTML != compareDiv2.innerHTML) {
   5041            throw "DOM does not round-trip through serialization!  "
   5042                + compareDiv1.innerHTML + " vs. " + compareDiv2.innerHTML;
   5043        }
   5044        if (!compareDiv1.isEqualNode(compareDiv2)) {
   5045            throw "DOM does not round-trip through serialization (although innerHTML is the same)!  "
   5046                + compareDiv1.innerHTML;
   5047        }
   5048 
   5049        // Check for attributes
   5050        if (specCell.firstChild.attributes.length) {
   5051            throw "Wrapper div has attributes!  " +
   5052                specCell.innerHTML.replace(/<div><\/div>$/, "");
   5053        }
   5054 
   5055        // Final sanity check: make sure everything isAllowedChild() of its
   5056        // parent.
   5057        getDescendants(specCell.firstChild).forEach(function(descendant) {
   5058            if (!isAllowedChild(descendant, descendant.parentNode)) {
   5059                throw "Something here is not an allowed child of its parent: " + descendant;
   5060            }
   5061        });
   5062 
   5063        addBrackets(range);
   5064 
   5065        specCell.lastChild.textContent = specCell.firstChild.innerHTML;
   5066        if (command != "multitest") {
   5067            specCell.lastChild.appendChild(queryOutputHelper(
   5068                beforeIndeterm, beforeState, beforeValue,
   5069                afterIndeterm, afterState, afterValue,
   5070                command, test[test.length - 1][1]));
   5071            if (specCell.querySelector(".bad-result")) {
   5072                specCell.parentNode.className = "alert";
   5073            }
   5074        }
   5075    } catch (e) {
   5076        specCell.firstChild.contentEditable = "inherit";
   5077        specCell.firstChild.removeAttribute("spellcheck");
   5078        specCell.lastChild.textContent = "Exception: " + formatException(e);
   5079 
   5080        specCell.parentNode.className = "alert";
   5081        specCell.lastChild.className = "alert";
   5082 
   5083        // Don't bother comparing to localStorage, this is always wrong no
   5084        // matter what.
   5085        return;
   5086    }
   5087 
   5088    if (command != "multitest") {
   5089        // Old storage format
   5090        var key = "execcommand-" + command
   5091            + "-" + (test.length == 2 || test[1][1] == "false" ? "0" : "1")
   5092            + "-" + tr.firstChild.lastChild.textContent;
   5093    } else {
   5094        var key = "execcommand-" + JSON.stringify(test);
   5095    }
   5096 
   5097    // Use getItem() instead of direct property access to work around Firefox
   5098    // bug: https://bugzilla.mozilla.org/show_bug.cgi?id=532062
   5099    var oldValue = localStorage.getItem(key);
   5100    var newValue = specCell.lastChild.firstChild.textContent;
   5101 
   5102    // Ignore differences between {} and [].
   5103    if (oldValue === null
   5104    || oldValue.replace("{}", "[]") !== newValue.replace("{}", "[]")) {
   5105        specCell.parentNode.className = "alert";
   5106        var alertDiv = document.createElement("div");
   5107        specCell.lastChild.appendChild(alertDiv);
   5108        alertDiv.className = "alert";
   5109        if (oldValue === null) {
   5110            alertDiv.textContent = "Newly added test result";
   5111        } else if (oldValue.replace(/[\[\]{}]/g, "") == newValue.replace(/[\[\]{}]/g, "")) {
   5112            alertDiv.textContent = "Last run produced a different selection: " + oldValue;
   5113        } else {
   5114            alertDiv.textContent = "Last run produced different markup: " + oldValue;
   5115        }
   5116 
   5117        var button = document.createElement("button");
   5118        alertDiv.appendChild(button);
   5119        button.textContent = "Store new result";
   5120        button.className = "store-new-result";
   5121        button.onclick = (function(key, val, alertDiv) { return function() {
   5122            localStorage[key] = val;
   5123            // Make it easier to do mass updates, and also to jump to the next
   5124            // new result
   5125            var buttons = document.getElementsByClassName("store-new-result");
   5126            for (var i = 0; i < buttons.length; i++) {
   5127                if (isDescendant(buttons[i], alertDiv)
   5128                && i + 1 < buttons.length) {
   5129                    buttons[i + 1].focus();
   5130                    break;
   5131                }
   5132            }
   5133            var td = alertDiv;
   5134            while (td.tagName != "TD") {
   5135                td = td.parentNode;
   5136            }
   5137            alertDiv.parentNode.removeChild(alertDiv);
   5138            if (!td.querySelector(".alert")) {
   5139                td.parentNode.className = (" " + td.parentNode.className + " ")
   5140                    .replace(/ alert /g, "")
   5141                    .replace(/^ | $/g, "");
   5142            }
   5143        } })(key, newValue, alertDiv);
   5144    }
   5145 }
   5146 //@}
   5147 
   5148 function browserCellException(e, testDiv, browserCell) {
   5149 //@{
   5150    if (testDiv) {
   5151        testDiv.contenteditable = "inherit";
   5152        testDiv.removeAttribute("spellcheck");
   5153    }
   5154    browserCell.lastChild.className = "alert";
   5155    browserCell.lastChild.textContent = "Exception: " + formatException(e);
   5156    if (testDiv && testDiv.parentNode != browserCell) {
   5157        browserCell.insertBefore(testDiv, browserCell.firstChild);
   5158    }
   5159 }
   5160 //@}
   5161 
   5162 function formatException(e) {
   5163 //@{
   5164    if (typeof e == "object" && "stack" in e) {
   5165        return e + " (stack: " + e.stack + ")";
   5166    }
   5167    return String(e);
   5168 }
   5169 //@}
   5170 
   5171 function doSameCell(tr) {
   5172 //@{
   5173    tr.className = (" " + tr.className + " ").replace(" active ", "").trim();
   5174    if (tr.className == "") {
   5175        tr.removeAttribute("class");
   5176    }
   5177 
   5178    var sameCell = document.createElement("td");
   5179    if (!document.querySelector("#browser-checkbox").checked) {
   5180        sameCell.className = "maybe";
   5181        sameCell.textContent = "?";
   5182    } else {
   5183        var exception = false;
   5184        try {
   5185            // Ad hoc normalization to avoid basically spurious mismatches.  For
   5186            // now this includes ignoring where the selection goes.
   5187            var normalizedSpecCell = tr.childNodes[1].lastChild.firstChild.textContent
   5188                .replace(/[[\]{}]/g, "")
   5189                .replace(/ style="margin: 0 0 0 40px; border: none; padding: 0px;"/g, '')
   5190                .replace(/ style="margin-right: 0px;" dir="ltr"/g, '')
   5191                .replace(/ style="margin-left: 0px;" dir="rtl"/g, '')
   5192                .replace(/ style="margin-(left|right): 40px;"/g, '')
   5193                .replace(/: /g, ":")
   5194                .replace(/;? ?"/g, '"')
   5195                .replace(/<(\/?)strong/g, '<$1b')
   5196                .replace(/<(\/?)strike/g, '<$1s')
   5197                .replace(/<(\/?)em/g, '<$1i')
   5198                .replace(/#[0-9a-fA-F]{6}/g, function(match) { return match.toUpperCase(); });
   5199            var normalizedBrowserCell = tr.childNodes[2].lastChild.firstChild.textContent
   5200                .replace(/[[\]{}]/g, "")
   5201                .replace(/ style="margin: 0 0 0 40px; border: none; padding: 0px;"/g, '')
   5202                .replace(/ style="margin-right: 0px;" dir="ltr"/g, '')
   5203                .replace(/ style="margin-left: 0px;" dir="rtl"/g, '')
   5204                .replace(/ style="margin-(left|right): 40px;"/g, '')
   5205                .replace(/: /g, ":")
   5206                .replace(/;? ?"/g, '"')
   5207                .replace(/<(\/?)strong/g, '<$1b')
   5208                .replace(/<(\/?)strike/g, '<$1s')
   5209                .replace(/<(\/?)em/g, '<$1i')
   5210                .replace(/#[0-9a-fA-F]{6}/g, function(match) { return match.toUpperCase(); })
   5211                .replace(/ size="2" width="100%"/g, '');
   5212            if (navigator.userAgent.indexOf("MSIE") != -1) {
   5213                // IE produces <font style> instead of <span style>, so let's
   5214                // translate all <span>s to <font>s.
   5215                normalizedSpecCell = normalizedSpecCell
   5216                    .replace(/<(\/?)span/g, '<$1font');
   5217                normalizedBrowserCell = normalizedBrowserCell
   5218                    .replace(/<(\/?)span/g, '<$1font');
   5219            }
   5220        } catch (e) {
   5221            exception = true;
   5222        }
   5223        if (!exception && normalizedSpecCell == normalizedBrowserCell) {
   5224            sameCell.className = "yes";
   5225            sameCell.textContent = "\u2713";
   5226        } else {
   5227            sameCell.className = "no";
   5228            sameCell.textContent = "\u2717";
   5229        }
   5230    }
   5231    tr.appendChild(sameCell);
   5232 
   5233    for (var i = 0; i <= 2; i++) {
   5234        // Insert <wbr> so IE doesn't stretch the screen.  This is considerably
   5235        // more complicated than it has to be, thanks to Firefox's lack of
   5236        // support for outerHTML.
   5237        var div = tr.childNodes[i].lastChild;
   5238        if (div.firstChild) {
   5239            var text = div.firstChild.textContent;
   5240            div.removeChild(div.firstChild);
   5241            div.insertBefore(document.createElement("div"), div.firstChild);
   5242            div.firstChild.innerHTML = text
   5243                .replace(/&/g, "&amp;")
   5244                .replace(/</g, "&lt;")
   5245                .replace(/>/g, "><wbr>")
   5246                .replace(/&lt;/g, "<wbr>&lt;");
   5247            while (div.firstChild.hasChildNodes()) {
   5248                div.insertBefore(div.firstChild.lastChild, div.firstChild.nextSibling);
   5249            }
   5250            div.removeChild(div.firstChild);
   5251        }
   5252 
   5253        // Add position: absolute span to not affect vertical layout
   5254        getDescendants(tr.childNodes[i].firstChild)
   5255        .filter(function(node) {
   5256            return node.nodeType == Node.TEXT_NODE
   5257                && /^(\{\}?|\})$/.test(node.data);
   5258        }).forEach(function(node) {
   5259            var span = document.createElement("span");
   5260            span.style.position = "absolute";
   5261            span.textContent = node.data;
   5262            node.parentNode.insertBefore(span, node);
   5263            node.parentNode.removeChild(node);
   5264        });
   5265    }
   5266 }
   5267 //@}
   5268 
   5269 function doTearDown(command) {
   5270 //@{
   5271    getSelection().removeAllRanges();
   5272 }
   5273 //@}
   5274 
   5275 function setupCell(cell, html) {
   5276 //@{
   5277    cell.innerHTML = "<div></div><div></div>";
   5278 
   5279    return setupDiv(cell.firstChild, html);
   5280 }
   5281 //@}
   5282 
   5283 function setupDiv(node, html) {
   5284 //@{
   5285    // A variety of checks to avoid simple errors.  Not foolproof, of course.
   5286    var re = /\{|\[|data-start/g;
   5287    var markers = [];
   5288    var marker;
   5289    while (marker = re.exec(html)) {
   5290        markers.push(marker);
   5291    }
   5292    if (markers.length != 1) {
   5293        throw "Need exactly one start marker ([ or { or data-start), found " + markers.length;
   5294    }
   5295 
   5296    var re = /\}|\]|data-end/g;
   5297    var markers = [];
   5298    var marker;
   5299    while (marker = re.exec(html)) {
   5300        markers.push(marker);
   5301    }
   5302    if (markers.length != 1) {
   5303        throw "Need exactly one end marker (] or } or data-end), found " + markers.length;
   5304    }
   5305 
   5306    node.innerHTML = html;
   5307 
   5308    var startNode, startOffset, endNode, endOffset;
   5309 
   5310    // For braces that don't lie inside text nodes, we can't just set
   5311    // innerHTML, because that might disturb the DOM.  For instance, if the
   5312    // brace is right before a <tr>, it could get moved outside the table
   5313    // entirely, which messes everything up pretty badly.  So we instead
   5314    // allow using data attributes: data-start and data-end on the start and
   5315    // end nodes, with a numeric value indicating the offset.  This format
   5316    // doesn't allow the parent div to be a start or end node, but in that case
   5317    // you can always use the curly braces.
   5318    if (node.querySelector("[data-start]")) {
   5319        startNode = node.querySelector("[data-start]");
   5320        startOffset = startNode.getAttribute("data-start");
   5321        startNode.removeAttribute("data-start");
   5322    }
   5323    if (node.querySelector("[data-end]")) {
   5324        endNode = node.querySelector("[data-end]");
   5325        endOffset = endNode.getAttribute("data-end");
   5326        endNode.removeAttribute("data-end");
   5327    }
   5328 
   5329    var cur = node;
   5330    while (true) {
   5331        if (!cur || (cur != node && !(cur.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_CONTAINS))) {
   5332            break;
   5333        }
   5334 
   5335        if (cur.nodeType != Node.TEXT_NODE) {
   5336            cur = nextNode(cur);
   5337            continue;
   5338        }
   5339 
   5340        var data = cur.data.replace(/\]/g, "");
   5341        var startIdx = data.indexOf("[");
   5342 
   5343        data = cur.data.replace(/\[/g, "");
   5344        var endIdx = data.indexOf("]");
   5345 
   5346        cur.data = cur.data.replace(/[\[\]]/g, "");
   5347 
   5348        if (startIdx != -1) {
   5349            startNode = cur;
   5350            startOffset = startIdx;
   5351        }
   5352 
   5353        if (endIdx != -1) {
   5354            endNode = cur;
   5355            endOffset = endIdx;
   5356        }
   5357 
   5358        // These are only legal as the first or last
   5359        data = cur.data.replace(/\}/g, "");
   5360        var elStartIdx = data.indexOf("{");
   5361 
   5362        data = cur.data.replace(/\{/g, "");
   5363        var elEndIdx = data.indexOf("}");
   5364 
   5365        if (elStartIdx == 0) {
   5366            startNode = cur.parentNode;
   5367            startOffset = getNodeIndex(cur);
   5368        } else if (elStartIdx != -1) {
   5369            startNode = cur.parentNode;
   5370            startOffset = getNodeIndex(cur) + 1;
   5371        }
   5372        if (elEndIdx == 0) {
   5373            endNode = cur.parentNode;
   5374            endOffset = getNodeIndex(cur);
   5375        } else if (elEndIdx != -1) {
   5376            endNode = cur.parentNode;
   5377            endOffset = getNodeIndex(cur) + 1;
   5378        }
   5379 
   5380        cur.data = cur.data.replace(/[{}]/g, "");
   5381        if (!cur.data.length) {
   5382            if (cur == startNode || cur == endNode) {
   5383                throw "You put a square bracket where there was no text node . . .";
   5384            }
   5385            var oldCur = cur;
   5386            cur = nextNode(cur);
   5387            oldCur.parentNode.removeChild(oldCur);
   5388        } else {
   5389            cur = nextNode(cur);
   5390        }
   5391    }
   5392 
   5393    return [startNode, startOffset, endNode, endOffset];
   5394 }
   5395 //@}
   5396 
   5397 function setSelection(startNode, startOffset, endNode, endOffset) {
   5398 //@{
   5399    if (navigator.userAgent.indexOf("Opera") != -1) {
   5400        // Yes, browser sniffing is evil, but I can't be bothered to debug
   5401        // Opera.
   5402        var range = document.createRange();
   5403        range.setStart(startNode, startOffset);
   5404        range.setEnd(endNode, endOffset);
   5405        if (range.collapsed) {
   5406            range.setEnd(startNode, startOffset);
   5407        }
   5408        getSelection().removeAllRanges();
   5409        getSelection().addRange(range);
   5410    } else if ("extend" in getSelection()) {
   5411        // WebKit behaves unreasonably for collapse(), so do that manually.
   5412        /*
   5413        var range = document.createRange();
   5414        range.setStart(startNode, startOffset);
   5415        getSelection().removeAllRanges();
   5416        getSelection().addRange(range);
   5417        */
   5418        getSelection().collapse(startNode, startOffset);
   5419        getSelection().extend(endNode, endOffset);
   5420    } else {
   5421        // IE9.  Selections have no direction, so we just make the selection
   5422        // always forwards.
   5423        var range;
   5424        if (getSelection().rangeCount) {
   5425            range = getSelection().getRangeAt(0);
   5426        } else {
   5427            range = document.createRange();
   5428        }
   5429        range.setStart(startNode, startOffset);
   5430        range.setEnd(endNode, endOffset);
   5431        if (range.collapsed) {
   5432            // Phooey, we got them backwards.
   5433            range.setEnd(startNode, startOffset);
   5434        }
   5435        if (!getSelection().rangeCount) {
   5436            getSelection().addRange(range);
   5437        }
   5438    }
   5439 }
   5440 //@}
   5441 
   5442 /**
   5443 * Add brackets at the start and end points of the given range, so that they're
   5444 * visible.
   5445 */
   5446 function addBrackets(range) {
   5447 //@{
   5448    // Handle the collapsed case specially, to avoid confusingly getting the
   5449    // markers backwards in some cases
   5450    if (range.startContainer.nodeType == Node.TEXT_NODE
   5451    || range.startContainer.nodeType == Node.COMMENT_NODE) {
   5452        if (range.collapsed) {
   5453            range.startContainer.insertData(range.startOffset, "[]");
   5454        } else {
   5455            range.startContainer.insertData(range.startOffset, "[");
   5456        }
   5457    } else {
   5458        var marker = range.collapsed ? "{}" : "{";
   5459        if (range.startOffset != range.startContainer.childNodes.length
   5460        && range.startContainer.childNodes[range.startOffset].nodeType == Node.TEXT_NODE) {
   5461            range.startContainer.childNodes[range.startOffset].insertData(0, marker);
   5462        } else if (range.startOffset != 0
   5463        && range.startContainer.childNodes[range.startOffset - 1].nodeType == Node.TEXT_NODE) {
   5464            range.startContainer.childNodes[range.startOffset - 1].appendData(marker);
   5465        } else {
   5466            // Seems to serialize as I'd want even for tables . . . IE doesn't
   5467            // allow undefined to be passed as the second argument (it throws
   5468            // an exception), so we have to explicitly check the number of
   5469            // children and pass null.
   5470            range.startContainer.insertBefore(document.createTextNode(marker),
   5471                range.startContainer.childNodes.length == range.startOffset
   5472                ? null
   5473                : range.startContainer.childNodes[range.startOffset]);
   5474        }
   5475    }
   5476    if (range.collapsed) {
   5477        return;
   5478    }
   5479    if (range.endContainer.nodeType == Node.TEXT_NODE
   5480    || range.endContainer.nodeType == Node.COMMENT_NODE) {
   5481        range.endContainer.insertData(range.endOffset, "]");
   5482    } else {
   5483        if (range.endOffset != range.endContainer.childNodes.length
   5484        && range.endContainer.childNodes[range.endOffset].nodeType == Node.TEXT_NODE) {
   5485            range.endContainer.childNodes[range.endOffset].insertData(0, "}");
   5486        } else if (range.endOffset != 0
   5487        && range.endContainer.childNodes[range.endOffset - 1].nodeType == Node.TEXT_NODE) {
   5488            range.endContainer.childNodes[range.endOffset - 1].appendData("}");
   5489        } else {
   5490            range.endContainer.insertBefore(document.createTextNode("}"),
   5491                range.endContainer.childNodes.length == range.endOffset
   5492                ? null
   5493                : range.endContainer.childNodes[range.endOffset]);
   5494        }
   5495    }
   5496 }
   5497 //@}
   5498 
   5499 function normalizeSerializedStyle(wrapper) {
   5500 //@{
   5501    // Inline CSS attribute serialization has terrible interop, so we fix
   5502    // things up a bit to avoid spurious mismatches.  This needs to be removed
   5503    // once CSSOM defines this stuff properly, but for now there's just no
   5504    // standard for any of it.  This only normalizes descendants of wrapper,
   5505    // not wrapper itself.
   5506    [].forEach.call(wrapper.querySelectorAll("[style]"), function(node) {
   5507        if (node.style.color != "") {
   5508            var newColor = normalizeColor(node.style.color);
   5509            node.style.color = "";
   5510            node.style.color = newColor;
   5511        }
   5512        if (node.style.backgroundColor != "") {
   5513            var newBackgroundColor = normalizeColor(node.style.backgroundColor);
   5514            node.style.backgroundColor = "";
   5515            node.style.backgroundColor = newBackgroundColor;
   5516        }
   5517        node.setAttribute("style", node.getAttribute("style")
   5518            // Random spacing differences
   5519            .replace(/; ?$/, "")
   5520            .replace(/: /g, ":")
   5521            // Gecko likes "transparent"
   5522            .replace(/transparent/g, "rgba(0, 0, 0, 0)")
   5523            // WebKit likes to look overly precise
   5524            .replace(/, 0.496094\)/g, ", 0.5)")
   5525            // Gecko converts anything with full alpha to "transparent" which
   5526            // then becomes "rgba(0, 0, 0, 0)", so we have to make other
   5527            // browsers match
   5528            .replace(/rgba\([0-9]+, [0-9]+, [0-9]+, 0\)/g, "rgba(0, 0, 0, 0)")
   5529        );
   5530    });
   5531 }
   5532 //@}
   5533 
   5534 /**
   5535 * Input is in the following format:
   5536 *   [input HTML,
   5537 *    array of commands,
   5538 *    expected output HTML,
   5539 *    array of expected execCommand() return values,
   5540 *    object of expected indeterm/state/value].
   5541 * The array of commands is [[command, value, optionalDesc], [command, value,
   5542 * optionalDesc], ...].  optionalDesc is appended to the description of the
   5543 * test in the generated test name.
   5544 *
   5545 * The
   5546 * array of expected execCommand() return values is [true|false, true|false,
   5547 * ...], where the indices match those in the array of commands.  The
   5548 * indeterm/state/value object is of the form
   5549 *   {command: [expected indeterm before, expected state before,
   5550 *     expected value before, expected indeterm after,
   5551 *     expected state after, expected value after],
   5552 *   command: ... }
   5553 * null for any of the last six entries means an INVALID_ACCESS_ERR must be
   5554 * raised.
   5555 */
   5556 function runConformanceTest(browserTest) {
   5557 //@{
   5558    document.getElementById("test-container").innerHTML = "<div contenteditable></div><p>test";
   5559    var testName = JSON.stringify(browserTest[1]) + " " + format_value(browserTest[0]);
   5560    var testDiv = document.querySelector("div[contenteditable]");
   5561    var originalRootElement, newRootElement;
   5562    var exception = null;
   5563    var expectedExecCommandReturnValues = browserTest[3];
   5564    var expectedQueryResults = browserTest[4];
   5565    var actualQueryResults = {};
   5566    var actualQueryExceptions = {};
   5567    var subtestName;
   5568 
   5569    try {
   5570        var points = setupDiv(testDiv, browserTest[0]);
   5571 
   5572        var range = document.createRange();
   5573        range.setStart(points[0], points[1]);
   5574        range.setEnd(points[2], points[3]);
   5575        // The points might be backwards
   5576        if (range.collapsed) {
   5577            range.setEnd(points[0], points[1]);
   5578        }
   5579        getSelection().removeAllRanges();
   5580        getSelection().addRange(range);
   5581 
   5582        var originalRootElement = document.documentElement.cloneNode(true);
   5583        originalRootElement.querySelector("[contenteditable]").parentNode
   5584            .removeChild(originalRootElement.querySelector("[contenteditable]"));
   5585        originalRootElement.querySelector("#log").parentNode
   5586            .removeChild(originalRootElement.querySelector("#log"));
   5587 
   5588        for (var command in expectedQueryResults) {
   5589            var results = [];
   5590            var exceptions = {};
   5591            try { results[0] = document.queryCommandIndeterm(command) }
   5592            catch(e) { exceptions[0] = e }
   5593            try { results[1] = document.queryCommandState(command) }
   5594            catch(e) { exceptions[1] = e }
   5595            try { results[2] = document.queryCommandValue(command) }
   5596            catch(e) { exceptions[2] = e }
   5597            actualQueryResults[command] = results;
   5598            actualQueryExceptions[command] = exceptions;
   5599        }
   5600    } catch(e) {
   5601        exception = e;
   5602    }
   5603 
   5604    for (var i = 0; i < browserTest[1].length; i++) {
   5605        subtestName = testName + ": execCommand(" +
   5606            format_value(browserTest[1][i][0]) + ", false, " +
   5607            format_value(browserTest[1][i][1]) + ") " +
   5608            (browserTest[1][i][2] ? browserTest[1][i][2] + " " : "") +
   5609            "return value"
   5610        subsetTest(test, function() {
   5611            assert_equals(exception, null, "Setup must not throw an exception");
   5612 
   5613            assert_equals(document.execCommand(browserTest[1][i][0], false, browserTest[1][i][1]),
   5614                expectedExecCommandReturnValues[i]);
   5615        }, subtestName);
   5616    }
   5617 
   5618    if (exception === null) {
   5619        try {
   5620            for (var command in expectedQueryResults) {
   5621                var results = actualQueryResults[command];
   5622                var exceptions = actualQueryExceptions[command];
   5623                try { results[3] = document.queryCommandIndeterm(command) }
   5624                catch(e) { exceptions[3] = e }
   5625                try { results[4] = document.queryCommandState(command) }
   5626                catch(e) { exceptions[4] = e }
   5627                try { results[5] = document.queryCommandValue(command) }
   5628                catch(e) { exceptions[5] = e }
   5629            }
   5630 
   5631            var newRootElement = document.documentElement.cloneNode(true);
   5632            newRootElement.querySelector("[contenteditable]").parentNode
   5633                .removeChild(newRootElement.querySelector("[contenteditable]"));
   5634            newRootElement.querySelector("#log").parentNode
   5635                .removeChild(newRootElement.querySelector("#log"));
   5636 
   5637            normalizeSerializedStyle(testDiv);
   5638        } catch(e) {
   5639            exception = e;
   5640        }
   5641    }
   5642 
   5643    subsetTest(test, function() {
   5644        assert_equals(exception, null, "Setup must not throw an exception");
   5645 
   5646        // Now test for modifications to non-editable content.  First just
   5647        // count children:
   5648        assert_equals(testDiv.parentNode.childNodes.length, 2,
   5649            "The parent div must have two children.  Did something spill outside the test div?");
   5650 
   5651        // Check for attributes
   5652        assert_equals(testDiv.attributes.length, 1,
   5653            'Wrapper div must have only one attribute (<div contenteditable="">), but has more (' +
   5654            formatStartTag(testDiv) + ")");
   5655 
   5656        assert_equals(document.body.attributes.length, 0,
   5657            "Body element must have no attributes (<body>), but has more (" +
   5658            formatStartTag(document.body) + ")");
   5659 
   5660        // Check that in general, nothing outside the test div was modified.
   5661        // TODO: Less verbose error reporting, the way some of the range tests
   5662        // do?
   5663        assert_equals(newRootElement.innerHTML, originalRootElement.innerHTML,
   5664            "Everything outside the editable div must be unchanged, but some change did occur");
   5665    }, testName + " checks for modifications to non-editable content");
   5666 
   5667    subsetTest(test, function() {
   5668        assert_equals(exception, null, "Setup must not throw an exception");
   5669 
   5670        if (Array.isArray(browserTest[2])) {
   5671          var expectedInnerHTMLArray = [];
   5672          browserTest[2].forEach(function (expectedInnerHTML) {
   5673            expectedInnerHTMLArray.push(expectedInnerHTML.replace(/[\[\]{}]/g, ""));
   5674          });
   5675          assert_in_array(testDiv.innerHTML,
   5676               expectedInnerHTMLArray,
   5677               "Unexpected innerHTML (after normalizing inline style)");
   5678        } else {
   5679          assert_equals(testDiv.innerHTML,
   5680              browserTest[2].replace(/[\[\]{}]/g, ""),
   5681              "Unexpected innerHTML (after normalizing inline style)");
   5682        }
   5683    }, testName + " compare innerHTML");
   5684 
   5685    for (var command in expectedQueryResults) {
   5686        var descriptions = [
   5687            'queryCommandIndeterm("' + command + '") before',
   5688            'queryCommandState("' + command + '") before',
   5689            'queryCommandValue("' + command + '") before',
   5690            'queryCommandIndeterm("' + command + '") after',
   5691            'queryCommandState("' + command + '") after',
   5692            'queryCommandValue("' + command + '") after',
   5693        ];
   5694        for (var i = 0; i < 6; i++) {
   5695            subsetTest(test, function() {
   5696                assert_equals(exception, null, "Setup must not throw an exception");
   5697 
   5698                if (expectedQueryResults[command][i] === null) {
   5699                    // Some ad hoc tests to verify that we have a real
   5700                    // DOMException.  FIXME: This should be made more rigorous,
   5701                    // with clear steps specified for checking that something
   5702                    // is really a DOMException.
   5703                    assert_true(i in actualQueryExceptions[command],
   5704                        "An exception must be thrown in this case");
   5705                    var e = actualQueryExceptions[command][i];
   5706                    assert_equals(typeof e, "object",
   5707                        "typeof thrown object");
   5708                    assert_idl_attribute(e, "code",
   5709                        "Thrown object must be a DOMException");
   5710                    assert_idl_attribute(e, "INVALID_ACCESS_ERR",
   5711                        "Thrown object must be a DOMException");
   5712                    assert_equals(e.code, e.INVALID_ACCESS_ERR,
   5713                        "Thrown object must be an INVALID_ACCESS_ERR, so its .code and .INVALID_ACCESS_ERR attributes must be equal");
   5714                } else if ((i == 2 || i == 5)
   5715                && (command == "backcolor" || command == "forecolor" || command == "hilitecolor")
   5716                && typeof actualQueryResults[command][i] == "string") {
   5717                    assert_false(i in actualQueryExceptions[command],
   5718                        "An exception must not be thrown in this case");
   5719                    // We don't return the format that the color should be in:
   5720                    // that's up to CSSOM.  Thus we normalize before comparing.
   5721                    assert_equals(normalizeColor(actualQueryResults[command][i]),
   5722                        expectedQueryResults[command][i],
   5723                        "Wrong result returned (after color normalization)");
   5724                } else {
   5725                    assert_false(i in actualQueryExceptions[command],
   5726                        "An exception must not be thrown in this case");
   5727                    assert_equals(actualQueryResults[command][i],
   5728                        expectedQueryResults[command][i],
   5729                        "Wrong result returned");
   5730                }
   5731            }, testName + " " + descriptions[i]);
   5732        }
   5733    }
   5734 
   5735    // Silly Firefox
   5736    document.body.removeAttribute("bgcolor");
   5737 }
   5738 //@}
   5739 
   5740 /**
   5741 * Return a string like '<body bgcolor="#FFFFFF">'.
   5742 */
   5743 function formatStartTag(el) {
   5744 //@{
   5745    var ret = "<" + el.tagName.toLowerCase();
   5746    for (var i = 0; i < el.attributes.length; i++) {
   5747        ret += " " + el.attributes[i].name + '="';
   5748        ret += el.attributes[i].value.replace(/\&/g, "&amp;")
   5749            .replace(/"/g, "&quot;");
   5750        ret += '"';
   5751    }
   5752    return ret + ">";
   5753 }
   5754 //@}
   5755 
   5756 // vim: foldmarker=@{,@} foldmethod=marker