Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

SSL tests.js   Sprache: JAVA

 

// For the original (development) tests, we want to make a bunch of changes to
// the page as it loads.  We don't want this for the conformance tests, so let
// them opt out.
if (typeof testsJsLibraryOnly == "undefined" || !testsJsLibraryOnly) {
    // Alert the reader of egregious Opera bug that will make the specced
    // implementation horribly buggy
    //@{
    (function() {
        var div = document.createElement("div");
        div.appendChild(document.createElement("br"));
        document.body.insertBefore(div, document.body.firstChild);
        var range = document.createRange();
        range.setStart(div, 1);
        div.insertBefore(document.createElement("p"), div.firstChild);
        if (range.startOffset > range.startContainer.childNodes.length) {
            var warningDiv = document.createElement("p");
            document.body.insertBefore(warningDiv, document.body.firstChild);
            warningDiv.style.fontWeight = "bold";
            warningDiv.style.fontSize = "2em";
            warningDiv.style.color = "red";
            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.';
        }
        div.parentNode.removeChild(div);
    })();
    //@}

    // Insert the toolbar thingie as soon as the script file is loaded
    //@{
    (function() {
        var toolbarDiv = document.createElement("div");
        toolbarDiv.id = "toolbar";
        // Note: this is completely not a hack at all.
        toolbarDiv.innerHTML = "<style id=alerts>body > div > table > tbody > tr:not(.alert):not(:first-child):not(.active) { display: none }</style>"
            + "<label><input id=alert-checkbox type=checkbox accesskey=a checked onclick='updateAlertRowStyle()'> Display rows without spec <u>a</u>lerts</label>"
            + "<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>";

        document.body.appendChild(toolbarDiv);
    })();
    //@}

    // Confusingly, we're storing a string here, not a boolean.
    document.querySelector("#alert-checkbox").checked = localStorage["display-alerts"] != "false";
    document.querySelector("#browser-checkbox").checked = localStorage["display-browser-tests"] != "false";

    function updateAlertRowStyle() {
    //@{
        var checked = document.querySelector("#alert-checkbox").checked;
        document.querySelector("#alerts").disabled = checked;
        localStorage["display-alerts"] = checked;
    }
    //@}
    updateAlertRowStyle();

    // Feature-test whether the browser wraps at <wbr> or not, and set word-wrap:
    // break-word where necessary if not.  (IE and Opera don't wrap, Gecko and
    // WebKit do.)  word-wrap: break-word will break anywhere at all, so it looks
    // significantly uglier.
    //@{
    (function() {
        var wordWrapTestDiv = document.createElement("div");
        wordWrapTestDiv.style.width = "5em";
        document.body.appendChild(wordWrapTestDiv);
        wordWrapTestDiv.innerHTML = "abc";
        var height1 = getComputedStyle(wordWrapTestDiv).height;
        wordWrapTestDiv.innerHTML = "abc<wbr>abc<wbr>abc<wbr>abc<wbr>abc<wbr>abc";
        var height2 = getComputedStyle(wordWrapTestDiv).height;
        document.body.removeChild(wordWrapTestDiv);
        if (height1 == height2) {
            document.body.className = (document.body.className + " wbr-workaround").trim();
        }
    })();
    //@}
}

// Now for the meat of the file.
var tests = {
    backcolor: [
    //@{ Same as hilitecolor (set below)
    ],
    //@}
    bold: [
    //@{
        'foo[]bar',
        '<p>[foo</p> <p>bar]</p>',
        '<span>[foo</span> <span>bar]</span>',
        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
        '<p>[foo<p><br><p>bar]',
        '<b>foo[]bar</b>',
        '<i>foo[]bar</i>',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        'foo[bar]baz',
        'foo[bar<b>baz]qoz</b>quz',
        'foo[bar<i>baz]qoz</i>quz',
        '{<p><p> <p>foo</p>}',

        'foo<span contenteditable=false>[bar]</span>baz',
        'fo[o<span contenteditable=false>bar</span>b]az',
        'foo<span contenteditable=false>ba[r</span>b]az',
        'fo[o<span contenteditable=false>b]ar</span>baz',
        'fo[<b>o</b><span contenteditable=false>bar</span><b>b</b>]az',
        '<span contenteditable=false>foo<span contenteditable=true>[bar]</span>baz</span>',
        '<span contenteditable=false>fo[o<span contenteditable=true>bar</span>b]az</span>',
        '<span contenteditable=false>foo<span contenteditable=true>ba[r</span>b]az</span>',
        '<span contenteditable=false>fo[o<span contenteditable=true>b]ar</span>baz</span>',
        '<span contenteditable=false>fo[<b>o<span contenteditable=true>bar</span>b</b>]az</span>',

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
        '{<table><tr><td>foo<td>bar<td>baz</table>}',

        'foo<span style="font-weight: bold">[bar]</span>baz',
        'foo<b>[bar]</b>baz',
        'foo<b>bar</b>[baz]',
        '[foo]<b>bar</b>baz',
        '<b>foo</b>[bar]<b>baz</b>',
        'foo<strong>bar</strong>[baz]',
        '[foo]<strong>bar</strong>baz',
        '<strong>foo</strong>[bar]<strong>baz</strong>',
        '<b>foo</b>[bar]<strong>baz</strong>',
        '<strong>foo</strong>[bar]<b>baz</b>',
        'foo[<b>bar</b>]baz',
        'foo[<b>bar]</b>baz',
        'foo<b>[bar</b>]baz',

        'foo{<b></b>}baz',
        'foo{<i></i>}baz',
        'foo{<b><i></i></b>}baz',
        'foo{<i><b></b></i>}baz',

        'foo<strong>[bar]</strong>baz',
        'foo[<strong>bar</strong>]baz',
        'foo[<strong>bar]</strong>baz',
        'foo<strong>[bar</strong>]baz',
        'foo[<span style="font-weight: bold">bar</span>]baz',
        'foo[<span style="font-weight: bold">bar]</span>baz',
        'foo<span style="font-weight: bold">[bar</span>]baz',

        '<b>{<p>foo</p><p>bar</p>}<p>baz</p></b>',
        '<b><p>foo[<i>bar</i>}</p><p>baz</p></b>',

        'foo [bar <b>baz] qoz</b> quz sic',
        'foo bar <b>baz [qoz</b> quz] sic',

        '<b id=purple>bar [baz] qoz</b>',

        'foo<span style="font-weight: 100">[bar]</span>baz',
        'foo<span style="font-weight: 200">[bar]</span>baz',
        'foo<span style="font-weight: 300">[bar]</span>baz',
        'foo<span style="font-weight: 400">[bar]</span>baz',
        'foo<span style="font-weight: 500">[bar]</span>baz',
        'foo<span style="font-weight: 600">[bar]</span>baz',
        'foo<span style="font-weight: 700">[bar]</span>baz',
        'foo<span style="font-weight: 800">[bar]</span>baz',
        'foo<span style="font-weight: 900">[bar]</span>baz',
        'foo<span style="font-weight: 400">[bar</span>]baz',
        'foo<span style="font-weight: 700">[bar</span>]baz',
        'foo[<span style="font-weight: 400">bar]</span>baz',
        'foo[<span style="font-weight: 700">bar]</span>baz',
        'foo[<span style="font-weight: 400">bar</span>]baz',
        'foo[<span style="font-weight: 700">bar</span>]baz',
        '<span style="font-weight: 100">foo[bar]baz</span>',
        '<span style="font-weight: 400">foo[bar]baz</span>',
        '<span style="font-weight: 700">foo[bar]baz</span>',
        '<span style="font-weight: 900">foo[bar]baz</span>',
        '{<span style="font-weight: 100">foobar]baz</span>',
        '{<span style="font-weight: 400">foobar]baz</span>',
        '{<span style="font-weight: 700">foobar]baz</span>',
        '{<span style="font-weight: 900">foobar]baz</span>',
        '<span style="font-weight: 100">foo[barbaz</span>}',
        '<span style="font-weight: 400">foo[barbaz</span>}',
        '<span style="font-weight: 700">foo[barbaz</span>}',
        '<span style="font-weight: 900">foo[barbaz</span>}',

        '<h3>foo[bar]baz</h3>',
        '{<h3>foobar]baz</h3>',
        '<h3>foo[barbaz</h3>}',
        '<h3>[foobarbaz]</h3>',
        '{<h3>foobarbaz]</h3>',
        '<h3>[foobarbaz</h3>}',
        '{<h3>foobarbaz</h3>}',

        '<b>foo<span style="font-weight: normal">bar<b>[baz]</b>quz</span>qoz</b>',
        '<b>foo<span style="font-weight: normal">[bar]</span>baz</b>',

        '{<b>foo</b> <b>bar</b>}',
        '{<h3>foo</h3><b>bar</b>}',

        '<i><b>foo</b></i>[bar]<i><b>baz</b></i>',
        '<i><b>foo</b></i>[bar]<b>baz</b>',
        '<b>foo</b>[bar]<i><b>baz</b></i>',
        '<font color=blue face=monospace><b>foo</b></font>[bar]',

        'foo<span style="font-weight: normal"><b>{bar}</b></span>baz',
        '[foo<span class=notbold>bar</span>baz]',
        '<b><span class=notbold>[foo]</span></b>',
        '<b><span class=notbold>foo[bar]baz</span></b>',

        '<p style="font-weight: bold">foo[bar]baz</p>',

        // Tests for queryCommandIndeterm() and queryCommandState()
        'fo[o<b>b]ar</b>baz',
        'foo<b>ba[r</b>b]az',
        'fo[o<b>bar</b>b]az',
        'foo[<b>b]ar</b>baz',
        'foo<b>ba[r</b>]baz',
        'foo{<b>bar</b>}baz',
        'fo[o<span style=font-weight:bold>b]ar</span>baz',
        '<span style=font-weight:800>fo[o</span><span style=font-weight:900>b]ar</span>',
        '<span style=font-weight:700>fo[o</span><span style=font-weight:800>b]ar</span>',
        '<span style=font-weight:600>fo[o</span><span style=font-weight:700>b]ar</span>',
        '<span style=font-weight:500>fo[o</span><span style=font-weight:600>b]ar</span>',
        '<span style=font-weight:400>fo[o</span><span style=font-weight:500>b]ar</span>',
        '<span style=font-weight:300>fo[o</span><span style=font-weight:400>b]ar</span>',
        '<span style=font-weight:200>fo[o</span><span style=font-weight:300>b]ar</span>',
        '<span style=font-weight:100>fo[o</span><span style=font-weight:200>b]ar</span>',
    ],
    //@}
    createlink: [
    //@{
        'foo[]bar',
        '<p>[foo</p> <p>bar]</p>',
        '<span>[foo</span> <span>bar]</span>',
        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
        '<p>[foo<p><br><p>bar]',
        '<b>foo[]bar</b>',
        '<i>foo[]bar</i>',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        'foo[bar]baz',
        'foo[bar<b>baz]qoz</b>quz',
        'foo[bar<i>baz]qoz</i>quz',
        '{<p><p> <p>foo</p>}',

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
        '{<table><tr><td>foo<td>bar<td>baz</table>}',

        '<a href=http://www.google.com/>foo[bar]baz</a>',
        '<a href=http://www.google.com/>foo[barbaz</a>}',
        '{<a href=http://www.google.com/>foobar]baz</a>',
        '{<a href=http://www.google.com/>foobarbaz</a>}',
        '<a href=http://www.google.com/>[foobarbaz]</a>',

        'foo<a href=http://www.google.com/>[bar]</a>baz',
        '[foo]<a href=http://www.google.com/>bar</a>baz',
        'foo<a href=http://www.google.com/>bar</a>[baz]',
        'foo[<a href=http://www.google.com/>bar</a>]baz',
        'foo<a href=http://www.google.com/>[bar</a>baz]',
        '[foo<a href=http://www.google.com/>bar]</a>baz',
        '[foo<a href=http://www.google.com/>bar</a>baz]',

        '<a href=otherurl>foo[bar]baz</a>',
        '<a href=otherurl>foo[barbaz</a>}',
        '{<a href=otherurl>foobar]baz</a>',
        '{<a href=otherurl>foobarbaz</a>}',
        '<a href=otherurl>[foobarbaz]</a>',

        'foo<a href=otherurl>[bar]</a>baz',
        'foo[<a href=otherurl>bar</a>]baz',
        'foo<a href=otherurl>[bar</a>baz]',
        '[foo<a href=otherurl>bar]</a>baz',
        '[foo<a href=otherurl>bar</a>baz]',

        '<a href=otherurl><b>foo[bar]baz</b></a>',
        '<a href=otherurl><b>foo[barbaz</b></a>}',
        '{<a href=otherurl><b>foobar]baz</b></a>',
        '<a href=otherurl><b>[foobarbaz]</b></a>',

        '<a name=abc>foo[bar]baz</a>',
        '<a name=abc><b>foo[bar]baz</b></a>',

        ['', 'foo[bar]baz'],
    ],
    //@}
    // Opera requires this to be quoted, contrary to ES5 11.1.5 which allows
    // PropertyName to be any IdentifierName, and see 7.6 which defines
    // IdentifierName to include ReservedWord; Identifier excludes it.
    "delete": [
    //@{
        // Collapsed selection
        //
        // These three commented-out test call Firefox 5.0a2 to blow up, not
        // just throwing exceptions on the tests themselves but on many
        // subsequent tests too.
        //'[]foo',
        //'<span>[]foo</span>',
        //'<p>[]foo</p>',
        'foo[]bar',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        'foo<span style=display:none>bar</span>[]baz',
        'foo<script>bar</script>[]baz',

        'foö[]bar',
        'foö[]bar',
        'foö̧[]bar',
        'ö[]bar',
        'ö[]bar',
        'ö̧[]bar',

        'שָׁ[]לוֹם',
        'שָׁלוֹ[]ם',

        '<p>foo</p><p>[]bar</p>',
        '<p>foo</p>[]bar',
        'foo<p>[]bar</p>',
        '<p>foo<br></p><p>[]bar</p>',
        '<p>foo<br></p>[]bar',
        'foo<br><p>[]bar</p>',
        '<p>foo<br><br></p><p>[]bar</p>',
        '<p>foo<br><br></p>[]bar',
        'foo<br><br><p>[]bar</p>',

        '<div><p>foo</p></div><p>[]bar</p>',
        '<p>foo</p><div><p>[]bar</p></div>',
        '<div><p>foo</p></div><div><p>[]bar</p></div>',
        '<div><p>foo</p></div>[]bar',
        'foo<div><p>[]bar</p></div>',

        '<div>foo</div><div>[]bar</div>',
        '<pre>foo</pre>[]bar',

        'foo<br>[]bar',
        'foo<br><b>[]bar</b>',
        'foo<hr>[]bar',
        '<p>foo<hr><p>[]bar',
        '<p>foo</p><br><p>[]bar</p>',
        '<p>foo</p><br><br><p>[]bar</p>',
        '<p>foo</p><img src=/img/lion.svg><p>[]bar',
        'foo<img src=/img/lion.svg>[]bar',

        '<a>foo</a>[]bar',
        '<a href=/>foo</a>[]bar',
        '<a name=abc>foo</a>[]bar',
        '<a href=/ name=abc>foo</a>[]bar',
        '<span><a>foo</a></span>[]bar',
        '<span><a href=/>foo</a></span>[]bar',
        '<span><a name=abc>foo</a></span>[]bar',
        '<span><a href=/ name=abc>foo</a></span>[]bar',
        'foo<a>[]bar</a>',
        'foo<a href=/>[]bar</a>',
        'foo<a name=abc>[]bar</a>',
        'foo<a href=/ name=abc>[]bar</a>',

        'foo  []',
        ' [] foo',
        'foo  []bar',
        'foo  []bar',
        'foo  []bar',
        'foo  []bar',
        'foo []  bar',
        'foo  [] bar',
        'foo   []bar',
        'foo []<span> </span> bar',
        'foo <span> </span>[] bar',
        'foo <span> </span> []bar',
        '<b>foo </b> []bar',
        '<b>foo </b> []bar',
        '<b>foo </b> []bar',
        '<b>foo </b> []bar',
        '<p>foo </p><p>[] bar</p>',

        '<pre>foo  []</pre>',
        '<pre> [] foo</pre>',
        '<pre>foo  []bar</pre>',
        '<pre>foo  []bar</pre>',
        '<pre>foo  []bar</pre>',

        '<div style=white-space:pre>foo  []</div>',
        '<div style=white-space:pre> [] foo</div>',
        '<div style=white-space:pre>foo  []bar</div>',
        '<div style=white-space:pre>foo  []bar</div>',
        '<div style=white-space:pre>foo  []bar</div>',

        '<div style=white-space:pre-wrap>foo  []</div>',
        '<div style=white-space:pre-wrap> [] foo</div>',
        '<div style=white-space:pre-wrap>foo  []bar</div>',
        '<div style=white-space:pre-wrap>foo  []bar</div>',
        '<div style=white-space:pre-wrap>foo  []bar</div>',

        '<div style=white-space:pre-line>foo  []</div>',
        '<div style=white-space:pre-line> [] foo</div>',
        '<div style=white-space:pre-line>foo  []bar</div>',
        '<div style=white-space:pre-line>foo  []bar</div>',
        '<div style=white-space:pre-line>foo  []bar</div>',

        '<div style=white-space:nowrap>foo  []</div>',
        '<div style=white-space:nowrap> [] foo</div>',
        '<div style=white-space:nowrap>foo  []bar</div>',
        '<div style=white-space:nowrap>foo  []bar</div>',
        '<div style=white-space:nowrap>foo  []bar</div>',

        // Tables with collapsed selection
        'foo<table><tr><td>[]bar</table>baz',
        'foo<table><tr><td>bar</table>[]baz',
        '<p>foo<table><tr><td>[]bar</table><p>baz',
        '<p>foo<table><tr><td>bar</table><p>[]baz',
        '<table><tr><td>foo<td>[]bar</table>',
        '<table><tr><td>foo<tr><td>[]bar</table>',

        'foo<br><table><tr><td>[]bar</table>baz',
        'foo<table><tr><td>bar<br></table>[]baz',
        '<p>foo<br><table><tr><td>[]bar</table><p>baz',
        '<p>foo<table><tr><td>bar<br></table><p>[]baz',
        '<table><tr><td>foo<br><td>[]bar</table>',
        '<table><tr><td>foo<br><tr><td>[]bar</table>',

        'foo<br><br><table><tr><td>[]bar</table>baz',
        'foo<table><tr><td>bar<br><br></table>[]baz',
        '<p>foo<br><br><table><tr><td>[]bar</table><p>baz',
        '<p>foo<table><tr><td>bar<br><br></table><p>[]baz',
        '<table><tr><td>foo<br><br><td>[]bar</table>',
        '<table><tr><td>foo<br><br><tr><td>[]bar</table>',

        'foo<hr><table><tr><td>[]bar</table>baz',
        'foo<table><tr><td>bar<hr></table>[]baz',
        '<table><tr><td>foo<hr><td>[]bar</table>',
        '<table><tr><td>foo<hr><tr><td>[]bar</table>',

        // Lists with collapsed selection
        'foo<ol><li>[]bar<li>baz</ol>',
        'foo<br><ol><li>[]bar<li>baz</ol>',
        'foo<br><br><ol><li>[]bar<li>baz</ol>',
        '<ol><li>foo<li>[]bar</ol>',
        '<ol><li>foo<br><li>[]bar</ol>',
        '<ol><li>foo<br><br><li>[]bar</ol>',
        '<ol><li>foo<li>[]bar<br>baz</ol>',
        '<ol><li>foo<br>bar<li>[]baz</ol>',

        '<ol><li><p>foo</p>{}bar</ol>',

        '<ol><li><p>foo<li>[]bar</ol>',
        '<ol><li>foo<li><p>[]bar</ol>',
        '<ol><li><p>foo<li><p>[]bar</ol>',

        '<ol><li>foo<ul><li>[]bar</ul></ol>',
        'foo<ol><ol><li>[]bar</ol></ol>',
        'foo<div><ol><li>[]bar</ol></div>',

        'foo<dl><dt>[]bar<dd>baz</dl>',
        'foo<dl><dd>[]bar</dl>',
        '<dl><dt>foo<dd>[]bar</dl>',
        '<dl><dt>foo<dt>[]bar<dd>baz</dl>',
        '<dl><dt>foo<dd>bar<dd>[]baz</dl>',

        '<ol><li>foo</ol>[]bar',
        '<ol><li>foo<br></ol>[]bar',
        '<ol><li>foo<br><br></ol>[]bar',
        '<ol><li><br></ol>[]bar',
        '<ol><li>foo<li><br></ol>[]bar',

        '<ol><li>foo</ol><p>[]bar',
        '<ol><li>foo<br></ol><p>[]bar',
        '<ol><li>foo<br><br></ol><p>[]bar',
        '<ol><li><br></ol><p>[]bar',
        '<ol><li>foo<li><br></ol><p>[]bar',

        '<ol><li>foo</ol>{}<br>',
        '<ol><li>foo<br></ol>{}<br>',
        '<ol><li>foo<br><br></ol>{}<br>',
        '<ol><li><br></ol>{}<br>',
        '<ol><li>foo<li><br></ol>{}<br>',

        '<ol><li>foo</ol><p>{}<br>',
        '<ol><li>foo<br></ol><p>{}<br>',
        '<ol><li>foo<br><br></ol><p>{}<br>',
        '<ol><li><br></ol><p>{}<br>',
        '<ol><li>foo<li><br></ol><p>{}<br>',

        // Indented stuff with collapsed selection
        'foo<blockquote>[]bar</blockquote>',
        'foo<blockquote><blockquote>[]bar</blockquote></blockquote>',
        'foo<blockquote><div>[]bar</div></blockquote>',
        'foo<blockquote style="color: blue">[]bar</blockquote>',

        'foo<blockquote><blockquote><p>[]bar<p>baz</blockquote></blockquote>',
        'foo<blockquote><div><p>[]bar<p>baz</div></blockquote>',
        'foo<blockquote style="color: blue"><p>[]bar<p>baz</blockquote>',

        'foo<blockquote><p><b>[]bar</b><p>baz</blockquote>',
        'foo<blockquote><p><strong>[]bar</strong><p>baz</blockquote>',
        'foo<blockquote><p><span>[]bar</span><p>baz</blockquote>',

        'foo<blockquote><ol><li>[]bar</ol></blockquote><p>extra',
        'foo<blockquote>bar<ol><li>[]baz</ol>quz</blockquote><p>extra',
        'foo<blockquote><ol><li>bar</li><ol><li>[]baz</ol><li>quz</ol></blockquote><p>extra',

        // Invisible stuff with collapsed selection
        'foo<span></span>[]bar',
        'foo<span><span></span></span>[]bar',
        'foo<quasit></quasit>[]bar',
        'foo<br><span></span>[]bar',
        '<span>foo<span></span></span>[]bar',
        'foo<span></span><span>[]bar</span>',
        'foo<div><div><p>[]bar</div></div>',
        'foo<div><div><p><!--abc-->[]bar</div></div>',
        'foo<div><div><!--abc--><p>[]bar</div></div>',
        'foo<div><!--abc--><div><p>[]bar</div></div>',
        'foo<!--abc--><div><div><p>[]bar</div></div>',
        '<div><div><p>foo</div></div>[]bar',
        '<div><div><p>foo</div></div><!--abc-->[]bar',
        '<div><div><p>foo</div><!--abc--></div>[]bar',
        '<div><div><p>foo</p><!--abc--></div></div>[]bar',
        '<div><div><p>foo<!--abc--></div></div>[]bar',
        '<div><div><p>foo</p></div></div><div><div><div>[]bar</div></div></div>',
        '<div><div><p>foo<!--abc--></p></div></div><div><div><div>[]bar</div></div></div>',
        '<div><div><p>foo</p><!--abc--></div></div><div><div><div>[]bar</div></div></div>',
        '<div><div><p>foo</p></div><!--abc--></div><div><div><div>[]bar</div></div></div>',
        '<div><div><p>foo</p></div></div><!--abc--><div><div><div>[]bar</div></div></div>',
        '<div><div><p>foo</p></div></div><div><!--abc--><div><div>[]bar</div></div></div>',
        '<div><div><p>foo</p></div></div><div><div><!--abc--><div>[]bar</div></div></div>',
        '<div><div><p>foo</p></div></div><div><div><div><!--abc-->[]bar</div></div></div>',

        // Styled stuff with collapsed selection
        '<p style=color:blue>foo<p>[]bar',
        '<p style=color:blue>foo<p style=color:brown>[]bar',
        '<p style=color:blue>foo<p style=color:rgba(0,0,255,1)>[]bar',
        '<p style=color:transparent>foo<p style=color:rgba(0,0,0,0)>[]bar',
        '<p>foo<p style=color:brown>[]bar',
        '<p><font color=blue>foo</font><p>[]bar',
        '<p><font color=blue>foo</font><p><font color=brown>[]bar</font>',
        '<p>foo<p><font color=brown>[]bar</font>',
        '<p><span style=color:blue>foo</font><p>[]bar',
        '<p><span style=color:blue>foo</font><p><span style=color:brown>[]bar</font>',
        '<p>foo<p><span style=color:brown>[]bar</font>',

        '<p style=background-color:aqua>foo<p>[]bar',
        '<p style=background-color:aqua>foo<p style=background-color:tan>[]bar',
        '<p>foo<p style=background-color:tan>[]bar',
        '<p><span style=background-color:aqua>foo</font><p>[]bar',
        '<p><span style=background-color:aqua>foo</font><p><span style=background-color:tan>[]bar</font>',
        '<p>foo<p><span style=background-color:tan>[]bar</font>',

        '<p style=text-decoration:underline>foo<p>[]bar',
        '<p style=text-decoration:underline>foo<p style=text-decoration:line-through>[]bar',
        '<p>foo<p style=text-decoration:line-through>[]bar',
        '<p><u>foo</u><p>[]bar',
        '<p><u>foo</u><p><s>[]bar</s>',
        '<p>foo<p><s>[]bar</s>',

        '<p style=color:blue>foo</p>[]bar',
        'foo<p style=color:brown>[]bar',
        '<div style=color:blue><p style=color:green>foo</div>[]bar',
        '<div style=color:blue><p style=color:green>foo</div><p style=color:brown>[]bar',
        '<p style=color:blue>foo<div style=color:brown><p style=color:green>[]bar',

        // Uncollapsed selection
        'foo[bar]baz',
        '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
        '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
        '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
        '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
        '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
        '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
        '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
        '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',

        'foo<b>[bar]</b>baz',
        'foo<b>{bar}</b>baz',
        'foo{<b>bar</b>}baz',
        'foo<span>[bar]</span>baz',
        'foo<span>{bar}</span>baz',
        'foo{<span>bar</span>}baz',
        '<b>foo[bar</b><i>baz]quz</i>',
        '<p>foo</p><p>[bar]</p><p>baz</p>',
        '<p>foo</p><p>{bar}</p><p>baz</p>',
        '<p>foo</p><p>{bar</p>}<p>baz</p>',
        '<p>foo</p>{<p>bar}</p><p>baz</p>',
        '<p>foo</p>{<p>bar</p>}<p>baz</p>',

        '<p>foo[bar<p>baz]quz',
        '<p>foo[bar<div>baz]quz</div>',
        '<p>foo[bar<h1>baz]quz</h1>',
        '<div>foo[bar</div><p>baz]quz',
        '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',

        '<p><b>foo[bar</b><p>baz]quz',
        '<div><p>foo[bar</div><p>baz]quz',
        '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
        '<p>foo[bar<p style=color:blue>baz]quz',
        '<p>foo[bar<p><b>baz]quz</b>',

        '<div><p>foo<p>[bar<p>baz]</div>',

        'foo[<br>]bar',
        '<p>foo[</p><p>]bar</p>',
        '<p>foo[</p><p>]bar<br>baz</p>',
        'foo[<p>]bar</p>',
        'foo{<p>}bar</p>',
        'foo[<p>]bar<br>baz</p>',
        'foo[<p>]bar</p>baz',
        'foo{<p>bar</p>}baz',
        'foo<p>{bar</p>}baz',
        'foo{<p>bar}</p>baz',
        '<p>foo[</p>]bar',
        '<p>foo{</p>}bar',
        '<p>foo[</p>]bar<br>baz',
        '<p>foo[</p>]bar<p>baz</p>',
        'foo[<div><p>]bar</div>',
        '<div><p>foo[</p></div>]bar',
        'foo[<div><p>]bar</p>baz</div>',
        'foo[<div>]bar<p>baz</p></div>',
        '<div><p>foo</p>bar[</div>]baz',
        '<div>foo<p>bar[</p></div>]baz',

        '<p>foo<br>{</p>]bar',
        '<p>foo<br><br>{</p>]bar',
        'foo<br>{<p>]bar</p>',
        'foo<br><br>{<p>]bar</p>',
        '<p>foo<br>{</p><p>}bar</p>',
        '<p>foo<br><br>{</p><p>}bar</p>',

        '<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>',
        '<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
        '<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
        '<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>',
        '<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>',
        '<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>',
        '{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}',
        '<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>',
        '<p>fo[o<table><tr><td>b]ar</table><p>baz',
        '<p>foo<table><tr><td>ba[r</table><p>b]az',
        '<p>fo[o<table><tr><td>bar</table><p>b]az',

        '<p>foo<ol><li>ba[r<li>b]az</ol><p>quz',
        '<p>foo<ol><li>bar<li>[baz]</ol><p>quz',
        '<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz',
        '<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz',
        '<p>fo[o<ol><li>bar<li>b]az</ol><p>quz',
        '<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz',

        '<ol><li>fo[o</ol><ol><li>b]ar</ol>',
        '<ol><li>fo[o</ol><ul><li>b]ar</ul>',

        'foo[<ol><li>]bar</ol>',
        '<ol><li>foo[<li>]bar</ol>',
        'foo[<dl><dt>]bar<dd>baz</dl>',
        'foo[<dl><dd>]bar</dl>',
        '<dl><dt>foo[<dd>]bar</dl>',
        '<dl><dt>foo[<dt>]bar<dd>baz</dl>',
        '<dl><dt>foo<dd>bar[<dd>]baz</dl>',

        '<b>foo [ </b>bar]',
        'foo<b> [ bar]</b>',
        '<b>[foo ] </b>bar',
        '[foo<b> ] bar</b>',

        // Do we merge based on element names or the display property?
        '<p style=display:inline>fo[o<p style=display:inline>b]ar',
        '<span style=display:block>fo[o</span><span style=display:block>b]ar</span>',
        '<span style=display:inline-block>fo[o</span><span style=display:inline-block>b]ar</span>',
        '<span style=display:inline-table>fo[o</span><span style=display:inline-table>b]ar</span>',
        '<span style=display:none>fo[o</span><span style=display:none>b]ar</span>',
        '<quasit style=display:block>fo[o</quasit><quasit style=display:block>b]ar</quasit>',

        // https://bugs.webkit.org/show_bug.cgi?id=35281
        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13976
        '<ol><li>foo</ol>{}<br><ol><li>bar</ol>',
        '<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>',
        '<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>',
        '<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>',
        '<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
        '<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
        '<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>',
        // Broken test: http://www.w3.org/Bugs/Public/show_bug.cgi?id=14727
        '!<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>',
        '<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>',
        '<ol><li>foo[</ol>bar]<ol><li>baz</ol>',
        '<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>',
        '<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>',
        '<ol><li>foo[]</ol><ol><li>bar</ol>',
        '<ol><li>foo</ol>[bar<ol><li>]baz</ol>',
        '<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>',
        '<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>',
        '<ol><li>foo</ol><ol><li>b[]ar</ol>',
        '<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>',
        '<ul><li>foo</ul>{}<br><ul><li>bar</ul>',
        '<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>',
        '<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>',
        '<ol><li>foo</ol>{}<br><ul><li>bar</ul>',
        '<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>',
        '<ul><li>foo</ul>{}<br><ol><li>bar</ol>',
        '<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>',

        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13831
        '<p><b>[foo]</b>',
        '<p><quasit>[foo]</quasit>',
        '<p><b><i>[foo]</i></b>',
        '<p><b>{foo}</b>',
        '<p>{<b>foo</b>}',
        '<p><b>f[]</b>',
        '<b>[foo]</b>',
        '<div><b>[foo]</b></div>',
    ],
    //@}
    fontname: [
    //@{
        'foo[]bar',
        '<p>[foo</p> <p>bar]</p>',
        '<span>[foo</span> <span>bar]</span>',
        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
        '<p>[foo<p><br><p>bar]',
        '<b>foo[]bar</b>',
        '<i>foo[]bar</i>',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        'foo[bar]baz',
        'foo[bar<b>baz]qoz</b>quz',
        'foo[bar<i>baz]qoz</i>quz',
        '{<p><p> <p>foo</p>}',

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
        '{<table><tr><td>foo<td>bar<td>baz</table>}',

        'foo<code>[bar]</code>baz',
        'foo<kbd>[bar]</kbd>baz',
        'foo<listing>[bar]</listing>baz',
        'foo<pre>[bar]</pre>baz',
        'foo<samp>[bar]</samp>baz',
        'foo<tt>[bar]</tt>baz',

        'foo<code>b[a]r</code>baz',
        'foo<kbd>b[a]r</kbd>baz',
        'foo<listing>b[a]r</listing>baz',
        'foo<pre>b[a]r</pre>baz',
        'foo<samp>b[a]r</samp>baz',
        'foo<tt>b[a]r</tt>baz',

        '[foo<code>bar</code>baz]',
        '[foo<kbd>bar</kbd>baz]',
        '[foo<listing>bar</listing>baz]',
        '[foo<pre>bar</pre>baz]',
        '[foo<samp>bar</samp>baz]',
        '[foo<tt>bar</tt>baz]',

        '[foo<code>ba]r</code>baz',
        '[foo<kbd>ba]r</kbd>baz',
        '[foo<listing>ba]r</listing>baz',
        '[foo<pre>ba]r</pre>baz',
        '[foo<samp>ba]r</samp>baz',
        '[foo<tt>ba]r</tt>baz',

        'foo<code>b[ar</code>baz]',
        'foo<kbd>b[ar</kbd>baz]',
        'foo<listing>b[ar</listing>baz]',
        'foo<pre>b[ar</pre>baz]',
        'foo<samp>b[ar</samp>baz]',
        'foo<tt>b[ar</tt>baz]',

        'foo<span style="font-family: sans-serif">[bar]</span>baz',
        'foo<span style="font-family: sans-serif">b[a]r</span>baz',
        'foo<span style="font-family: monospace">[bar]</span>baz',
        'foo<span style="font-family: monospace">b[a]r</span>baz',

        'foo<tt contenteditable=false>ba[r</tt>b]az',
        'fo[o<tt contenteditable=false>b]ar</tt>baz',
        'foo<tt>{}<br></tt>bar',
        'foo<tt>{<br></tt>}bar',
        'foo<tt>{<br></tt>b]ar',

        // Tests for queryCommandIndeterm() and queryCommandState()
        'fo[o<span style=font-family:monospace>b]ar</span>baz',
        'foo<span style=font-family:monospace>ba[r</span>b]az',
        'fo[o<span style=font-family:monospace>bar</span>b]az',
        'foo[<span style=font-family:monospace>b]ar</span>baz',
        'foo<span style=font-family:monospace>ba[r</span>]baz',
        'foo[<span style=font-family:monospace>bar</span>]baz',
        'foo<span style=font-family:monospace>[bar]</span>baz',
        'foo{<span style=font-family:monospace>bar</span>}baz',
        'fo[o<code>b]ar</code>',
        'fo[o<kbd>b]ar</kbd>',
        'fo[o<listing>b]ar</listing>',
        'fo[o<pre>b]ar</pre>',
        'fo[o<samp>b]ar</samp>',
        'fo[o<tt>b]ar</tt>',
        '<tt>fo[o</tt><code>b]ar</code>',
        '<pre>fo[o</pre><samp>b]ar</samp>',
        '<span style=font-family:monospace>fo[o</span><kbd>b]ar</kbd>',
    ],
    //@}
    fontsize: [
    //@{
        'foo[]bar',
        '<p>[foo</p> <p>bar]</p>',
        '<span>[foo</span> <span>bar]</span>',
        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
        '<p>[foo<p><br><p>bar]',
        '<b>foo[]bar</b>',
        '<i>foo[]bar</i>',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        'foo[bar]baz',
        'foo[bar<b>baz]qoz</b>quz',
        'foo[bar<i>baz]qoz</i>quz',
        '{<p><p> <p>foo</p>}',

        ["1", 'foo[bar]baz'],
        ["0", 'foo[bar]baz'],
        ["-5", 'foo[bar]baz'],
        ["6", 'foo[bar]baz'],
        ["7", 'foo[bar]baz'],
        ["8", 'foo[bar]baz'],
        ["100", 'foo[bar]baz'],
        ["2em", 'foo[bar]baz'],
        ["20pt", 'foo[bar]baz'],
        ["xx-large", 'foo[bar]baz'],
        [" 1 ", 'foo[bar]baz'],
        ["1.", 'foo[bar]baz'],
        ["1.0", 'foo[bar]baz'],
        ["1.0e2", 'foo[bar]baz'],
        ["1.1", 'foo[bar]baz'],
        ["1.9", 'foo[bar]baz'],
        ["+0", 'foo[bar]baz'],
        ["+1", 'foo[bar]baz'],
        ["+9", 'foo[bar]baz'],
        ["-0", 'foo[bar]baz'],
        ["-1", 'foo[bar]baz'],
        ["-9", 'foo[bar]baz'],
        ["", 'foo[bar]baz'],

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
        '{<table><tr><td>foo<td>bar<td>baz</table>}',

        'foo<font size=1>[bar]</font>baz',
        '<font size=1>foo[bar]baz</font>',
        'foo<font size=3>[bar]</font>baz',
        '<font size=3>foo[bar]baz</font>',
        'foo<font size=4>[bar]</font>baz',
        '<font size=4>foo[bar]baz</font>',
        'foo<font size=+1>[bar]</font>baz',
        '<font size=+1>foo[bar]baz</font>',
        '<font size=4>foo<font size=1>b[a]r</font>baz</font>',

        'foo<span style="font-size: xx-small">[bar]</span>baz',
        '<span style="font-size: xx-small">foo[bar]baz</span>',
        'foo<span style="font-size: medium">[bar]</span>baz',
        '<span style="font-size: medium">foo[bar]baz</span>',
        'foo<span style="font-size: large">[bar]</span>baz',
        '<span style="font-size: large">foo[bar]baz</span>',
        '<span style="font-size: large">foo<span style="font-size: xx-small">b[a]r</span>baz</span>',

        'foo<span style="font-size: 2em">[bar]</span>baz',
        '<span style="font-size: 2em">foo[bar]baz</span>',

        '<p style="font-size: xx-small">foo[bar]baz</p>',
        '<p style="font-size: medium">foo[bar]baz</p>',
        '<p style="font-size: large">foo[bar]baz</p>',
        '<p style="font-size: 2em">foo[bar]baz</p>',

        ["3", '<p style="font-size: xx-small">foo[bar]baz</p>'],
        ["3", '<p style="font-size: medium">foo[bar]baz</p>'],
        ["3", '<p style="font-size: large">foo[bar]baz</p>'],
        ["3", '<p style="font-size: 2em">foo[bar]baz</p>'],

        // Minor algorithm bug: this changes the size of the "b" and "r" in
        // "bar" when we pull down styles
        ["3", '<font size=6>foo <span style="font-size: 2em">b[a]r</span> baz</font>'],

        ["3", 'foo<big>[bar]</big>baz'],
        ["3", 'foo<big>b[a]r</big>baz'],
        ["3", 'foo<small>[bar]</small>baz'],
        ["3", 'foo<small>b[a]r</small>baz'],

        // Tests for queryCommandIndeterm() and queryCommandState()
        'fo[o<font size=2>b]ar</font>baz',
        'foo<font size=2>ba[r</font>b]az',
        'fo[o<font size=2>bar</font>b]az',
        'foo[<font size=2>b]ar</font>baz',
        'foo<font size=2>ba[r</font>]baz',
        'foo[<font size=2>bar</font>]baz',
        'foo<font size=2>[bar]</font>baz',
        'foo{<font size=2>bar</font>}baz',
        '<font size=1>fo[o</font><span style=font-size:xx-small>b]ar</span>',
        '<font size=2>fo[o</font><span style=font-size:small>b]ar</span>',
        '<font size=3>fo[o</font><span style=font-size:medium>b]ar</span>',
        '<font size=4>fo[o</font><span style=font-size:large>b]ar</span>',
        '<font size=5>fo[o</font><span style=font-size:x-large>b]ar</span>',
        '<font size=6>fo[o</font><span style=font-size:xx-large>b]ar</span>',

        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13829
        ["!6", '<span style=background-color:aqua>[foo]</span>'],
        ["!6", '<span style=background-color:aqua>foo[bar]baz</span>'],
        ["!6", '[foo<span style=background-color:aqua>bar</span>baz]'],
    ],
    //@}
    forecolor: [
    //@{
        'foo[]bar',
        '<p>[foo</p> <p>bar]</p>',
        '<span>[foo</span> <span>bar]</span>',
        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
        '<p>[foo<p><br><p>bar]',
        '<b>foo[]bar</b>',
        '<i>foo[]bar</i>',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        'foo[bar]baz',
        'foo[bar<b>baz]qoz</b>quz',
        'foo[bar<i>baz]qoz</i>quz',
        '{<p><p> <p>foo</p>}',

        ['blue', 'foo[bar]baz'],
        ['f', 'foo[bar]baz'],
        ['#f', 'foo[bar]baz'],
        ['00f', 'foo[bar]baz'],
        ['#00f', 'foo[bar]baz'],
        ['0000ff', 'foo[bar]baz'],
        ['#0000ff', 'foo[bar]baz'],
        ['000000fff', 'foo[bar]baz'],
        ['#000000fff', 'foo[bar]baz'],
        ['rgb(0, 0, 255)', 'foo[bar]baz'],
        ['rgb(0%, 0%, 100%)', 'foo[bar]baz'],
        ['rgb( 0 ,0 ,255)', 'foo[bar]baz'],
        ['rgba(0, 0, 255, 0.0)', 'foo[bar]baz'],
        ['rgb(15, -10, 375)', 'foo[bar]baz'],
        ['rgba(0, 0, 0, 1)', 'foo[bar]baz'],
        ['rgba(255, 255, 255, 1)', 'foo[bar]baz'],
        ['rgba(0, 0, 255, 0.5)', 'foo[bar]baz'],
        ['hsl(240, 100%, 50%)', 'foo[bar]baz'],
        ['cornsilk', 'foo[bar]baz'],
        ['potato quiche', 'foo[bar]baz'],
        ['transparent', 'foo[bar]baz'],
        ['currentColor', 'foo[bar]baz'],

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
        '{<table><tr><td>foo<td>bar<td>baz</table>}',

        'foo<font color=blue>[bar]</font>baz',
        'foo{<font color=blue>bar</font>}baz',
        '<span style="color: blue">foo<span style="color: brown">[bar]</span>baz</span>',
        '<span style="color: #00f">foo<span style="color: brown">[bar]</span>baz</span>',
        '<span style="color: #0000ff">foo<span style="color: brown">[bar]</span>baz</span>',
        '<span style="color: rgb(0, 0, 255)">foo<span style="color: brown">[bar]</span>baz</span>',
        '<font color=blue>foo<font color=brown>[bar]</font>baz</font>',
        '<span style="color: rgb(0, 0, 255)">foo<span style="color: brown">b[ar]</span>baz</span>',
        'foo<span id=purple>ba[r</span>ba]z',
        '<span style="color: rgb(0, 0, 255)">foo<span id=purple>b[a]r</span>baz</span>',

        ['blue', '<a href=http://www.google.com>foo[bar]baz</a>'],
        ['#0000ff', '<a href=http://www.google.com>foo[bar]baz</a>'],
        ['rgb(0,0,255)', '<a href=http://www.google.com>foo[bar]baz</a>'],

        // Tests for queryCommandValue()
        '<font color="blue">[foo]</font>',
        '<font color="0000ff">[foo]</font>',
        '<font color="#0000ff">[foo]</font>',
        '<span style="color: blue">[foo]</span>',
        '<span style="color: #0000ff">[foo]</span>',
        '<span style="color: rgb(0, 0, 255)">[foo]</span>',
        '<span style="color: rgb(0%, 0%, 100%)">[foo]</span>',
        '<span style="color: rgb( 0 ,0 ,255)">[foo]</span>',
        '<span style="color: rgba(0, 0, 255, 0.0)">[foo]</span>',
        '<span style="color: rgb(15, -10, 375)">[foo]</span>',
        '<span style="color: rgba(0, 0, 0, 1)">[foo]</span>',
        '<span style="color: rgba(255, 255, 255, 1)">[foo]</span>',
        '<span style="color: rgba(0, 0, 255, 0.5)">[foo]</span>',
        '<span style="color: hsl(240, 100%, 50%)">[foo]</span>',
        '<span style="color: cornsilk">[foo]</span>',
        '<span style="color: transparent">[foo]</span>',
        '<span style="color: currentColor">[foo]</span>',

        // Tests for queryCommandIndeterm() and queryCommandState()
        'fo[o<font color=brown>b]ar</font>baz',
        'foo<font color=brown>ba[r</font>b]az',
        'fo[o<font color=brown>bar</font>b]az',
        'foo[<font color=brown>b]ar</font>baz',
        'foo<font color=brown>ba[r</font>]baz',
        'foo[<font color=brown>bar</font>]baz',
        'foo<font color=brown>[bar]</font>baz',
        'foo{<font color=brown>bar</font>}baz',
        '<font color=brown>fo[o</font><span style=color:brown>b]ar</span>',
        '<span style=color:brown>fo[o</span><span style=color:#0000ff>b]ar</span>',
    ],
    //@}
    formatblock: [
    //@{
        'foo[]bar<p>extra',
        '<span>foo</span>{}<span>bar</span><p>extra',
        '<span>foo[</span><span>]bar</span><p>extra',
        'foo[bar]baz<p>extra',
        'foo]bar[baz<p>extra',
        '{<p><p> <p>foo</p>}',
        'foo[bar<i>baz]qoz</i>quz<p>extra',

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
        '{<table><tr><td>foo<td>bar<td>baz</table>}',

        '<div>[foobar]</div>',
        '<p>[foobar]</p>',
        '<blockquote>[foobar]</blockquote>',
        '<h1>[foobar]</h1>',
        '<h2>[foobar]</h2>',
        '<h3>[foobar]</h3>',
        '<h4>[foobar]</h4>',
        '<h5>[foobar]</h5>',
        '<h6>[foobar]</h6>',
        '<dl><dt>[foo]<dd>bar</dl>',
        '<dl><dt>foo<dd>[bar]</dl>',
        '<dl><dt>[foo<dd>bar]</dl>',
        '<ol><li>[foobar]</ol>',
        '<ul><li>[foobar]</ul>',
        '<address>[foobar]</address>',
        '<pre>[foobar]</pre>',
        '<article>[foobar]</article>',
        '<ins>[foobar]</ins>',
        '<del>[foobar]</del>',
        '<quasit>[foobar]</quasit>',
        '<quasit style="display: block">[foobar]</quasit>',

        ['<p>', 'foo[]bar<p>extra'],
        ['<p>', '<span>foo</span>{}<span>bar</span><p>extra'],
        ['<p>', '<span>foo[</span><span>]bar</span><p>extra'],
        ['<p>', 'foo[bar]baz<p>extra'],
        ['<p>', 'foo]bar[baz<p>extra'],
        ['<p>', '{<p><p> <p>foo</p>}'],
        ['<p>', 'foo[bar<i>baz]qoz</i>quz<p>extra'],

        ['<p>', '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>'],
        ['<p>', '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>'],
        ['<p>', '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>'],
        ['<p>', '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>'],
        ['<p>', '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>'],
        ['<p>', '{<table><tr><td>foo<td>bar<td>baz</table>}'],

        ['<p>', '<div>[foobar]</div>'],
        ['<p>', '<p>[foobar]</p>'],
        ['<p>', '<blockquote>[foobar]</blockquote>'],
        ['<p>', '<h1>[foobar]</h1>'],
        ['<p>', '<h2>[foobar]</h2>'],
        ['<p>', '<h3>[foobar]</h3>'],
        ['<p>', '<h4>[foobar]</h4>'],
        ['<p>', '<h5>[foobar]</h5>'],
        ['<p>', '<h6>[foobar]</h6>'],
        ['<p>', '<dl><dt>[foo]<dd>bar</dl>'],
        ['<p>', '<dl><dt>foo<dd>[bar]</dl>'],
        ['<p>', '<dl><dt>[foo<dd>bar]</dl>'],
        ['<p>', '<ol><li>[foobar]</ol>'],
        ['<p>', '<ul><li>[foobar]</ul>'],
        ['<p>', '<address>[foobar]</address>'],
        ['<p>', '<pre>[foobar]</pre>'],
        ['<p>', '<listing>[foobar]</listing>'],
        ['<p>', '<xmp>[foobar]</xmp>'],
        ['<p>', '<article>[foobar]</article>'],
        ['<p>', '<ins>[foobar]</ins>'],
        ['<p>', '<del>[foobar]</del>'],
        ['<p>', '<quasit>[foobar]</quasit>'],
        ['<p>', '<quasit style="display: block">[foobar]</quasit>'],

        ['<blockquote>', '<blockquote>[foo]</blockquote><p>extra'],
        ['<blockquote>', '<blockquote><p>[foo]<p>bar</blockquote><p>extra'],
        ['<blockquote>', '[foo]<blockquote>bar</blockquote><p>extra'],
        ['<blockquote>', '<p>[foo<p>bar]<p>baz'],
        ['<blockquote>', '<section>[foo]</section>'],
        ['<blockquote>', '<section><p>[foo]</section>'],
        ['<blockquote>', '<section><hgroup><h1>[foo]</h1><h2>bar</h2></hgroup><p>baz</section>'],
        ['<article>', '<section>[foo]</section>'],

        ['<address>', '<div>[foobar]</div>'],
        ['<article>', '<div>[foobar]</div>'],
        ['<blockquote>', '<div>[foobar]</div>'],
        ['<dd>', '<div>[foobar]</div>'],
        ['<del>', '<div>[foobar]</div>'],
        ['<dl>', '<div>[foobar]</div>'],
        ['<dt>', '<div>[foobar]</div>'],
        ['<h1>', '<div>[foobar]</div>'],
        ['<h2>', '<div>[foobar]</div>'],
        ['<h3>', '<div>[foobar]</div>'],
        ['<h4>', '<div>[foobar]</div>'],
        ['<h5>', '<div>[foobar]</div>'],
        ['<h6>', '<div>[foobar]</div>'],
        ['<ins>', '<div>[foobar]</div>'],
        ['<li>', '<div>[foobar]</div>'],
        ['<ol>', '<div>[foobar]</div>'],
        ['<pre>', '<div>[foobar]</div>'],
        ['<ul>', '<div>[foobar]</div>'],
        ['<quasit>', '<div>[foobar]</div>'],

        ['<address>', '<p>[foobar]</p>'],
        ['<article>', '<p>[foobar]</p>'],
        ['<aside>', '<p>[foobar]</p>'],
        ['<blockquote>', '<p>[foobar]</p>'],
        ['<body>', '<p>[foobar]</p>'],
        ['<dd>', '<p>[foobar]</p>'],
        ['<del>', '<p>[foobar]</p>'],
        ['<details>', '<p>[foobar]</p>'],
        ['<dir>', '<p>[foobar]</p>'],
        ['<dl>', '<p>[foobar]</p>'],
        ['<dt>', '<p>[foobar]</p>'],
        ['<fieldset>', '<p>[foobar]</p>'],
        ['<figcaption>', '<p>[foobar]</p>'],
        ['<figure>', '<p>[foobar]</p>'],
        ['<footer>', '<p>[foobar]</p>'],
        ['<form>', '<p>[foobar]</p>'],
        ['<h1>', '<p>[foobar]</p>'],
        ['<h2>', '<p>[foobar]</p>'],
        ['<h3>', '<p>[foobar]</p>'],
        ['<h4>', '<p>[foobar]</p>'],
        ['<h5>', '<p>[foobar]</p>'],
        ['<h6>', '<p>[foobar]</p>'],
        ['<header>', '<p>[foobar]</p>'],
        ['<head>', '<p>[foobar]</p>'],
        ['<hgroup>', '<p>[foobar]</p>'],
        ['<hr>', '<p>[foobar]</p>'],
        ['<html>', '<p>[foobar]</p>'],
        ['<ins>', '<p>[foobar]</p>'],
        ['<li>', '<p>[foobar]</p>'],
        ['<listing>', '<p>[foobar]</p>'],
        ['<menu>', '<p>[foobar]</p>'],
        ['<nav>', '<p>[foobar]</p>'],
        ['<ol>', '<p>[foobar]</p>'],
        ['<plaintext>', '<p>[foobar]</p>'],
        ['<pre>', '<p>[foobar]</p>'],
        ['<section>', '<p>[foobar]</p>'],
        ['<ul>', '<p>[foobar]</p>'],
        ['<xmp>', '<p>[foobar]</p>'],
        ['<quasit>', '<p>[foobar]</p>'],

        ['<address>', '<p>[foo<p>bar]'],
        ['<article>', '<p>[foo<p>bar]'],
        ['<aside>', '<p>[foo<p>bar]'],
        ['<blockquote>', '<p>[foo<p>bar]'],
        ['<body>', '<p>[foo<p>bar]'],
        ['<dd>', '<p>[foo<p>bar]'],
        ['<del>', '<p>[foo<p>bar]'],
        ['<details>', '<p>[foo<p>bar]'],
        ['<dir>', '<p>[foo<p>bar]'],
        ['<div>', '<p>[foo<p>bar]'],
        ['<dl>', '<p>[foo<p>bar]'],
        ['<dt>', '<p>[foo<p>bar]'],
        ['<fieldset>', '<p>[foo<p>bar]'],
        ['<figcaption>', '<p>[foo<p>bar]'],
        ['<figure>', '<p>[foo<p>bar]'],
        ['<footer>', '<p>[foo<p>bar]'],
        ['<form>', '<p>[foo<p>bar]'],
        ['<h1>', '<p>[foo<p>bar]'],
        ['<h2>', '<p>[foo<p>bar]'],
        ['<h3>', '<p>[foo<p>bar]'],
        ['<h4>', '<p>[foo<p>bar]'],
        ['<h5>', '<p>[foo<p>bar]'],
        ['<h6>', '<p>[foo<p>bar]'],
        ['<header>', '<p>[foo<p>bar]'],
        ['<head>', '<p>[foo<p>bar]'],
        ['<hgroup>', '<p>[foo<p>bar]'],
        ['<hr>', '<p>[foo<p>bar]'],
        ['<html>', '<p>[foo<p>bar]'],
        ['<ins>', '<p>[foo<p>bar]'],
        ['<li>', '<p>[foo<p>bar]'],
        ['<listing>', '<p>[foo<p>bar]'],
        ['<menu>', '<p>[foo<p>bar]'],
        ['<nav>', '<p>[foo<p>bar]'],
        ['<ol>', '<p>[foo<p>bar]'],
        ['<p>', '<p>[foo<p>bar]'],
        ['<plaintext>', '<p>[foo<p>bar]'],
        ['<pre>', '<p>[foo<p>bar]'],
        ['<section>', '<p>[foo<p>bar]'],
        ['<ul>', '<p>[foo<p>bar]'],
        ['<xmp>', '<p>[foo<p>bar]'],
        ['<quasit>', '<p>[foo<p>bar]'],

        ['p', '<div>[foobar]</div>'],

        '<ol><li>[foo]<li>bar</ol>',

        ['<p>', '<h1>[foo]<br>bar</h1>'],
        ['<p>', '<h1>foo<br>[bar]</h1>'],
        ['<p>', '<h1>[foo<br>bar]</h1>'],
        ['<address>', '<h1>[foo]<br>bar</h1>'],
        ['<address>', '<h1>foo<br>[bar]</h1>'],
        ['<address>', '<h1>[foo<br>bar]</h1>'],
        ['<pre>', '<h1>[foo]<br>bar</h1>'],
        ['<pre>', '<h1>foo<br>[bar]</h1>'],
        ['<pre>', '<h1>[foo<br>bar]</h1>'],
        ['<h2>', '<h1>[foo]<br>bar</h1>'],
        ['<h2>', '<h1>foo<br>[bar]</h1>'],
        ['<h2>', '<h1>[foo<br>bar]</h1>'],

        ['<h1>', '<p>[foo]<br>bar</p>'],
        ['<h1>', '<p>foo<br>[bar]</p>'],
        ['<h1>', '<p>[foo<br>bar]</p>'],
        ['<address>', '<p>[foo]<br>bar</p>'],
        ['<address>', '<p>foo<br>[bar]</p>'],
        ['<address>', '<p>[foo<br>bar]</p>'],
        ['<pre>', '<p>[foo]<br>bar</p>'],
        ['<pre>', '<p>foo<br>[bar]</p>'],
        ['<pre>', '<p>[foo<br>bar]</p>'],

        ['<p>', '<address>[foo]<br>bar</address>'],
        ['<p>', '<address>foo<br>[bar]</address>'],
        ['<p>', '<address>[foo<br>bar]</address>'],
        ['<pre>', '<address>[foo]<br>bar</address>'],
        ['<pre>', '<address>foo<br>[bar]</address>'],
        ['<pre>', '<address>[foo<br>bar]</address>'],
        ['<h1>', '<address>[foo]<br>bar</address>'],
        ['<h1>', '<address>foo<br>[bar]</address>'],
        ['<h1>', '<address>[foo<br>bar]</address>'],

        ['<p>', '<pre>[foo]<br>bar</pre>'],
        ['<p>', '<pre>foo<br>[bar]</pre>'],
        ['<p>', '<pre>[foo<br>bar]</pre>'],
        ['<address>', '<pre>[foo]<br>bar</pre>'],
        ['<address>', '<pre>foo<br>[bar]</pre>'],
        ['<address>', '<pre>[foo<br>bar]</pre>'],
        ['<h1>', '<pre>[foo]<br>bar</pre>'],
        ['<h1>', '<pre>foo<br>[bar]</pre>'],
        ['<h1>', '<pre>[foo<br>bar]</pre>'],

        ['<h1>', '<p>[foo</p>bar]'],
        ['<h1>', '[foo<p>bar]</p>'],
        ['<p>', '<div>[foo<p>bar]</p></div>'],
        ['<p>', '<xmp>[foo]</xmp>'],
        ['<div>', '<xmp>[foo]</xmp>'],

        '<div><ol><li>[foo]</ol></div>',
        '<div><table><tr><td>[foo]</table></div>',
        '<p>[foo<h1>bar]</h1>',
        '<h1>[foo</h1><h2>bar]</h2>',
        '<div>[foo</div>bar]',

        // https://bugs.webkit.org/show_bug.cgi?id=47054
        ['<p>', '<div style=color:blue>[foo]</div>'],
        // https://bugs.webkit.org/show_bug.cgi?id=47574
        ['<h1>', '{<p>foo</p>ba]r'],
        ['<pre>', ' [foo<p>bar]</p>'],
        // From https://bugs.webkit.org/show_bug.cgi?id=47300
        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14009
        ['!<p>', '{<pre> foo bar </pre>}'],
    ],
    //@}
    forwarddelete: [
    //@{
        // Collapsed selection
        'foo[]',
        '<span>foo[]</span>',
        '<p>foo[]</p>',
        'foo[]bar',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        'foo[]<span style=display:none>bar</span>baz',
        'foo[]<script>bar</script>baz',
        'fo[]öbar',
        'fo[]öbar',
        'fo[]ö̧bar',
        '[]öbar',
        '[]öbar',
        '[]ö̧bar',

        '[]שָׁלוֹם',
        'שָׁל[]וֹם',

        '<p>foo[]</p><p>bar</p>',
        '<p>foo[]</p>bar',
        'foo[]<p>bar</p>',
        '<p>foo[]<br></p><p>bar</p>',
        '<p>foo[]<br></p>bar',
        'foo[]<br><p>bar</p>',

        '<p>{}<br></p>foo',
        '<p>{}<span><br></span></p>foo',
        'foo{}<p><br>',
        'foo{}<p><span><br></span>',
        'foo{}<br><p><br>',
        'foo{}<span><br></span><p><br>',
        'foo{}<br><p><span><br></span>',
        'foo{}<span><br></span><p><span><br></span>',
        'foo{}<p>',
        '<table><tr><td>{}</table>foo',
        '<table><tr><td>{}<br></table>foo',
        '<table><tr><td>{}<span><br></span></table>foo',

        '<div><p>foo[]</p></div><p>bar</p>',
        '<p>foo[]</p><div><p>bar</p></div>',
        '<div><p>foo[]</p></div><div><p>bar</p></div>',
        '<div><p>foo[]</p></div>bar',
        'foo[]<div><p>bar</p></div>',

        '<div>foo[]</div><div>bar</div>',
        '<pre>foo[]</pre>bar',

        'foo[]<br>bar',
        '<b>foo[]</b><br>bar',
        'foo[]<hr>bar',
        '<p>foo[]<hr><p>bar',
        '<p>foo[]</p><br><p>bar</p>',
        '<p>foo[]</p><br><br><p>bar</p>',
        '<p>foo[]</p><img src=/img/lion.svg><p>bar',
        'foo[]<img src=/img/lion.svg>bar',

        'foo[]<a>bar</a>',
        'foo[]<a href=/>bar</a>',
        'foo[]<a name=abc>bar</a>',
        'foo[]<a href=/ name=abc>bar</a>',
        'foo[]<span><a>bar</a></span>',
        'foo[]<span><a href=/>bar</a></span>',
        'foo[]<span><a name=abc>bar</a></span>',
        'foo[]<span><a href=/ name=abc>bar</a></span>',
        '<a>foo[]</a>bar',
        '<a href=/>foo[]</a>bar',
        '<a name=abc>foo[]</a>bar',
        '<a href=/ name=abc>foo[]</a>bar',

        'foo [] ',
        '[]  foo',
        'foo[]  bar',
        'foo[]  bar',
        'foo[]  bar',
        'foo[]  bar',
        'foo[]   bar',
        'foo []  bar',
        'foo  [] bar',
        'foo[] <span> </span> bar',
        'foo []<span> </span> bar',
        'foo <span> </span>[] bar',
        '<b>foo[] </b> bar',
        '<b>foo[] </b> bar',
        '<b>foo[] </b> bar',
        '<b>foo[] </b> bar',

        '<pre>foo [] </pre>',
        '<pre>[]  foo</pre>',
        '<pre>foo[]  bar</pre>',
        '<pre>foo[]  bar</pre>',
        '<pre>foo[]  bar</pre>',

        '<div style=white-space:pre>foo [] </div>',
        '<div style=white-space:pre>[]  foo</div>',
        '<div style=white-space:pre>foo[]  bar</div>',
        '<div style=white-space:pre>foo[]  bar</div>',
        '<div style=white-space:pre>foo[]  bar</div>',

        '<div style=white-space:pre-wrap>foo [] </div>',
        '<div style=white-space:pre-wrap>[]  foo</div>',
        '<div style=white-space:pre-wrap>foo[]  bar</div>',
        '<div style=white-space:pre-wrap>foo[]  bar</div>',
        '<div style=white-space:pre-wrap>foo[]  bar</div>',

        '<div style=white-space:pre-line>foo [] </div>',
        '<div style=white-space:pre-line>[]  foo</div>',
        '<div style=white-space:pre-line>foo[]  bar</div>',
        '<div style=white-space:pre-line>foo[]  bar</div>',
        '<div style=white-space:pre-line>foo[]  bar</div>',

        '<div style=white-space:nowrap>foo [] </div>',
        '<div style=white-space:nowrap>[]  foo</div>',
        '<div style=white-space:nowrap>foo[]  bar</div>',
        '<div style=white-space:nowrap>foo[]  bar</div>',
        '<div style=white-space:nowrap>foo[]  bar</div>',

        // Tables with collapsed selection
        'foo[]<table><tr><td>bar</table>baz',
        'foo<table><tr><td>bar[]</table>baz',
        '<p>foo[]<table><tr><td>bar</table><p>baz',
        '<table><tr><td>foo[]<td>bar</table>',
        '<table><tr><td>foo[]<tr><td>bar</table>',

        'foo[]<br><table><tr><td>bar</table>baz',
        'foo<table><tr><td>bar[]<br></table>baz',
        '<p>foo[]<br><table><tr><td>bar</table><p>baz',
        '<p>foo<table><tr><td>bar[]<br></table><p>baz',
        '<table><tr><td>foo[]<br><td>bar</table>',
        '<table><tr><td>foo[]<br><tr><td>bar</table>',

        'foo<table><tr><td>bar[]</table><br>baz',
        'foo[]<table><tr><td><hr>bar</table>baz',
        '<table><tr><td>foo[]<td><hr>bar</table>',
        '<table><tr><td>foo[]<tr><td><hr>bar</table>',

        // Lists with collapsed selection
        'foo[]<ol><li>bar<li>baz</ol>',
        'foo[]<br><ol><li>bar<li>baz</ol>',
        '<ol><li>foo[]<li>bar</ol>',
        '<ol><li>foo[]<br><li>bar</ol>',
        '<ol><li>foo[]<li>bar<br>baz</ol>',

        '<ol><li><p>foo[]<li>bar</ol>',
        '<ol><li>foo[]<li><p>bar</ol>',
        '<ol><li><p>foo[]<li><p>bar</ol>',

        '<ol><li>foo[]<ul><li>bar</ul></ol>',
        'foo[]<ol><ol><li>bar</ol></ol>',
        'foo[]<div><ol><li>bar</ol></div>',

        'foo[]<dl><dt>bar<dd>baz</dl>',
        'foo[]<dl><dd>bar</dl>',
        '<dl><dt>foo[]<dd>bar</dl>',
        '<dl><dt>foo[]<dt>bar<dd>baz</dl>',
        '<dl><dt>foo<dd>bar[]<dd>baz</dl>',

        '<ol><li>foo[]</ol>bar',
        '<ol><li>foo[]<br></ol>bar',
        '<ol><li>{}<br></ol>bar',
        '<ol><li>foo<li>{}<br></ol>bar',

        '<ol><li>foo[]</ol><p>bar',
        '<ol><li>foo[]<br></ol><p>bar',
        '<ol><li>{}<br></ol><p>bar',
        '<ol><li>foo<li>{}<br></ol><p>bar',

        '<ol><li>foo[]</ol><br>',
        '<ol><li>foo[]<br></ol><br>',
        '<ol><li>{}<br></ol><br>',
        '<ol><li>foo<li>{}<br></ol><br>',

        '<ol><li>foo[]</ol><p><br>',
        '<ol><li>foo[]<br></ol><p><br>',
        '<ol><li>{}<br></ol><p><br>',
        '<ol><li>foo<li>{}<br></ol><p><br>',

        // Indented stuff with collapsed selection
        'foo[]<blockquote>bar</blockquote>',
        'foo[]<blockquote><blockquote>bar</blockquote></blockquote>',
        'foo[]<blockquote><div>bar</div></blockquote>',
        'foo[]<blockquote style="color: blue">bar</blockquote>',

        'foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>',
        'foo[]<blockquote><div><p>bar<p>baz</div></blockquote>',
        'foo[]<blockquote style="color: blue"><p>bar<p>baz</blockquote>',

        'foo[]<blockquote><p><b>bar</b><p>baz</blockquote>',
        'foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>',
        'foo[]<blockquote><p><span>bar</span><p>baz</blockquote>',

        'foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra',
        'foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra',
        'foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra',

        // Invisible stuff with collapsed selection
        'foo[]<span></span>bar',
        'foo[]<span><span></span></span>bar',
        'foo[]<quasit></quasit>bar',
        'foo[]<span></span><br>bar',
        '<span>foo[]<span></span></span>bar',
        'foo[]<span></span><span>bar</span>',
        'foo[]<div><div><p>bar</div></div>',
        'foo[]<div><div><p><!--abc-->bar</div></div>',
        'foo[]<div><div><!--abc--><p>bar</div></div>',
        'foo[]<div><!--abc--><div><p>bar</div></div>',
        'foo[]<!--abc--><div><div><p>bar</div></div>',
        '<div><div><p>foo[]</div></div>bar',
        '<div><div><p>foo[]</div></div><!--abc-->bar',
        '<div><div><p>foo[]</div><!--abc--></div>bar',
        '<div><div><p>foo[]</p><!--abc--></div></div>bar',
        '<div><div><p>foo[]<!--abc--></div></div>bar',
        '<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>',
        '<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>',
        '<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>',
        '<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>',
        '<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>',
        '<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>',
        '<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>',
        '<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>',

        // Styled stuff with collapsed selection
        '<p style=color:blue>foo[]<p>bar',
        '<p style=color:blue>foo[]<p style=color:brown>bar',
        '<p>foo[]<p style=color:brown>bar',
        '<p><font color=blue>foo[]</font><p>bar',
        '<p><font color=blue>foo[]</font><p><font color=brown>bar</font>',
        '<p>foo[]<p><font color=brown>bar</font>',
        '<p><span style=color:blue>foo[]</font><p>bar',
        '<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>',
        '<p>foo[]<p><span style=color:brown>bar</font>',

        '<p style=background-color:aqua>foo[]<p>bar',
        '<p style=background-color:aqua>foo[]<p style=background-color:tan>bar',
        '<p>foo[]<p style=background-color:tan>bar',
        '<p><span style=background-color:aqua>foo[]</font><p>bar',
        '<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>',
        '<p>foo[]<p><span style=background-color:tan>bar</font>',

        '<p style=text-decoration:underline>foo[]<p>bar',
        '<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar',
        '<p>foo[]<p style=text-decoration:line-through>bar',
        '<p><u>foo[]</u><p>bar',
        '<p><u>foo[]</u><p><s>bar</s>',
        '<p>foo[]<p><s>bar</s>',

        '<p style=color:blue>foo[]</p>bar',
        'foo[]<p style=color:brown>bar',
        '<div style=color:blue><p style=color:green>foo[]</div>bar',
        '<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar',
        '<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar',

        // Uncollapsed selection (should be same as delete command)
        'foo[bar]baz',
        '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
        '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
        '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
        '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
        '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
        '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
        '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
        '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',

        'foo<b>[bar]</b>baz',
        'foo<b>{bar}</b>baz',
        'foo{<b>bar</b>}baz',
        'foo<span>[bar]</span>baz',
        'foo<span>{bar}</span>baz',
        'foo{<span>bar</span>}baz',
        '<b>foo[bar</b><i>baz]quz</i>',
        '<p>foo</p><p>[bar]</p><p>baz</p>',
        '<p>foo</p><p>{bar}</p><p>baz</p>',
        '<p>foo</p><p>{bar</p>}<p>baz</p>',
        '<p>foo</p>{<p>bar}</p><p>baz</p>',
        '<p>foo</p>{<p>bar</p>}<p>baz</p>',

        '<p>foo[bar<p>baz]quz',
        '<p>foo[bar<div>baz]quz</div>',
        '<p>foo[bar<h1>baz]quz</h1>',
        '<div>foo[bar</div><p>baz]quz',
        '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',

        '<p><b>foo[bar</b><p>baz]quz',
        '<div><p>foo[bar</div><p>baz]quz',
        '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
        '<p>foo[bar<p style=color:blue>baz]quz',
        '<p>foo[bar<p><b>baz]quz</b>',

        '<div><p>foo<p>[bar<p>baz]</div>',

        'foo[<br>]bar',
        '<p>foo[</p><p>]bar</p>',
        '<p>foo[</p><p>]bar<br>baz</p>',
        'foo[<p>]bar</p>',
        'foo{<p>}bar</p>',
        'foo[<p>]bar<br>baz</p>',
        'foo[<p>]bar</p>baz',
        'foo{<p>bar</p>}baz',
        'foo<p>{bar</p>}baz',
        'foo{<p>bar}</p>baz',
        '<p>foo[</p>]bar',
        '<p>foo{</p>}bar',
        '<p>foo[</p>]bar<br>baz',
        '<p>foo[</p>]bar<p>baz</p>',
        'foo[<div><p>]bar</div>',
        '<div><p>foo[</p></div>]bar',
        'foo[<div><p>]bar</p>baz</div>',
        'foo[<div>]bar<p>baz</p></div>',
        '<div><p>foo</p>bar[</div>]baz',
        '<div>foo<p>bar[</p></div>]baz',

        '<p>foo<br>{</p>]bar',
        '<p>foo<br><br>{</p>]bar',
        'foo<br>{<p>]bar</p>',
        'foo<br><br>{<p>]bar</p>',
        '<p>foo<br>{</p><p>}bar</p>',
        '<p>foo<br><br>{</p><p>}bar</p>',

        '<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>',
        '<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
        '<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>',
        '<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>',
        '<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>',
        '<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>',
        '{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}',
        '<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>',
        '<p>fo[o<table><tr><td>b]ar</table><p>baz',
        '<p>foo<table><tr><td>ba[r</table><p>b]az',
        '<p>fo[o<table><tr><td>bar</table><p>b]az',

        '<p>foo<ol><li>ba[r<li>b]az</ol><p>quz',
        '<p>foo<ol><li>bar<li>[baz]</ol><p>quz',
        '<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz',
        '<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz',
        '<p>fo[o<ol><li>bar<li>b]az</ol><p>quz',
        '<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz',

        '<ol><li>fo[o</ol><ol><li>b]ar</ol>',
        '<ol><li>fo[o</ol><ul><li>b]ar</ul>',

        'foo[<ol><li>]bar</ol>',
        '<ol><li>foo[<li>]bar</ol>',
        'foo[<dl><dt>]bar<dd>baz</dl>',
        'foo[<dl><dd>]bar</dl>',
        '<dl><dt>foo[<dd>]bar</dl>',
        '<dl><dt>foo[<dt>]bar<dd>baz</dl>',
        '<dl><dt>foo<dd>bar[<dd>]baz</dl>',

        // https://bugs.webkit.org/show_bug.cgi?id=35281
        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13976
        '<ol><li>foo</ol>{}<br><ol><li>bar</ol>',
        '<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>',
        '<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>',
        '<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>',
        '<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
        '<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>',
        '<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>',
        '<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>',
        '<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>',
        '<ol><li>foo[</ol>bar]<ol><li>baz</ol>',
        '<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>',
        '<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>',
        '<ol><li>fo[]o</ol><ol><li>bar</ol>',
        '<ol><li>foo</ol>[bar<ol><li>]baz</ol>',
        '<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>',
        '<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>',
        '<ol><li>foo</ol><ol><li>[]bar</ol>',
        '<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>',
        '<ul><li>foo</ul>{}<br><ul><li>bar</ul>',
        '<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>',
        '<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>',
        '<ol><li>foo</ol>{}<br><ul><li>bar</ul>',
        '<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>',
        '<ul><li>foo</ul>{}<br><ol><li>bar</ol>',
        '<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>',

        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13831
        '<p><b>[foo]</b>',
        '<p><quasit>[foo]</quasit>',
        '<p><b><i>[foo]</i></b>',
        '<p><b>{foo}</b>',
        '<p>{<b>foo</b>}',
        '<p><b>[]f</b>',
        '<b>[foo]</b>',
        '<div><b>[foo]</b></div>',
    ],
    //@}
    hilitecolor: [
    //@{
        'foo[]bar',
        '<p>[foo</p> <p>bar]</p>',
        '<span>[foo</span> <span>bar]</span>',
        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
        '<p>[foo<p><br><p>bar]',
        '<b>foo[]bar</b>',
        '<i>foo[]bar</i>',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        'foo[bar]baz',
        'foo[bar<b>baz]qoz</b>quz',
        'foo[bar<i>baz]qoz</i>quz',
        '{<p><p> <p>foo</p>}',

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
        '{<table><tr><td>foo<td>bar<td>baz</table>}',

        '<p style="background-color: rgb(0, 255, 255)">foo[bar]baz</p>',
        '<p style="background-color: #00ffff">foo[bar]baz</p>',
        '<p style="background-color: aqua">foo[bar]baz</p>',
        '{<p style="background-color: aqua">foo</p><p>bar</p>}',
        '<span style="background-color: aqua">foo<span style="background-color: tan">[bar]</span>baz</span>',
        '<span style="background-color: #00ffff">foo<span style="background-color: tan">[bar]</span>baz</span>',
        '<span style="background-color: #0ff">foo<span style="background-color: tan">[bar]</span>baz</span>',
        '<span style="background-color: rgb(0, 255, 255)">foo<span style="background-color: tan">[bar]</span>baz</span>',
        '<span style="background-color: aqua">foo<span style="background-color: tan">b[ar]</span>baz</span>',
        '<p style="background-color: aqua">foo<span style="background-color: tan">b[ar]</span>baz</p>',
        '<div style="background-color: aqua"><p style="background-color: tan">b[ar]</p></div>',
        '<span style="display: block; background-color: aqua"><span style="display: block; background-color: tan">b[ar]</span></span>',

        // Tests for queryCommandIndeterm() and queryCommandState()
        'fo[o<span style=background-color:tan>b]ar</span>baz',
        'foo<span style=background-color:tan>ba[r</span>b]az',
        'fo[o<span style=background-color:tan>bar</span>b]az',
        'foo[<span style=background-color:tan>b]ar</span>baz',
        'foo<span style=background-color:tan>ba[r</span>]baz',
        'foo[<span style=background-color:tan>bar</span>]baz',
        'foo<span style=background-color:tan>[bar]</span>baz',
        'foo{<span style=background-color:tan>bar</span>}baz',
        '<span style=background-color:tan>fo[o</span><span style=background-color:yellow>b]ar</span>',
        '<span style=background-color:tan>fo[o</span><span style=background-color:tan>b]ar</span>',
        '<span style=background-color:tan>fo[o<span style=background-color:transparent>b]ar</span></span>',

        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13829
        '!<font size=6>[foo]</font>',
        '!<span style=font-size:xx-large>[foo]</span>',
        '!<font size=6>foo[bar]baz</font>',
        '!<span style=font-size:xx-large>foo[bar]baz</span>',
        '![foo<font size=6>bar</font>baz]',
        '![foo<span style=font-size:xx-large>bar</span>baz]',
    ],
    //@}
    indent: [
    //@{
        // All these have a trailing unselected paragraph, because otherwise
        // Gecko is unhappy: it throws exceptions in non-CSS mode, and in CSS
        // mode it adds the indentation invisibly to the wrapper div in many
        // cases.
        'foo[]bar<p>extra',
        '<span>foo</span>{}<span>bar</span><p>extra',
        '<span>foo[</span><span>]bar</span><p>extra',
        'foo[bar]baz<p>extra',
        '<p dir=rtl>פו[בר]בז<p dir=rtl>נוםף',
        '<p dir=rtl>פו[ברבז<p>Foobar]baz<p>Extra',
        '<p>Foo[barbaz<p dir=rtl>פובר]בז<p>Extra',
        '<div><p>Foo[barbaz<p dir=rtl>פובר]בז</div><p>Extra',
        'foo]bar[baz<p>extra',
        '{<p><p> <p>foo</p>}<p>extra',
        'foo[bar<i>baz]qoz</i>quz<p>extra',
        '[]foo<p>extra',
        'foo[]<p>extra',
        '<p>[]foo<p>extra',
        '<p>foo[]<p>extra',
        '<p>{}<br>foo</p><p>extra',
        '<p>foo<br>{}</p><p>extra',
        '<span>{}<br>foo</span>bar<p>extra',
        '<span>foo<br>{}</span>bar<p>extra',
        '<p>foo</p>{}<p>bar</p>',

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
        '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',

        '<p>foo[bar]</p><p>baz</p><p>extra',
        '<p>[foobar</p><p>ba]z</p><p>extra',
        'foo[bar]<br>baz<p>extra',
        'foo[bar]<br><br><br><br>baz<p>extra',
        'foobar<br>[ba]z<p>extra',
        'foobar<br><br><br><br>[ba]z<p>extra',
        'foo[bar<br>ba]z<p>extra',
        '<div>foo<p>[bar]</p>baz</div><p>extra',

        // These mimic existing indentation in various browsers, to see how
        // they cope with indenting twice.  This is spec, Gecko non-CSS, and
        // Opera:
        '<blockquote><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
        '<blockquote><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
        '<blockquote><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
        '<blockquote><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
        '<p>[foo]<blockquote><p>bar</blockquote><p>extra',
        '<p>[foo<blockquote><p>b]ar</blockquote><p>extra',
        '<p>foo<blockquote><p>bar</blockquote><p>[baz]<p>extra',
        '<p>foo<blockquote><p>[bar</blockquote><p>baz]<p>extra',
        '<p>[foo<blockquote><p>bar</blockquote><p>baz]<p>extra',
        '<blockquote><p>foo</blockquote><p>[bar]<blockquote><p>baz</blockquote><p>extra',

        '<blockquote>foo[bar]<br>baz</blockquote><p>extra',
        '<blockquote>foo[bar<br>b]az</blockquote><p>extra',
        '<blockquote>foo[bar]</blockquote>baz<p>extra',
        '<blockquote>foo[bar</blockquote>b]az<p>extra',
        '[foo]<blockquote>bar</blockquote><p>extra',
        '[foo<blockquote>b]ar</blockquote><p>extra',
        'foo<blockquote>bar</blockquote>[baz]<p>extra',
        '[foo<blockquote>bar</blockquote>baz]<p>extra',
        '<blockquote>foo</blockquote>[bar]<blockquote>baz</blockquote><p>extra',

        // IE:
        '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar]</p><p>baz</p></blockquote><p>extra',
        '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar</p><p>b]az</p></blockquote><p>extra',
        '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar]</p></blockquote><p>baz</p><p>extra',
        '<blockquote style="margin-right: 0" dir="ltr"><p>foo[bar</p></blockquote><p>b]az</p><p>extra',
        '<p>[foo]<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>extra',
        '<p>[foo<blockquote style="margin-right: 0" dir="ltr"><p>b]ar</blockquote><p>extra',
        '<p>foo<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>[baz]<p>extra',
        '<p>foo<blockquote style="margin-right: 0" dir="ltr"><p>[bar</blockquote><p>baz]<p>extra',
        '<p>[foo<blockquote style="margin-right: 0" dir="ltr"><p>bar</blockquote><p>baz]<p>extra',
        '<blockquote style="margin-right: 0" dir="ltr"><p>foo</blockquote><p>[bar]<blockquote style="margin-right: 0" dir="ltr"><p>baz</blockquote><p>extra',

        // Firefox CSS mode:
        '<p style="margin-left: 40px">foo[bar]</p><p style="margin-left: 40px">baz</p><p>extra',
        '<p style="margin-left: 40px">foo[bar</p><p style="margin-left: 40px">b]az</p><p>extra',
        '<p style="margin-left: 40px">foo[bar]</p><p>baz</p><p>extra',
        '<p style="margin-left: 40px">foo[bar</p><p>b]az</p><p>extra',
        '<p>[foo]<p style="margin-left: 40px">bar<p>extra',
        '<p>[foo<p style="margin-left: 40px">b]ar<p>extra',
        '<p>foo<p style="margin-left: 40px">bar<p>[baz]<p>extra',
        '<p>foo<p style="margin-left: 40px">[bar<p>baz]<p>extra',
        '<p>[foo<p style="margin-left: 40px">bar<p>baz]<p>extra',
        '<p style="margin-left: 40px">foo<p>[bar]<p style="margin-left: 40px">baz<p>extra',

        // WebKit:
        '<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',
        '<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',
        '<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',
        '<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',
        '<p>[foo]<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>extra',
        '<p>[foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>b]ar</blockquote><p>extra',
        '<p>foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>[baz]<p>extra',
        '<p>foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>[bar</blockquote><p>baz]<p>extra',
        '<p>[foo<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px"><p>bar</blockquote><p>baz]<p>extra',
        '<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',

        // MDC says "In Firefox, if the selection spans multiple lines at
        // different levels of indentation, only the least indented lines in
        // the selection will be indented."  Let's test that.
        '<blockquote>f[oo<blockquote>b]ar</blockquote></blockquote><p>extra',

        // Lists!
        '<ol><li>foo<li>[bar]<li>baz</ol>',
        '<ol data-start=1 data-end=2><li>foo<li>bar<li>baz</ol>',
        '<ol><li>foo</ol>[bar]',
        '<ol><li>[foo]<br>bar<li>baz</ol>',
        '<ol><li>foo<br>[bar]<li>baz</ol>',
        '<ol><li><div>[foo]</div>bar<li>baz</ol>',
        '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
        '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
        '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
        '<ol><li>foo</li><ol data-start=0 data-end=1><li>bar<li>baz</ol><li>quz</ol>',
        '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
        '<ol><li>foo</li><ol data-start=1 data-end=2><li>bar<li>baz</ol><li>quz</ol>',
        '<ol><li>foo<ol><li>b[a]r</ol><li>baz</ol>',
        '<ol><li>foo</li><ol><li>b[a]r</ol><li>baz</ol>',
        '<ol><li>foo{<ol><li>bar</ol>}<li>baz</ol>',
        '<ol><li>foo</li>{<ol><li>bar</ol>}<li>baz</ol>',
        '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
        '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
        '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
        '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
        '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
        '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',

        // Lists with id's:
        // http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2009-July/020721.html
        '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>',
        '<ol><ol><li id=i1>foo</ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>',
        '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</li><ol><li id=i3>baz</ol></ol>',
        '<ol><li id=i2>[bar]</li><ol id=u3><li id=i3>baz</ol></ol>',
        '<ol><ol id=u1><li id=i1>foo</ol><li id=i2>[bar]</ol>',

        // Try indenting multiple items at once.
        '<ol><li>foo<li>b[ar<li>baz]</ol>',
        '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
        '<ol><li>[foo</li><ol><li>bar]</ol><li>baz</ol>',
        '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
        '<ol><li>foo</li><ol><li>b[ar</ol><li>b]az</ol>',
        '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
        '<ol><li>[foo</li><ol><li>bar</ol><li>baz]</ol><p>extra',

        // We probably can't actually get this DOM . . .
        '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
        '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
        '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
        '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',

        'foo<!--bar-->[baz]<p>extra',
        '[foo]<!--bar-->baz<p>extra',
        '<p>foo<!--bar-->{}<p>extra',
        '<p>{}<!--foo-->bar<p>extra',

        // Whitespace nodes
        '<blockquote><p>foo</blockquote> <p>[bar]',
        '<p>[foo]</p> <blockquote><p>bar</blockquote>',
        '<blockquote><p>foo</blockquote> <p>[bar]</p> <blockquote><p>baz</blockquote>',
        '<ol><li>foo</li><ol><li>bar</li> </ol><li>[baz]</ol>',
        '<ol><li>foo</li><ol><li>bar</li></ol> <li>[baz]</ol>',
        '<ol><li>foo</li><ol><li>bar</li> </ol> <li>[baz]</ol>',
        '<ol><li>foo<ol><li>bar</li> </ol></li><li>[baz]</ol>',
        '<ol><li>foo<ol><li>bar</li></ol></li> <li>[baz]</ol>',
        '<ol><li>foo<ol><li>bar</li> </ol></li> <li>[baz]</ol>',
        '<ol><li>foo<li>[bar]</li> <ol><li>baz</ol></ol>',
        '<ol><li>foo<li>[bar]</li><ol> <li>baz</ol></ol>',
        '<ol><li>foo<li>[bar]</li> <ol> <li>baz</ol></ol>',
        '<ol><li>foo<li>[bar] <ol><li>baz</ol></ol>',
        '<ol><li>foo<li>[bar]<ol> <li>baz</ol></ol>',
        '<ol><li>foo<li>[bar] <ol> <li>baz</ol></ol>',

        // https://bugs.webkit.org/show_bug.cgi?id=32003
        '<ul><li>a<br>{<br>}</li><li>b</li></ul>',
    ],
    //@}
    inserthorizontalrule: [
    //@{
        'foo[]bar',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        '<p>foo[bar<p>baz]quz',
        '<div><b>foo</b>{}<b>bar</b></div>',
        '<div><b>foo[</b><b>]bar</b></div>',
        '<div><b>foo</b>{<b>bar</b>}<b>baz</b></div>',
        '<b>foo[]bar</b>',
        '<b id=abc>foo[]bar</b>',
        ["abc", 'foo[bar]baz'],
        'foo[bar]baz',

        'foo<b>[bar]</b>baz',
        'foo<b>{bar}</b>baz',
        'foo{<b>bar</b>}baz',
        '<p>foo<p>[bar]<p>baz',
        '<p>foo<p>{bar}<p>baz',
        '<p>foo{<p>bar</p>}<p>baz',

        '<p>foo[bar]baz</p>',
        '<p id=abc>foo[bar]baz</p>',
        '<h1>foo[bar]baz</h1>',
        '<p>foo<b>b[a]r</b>baz</p>',

        '<a>foo[bar]baz</a>',
        '<a href=/>foo[bar]baz</a>',
        '<abbr>foo[bar]baz</abbr>',
        '<address>foo[bar]baz</address>',
        '<article>foo[bar]baz</article>',
        '<aside>foo[bar]baz</aside>',
        '<b>foo[bar]baz</b>',
        '<bdi>foo[bar]baz</bdi>',
        '<bdo dir=rtl>foo[bar]baz</bdo>',
        '<blockquote>foo[bar]baz</blockquote>',
        '<table><caption>foo[bar]baz</caption><tr><td>quz</table>',
        '<cite>foo[bar]baz</cite>',
        '<code>foo[bar]baz</code>',
        '<dl><dd>foo[bar]baz</dd></dl>',
        '<del>foo[bar]baz</del>',
        '<details>foo[bar]baz</details>',
        '<dfn>foo[bar]baz</dfn>',
        '<div>foo[bar]baz</div>',
        '<dl><dt>foo[bar]baz</dt></dl>',
        '<em>foo[bar]baz</em>',
        '<figure><figcaption>foo[bar]baz</figcaption>quz</figure>',
        '<figure>foo[bar]baz</figure>',
        '<footer>foo[bar]baz</footer>',
        '<h1>foo[bar]baz</h1>',
        '<h2>foo[bar]baz</h2>',
        '<h3>foo[bar]baz</h3>',
        '<h4>foo[bar]baz</h4>',
        '<h5>foo[bar]baz</h5>',
        '<h6>foo[bar]baz</h6>',
        '<header>foo[bar]baz</header>',
        '<hgroup>foo[bar]baz</hgroup>',
        '<hgroup><h1>foo[bar]baz</h1></hgroup>',
        '<i>foo[bar]baz</i>',
        '<ins>foo[bar]baz</ins>',
        '<kbd>foo[bar]baz</kbd>',
        '<mark>foo[bar]baz</mark>',
        '<nav>foo[bar]baz</nav>',
        '<ol><li>foo[bar]baz</li></ol>',
        '<p>foo[bar]baz</p>',
        '<pre>foo[bar]baz</pre>',
        '<q>foo[bar]baz</q>',
        '<ruby>foo[bar]baz<rt>quz</rt></ruby>',
        '<ruby>foo<rt>bar[baz]quz</rt></ruby>',
        '<ruby>foo<rp>bar[baz]quz</rp><rt>qoz</rt><rp>qiz</rp></ruby>',
        '<s>foo[bar]baz</s>',
        '<samp>foo[bar]baz</samp>',
        '<section>foo[bar]baz</section>',
        '<small>foo[bar]baz</small>',
        '<span>foo[bar]baz</span>',
        '<strong>foo[bar]baz</strong>',
        '<sub>foo[bar]baz</sub>',
        '<sup>foo[bar]baz</sup>',
        '<table><tr><td>foo[bar]baz</td></table>',
        '<table><tr><th>foo[bar]baz</th></table>',
        '<u>foo[bar]baz</u>',
        '<ul><li>foo[bar]baz</li></ul>',
        '<var>foo[bar]baz</var>',

        '<acronym>foo[bar]baz</acronym>',
        '<big>foo[bar]baz</big>',
        '<blink>foo[bar]baz</blink>',
        '<center>foo[bar]baz</center>',
        '<dir>foo[bar]baz</dir>',
        '<dir><li>foo[bar]baz</li></dir>',
        '<font>foo[bar]baz</font>',
        '<listing>foo[bar]baz</listing>',
        '<marquee>foo[bar]baz</marquee>',
        '<nobr>foo[bar]baz</nobr>',
        '<strike>foo[bar]baz</strike>',
        '<tt>foo[bar]baz</tt>',
        '<xmp>foo[bar]baz</xmp>',

        '<quasit>foo[bar]baz</quasit>',

        '<table><tr><td>fo[o<td>b]ar</table>',
        'fo[o<span contenteditable=false>bar</span>b]az',
    ],
    //@}
    inserthtml: [
    //@{
        'foo[]bar',
        'foo[bar]baz',
        'foo<span style=color:#aBcDeF>[bar]</span>baz',
        'foo<span style=color:#aBcDeF>{bar}</span>baz',
        'foo{<span style=color:#aBcDeF>bar</span>}baz',
        '[foo<span style=color:#aBcDeF>bar]</span>baz',
        '{foo<span style=color:#aBcDeF>bar}</span>baz',
        'foo<span style=color:#aBcDeF>[bar</span>baz]',
        'foo<span style=color:#aBcDeF>{bar</span>baz}',
        'foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',

        ['', 'foo[bar]baz'],
        ['\0', 'foo[bar]baz'],
        ['\x07', 'foo[bar]baz'],
        // The following line makes Firefox 7.0a2 go into an infinite loop on
        // my machine.
        //['\ud800', 'foo[bar]baz'],

        ['<b>', 'foo[bar]baz'],
        ['<b>abc', 'foo[bar]baz'],
        ['<p>abc', '<p>foo[bar]baz'],
        ['<li>abc', '<p>foo[bar]baz'],
        ['<p>abc', '<ol>{<li>foo</li>}<li>bar</ol>'],
        ['<p>abc', '<ol><li>foo</li>{<li>bar</li>}<li>baz</ol>'],
        ['<p>abc', '<ol><li>[foo]</li><li>bar</ol>'],

        ['abc', '<xmp>f[o]o</xmp>'],
        ['<b>abc</b>', '<xmp>f[o]o</xmp>'],
        ['abc', '<script>f[o]o</script>bar'],
        ['<b>abc</b>', '<script>f[o]o</script>bar'],

        ['<a>abc</a>', '<a>f[o]o</a>'],
        ['<a href=/>abc</a>', '<a href=.>f[o]o</a>'],
        ['<hr>', '<p>f[o]o'],
        ['<hr>', '<b>f[o]o</b>'],
        ['<h2>abc</h2>', '<h1>f[o]o</h1>'],
        ['<td>abc</td>', '<table><tr><td>f[o]o</table>'],
        ['<td>abc</td>', 'f[o]o'],

        ['<dt>abc</dt>', '<dl><dt>f[o]o<dd>bar</dl>'],
        ['<dt>abc</dt>', '<dl><dt>foo<dd>b[a]r</dl>'],
        ['<dd>abc</dd>', '<dl><dt>f[o]o<dd>bar</dl>'],
        ['<dd>abc</dd>', '<dl><dt>foo<dd>b[a]r</dl>'],
        ['<dt>abc</dt>', 'f[o]o'],
        ['<dt>abc</dt>', '<ol><li>f[o]o</ol>'],
        ['<dd>abc</dd>', 'f[o]o'],
        ['<dd>abc</dd>', '<ol><li>f[o]o</ol>'],

        ['<li>abc</li>', '<dir><li>f[o]o</dir>'],
        ['<li>abc</li>', '<ol><li>f[o]o</ol>'],
        ['<li>abc</li>', '<ul><li>f[o]o</ul>'],
        ['<dir><li>abc</dir>', '<dir><li>f[o]o</dir>'],
        ['<dir><li>abc</dir>', '<ol><li>f[o]o</ol>'],
        ['<dir><li>abc</dir>', '<ul><li>f[o]o</ul>'],
        ['<ol><li>abc</ol>', '<dir><li>f[o]o</dir>'],
        ['<ol><li>abc</ol>', '<ol><li>f[o]o</ol>'],
        ['<ol><li>abc</ol>', '<ul><li>f[o]o</ul>'],
        ['<ul><li>abc</ul>', '<dir><li>f[o]o</dir>'],
        ['<ul><li>abc</ul>', '<ol><li>f[o]o</ol>'],
        ['<ul><li>abc</ul>', '<ul><li>f[o]o</ul>'],
        ['<li>abc</li>', 'f[o]o'],

        ['<nobr>abc</nobr>', '<nobr>f[o]o</nobr>'],
        ['<nobr>abc</nobr>', 'f[o]o'],

        ['<p>abc', '<font color=blue>foo[]bar</font>'],
        ['<p>abc', '<span style=color:blue>foo[]bar</span>'],
        ['<p>abc', '<span style=font-variant:small-caps>foo[]bar</span>'],
        [' ', '<p>[foo]</p>'],
        ['<span style=display:none></span>', '<p>[foo]</p>'],
        ['<!--abc-->', '<p>[foo]</p>'],

        ['abc', '<p>{}<br></p>'],
        ['<!--abc-->', '<p>{}<br></p>'],
        ['abc', '<p><!--foo-->{}<span><br></span><!--bar--></p>'],
        ['<!--abc-->', '<p><!--foo-->{}<span><br></span><!--bar--></p>'],
        ['abc', '<p>{}<span><!--foo--><br><!--bar--></span></p>'],
        ['<!--abc-->', '<p>{}<span><!--foo--><br><!--bar--></span></p>'],

        ['abc', '<p><br>{}</p>'],
        ['<!--abc-->', '<p><br>{}</p>'],
        ['abc', '<p><!--foo--><span><br></span>{}<!--bar--></p>'],
        ['<!--abc-->', '<p><!--foo--><span><br></span>{}<!--bar--></p>'],
        ['abc', '<p><span><!--foo--><br><!--bar--></span>{}</p>'],
        ['<!--abc-->', '<p><span><!--foo--><br><!--bar--></span>{}</p>'],
    ],
    //@}
    insertimage: [
    //@{
        'foo[]bar',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        ["", 'foo[bar]baz'],
        'foo[bar]baz',
        'foo<span style=color:#aBcDeF>[bar]</span>baz',
        'foo<span style=color:#aBcDeF>{bar}</span>baz',
        'foo{<span style=color:#aBcDeF>bar</span>}baz',
        '[foo<span style=color:#aBcDeF>bar]</span>baz',
        '{foo<span style=color:#aBcDeF>bar}</span>baz',
        'foo<span style=color:#aBcDeF>[bar</span>baz]',
        'foo<span style=color:#aBcDeF>{bar</span>baz}',
        'foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',

        'foo<b>[bar]</b>baz',
        'foo<b>{bar}</b>baz',
        'foo{<b>bar</b>}baz',
        'foo<span>[bar]</span>baz',
        'foo<span>{bar}</span>baz',
        'foo{<span>bar</span>}baz',
        '<b>foo[bar</b><i>baz]quz</i>',
        '<p>foo</p><p>[bar]</p><p>baz</p>',
        '<p>foo</p><p>{bar}</p><p>baz</p>',
        '<p>foo</p>{<p>bar</p>}<p>baz</p>',

        '<p>foo[bar<p>baz]quz',
        '<p>foo[bar<div>baz]quz</div>',
        '<p>foo[bar<h1>baz]quz</h1>',
        '<div>foo[bar</div><p>baz]quz',
        '<blockquote>foo[bar</blockquote><pre>baz]quz</pre>',

        '<p><b>foo[bar</b><p>baz]quz',
        '<div><p>foo[bar</div><p>baz]quz',
        '<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote',
        '<p>foo[bar<p style=color:blue>baz]quz',
        '<p>foo[bar<p><b>baz]quz</b>',

        '<div><p>foo<p>[bar<p>baz]</div>',

        'foo[<br>]bar',
        '<p>foo[</p><p>]bar</p>',
        '<p>foo[</p><p>]bar<br>baz</p>',
        'foo[<p>]bar</p>',
        'foo[<p>]bar<br>baz</p>',
        'foo[<p>]bar</p>baz',
        '<p>foo[</p>]bar',
        '<p>foo[</p>]bar<br>baz',
        '<p>foo[</p>]bar<p>baz</p>',
        'foo[<div><p>]bar</div>',
        '<div><p>foo[</p></div>]bar',
        'foo[<div><p>]bar</p>baz</div>',
        'foo[<div>]bar<p>baz</p></div>',
        '<div><p>foo</p>bar[</div>]baz',
        '<div>foo<p>bar[</p></div>]baz',
    ],
    //@}
    insertlinebreak: [
    //@{ Same as insertparagraph (set below)
    ],
    //@}
    insertorderedlist: [
    //@{
        'foo[]bar',
        'foo[bar]baz',
        'foo<br>[bar]',
        'f[oo<br>b]ar<br>baz',
        '<p>[foo]<br>bar</p>',
        '[foo<ol><li>bar]</ol>baz',
        'foo<ol><li>[bar</ol>baz]',
        '[foo<ul><li>bar]</ul>baz',
        'foo<ul><li>[bar</ul>baz]',
        'foo<ul><li>[bar</ul><ol><li>baz]</ol>quz',
        'foo<ol><li>[bar</ol><ul><li>baz]</ul>quz',

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
        '<table><tbody><tr><td>fo[o<td>b]ar<td>baz</table>',
        '{<table><tr><td>foo<td>bar<td>baz</table>}',

        '<p>foo<p>[bar]<p>baz',
        '<p>foo<blockquote>[bar]</blockquote><p>baz',
        '<dl><dt>foo<dd>[bar]<dt>baz<dd>quz</dl>',
        '<dl><dt>foo<dd>bar<dt>[baz]<dd>quz</dl>',

        '<p>[foo<p>bar]<p>baz',
        '<p>[foo<blockquote>bar]</blockquote><p>baz',
        '<dl><dt>[foo<dd>bar]<dt>baz<dd>quz</dl>',
        '<dl><dt>foo<dd>[bar<dt>baz]<dd>quz</dl>',

        '<p>[foo<blockquote><p>bar]<p>baz</blockquote>',


        // Various <ol> stuff
        '<ol><li>foo<li>[bar]<li>baz</ol>',
        '<ol><li>foo</ol>[bar]',
        '[foo]<ol><li>bar</ol>',
        '<ol><li>foo</ol>[bar]<ol><li>baz</ol>',
        '<ol><ol><li>[foo]</ol></ol>',
        '<ol><li>[foo]<br>bar<li>baz</ol>',
        '<ol><li>foo<br>[bar]<li>baz</ol>',
        '<ol><li><div>[foo]</div>bar<li>baz</ol>',
        '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
        '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
        '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
        '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
        '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
        '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
        '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
        '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
        '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
        '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',

        // Multiple items at once.
        '<ol><li>foo<li>[bar<li>baz]</ol>',
        '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
        '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
        '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',

        // We probably can't actually get this DOM . . .
        '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
        '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
        '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
        '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',


        // Same stuff but with <ul>
        '<ul><li>foo<li>[bar]<li>baz</ul>',
        '<ul><li>foo</ul>[bar]',
        '[foo]<ul><li>bar</ul>',
        '<ul><li>foo</ul>[bar]<ul><li>baz</ul>',
        '<ul><ul><li>[foo]</ul></ul>',
        '<ul><li>[foo]<br>bar<li>baz</ul>',
        '<ul><li>foo<br>[bar]<li>baz</ul>',
        '<ul><li><div>[foo]</div>bar<li>baz</ul>',
        '<ul><li>foo<ul><li>[bar]<li>baz</ul><li>quz</ul>',
        '<ul><li>foo<ul><li>bar<li>[baz]</ul><li>quz</ul>',
        '<ul><li>foo</li><ul><li>[bar]<li>baz</ul><li>quz</ul>',
        '<ul><li>foo</li><ul><li>bar<li>[baz]</ul><li>quz</ul>',
        '<ul><li>[foo]<ul><li>bar</ul><li>baz</ul>',
        '<ul><li>[foo]</li><ul><li>bar</ul><li>baz</ul>',
        '<ul><li>foo<li>[bar]<ul><li>baz</ul><li>quz</ul>',
        '<ul><li>foo<li>[bar]</li><ul><li>baz</ul><li>quz</ul>',
        '<ul><li>foo<ul><li>bar<li>baz</ul><li>[quz]</ul>',
        '<ul><li>foo</li><ul><li>bar<li>baz</ul><li>[quz]</ul>',

        // Multiple items at once.
        '<ul><li>foo<li>[bar<li>baz]</ul>',
        '<ul><li>[foo<ul><li>bar]</ul><li>baz</ul>',
        '<ul><li>foo<ul><li>b[ar</ul><li>b]az</ul>',
        '<ul><li>[foo<ul><li>bar</ul><li>baz]</ul><p>extra',

        // We probably can't actually get this DOM . . .
        '<ul><li>[foo]<ul><li>bar</ul>baz</ul>',
        '<ul><li>foo<ul><li>[bar]</ul>baz</ul>',
        '<ul><li>foo<ul><li>bar</ul>[baz]</ul>',
        '<ul><li>[foo<ul><li>bar]</ul>baz</ul>',


        // Mix of <ol> and <ul>
        'foo<ol><li>bar</ol><ul><li>[baz]</ul>quz',
        'foo<ol><li>bar</ol><ul><li>[baz</ul>quz]',
        'foo<ul><li>[bar]</ul><ol><li>baz</ol>quz',
        '[foo<ul><li>bar]</ul><ol><li>baz</ol>quz',

        // Interaction with indentation
        '[foo]<blockquote>bar</blockquote>baz',
        'foo<blockquote>[bar]</blockquote>baz',
        '[foo<blockquote>bar]</blockquote>baz',
        '<ol><li>foo</ol><blockquote>[bar]</blockquote>baz',
        '[foo]<blockquote><ol><li>bar</ol></blockquote>baz',
        'foo<blockquote>[bar]<br>baz</blockquote>',
        '[foo<blockquote>bar]<br>baz</blockquote>',
        '<ol><li>foo</ol><blockquote>[bar]<br>baz</blockquote>',

        '<p>[foo]<blockquote><p>bar</blockquote><p>baz',
        '<p>foo<blockquote><p>[bar]</blockquote><p>baz',
        '<p>[foo<blockquote><p>bar]</blockquote><p>baz',
        '<ol><li>foo</ol><blockquote><p>[bar]</blockquote><p>baz',

        // Attributes
        '<ul id=abc><li>foo<li>[bar]<li>baz</ul>',
        '<ul style=color:blue><li>foo<li>[bar]<li>baz</ul>',
        '<ul style=text-indent:1em><li>foo<li>[bar]<li>baz</ul>',
        '<ul id=abc><li>[foo]<li>bar<li>baz</ul>',
        '<ul style=color:blue><li>[foo]<li>bar<li>baz</ul>',
        '<ul style=text-indent:1em><li>[foo]<li>bar<li>baz</ul>',
        '<ul id=abc><li>foo<li>bar<li>[baz]</ul>',
        '<ul style=color:blue><li>foo<li>bar<li>[baz]</ul>',
        '<ul style=text-indent:1em><li>foo<li>bar<li>[baz]</ul>',

        // Whitespace nodes
        '<ol><li>foo</ol> <p>[bar]',
        '<p>[foo]</p> <ol><li>bar</ol>',
        '<ol><li>foo</ol> <p>[bar]</p> <ol><li>baz</ol>',

        // This caused an infinite loop at one point due to a bug in "fix
        // disallowed ancestors".  Disabled because I'm not sure how we want it
        // to behave:
        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14578
        '!<span contenteditable=true>foo[]</span>',
    ],
    //@}
    insertparagraph: [
    //@{
        'foo[bar]baz',
        'fo[o<table><tr><td>b]ar</table>',
        '<table><tr><td>[foo<td>bar]<tr><td>baz<td>quz</table>',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<tr><td>baz<td>quz</table>',
        '<table><tr><td>fo[o</table>b]ar',
        '<table><tr><td>fo[o<td>b]ar<td>baz</table>',
        '{<table><tr><td>foo</table>}',
        '<table><tr><td>[foo]</table>',
        '<ol><li>[foo]<li>bar</ol>',
        '<ol><li>f[o]o<li>bar</ol>',

        '[]foo',
        'foo[]',
        '<span>foo[]</span>',
        'foo[]<br>',
        'foo[]bar',
        '<address>[]foo</address>',
        '<address>foo[]</address>',
        '<address>foo[]<br></address>',
        '<address>foo[]bar</address>',
        '<div>[]foo</div>',
        '<div>foo[]</div>',
        '<div>foo[]<br></div>',
        '<div>foo[]bar</div>',
        '<dl><dt>[]foo<dd>bar</dl>',
        '<dl><dt>foo[]<dd>bar</dl>',
        '<dl><dt>foo[]<br><dd>bar</dl>',
        '<dl><dt>foo[]bar<dd>baz</dl>',
        '<dl><dt>foo<dd>[]bar</dl>',
        '<dl><dt>foo<dd>bar[]</dl>',
        '<dl><dt>foo<dd>bar[]<br></dl>',
        '<dl><dt>foo<dd>bar[]baz</dl>',
        '<h1>[]foo</h1>',
        '<h1>foo[]</h1>',
        '<h1>foo[]<br></h1>',
        '<h1>foo[]bar</h1>',
        '<ol><li>[]foo</ol>',
        '<ol><li>foo[]</ol>',
        '<ol><li>foo[]<br></ol>',
        '<ol><li>foo[]bar</ol>',
        '<p>[]foo</p>',
        '<p>foo[]</p>',
        '<p>foo[]<br></p>',
        '<p>foo[]bar</p>',
        '<pre>[]foo</pre>',
        '<pre>foo[]</pre>',
        '<pre>foo[]<br></pre>',
        '<pre>foo[]bar</pre>',

        '<pre>foo[]<br><br></pre>',
        '<pre>foo<br>{}<br></pre>',
        '<pre>foo []</pre>',
        '<pre>foo[] </pre>',
        '<pre>foo [] </pre>',

        '<xmp>foo[]bar</xmp>',
        '<script>foo[]bar</script>baz',
        '<div style=display:none>foo[]bar</div>baz',
        '<listing>foo[]bar</listing>',

        '<ol><li>{}<br></li></ol>',
        'foo<ol><li>{}<br></li></ol>',
        '<ol><li>{}<br></li></ol>foo',
        '<ol><li>foo<li>{}<br></ol>',
        '<ol><li>{}<br><li>bar</ol>',
        '<ol><li>foo</li><ul><li>{}<br></ul></ol>',

        '<dl><dt>{}<br></dt></dl>',
        '<dl><dt>foo<dd>{}<br></dl>',
        '<dl><dt>{}<br><dd>bar</dl>',
        '<dl><dt>foo<dd>bar<dl><dt>{}<br><dd>baz</dl></dl>',
        '<dl><dt>foo<dd>bar<dl><dt>baz<dd>{}<br></dl></dl>',

        '<h1>foo[bar</h1><p>baz]quz</p>',
        '<p>foo[bar</p><h1>baz]quz</h1>',
        '<p>foo</p>{}<br>',
        '{}<br><p>foo</p>',
        '<p>foo</p>{}<br><h1>bar</h1>',
        '<h1>foo</h1>{}<br><p>bar</p>',
        '<h1>foo</h1>{}<br><h2>bar</h2>',
        '<p>foo</p><h1>[bar]</h1><p>baz</p>',
        '<p>foo</p>{<h1>bar</h1>}<p>baz</p>',

        '<table><tr><td>foo[]bar</table>',
        '<table><tr><td><p>foo[]bar</table>',

        '<blockquote>[]foo</blockquote>',
        '<blockquote>foo[]</blockquote>',
        '<blockquote>foo[]<br></blockquote>',
        '<blockquote>foo[]bar</blockquote>',
        '<blockquote><p>[]foo</blockquote>',
        '<blockquote><p>foo[]</blockquote>',
        '<blockquote><p>foo[]bar</blockquote>',
        '<blockquote><p>foo[]<p>bar</blockquote>',
        '<blockquote><p>foo[]bar<p>baz</blockquote>',

        '<span>foo[]bar</span>',
        '<span>foo[]bar</span>baz',
        '<b>foo[]bar</b>',
        '<b>foo[]bar</b>baz',
        '<b>foo[]</b>bar',
        'foo<b>[]bar</b>',
        '<b>foo[]</b><i>bar</i>',
        '<b id=x class=y>foo[]bar</b>',
        '<i><b>foo[]bar</b>baz</i>',

        '<p><b>foo[]bar</b></p>',
        '<p><b>[]foo</b></p>',
        '<p><b id=x class=y>foo[]bar</b></p>',
        '<div><b>foo[]bar</b></div>',

        '<a href=foo>foo[]bar</a>',
        '<a href=foo>foo[]bar</a>baz',
        '<a href=foo>foo[]</a>bar',
        'foo<a href=foo>[]bar</a>',

        '<p>foo[]<!--bar-->',
        '<p><!--foo-->[]bar',

        '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
        '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
        '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
        '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
        '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
        '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
        '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
        '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',

        // https://bugs.webkit.org/show_bug.cgi?id=5036
        '<ul contenteditable><li>{}<br></ul>',
        '<ul contenteditable><li>foo[]</ul>',
        '<div contenteditable=false><ul contenteditable><li>{}<br></ul></div>',
        '<div contenteditable=false><ul contenteditable><li>foo[]</ul></div>',

        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=13841
        // https://bugs.webkit.org/show_bug.cgi?id=23507
        '<address><p>foo[]</address>',
        '<dl><dt><p>foo[]</dl>',
        '<dl><dd><p>foo[]</dl>',
        '<ol><li><p>foo[]</ol>',
        '<ul><li><p>foo[]</ul>',
        '<address><div>foo[]</address>',
        '<dl><dt><div>foo[]</dl>',
        '<dl><dd><div>foo[]</dl>',
        '<ol><li><div>foo[]</ol>',
        '<ul><li><div>foo[]</ul>',
        '<div><p>foo[]</div>',
        '<div><div>foo[]</div>',

        '<address><p>[]foo</address>',
        '<dl><dt><p>[]foo</dl>',
        '<dl><dd><p>[]foo</dl>',
        '<ol><li><p>[]foo</ol>',
        '<ul><li><p>[]foo</ul>',
        '<address><div>[]foo</address>',
        '<dl><dt><div>[]foo</dl>',
        '<dl><dd><div>[]foo</dl>',
        '<ol><li><div>[]foo</ol>',
        '<ul><li><div>[]foo</ul>',
        '<div><p>[]foo</div>',
        '<div><div>[]foo</div>',

        '<address><p>foo[]bar</address>',
        '<dl><dt><p>foo[]bar</dl>',
        '<dl><dd><p>foo[]bar</dl>',
        '<ol><li><p>foo[]bar</ol>',
        '<ul><li><p>foo[]bar</ul>',
        '<address><div>foo[]bar</address>',
        '<dl><dt><div>foo[]bar</dl>',
        '<dl><dd><div>foo[]bar</dl>',
        '<ol><li><div>foo[]bar</ol>',
        '<ul><li><div>foo[]bar</ul>',
        '<div><p>foo[]bar</div>',
        '<div><div>foo[]bar</div>',

        '<ol><li class=a id=x><p class=b id=y>foo[]</ol>',
        '<div class=a id=x><div class=b id=y>foo[]</div></div>',
        '<div class=a id=x><p class=b id=y>foo[]</div>',
        '<ol><li class=a id=x><p class=b id=y>[]foo</ol>',
        '<div class=a id=x><div class=b id=y>[]foo</div></div>',
        '<div class=a id=x><p class=b id=y>[]foo</div>',
        '<ol><li class=a id=x><p class=b id=y>foo[]bar</ol>',
        '<div class=a id=x><div class=b id=y>foo[]bar</div></div>',
        '<div class=a id=x><p class=b id=y>foo[]bar</div>',
    ],
    //@}
    inserttext: [
    //@{
        'foo[bar]baz',
        ['', 'foo[bar]baz'],

        ['\t', 'foo[]bar'],
        ['&', 'foo[]bar'],
        ['\n', 'foo[]bar'],
        ['abc\ndef', 'foo[]bar'],
        ['\x07', 'foo[]bar'],

        ['<b>hi</b>', 'foo[]bar'],
        ['<', 'foo[]bar'],
        ['&', 'foo[]bar'],

        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14254
        ['!\r', 'foo[]bar'],
        ['!\r\n', 'foo[]bar'],
        ['!\0', 'foo[]bar'],
        ['!\ud800', 'foo[]bar'],

        // Whitespace tests!  The following two bugs are relevant to some of
        // these:
        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14119
        // https://bugzilla.mozilla.org/show_bug.cgi?id=681626
        [' ', 'foo[]bar'],
        [' ', 'foo []bar'],
        [' ', 'foo[] bar'],
        [' ', 'foo  []bar'],
        [' ', 'foo [] bar'],
        [' ', 'foo[]  bar'],
        [' ', 'foo  []bar'],
        [' ', 'foo [] bar'],
        [' ', 'foo[]  bar'],
        [' ', 'foo  []bar'],
        [' ', 'foo [] bar'],
        [' ', 'foo[]  bar'],
        [' ', 'foo []         bar'],
        [' ', 'foo  []bar'],
        [' ', 'foo []     bar'],

        [' ', '[]foo'],
        [' ', '{}foo'],
        [' ', 'foo[]'],
        [' ', 'foo{}'],
        [' ', 'foo []'],
        [' ', 'foo {}'],
        [' ', 'foo  []'],
        [' ', 'foo  {}'],
        [' ', '<b>foo[]</b>bar'],
        [' ', 'foo[]<b>bar</b>'],

        [' ', 'foo[] '],
        [' ', ' foo   []   '],
        [' ', 'foo[]<span> </span>'],
        [' ', 'foo[]<span> </span> '],
        [' ', ' []foo'],
        [' ', '   []   foo '],
        [' ', '<span> </span>[]foo'],
        [' ', ' <span> </span>[]foo'],

        [' ', '{}<br>'],
        [' ', '<p>{}<br>'],

        [' ', '<p>foo[]<p>bar'],
        [' ', '<p>foo []<p>bar'],
        [' ', '<p>foo[]<p> bar'],

        // Some of the same tests as above, repeated with various values of
        // white-space.
        [' ', '<pre>foo[]bar</pre>'],
        [' ', '<pre>foo []bar</pre>'],
        [' ', '<pre>foo[] bar</pre>'],
        [' ', '<pre>foo  []bar</pre>'],
        [' ', '<pre>[]foo</pre>'],
        [' ', '<pre>foo[]</pre>'],
        [' ', '<pre>foo []</pre>'],
        [' ', '<pre> foo   []   </pre>'],

        [' ', '<div style=white-space:pre>foo[]bar</div>'],
        [' ', '<div style=white-space:pre>foo []bar</div>'],
        [' ', '<div style=white-space:pre>foo[] bar</div>'],
        [' ', '<div style=white-space:pre>foo  []bar</div>'],
        [' ', '<div style=white-space:pre>[]foo</div>'],
        [' ', '<div style=white-space:pre>foo[]</div>'],
        [' ', '<div style=white-space:pre>foo []</div>'],
        [' ', '<div style=white-space:pre> foo   []   </div>'],

        [' ', '<div style=white-space:pre-wrap>foo[]bar</div>'],
        [' ', '<div style=white-space:pre-wrap>foo []bar</div>'],
        [' ', '<div style=white-space:pre-wrap>foo[] bar</div>'],
        [' ', '<div style=white-space:pre-wrap>foo  []bar</div>'],
        [' ', '<div style=white-space:pre-wrap>[]foo</div>'],
        [' ', '<div style=white-space:pre-wrap>foo[]</div>'],
        [' ', '<div style=white-space:pre-wrap>foo []</div>'],
        [' ', '<div style=white-space:pre-wrap> foo   []   </div>'],

        [' ', '<div style=white-space:pre-line>foo[]bar</div>'],
        [' ', '<div style=white-space:pre-line>foo []bar</div>'],
        [' ', '<div style=white-space:pre-line>foo[] bar</div>'],
        [' ', '<div style=white-space:pre-line>foo  []bar</div>'],
        [' ', '<div style=white-space:pre-line>[]foo</div>'],
        [' ', '<div style=white-space:pre-line>foo[]</div>'],
        [' ', '<div style=white-space:pre-line>foo []</div>'],
        [' ', '<div style=white-space:pre-line> foo   []   </div>'],

        [' ', '<div style=white-space:nowrap>foo[]bar</div>'],
        [' ', '<div style=white-space:nowrap>foo []bar</div>'],
        [' ', '<div style=white-space:nowrap>foo[] bar</div>'],
        [' ', '<div style=white-space:nowrap>foo  []bar</div>'],
        [' ', '<div style=white-space:nowrap>[]foo</div>'],
        [' ', '<div style=white-space:nowrap>foo[]</div>'],
        [' ', '<div style=white-space:nowrap>foo []</div>'],
        [' ', '<div style=white-space:nowrap> foo   []   </div>'],

        // End whitespace tests

        // Autolinking tests
        [' ', 'http://a[]'],
        [' ', 'ftp://a[]'],
        [' ', 'quasit://a[]'],
        [' ', '.x-++-.://a[]'],
        [' ', '(http://a)[]'],
        [' ', '<http://a>[]'],
        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14744
        ['! ', '[http://a][]'],
        ['! ', '{http://a}[]'],
        [' ', 'http://a![]'],
        [' ', '!"#$%&\'()*+,-./:;<=>?\^_`|~http://a!"#$%&\'()*+,-./:;<=>?\^_`|~[]'],
        [' ', 'http://a!"\'(),-.:;<>`[]'],
        [' ', 'http://a#$%&*+/=?\^_|~[]'],
        [' ', 'mailto:a[]'],
        [' ', 'a@b[]'],
        [' ', 'a@[]'],
        [' ', '@b[]'],
        [' ', '#@x[]'],
        [' ', 'a@.[]'],
        [' ', '!"#$%&\'()*+,-./:;<=>?\^_`|~a@b!"#$%&\'()*+,-./:;<=>?\^_`|~[]'],
        [' ', '<b>a@b</b>{}'],
        [' ', '<b>a</b><i>@</i><u>b</u>{}'],
        [' ', 'a@b<b>[]c</b>'],
        [' ', '<p>a@b</p><p>[]c</p>'],
        ['a', 'http://a[]'],
        ['\t', 'http://a[]'],
        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14254
        ['!\r', 'http://a[]'],
        // http://www.w3.org/Bugs/Public/show_bug.cgi?id=14745
        ['!\n', 'http://a[]'],
        ['\f', 'http://a[]'],
        ['\u00A0', 'http://a[]'],

        ['   ', 'foo[]'],

        'foo[]bar',
        'foo []',
        'foo\xa0[]',
        '<p>foo[]',
        '<p>foo</p>{}',
        '<p>[]foo',
        '<p>{}foo',
        '{}<p>foo',
        '<p>foo</p>{}<p>bar</p>',
        '<b>foo[]</b>bar',
        '<b>foo</b>[]bar',
        'foo<b>{}</b>bar',
        '<a>foo[]</a>bar',
        '<a>foo</a>[]bar',
        '<a href=/>foo[]</a>bar',
        '<a href=/>foo</a>[]bar',
        '<p>fo[o<p>b]ar',
        '<p>fo[o<p>bar<p>b]az',
        '{}<br>',
        '<p>{}<br>',
        '<p><span>{}<br></span>',
        '<p>foo<span style=color:#aBcDeF>[bar]</span>baz',
        '<p>foo<span style=color:#aBcDeF>{bar}</span>baz',
        '<p>foo{<span style=color:#aBcDeF>bar</span>}baz',
        '<p>[foo<span style=color:#aBcDeF>bar]</span>baz',
        '<p>{foo<span style=color:#aBcDeF>bar}</span>baz',
        '<p>foo<span style=color:#aBcDeF>[bar</span>baz]',
        '<p>foo<span style=color:#aBcDeF>{bar</span>baz}',
        '<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz',


        // These are like the corresponding tests in the multitest section, but
        // because the selection isn't collapsed, we don't need to do
        // multitests to set overrides.
        'foo<b>[bar]</b>baz',
        'foo<i>[bar]</i>baz',
        'foo<s>[bar]</s>baz',
        'foo<sub>[bar]</sub>baz',
        'foo<sup>[bar]</sup>baz',
        'foo<u>[bar]</u>baz',
        'foo<a href=http://www.google.com>[bar]</a>baz',
        'foo<font face=sans-serif>[bar]</font>baz',
        'foo<font size=4>[bar]</font>baz',
        'foo<font color=#0000FF>[bar]</font>baz',
        'foo<span style=background-color:#00FFFF>[bar]</span>baz',
        'foo<a href=http://www.google.com><font color=blue>[bar]</font></a>baz',
        'foo<font color=blue><a href=http://www.google.com>[bar]</a></font>baz',
        'foo<a href=http://www.google.com><font color=brown>[bar]</font></a>baz',
        'foo<font color=brown><a href=http://www.google.com>[bar]</a></font>baz',
        'foo<a href=http://www.google.com><font color=black>[bar]</font></a>baz',
        'foo<a href=http://www.google.com><u>[bar]</u></a>baz',
        'foo<u><a href=http://www.google.com>[bar]</a></u>baz',
        'foo<sub><font size=2>[bar]</font></sub>baz',
        'foo<font size=2><sub>[bar]</sub></font>baz',
        'foo<sub><font size=3>[bar]</font></sub>baz',
        'foo<font size=3><sub>[bar]</sub></font>baz',

        // Now repeat but with different selections.
        '[foo<b>bar]</b>baz',
        '[foo<i>bar]</i>baz',
        '[foo<s>bar]</s>baz',
        '[foo<sub>bar]</sub>baz',
        '[foo<sup>bar]</sup>baz',
        '[foo<u>bar]</u>baz',
        '[foo<a href=http://www.google.com>bar]</a>baz',
        '[foo<font face=sans-serif>bar]</font>baz',
        '[foo<font size=4>bar]</font>baz',
        '[foo<font color=#0000FF>bar]</font>baz',
        '[foo<span style=background-color:#00FFFF>bar]</span>baz',
        '[foo<a href=http://www.google.com><font color=blue>bar]</font></a>baz',
        '[foo<font color=blue><a href=http://www.google.com>bar]</a></font>baz',
        '[foo<a href=http://www.google.com><font color=brown>bar]</font></a>baz',
        '[foo<font color=brown><a href=http://www.google.com>bar]</a></font>baz',
        '[foo<a href=http://www.google.com><font color=black>bar]</font></a>baz',
        '[foo<a href=http://www.google.com><u>bar]</u></a>baz',
        '[foo<u><a href=http://www.google.com>bar]</a></u>baz',
        '[foo<sub><font size=2>bar]</font></sub>baz',
        '[foo<font size=2><sub>bar]</sub></font>baz',
        '[foo<sub><font size=3>bar]</font></sub>baz',
        '[foo<font size=3><sub>bar]</sub></font>baz',

        'foo<b>[bar</b>baz]',
        'foo<i>[bar</i>baz]',
        'foo<s>[bar</s>baz]',
        'foo<sub>[bar</sub>baz]',
        'foo<sup>[bar</sup>baz]',
        'foo<u>[bar</u>baz]',
        'foo<a href=http://www.google.com>[bar</a>baz]',
        'foo<font face=sans-serif>[bar</font>baz]',
        'foo<font size=4>[bar</font>baz]',
        'foo<font color=#0000FF>[bar</font>baz]',
        'foo<span style=background-color:#00FFFF>[bar</span>baz]',
        'foo<a href=http://www.google.com><font color=blue>[bar</font></a>baz]',
        'foo<font color=blue><a href=http://www.google.com>[bar</a></font>baz]',
        'foo<a href=http://www.google.com><font color=brown>[bar</font></a>baz]',
        'foo<font color=brown><a href=http://www.google.com>[bar</a></font>baz]',
        'foo<a href=http://www.google.com><font color=black>[bar</font></a>baz]',
        'foo<a href=http://www.google.com><u>[bar</u></a>baz]',
        'foo<u><a href=http://www.google.com>[bar</a></u>baz]',
        'foo<sub><font size=2>[bar</font></sub>baz]',
        'foo<font size=2><sub>[bar</sub></font>baz]',
        'foo<sub><font size=3>[bar</font></sub>baz]',
        'foo<font size=3><sub>[bar</sub></font>baz]',

        // https://bugs.webkit.org/show_bug.cgi?id=19702
        '<blockquote><font color=blue>[foo]</font></blockquote>',
    ],
    //@}
    insertunorderedlist: [
    //@{
        'foo[]bar',
        'foo[bar]baz',
        'foo<br>[bar]',
        'f[oo<br>b]ar<br>baz',
        '<p>[foo]<br>bar</p>',
        '[foo<ol><li>bar]</ol>baz',
        'foo<ol><li>[bar</ol>baz]',
        '[foo<ul><li>bar]</ul>baz',
        'foo<ul><li>[bar</ul>baz]',
        'foo<ul><li>[bar</ul><ol><li>baz]</ol>quz',
        'foo<ol><li>[bar</ol><ul><li>baz]</ul>quz',

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
        '<table><tbody><tr><td>fo[o<td>b]ar<td>baz</table>',
        '{<table><tr><td>foo<td>bar<td>baz</table>}',

        '<p>foo<p>[bar]<p>baz',
        '<p>foo<blockquote>[bar]</blockquote><p>baz',
        '<dl><dt>foo<dd>[bar]<dt>baz<dd>quz</dl>',
        '<dl><dt>foo<dd>bar<dt>[baz]<dd>quz</dl>',

        '<p>[foo<p>bar]<p>baz',
        '<p>[foo<blockquote>bar]</blockquote><p>baz',
        '<dl><dt>[foo<dd>bar]<dt>baz<dd>quz</dl>',
        '<dl><dt>foo<dd>[bar<dt>baz]<dd>quz</dl>',

        '<p>[foo<blockquote><p>bar]<p>baz</blockquote>',


        // Various <ol> stuff
        '<ol><li>foo<li>[bar]<li>baz</ol>',
        '<ol><li>foo</ol>[bar]',
        '[foo]<ol><li>bar</ol>',
        '<ol><li>foo</ol>[bar]<ol><li>baz</ol>',
        '<ol><ol><li>[foo]</ol></ol>',
        '<ol><li>[foo]<br>bar<li>baz</ol>',
        '<ol><li>foo<br>[bar]<li>baz</ol>',
        '<ol><li><div>[foo]</div>bar<li>baz</ol>',
        '<ol><li>foo<ol><li>[bar]<li>baz</ol><li>quz</ol>',
        '<ol><li>foo<ol><li>bar<li>[baz]</ol><li>quz</ol>',
        '<ol><li>foo</li><ol><li>[bar]<li>baz</ol><li>quz</ol>',
        '<ol><li>foo</li><ol><li>bar<li>[baz]</ol><li>quz</ol>',
        '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
        '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
        '<ol><li>foo<li>[bar]<ol><li>baz</ol><li>quz</ol>',
        '<ol><li>foo<li>[bar]</li><ol><li>baz</ol><li>quz</ol>',
        '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
        '<ol><li>foo</li><ol><li>bar<li>baz</ol><li>[quz]</ol>',

        // Multiple items at once.
        '<ol><li>foo<li>[bar<li>baz]</ol>',
        '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
        '<ol><li>foo<ol><li>b[ar</ol><li>b]az</ol>',
        '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',

        // We probably can't actually get this DOM . . .
        '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
        '<ol><li>foo<ol><li>[bar]</ol>baz</ol>',
        '<ol><li>foo<ol><li>bar</ol>[baz]</ol>',
        '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',


        // Same stuff but with <ul>
        '<ul><li>foo<li>[bar]<li>baz</ul>',
        '<ul><li>foo</ul>[bar]',
        '[foo]<ul><li>bar</ul>',
        '<ul><li>foo</ul>[bar]<ul><li>baz</ul>',
        '<ul><ul><li>[foo]</ul></ul>',
        '<ul><li>[foo]<br>bar<li>baz</ul>',
        '<ul><li>foo<br>[bar]<li>baz</ul>',
        '<ul><li><div>[foo]</div>bar<li>baz</ul>',
        '<ul><li>foo<ul><li>[bar]<li>baz</ul><li>quz</ul>',
        '<ul><li>foo<ul><li>bar<li>[baz]</ul><li>quz</ul>',
        '<ul><li>foo</li><ul><li>[bar]<li>baz</ul><li>quz</ul>',
        '<ul><li>foo</li><ul><li>bar<li>[baz]</ul><li>quz</ul>',
        '<ul><li>[foo]<ul><li>bar</ul><li>baz</ul>',
        '<ul><li>[foo]</li><ul><li>bar</ul><li>baz</ul>',
        '<ul><li>foo<li>[bar]<ul><li>baz</ul><li>quz</ul>',
        '<ul><li>foo<li>[bar]</li><ul><li>baz</ul><li>quz</ul>',
        '<ul><li>foo<ul><li>bar<li>baz</ul><li>[quz]</ul>',
        '<ul><li>foo</li><ul><li>bar<li>baz</ul><li>[quz]</ul>',

        // Multiple items at once.
        '<ul><li>foo<li>[bar<li>baz]</ul>',
        '<ul><li>[foo<ul><li>bar]</ul><li>baz</ul>',
        '<ul><li>foo<ul><li>b[ar</ul><li>b]az</ul>',
        '<ul><li>[foo<ul><li>bar</ul><li>baz]</ul><p>extra',

        // We probably can't actually get this DOM . . .
        '<ul><li>[foo]<ul><li>bar</ul>baz</ul>',
        '<ul><li>foo<ul><li>[bar]</ul>baz</ul>',
        '<ul><li>foo<ul><li>bar</ul>[baz]</ul>',
        '<ul><li>[foo<ul><li>bar]</ul>baz</ul>',


        // Mix of <ol> and <ul>
        'foo<ol><li>bar</ol><ul><li>[baz]</ul>quz',
        'foo<ol><li>bar</ol><ul><li>[baz</ul>quz]',
        'foo<ul><li>[bar]</ul><ol><li>baz</ol>quz',
        '[foo<ul><li>bar]</ul><ol><li>baz</ol>quz',

        // Interaction with indentation
        '[foo]<blockquote>bar</blockquote>baz',
        'foo<blockquote>[bar]</blockquote>baz',
        '[foo<blockquote>bar]</blockquote>baz',
        '<ol><li>foo</ol><blockquote>[bar]</blockquote>baz',
        '[foo]<blockquote><ol><li>bar</ol></blockquote>baz',
        'foo<blockquote>[bar]<br>baz</blockquote>',
        '[foo<blockquote>bar]<br>baz</blockquote>',
        '<ol><li>foo</ol><blockquote>[bar]<br>baz</blockquote>',

        '<p>[foo]<blockquote><p>bar</blockquote><p>baz',
        '<p>foo<blockquote><p>[bar]</blockquote><p>baz',
        '<p>[foo<blockquote><p>bar]</blockquote><p>baz',
        '<ol><li>foo</ol><blockquote><p>[bar]</blockquote><p>baz',

        // Attributes
        '<ul id=abc><li>foo<li>[bar]<li>baz</ul>',
        '<ul style=color:blue><li>foo<li>[bar]<li>baz</ul>',
        '<ul style=text-indent:1em><li>foo<li>[bar]<li>baz</ul>',
        '<ul id=abc><li>[foo]<li>bar<li>baz</ul>',
        '<ul style=color:blue><li>[foo]<li>bar<li>baz</ul>',
        '<ul style=text-indent:1em><li>[foo]<li>bar<li>baz</ul>',
        '<ul id=abc><li>foo<li>bar<li>[baz]</ul>',
        '<ul style=color:blue><li>foo<li>bar<li>[baz]</ul>',
        '<ul style=text-indent:1em><li>foo<li>bar<li>[baz]</ul>',

        // Whitespace nodes
        '<ul><li>foo</ul> <p>[bar]',
        '<p>[foo]</p> <ul><li>bar</ul>',
        '<ul><li>foo</ul> <p>[bar]</p> <ul><li>baz</ul>',

        // https://bugs.webkit.org/show_bug.cgi?id=24167
        '{<div style="font-size: 1.3em">1</div><div style="font-size: 1.1em">2</div>}',
    ],
    //@}
    italic: [
    //@{
        'foo[]bar',
        '<p>[foo</p> <p>bar]</p>',
        '<span>[foo</span> <span>bar]</span>',
        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
        '<p>[foo<p><br><p>bar]',
        '<b>foo[]bar</b>',
        '<i>foo[]bar</i>',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        'foo[bar]baz',
        'foo[bar<b>baz]qoz</b>quz',
        'foo[bar<i>baz]qoz</i>quz',
        '{<p><p> <p>foo</p>}',

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
        '{<table><tr><td>foo<td>bar<td>baz</table>}',

        'foo<span style="font-style: italic">[bar]</span>baz',
        'foo<address>[bar]</address>baz',
        'foo<cite>[bar]</cite>baz',
        'foo<dfn>[bar]</dfn>baz',
        'foo<em>[bar]</em>baz',
        'foo<i>[bar]</i>baz',
        'foo<var>[bar]</var>baz',

        'foo{<address>bar</address>}baz',
        'foo{<cite>bar</cite>}baz',
        'foo{<dfn>bar</dfn>}baz',
        'foo{<em>bar</em>}baz',
        'foo{<i>bar</i>}baz',
        'foo{<var>bar</var>}baz',

        'foo<address>b[a]r</address>baz',
        'foo<cite>b[a]r</cite>baz',
        'foo<dfn>b[a]r</dfn>baz',
        'foo<em>b[a]r</em>baz',
        'foo<i>b[a]r</i>baz',
        'foo<var>b[a]r</var>baz',

        'fo[o<address>bar</address>b]az',
        'fo[o<cite>bar</cite>b]az',
        'fo[o<dfn>bar</dfn>b]az',
        'fo[o<em>bar</em>b]az',
        'fo[o<i>bar</i>b]az',
        'fo[o<var>bar</var>b]az',

        'foo[<address>bar</address>baz]',
        'foo[<cite>bar</cite>baz]',
        'foo[<dfn>bar</dfn>baz]',
        'foo[<em>bar</em>baz]',
        'foo[<i>bar</i>baz]',
        'foo[<var>bar</var>baz]',

        '[foo<address>bar</address>]baz',
        '[foo<cite>bar</cite>]baz',
        '[foo<dfn>bar</dfn>]baz',
        '[foo<em>bar</em>]baz',
        '[foo<i>bar</i>]baz',
        '[foo<var>bar</var>]baz',

        'foo<span style="font-style: italic">[bar]</span>baz',
        'foo<span style="font-style: oblique">[bar]</span>baz',
        'foo<span style="font-style: oblique">b[a]r</span>baz',

        '<i>{<p>foo</p><p>bar</p>}<p>baz</p></i>',
        '<i><p>foo[<b>bar</b>}</p><p>baz</p></i>',
        'foo [bar <b>baz] qoz</b> quz sic',
        'foo bar <b>baz [qoz</b> quz] sic',
        'foo [bar <i>baz] qoz</i> quz sic',
        'foo bar <i>baz [qoz</i> quz] sic',

        // Tests for queryCommandIndeterm() and queryCommandState()
        'fo[o<i>b]ar</i>baz',
        'foo<i>ba[r</i>b]az',
        'fo[o<i>bar</i>b]az',
        'foo[<i>b]ar</i>baz',
        'foo<i>ba[r</i>]baz',
        'foo[<i>bar</i>]baz',
        'foo<i>[bar]</i>baz',
        'foo{<i>bar</i>}baz',
        'fo[o<span style=font-style:italic>b]ar</span>baz',
        'fo[o<span style=font-style:oblique>b]ar</span>baz',
        '<span style=font-style:italic>fo[o</span><span style=font-style:oblique>b]ar</span>',
        '<span style=font-style:oblique>fo[o</span><span style=font-style:italic>b]ar</span>',
        '<i>fo[o</i><address>b]ar</address>',
    ],
    //@}
    justifycenter: [
    //@{
        'foo[]bar<p>extra',
        '<span>foo</span>{}<span>bar</span><p>extra',
        '<span>foo[</span><span>]bar</span><p>extra',
        'foo[bar]baz<p>extra',
        'foo[bar<b>baz]qoz</b>quz<p>extra',
        '<p>foo[]bar<p>extra',
        '<p>foo[bar]baz<p>extra',
        '<h1>foo[bar]baz</h1><p>extra',
        '<pre>foo[bar]baz</pre><p>extra',
        '<xmp>foo[bar]baz</xmp><p>extra',
        '<center><p>[foo]<p>bar</center><p>extra',
        '<center><p>[foo<p>bar]</center><p>extra',

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
        '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',

        '<table align=center><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
        '<table align=center><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table align=center><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table align=center><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
        '<table align=center data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
        '{<table align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra',

        '<table><tbody align=center><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
        '<table><tbody align=center><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody align=center><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody align=center data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
        '<table data-start=0 data-end=1><tbody align=center><tr><td>foo<td>bar<td>baz</table><p>extra',
        '{<table><tbody align=center><tr><td>foo<td>bar<td>baz</table>}<p>extra',

        '<table><tbody><tr align=center><td>foo<td>b[a]r<td>baz</table><p>extra',
        '<table><tbody><tr align=center data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody><tr align=center data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody data-start=0 data-end=1><tr align=center><td>foo<td>bar<td>baz</table><p>extra',
        '<table data-start=0 data-end=1><tbody><tr align=center><td>foo<td>bar<td>baz</table><p>extra',
        '{<table><tr align=center><td>foo<td>bar<td>baz</table>}<p>extra',

        '<div align=center><p>[foo]<p>bar</div><p>extra',
        '<div align=center><p>[foo<p>bar}</div><p>extra',
        '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
        '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',

        '<div align=justify><p>[foo]<p>bar</div><p>extra',
        '<div align=justify><p>[foo<p>bar}</div><p>extra',
        '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
        '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',

        '<div align=left><p>[foo]<p>bar</div><p>extra',
        '<div align=left><p>[foo<p>bar}</div><p>extra',
        '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
        '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',

        '<div align=right><p>[foo]<p>bar</div><p>extra',
        '<div align=right><p>[foo<p>bar}</div><p>extra',
        '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
        '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',

        '<center>foo</center># This Source Code Form is subject to the terms of the Mozilla Public
        '[foo]<center>bar</center><p>extra',
        '<center>foo</center>[bar]<center>baz</center><p>extra',
        '<div align=center>foo</div>[bar]<p>extra',
        '[foo]<div align=center>bar</div><p>extra',
        '<div align=center>foo</div>[bar]<div align=center>baz</div><p>extra',
        '<div align=center><p>foo</div><p>[bar]<p>extra',
        '<p>[foo]<div align=center><p>bar</div><p>extra',
        '<div align=center><p>foo</div><p>[bar]<div align=center><p>baz</div><p>extra',
        '<div style=text-align:center>foo</div>[bar]<p>extra',
        '[foo]<div style=text-align:center>bar</div><p>extra',
        '<div style=text-align:center>foo</div>[bar]<div style=text-align:center>baz</div><p>extra',
        '<div style=text-align:center><p>foo</div><p>[bar]<p>extra',
        '<p>[foo]<div style=text-align:center><p>bar</div><p>extra',
        '<div style=text-align:center><p>foo</div><p>[bar]<div style=text-align:center><p>baz</div><p>extra',
        '<p align=center>foo<p>[bar]<p>extra',
        '<p>[foo]<p align=center>bar<p>extra',
        '<p align=center>foo<p>[bar]<p align=center>baz<p>extra',

        '<center>[foo</center>bar]<p>extra',
        '<center>fo[o</center>b]ar<p>extra',
        '<div align=center>[foo</div>bar]<p>extra',
        '<div align=center>fo[o</div>b]ar<p>extra',
        '<div style=text-align:center>[foo</div>bar]<p>extra',
        '<div style=text-align:center>fo[o</div>b]ar<p>extra',
        '<span style=text-align:center>[foo]</span><p>extra',
        '<span style=text-align:center>f[o]o</span><p>extra',

        '<div style=text-align:center>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',

        '<div align=nonsense><p>[foo]</div><p>extra',
        '<div style=text-align:inherit><p>[foo]</div><p>extra',
        '<quasit align=right><p>[foo]</p></quasit><p>extra',

        '<div align=center>{<div align=left>foo</div>}</div>',
        '<div align=left>{<div align=center>foo</div>}</div>',
        '<div align=center>{<div align=left>foo</div>bar}</div>',
        '<div align=left>{<div align=center>foo</div>bar}</div>',
        '<div align=center>{<div align=left>foo</div><img src=/img/lion.svg>}</div>',
        '<div align=left>{<div align=center>foo</div><img src=/img/lion.svg>}</div>',
        '<div align=center>{<div align=left>foo</div><!-- bar -->}</div>',
        '<div align=left>{<div align=center>foo</div><!-- bar -->}</div>',

        '<div style=text-align:start>[foo]</div><p>extra',
        '<div style=text-align:end>[foo]</div><p>extra',
        '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
        '<div dir=rtl style=text-align:end>[foo]</div><p>extra',

        // Whitespace nodes
        '<div style=text-align:center><p>foo</div> <p>[bar]',
        '<div align=center><p>foo</div> <p>[bar]',
        '<center><p>foo</center> <p>[bar]',
        '<p>[foo]</p> <div style=text-align:center><p>bar</div>',
        '<p>[foo]</p> <div align=center><p>bar</div>',
        '<p>[foo]</p> <center><p>bar</center>',
        '<div style=text-align:center><p>foo</div> <p>[bar]</p> <div style=text-align:center><p>baz</div>',
        '<div align=center><p>foo</div> <p>[bar]</p> <div align=center><p>baz</div>',
        '<center><p>foo</center> <p>[bar]</p> <center><p>baz</center>',
    ],
    //@}
    justifyfull: [
    //@{
        'foo[]bar<p>extra',
        '<span>foo</span>{}<span>bar</span><p>extra',
        '<span>foo[</span><span>]bar</span><p>extra',
        'foo[bar]baz<p>extra',
        'foo[bar<b>baz]qoz</b>quz<p>extra',
        '<p>foo[]bar<p>extra',
        '<p>foo[bar]baz<p>extra',
        '<h1>foo[bar]baz</h1><p>extra',
        '<pre>foo[bar]baz</pre><p>extra',
        '<xmp>foo[bar]baz</xmp><p>extra',
        '<center><p>[foo]<p>bar</center><p>extra',
        '<center><p>[foo<p>bar]</center><p>extra',

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
        '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',

        '<table align=justify><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
        '<table align=justify><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table align=justify><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table align=justify><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
        '<table align=justify data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
        '{<table align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra',

        '<table><tbody align=justify><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
        '<table><tbody align=justify><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody align=justify><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody align=justify data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
        '<table data-start=0 data-end=1><tbody align=justify><tr><td>foo<td>bar<td>baz</table><p>extra',
        '{<table><tbody align=justify><tr><td>foo<td>bar<td>baz</table>}<p>extra',

        '<table><tbody><tr align=justify><td>foo<td>b[a]r<td>baz</table><p>extra',
        '<table><tbody><tr align=justify data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody><tr align=justify data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody data-start=0 data-end=1><tr align=justify><td>foo<td>bar<td>baz</table><p>extra',
        '<table data-start=0 data-end=1><tbody><tr align=justify><td>foo<td>bar<td>baz</table><p>extra',
        '{<table><tr align=justify><td>foo<td>bar<td>baz</table>}<p>extra',

        '<div align=center><p>[foo]<p>bar</div><p>extra',
        '<div align=center><p>[foo<p>bar}</div><p>extra',
        '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
        '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',

        '<div align=justify><p>[foo]<p>bar</div><p>extra',
        '<div align=justify><p>[foo<p>bar}</div><p>extra',
        '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
        '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',

        '<div align=left><p>[foo]<p>bar</div><p>extra',
        '<div align=left><p>[foo<p>bar}</div><p>extra',
        '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
        '<div style=text-align:left><p>[foo<p>bar]</div><p>extra',

        '<div align=right><p>[foo]<p>bar</div><p>extra',
        '<div align=right><p>[foo<p>bar}</div><p>extra',
        '<div style=text-align:right><p>[foo]<p>bar</div><p>extra',
        '<div style=text-align:right><p>[foo<p>bar]</div><p>extra',

        '<div align=justify>foo</div>[bar]<p>extra',
        '[foo]<div align=justify>bar</div><p>extra',
        '<div align=justify>foo</div>[bar]<div align=justify>baz</div><p>extra',
        '<div align=justify><p>foo</div><p>[bar]<p>extra',
        '<p>[foo]<div align=justify><p>bar</div><p>extra',
        '<div align=justify><p>foo</div><p>[bar]<div align=justify><p>baz</div><p>extra',
        '<div style=text-align:justify>foo</div>[bar]<p>extra',
        '[foo]<div style=text-align:justify>bar</div><p>extra',
        '<div style=text-align:justify>foo</div>[bar]<div style=text-align:justify>baz</div><p>extra',
        '<div style=text-align:justify><p>foo</div><p>[bar]<p>extra',
        '<p>[foo]<div style=text-align:justify><p>bar</div><p>extra',
        '<div style=text-align:justify><p>foo</div><p>[bar]<div style=text-align:justify><p>baz</div><p>extra',
        '<p align=justify>foo<p>[bar]<p>extra',
        '<p>[foo]<p align=justify>bar<p>extra',
        '<p align=justify>foo<p>[bar]<p align=justify>baz<p>extra',

        '<div align=justify>[foo</div>bar]<p>extra',
        '<div align=justify>fo[o</div>b]ar<p>extra',
        '<div style=text-align:justify>[foo</div>bar]<p>extra',
        '<div style=text-align:justify>fo[o</div>b]ar<p>extra',
        '<span style=text-align:justify>[foo]</span><p>extra',
        '<span style=text-align:justify>f[o]o</span><p>extra',

        '<div style=text-align:justify>[foo<div style=text-align:left contenteditable=false>bar</div>baz]</div><p>extra',

        '<div align=nonsense><p>[foo]</div><p>extra',
        '<div style=text-align:inherit><p>[foo]</div><p>extra',
        '<quasit align=center><p>[foo]</p></quasit><p>extra',

        '<div style=text-align:start>[foo]</div><p>extra',
        '<div style=text-align:end>[foo]</div><p>extra',
        '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
        '<div dir=rtl style=text-align:end>[foo]</div><p>extra',

        // Whitespace nodes
        '<div style=text-align:justify><p>foo</div> <p>[bar]',
        '<div align=justify><p>foo</div> <p>[bar]',
        '<p>[foo]</p> <div style=text-align:justify><p>bar</div>',
        '<p>[foo]</p> <div align=justify><p>bar</div>',
        '<div style=text-align:justify><p>foo</div> <p>[bar]</p> <div style=text-align:justify><p>baz</div>',
        '<div align=justify><p>foo</div> <p>[bar]</p> <div align=justify><p>baz</div>',
    ],
    //@}
    justifyleft: [
    //@{
        'foo[]bar<p>extra',
        '<span>foo</span>{}<span>bar</span><p>extra',
        '<span>foo[</span><span>]bar</span><p>extra',
        'foo[bar]baz<p>extra',
        'foo[bar<b>baz]qoz</b>quz<p>extra',
        '<p>foo[]bar<p>extra',
        '<p>foo[bar]baz<p>extra',
        '<h1>foo[bar]baz</h1><p>extra',
        '<pre>foo[bar]baz</pre><p>extra',
        '<xmp>foo[bar]baz</xmp><p>extra',
        '<center><p>[foo]<p>bar</center><p>extra',
        '<center><p>[foo<p>bar]</center><p>extra',

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
        '{<table><tr><td>foo<td>bar<td>baz</table>}<p>extra',

        '<table align=left><tbody><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
        '<table align=left><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table align=left><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table align=left><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
        '<table align=left data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table><p>extra',
        '{<table align=left><tr><td>foo<td>bar<td>baz</table>}<p>extra',

        '<table><tbody align=left><tr><td>foo<td>b[a]r<td>baz</table><p>extra',
        '<table><tbody align=left><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody align=left><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody align=left data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table><p>extra',
        '<table data-start=0 data-end=1><tbody align=left><tr><td>foo<td>bar<td>baz</table><p>extra',
        '{<table><tbody align=left><tr><td>foo<td>bar<td>baz</table>}<p>extra',

        '<table><tbody><tr align=left><td>foo<td>b[a]r<td>baz</table><p>extra',
        '<table><tbody><tr align=left data-start=1 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody><tr align=left data-start=0 data-end=2><td>foo<td>bar<td>baz</table><p>extra',
        '<table><tbody data-start=0 data-end=1><tr align=left><td>foo<td>bar<td>baz</table><p>extra',
        '<table data-start=0 data-end=1><tbody><tr align=left><td>foo<td>bar<td>baz</table><p>extra',
        '{<table><tr align=left><td>foo<td>bar<td>baz</table>}<p>extra',

        '<div align=center><p>[foo]<p>bar</div><p>extra',
        '<div align=center><p>[foo<p>bar}</div><p>extra',
        '<div style=text-align:center><p>[foo]<p>bar</div><p>extra',
        '<div style=text-align:center><p>[foo<p>bar]</div><p>extra',

        '<div align=justify><p>[foo]<p>bar</div><p>extra',
        '<div align=justify><p>[foo<p>bar}</div><p>extra',
        '<div style=text-align:justify><p>[foo]<p>bar</div><p>extra',
        '<div style=text-align:justify><p>[foo<p>bar]</div><p>extra',

        '<div// the page as it loads.  We don't want this for the conformance tests, so let
        '<div align=left><p>[foo<p>bar}</        adocumentc("");
        '<div style=text-align:left><p>[foo]<p>bar</div><p>extra',
       'div styletext-align:left><p>[foo<p>bar]</div><p>extra',

        '<div align=right><p>[foo]<>bar/iv<p>'java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
        '<div align=right><p>[foo<p>bar}</div><p>extra',
       < style-rightppbar/ivpe'


'divalign>foo/>b<>extrajava.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
         body=(ocument.ody +"wbr-".rim(java.lang.StringIndexOutOfBoundsException: Index 91 out of bounds for length 91
        <iv left</[ar<divl>az<div>p>'
        '<div         'foo[bar]bafoo]baz'java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 22
        '<p>['scontenteditable><span =>bar</panb</pan'java.lang.StringIndexOutOfBoundsException: Index 91 out of bounds for length 91
        'div alignl<>foo/div><p[
        '<div style=text-align        <able>tdata-=0data-=1<foo<db<td>az/able>,
'foo]div style=ext-lign:left>
        '<java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 0
        '<div=ext-:left<>oodiv>p<e'java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
        '<foostyle=ontjava.lang.StringIndexOutOfBoundsException: Range [38, 36) out of bounds for length 60
=textjava.lang.StringIndexOutOfBoundsException: Range [31, 30) out of bounds for length 105
        '<p align=left>foo<p>[bar]<p>extra',
        <>foo pe'java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
        '<p align=left>foo<p>[bar]<p         '<span style="font-weight: 900">fo/pan},

        < alignleft[oo/iv]p>'java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
         align>oo/ivb<>extra,
        <div stylealign:eft>f</iv]<>xtra,
        <iv styletext-l>foo<div>a<>extra,
        'java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 89
'<textfoo/<e'java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59

        '<divfoo[arq'

        '
        '<div< =http/
        '<quasit align=center><p>[foo]</p></quasit        [a =http/

        '<div        foo< href=therurl>b</abaz]'
        '<<a href=therurl<>oo[/<a}'
        '<div dir=rtl style=text-align:start>[foo]</div><p>extra',
        '<div dir=rtl style=text/

        // Whitespace nodes
        <div styletext-lign:eft<pfoodiv <p>]'
        '<div align=lefto&#[]'
        ''p</<>]/>,
        '>f]</><align=<pb</'java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
        '<div style=        '<div><p>foo</p>div>]ar'java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
' left>pf</ <>b]</> <div align=leftbaz</iv'java.lang.StringIndexOutOfBoundsException: Index 81 out of bounds for length 81
    ],
//@}
    'fooahref/nameabc>]ar/'java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
    //@{        'foo  [] bar',
        'foo[]bar<pfoo <pan>n;<java.lang.StringIndexOutOfBoundsException: Range [33, 31) out of bounds for length 40
foo/pan{<pan</span<>extrajava.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
        <>foo[bar/pre'
        'foo[bar]baz<p>extra',
        'foo[bar<b>baz]qoz</b>quz<p>extra',
        '<p>foo[]java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 0
        '<p>'div style=space&[ /iv'
        '/java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
<>oo<<>xtra'java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
'foo>t><>p>,
        <>p[oo<bar/enterp'
        '<center><p>[foo<p>bar]</'><d<br><br><>]bar<table>java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54

        <>li>li[b<ol'
        '
        <>-=0data-=2<dfoo<dbar>az</>p>extra'
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table        f<divdiv<l><li>[]ar/ol>/'
        '<table data-start=0 data-end'dld>d>d>]>'java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
        '{<table><tr><td<br></ol><p>[]bar',

        '<table align=right><tbody><tr><td>foo<td>b[a]r<td>baz</'o>l>fooli<>/>}b>'
        '<table align=right><tbody><tr '<>l>oo>b>/l><p'
        '<table align=right><tbody><tr fooblockquote style=c >]ar<blockquote>
        '<table align=right><tbody data-start=0        
        '<table align=right data-start
        '{<table align=right><tr><td>foo<td>bar

        '<table><tbody align=java.lang.StringIndexOutOfBoundsException: Range [8, 1) out of bounds for length 54
'>tbodyalignr>tr -start1 -nd=><>footd<>baztable><>
        '<table><tbody align=right><'<div>div<>oo/-<</>div<div>[<>div><',
        'd>div>>oo</</>div<iv><!d>java.lang.StringIndexOutOfBoundsException: Range [72, 71) out of bounds for length 91
        '<table data-start=0 data        <pstyle:bluefoo< =color:rown[b,
        '{<table><tbody align<><pjava.lang.StringIndexOutOfBoundsException: Range [30, 29) out of bounds for length 43

        '<table><tbody><tr         '<p style=background-col background-:aquaf< style=ackground-tan[bar'java.lang.StringIndexOutOfBoundsException: Index 80 out of bounds for length 80
'><tbody><alignr datastart= data-end=>java.lang.StringIndexOutOfBoundsException: Range [74, 70) out of bounds for length 102
        '<<p>foo<>s[b/>,
        '<table><tbody data-start=0 data-end=1><tr align=right><td>foo<td>bar<td>baz</table><p>extra',
                Uncollapsed selection
        '{<table><tr align=right><td>foo<td>bar<td>baz</table>}<p>extra',

        '<div align=center><p>[foo]<p>bar</div><p>extra',<>foospan :>b</panbaz},
        ''foob>b}/b',
        < styletext-lign>p[oo<>ar/div<>extra,
        '<div style=text-align<p>oo/p<p>b}/>pb</>,

        =justifyp>f]p>ar<div<>xtra,
        <iv =justify<><>ar/>p>extra
        '<div style=text-align:justify> '<>p<>baz</'
        < stylestylealignjustify[<</>'

        '<div align<pfoo{/>}'java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
        '<div align=left[div>p>b<pbaz/div'java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
iv=-alignleftp[<>ar<>,
        ''oo>br{p]<p'

        d align>[]>ar/>p'
        '<div align<table>t>tr[<>bar><<d><>tdq]java.lang.StringIndexOutOfBoundsException: Range [83, 82) out of bounds for length 85
        '<div<f<<tr>ba[<<pba'java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
        '<div style=text-align:right><p>[foo<p>'p<<>ar><p,

        '<div align=right>foo</div>[bar]java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        '[foo]<div align=right>bar</div><p>extra',d>d>[<><>/>java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
        '<div align=right>foo</div>[bar]<div align=right
        '<div align=right><p>foo</div><p>[bar]<p>extra',
        '<p>[foo]<div align=right><p>'<span style=display:none>fo[o</>s =isplay:oneb]rspan>,
        '<div align=right><p>foo/java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
        '<div style=text-align:right>foo</div>[        '<div style=text-align:right>foo</div>[bar
        '[foo]<div style'<>>lifoo/ll>}br><ll>/>,
        '<div style=text-align:right>foo</div'o>>foo]/><i<>,
        <=-lign<foodivp>[]p>extra,
        '<p>[foo]<div style=textl>ar]/>ol>>baz/<ol><li>/>',
        < style-alignrightp</<[ar<talign>p<<>xtra
        '<p align=right>foo<p>[bar]<p>extra',
,
        '<p align=right>foo<p>[bar]<p align=right>baz<p>extra',

        '<div align<span>oo[<<>bar</'java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
        '<div align=right>fo[o</div>b]<able><<r<foot>[ar>baz/table>'
        '<div style=text-align:right>[foo</div>bar]<p>extra',
        '<div style=text-align:right>fo[o</div>b]ar<p>extra',
        '<span style=text-align:right>[foo]</span><p>extra',
        '<span style=text-align:right>f[o]o</span>bar</,

        '<div style=text-foo<tt>b[a]r</tt>baz

        '<div align=nonsense><p>[foo]</div>>ar/t]'
        '<div style=text-align:inherit><p>[foo'[oojava.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 41
        '<quasit align=center><p>[foo]</p></quasit><p>extra',

        '<div style=text-align:start>[foo]</div><p>extra',
        '<div style=text-align foo style="ont-amily: sans-serif">[bar]</span>baz',
        '<div dir'oo-:monospace"[bar<span>az',
        ' tcontenteditable>ba[<ttba'java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53

/
'div style=text-:right><p>foo<div <p>bar]',
        '<div align=right><p>foo</div> <p>[bar]',
        '<p>[foo]</p'o<sampb<samp'
        <>foo]/ <iv =right<>bar/>java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
        '<div style=text-align:java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 19
'div right>p<div><>bar]/><align=ight<>baz/'java.lang.StringIndexOutOfBoundsException: Index 83 out of bounds for length 83
]
    /}
    outdent: [
    //@{
        // These mimic existing indentation in various browsers, to see how
outdentingvarious things.  Thisspec Gecko
[20" f[barb',
        '<blockquote><p>foo[bar]</p><p>        ".0" java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 31
        ", f[barbaz',
        '<blockquote><p>        ["-1", 'foo[bar]baz,
        '<blockquote><p>foo[bar</p></blockquote><p>b]az</p><p>extra',

        // IE:
        '<blockquote style="margin-right: 0px;" java.lang.StringIndexOutOfBoundsException: Range [0, 51) out of bounds for length 0
        '<blockquote style="margin-right: 0px;" dir="ltr"><p>foo[bar</p><p>'fontbar</b'java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
        <style"-ight:0x" dir=ltr">pfoo]<blockquote>p>bazp<>'
        <lockquote style"-right 0;"dir=ltr"<>oo[ar>/lockquote><>a<p<>xtrajava.lang.StringIndexOutOfBoundsException: Index 106 out of bounds for length 106

        // Firefox CSS mode:
        '<p style="margin-left: 40px">foo[bar]</p><p style        'span="ont-size 2em"foo]/span>,
        '<p style="margin-left:'< style=font-size: medium"foo[bar]</>',
        '<p style="margin-left: 40px">foojava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        '<p style="margin-left: 40px">foo[bar</p><p>b]az</p><p>extra',

        // WebKit:
        '<blockquote class "3", '<font size=6>foospan style=f-size 2m"b]<span> /ont>]
        '<blockquote class="webkit-indent-blockquote" style= 3",'<]/mall>'java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
        '<blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: java.lang.StringIndexOutOfBoundsException: Range [0, 93) out of bounds for length 42
        '<        f[f java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 42

        // Now let's try nesting lots of stuff and see what happens.<s fontsmallb<span'
        ></blockquote',
        '<blockquote><blockquote data-abc=def>foo[bar]baz</blockquote></blockquote>',
        '<blockquote data-abc=def><blockquote>foo[bar]baz</blockquote></blockquote>',
<>[<<java.lang.StringIndexOutOfBoundsException: Range [56, 55) out of bounds for length 58
        '<java.lang.StringIndexOutOfBoundsException: Range [0, 20) out of bounds for length 8
        <lockquoteid=>foob]baz/lockquote>,
        '        [bar/>,

        '<blockquote{p<> <foo/>'
        '<blockquote><blockquote data-abc=def><p>foo[bar]<p>baz</blockquote></blockquote>'00' '[barbaz',
        '<blockquote data-abc=def><blockquote><p>foo[bar]<p>baz</blockquote></blockquote>',
        '<blockquote><div><p>foo[bar]<p>        '<blockquote><div><p>foo[bar]<p>baz
        '<blockquote><div id=abc><p>foo[bar]<p'java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 50
        '<blockquote id=abc><p>foo[bar]<p>baz</blockquote>',[' foo]',
        '<blockquote style="color: blue"><p>foo[bar]<p>baz'table<>tr datastart1  data-2<d><>bar>baz/'

        '<blockquote><p><b>foof<color=[</font'java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
        'blockquote<><trong>oobar</trong>p></lockquote>',
        '<blockquote>' =color:rgb, 0,255)>< "olorbrown"[]/>baz/>,
        '<blockquote><blockquote style="color: blue"><p>foo[bar]</
        '<blockquote style="color: [#ff,'a:www.comfoobar/>]java.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 69

        // Lists!
        '>li<li>b]<ib/'java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
>/>java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
        <l<i[ar'
        '<ol><li>[foo]<br>bar<li>baz</ol>',
        '<ol><li>foo<br>[bar]<li>baz</ol>',
        '<ol><li><div>[foo]</div>bar<li>baz</ol>',
        <<i<><li[]lib</l>java.lang.StringIndexOutOfBoundsException: Range [52, 48) out of bounds for length 59
        'olo><ib<li>b]<ol<liq</>,
        <p>,
        '<ol><li>foo</li><ol data-start=0 data-end=1><li>bar<li>baz<'oobar>azq/>quzp>xtra,
        '><>foo/i>o><li<i[]<ol<liquz</>,
        '<ol><li>foo</li><ol data-start=1 data-end=2><li>bar<li>baz</ol><li>quz</ol>',
        '<ol><li>foo<ol><li>b[a]r</ol><li>baz</ol>',
        '<ol><li>foo</        '<h1>[foobar]</h,
        '<ol><li>foo{<ol><li>bar</ol>}<li>baz</ol>',
        '<ol><li>foo</li>{<ol><li>bar</ol>}        >oo<db]/'java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
        '<ol><li>[foo]<ol><li>bar</ol><li>baz</ol>',
        '<ol><li>[foo]</li><ol><li>bar</ol><li>baz</ol>',
        o>l>l>b<l<li>az</l<>uz>,
        '<ol><li>foo<li>[bar]</'<>,'<span>foo<span{<b<span>p>']
        '<ol><li>foo<ol><li>bar<li>baz</ol><li>[quz]</ol>',
'<l>li>/i>o>li>bar<b<ol<li[uz<ol'java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64

        
        '<ol><li>foo<li><>''divfoobar<>]java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
        '<ol><li>[foo<ol><li>bar]</ol><li>baz</ol>',
        '<ol><li>[foo</li><ol><li>bar]</ol><li>baz</ol>[<>' '
        <<if<ol<iba</>li]z/l>,
        '<ol><li>foo</li><ol><li>b[ar</ol><li>b]az</ol>',
        '<ol><li>[foo<ol><li>bar</ol><li>baz]</ol><p>extra',
        '<ol><li>[foo</li><ol><li>bar</ol><li>baz]</ol><p>extra',

        // We probably can't actually get this DOM . . .
        '<ol><li>[foo]<ol><li>bar</ol>baz</ol>',
        '<ol><li>foo<ol><li>[bar]</ol        [<blockquote>,'section[section>]java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
        '<ol><li[<' 'section>f]/>]java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
        '<ol><li>[foo<ol><li>bar]</ol>baz</ol>',

        // Attribute handling on lists
        'foo<ol start=5><li>[bar]</ol>baz',
'<olid=bc<>[ar</l'java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
'<olstyle=blue>l>bar<ol'java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
        'foo<ol><li value=5>[bar]</ol>baz',
        'foo<ol><li id=abc>[bar]</ol>baz',
        'foo<ol><li style=color:blue>[bar]</ol>baz',
        '<ol><li>foo</li> <el''p[oobar</>]java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
        '<ul><li>foo</li><ol><li value=5>[bar]</ol>['dl <>foobar</
        '<ol><li>foo</li><ol start=5><li>[bar]</ol><li>baz</java.lang.StringIndexOutOfBoundsException: Range [0, 62) out of bounds for length 44
        '<        ['<f>,'p>f<p',
        '<ol['<>,[java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
        '<ol><li>foo</li><ol style=text-indent:1em><li>[bar]</ol><li>baz</ol>',
        '<ol><li>foo</li><ol start=5><li>[bar<li>baz]</ol><li>quz</'<group' '<>f</>,
        '<ol><li>foo</li><ol id=abc><li>[bar<li>baz]</ol><li>quz</ol>',
        ''menu,'p[oobar]/>]java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
        '<ol><li>foo[java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 37

        // List inside indentation element
        '<blockquote><ol><li>[foo]</ol></blockquote><p>extra',
        '<blockquote>foo<ol><li>[bar]</ol>baz</blockquote><p>extra',
        '<blockquote>[<div>' <>foo>ar]

        '<ol>'f<p[p>],
        <<>x>f</xmp<li</l>,
        '<blockquote><ol><li>foo<div><ol><li>[bar]</ol></div><li>baz</ol></blockquote>',

        // Whitespace nodes
        '<blockquote> <p>[foo]</p></blockquote>',
        '<>' <>foo>ar]]java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
        < <>]/> />'
        '<ol> <li>[foo]</li></ol>',
        >foo]<li> /
        '<ol> <li>[foo]</li> </ol>',
        '<ul> <li>[foo]</li></ul>',
        '<ul><li>[foo]</li> </ul>',
        '<ul> <li>[foo]</li> </ul>',[<address>, <>f]b>h1]java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
        '<blockquote> <p>[foo]</p> [<pre' '[]b>/h1',
        '<blockquote> <p>foo</p> <p>[bar]</p> <p>baz</p></blockquote>',
        'blockquote> p<p <></p[</p</lockquote
        '<ol> <li>[foo]</li> <li>bar</li> <li>baz</li></ol>',
        '<        ['<a'''>foo>bar/>,
        <>l>/li>ar/li l>b]/<'
        '<ul> <li>[foo]</li> <li>bar</li> <li>baz</li></ul>',
        '<ul> <li>foo</li> <li>['p,<>foobr></ddress
        '<ul> <li>foo</li> <li>bar</li> <li>[baz]</li></ul>',

        // https://bugs.webkit.org/show_bug.cgi?id=24249
        '<ol><li>[]a<table><tr><td><br></table></ol>',
                'a>, <[oob>bar</re>]
        '<blockquote><span>foo<br>[bar]</span></blockquote>',
   ,
    //@}
    removeformat: [
    //@{
        f[b,
        '<span>foo</span>{}<span>bar</span>',
        <pan><span>s>b</'
        '[foo<b>bar</b>baz]',
        'foo[<b>bar</b>baz]',
        'foo[<b>bar</b>]baz',
        'foo<b>[bar]</b>baz',
        'foo<b>b[a]r</b>baz',
        '[foo<strong>bar</strong>baz]',
        '[foo<span style="'foo[]<span style=disp:oneb</>baz,
        ''oo#308'java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
        '[foo<span style="font-variant: small-caps">bar</span>baz]',
        'foo<span style="font-variant: small-caps">b[a]r</span>baz',
        f< idfoo/>,
        'foo<b id=foo>b[a]r</b>baz',

        // HTML has lots of inline elements, doesn't it?
        '[foo<a>bar</a>baz]',
        fooa>[r/ab'
        '[foo<a href=foo>bar</a>baz]',
        href=oob[]/>baz,
        '[foo<abbr>bar'divp>[<p/>p>/>
        'foo<abbr>b[a'>p[]<<>bar
        '[foo<acronym>bar</acronym>baz]',
        '<>foo]<b<rbar'java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
        '[foo<b>bar</b>baz]',
        'foo<b>b[a]r</b>baz'']<img=//ion>'java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
        '[foo<java.lang.StringIndexOutOfBoundsException: Range [42, 43) out of bounds for length 42
        'foo<bdi dir=rtl>b[a]r</bdi>baz',
        '[foo<java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        'foo<bdo dir=rtl>b[a]r<f[ bar,
        '[foo<big>bar</big>baz]',
        foo[</baz,
        '[foo<blink>bar</blink>baz]',
        'foo<blink>b[a]r</'b>]<b bar,
        '[foo<cite>bar</'pre>]nbsp;foo</>java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
        'foo<cite>b[a]r</cite>baz',
        '[foo<code>bar</code>baz]',
        'foo<code>b[a]r</code>baz',
        '[foo<del>bar</del>baz]',
        'foo<del>b[a]r</del>baz',
        'java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
        '<dfn[a]</>baz,
        '[foo<em>bar</em>        '<div style=white-spnowrap>oo] &bsp;ar</>'
        '
'<>bar<font],
        'foo<font>b[a]r</font>baz',
        [<fontblue>bar/baz],
'f color=blue[ar/>baz,
        '[foo<i>bar</i>baz]',
        'foo<i>b[a]r</i>baz',
        '[foo<ins>bar</ins>baz]',
        'foo<ins>b[a]r</ins>baz',
        '[foo<kbd>bar</kbd>baz]',
        kbd>ar/baz'java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
        '[foo<mark>bar</mark>baz]',
        'foo<mark>b[a]r</mark>baz',
        '[foo<nobr>bar</nobr>java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
        'foo<nobr>b[a]r</nobr>baz',
        '[foo<q>bar</q>baz]',
        'foo<q>b[a]r</q>baz',
        <samp/>az,
        'foo<samp>b[a]r</samp>baz',
        '[foo<s>bar</s>baz]',
        'foo<s>b[a]r</s>baz',
        '[foo<small>bar</small>baz]',
        'foo<small>b[a]r</small>baz',
        '[foo<span>bar</span>baz]',
        'foo<span>b[a]rjava.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
        '[foo<strike>bar</strike>baz]',
        'foo<strike>b[a]r</strike>baz',
        '[foo<strong>bar</strong>baz]',
        'foo<strong>b[a]r</strong>baz',
        '[foo<sub>bar</'div<f[<>/>/iv<iv>---<iv<iv><<',
        'foo<sub>b[a]r</sub>baz',
        '[foo<sup>bar</sup>baz]',
        'foo<sup>b[a]r</sup>baz',
        '[foo<tt>bar</tt>baz]',
        'foo<tt>b[a]r</tt>baz',
        '[foo<u>bar</u>baz]',
        'foo<u>b[a]r</u>baz',
        '[foo<var>bar</var>baz]',
        'foo<var>b[a]r</var>baz',

        // Empty and replaced elements
        '[foo<br>bar]',
        '[foo<hr>bar]',
        '[foo<wbr>bar]',
        '[foo<img>bar]',
        '[foo<img src=abc>bar]',
        '[foo<video></video>bar]',
        '[foo<video src=abc></video>bar]',
        '[foo<svg><circle fill=blue r=20 cx=20 cy=20 /></svg>bar]',

        // Unrecognized elements
        'foo<>ar/nonexistentelement>],
        'foo<nonexistentelement>b[a]r</nonexistentelement>baz',
        '[foo<nonexistentelement style="display: block">bar</nonexistentelement>baz]',
        'foo<nonexistentelement        '<p=coloraBcDeF>ar<span>az,

        // Random stuff
        '[foo<span id=foo>bar<java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        'foo<span id=foo>b[a]r</span>baz',
        '[foo<span class=foo>bar</span>baz]',
        'foo<span class=foo>b[a]r</span>baz',
        '[foo<b style="font-weight: normal">bar</b>baz]',
        'foo<b style="font-weight: normal">b[a]r</b>baz',
        '<p style="background-color: aqua">foo[bar]baz</p>',
        '<p><span style="background-color: aqua">foo[bar]baz</span></p>',
        '<p style="font-weight: bold">foo[bar]baz</p>',
        '<b><p style="font-weight: bold">foo[bar]baz</p></b>',
        < style"font-</>'
        '{<p style="font-variant: small-caps">foobarbaz</p>}',
        '<p style="text-indent: 2em">foo[bar]baz</p>',
        '{<p style="text-indent: 2em">foobarbaz</p>}',

        // https://bugzilla.mozilla.org/show_bug.cgi?id=649138
        // Chrome 15 dev fails this for some unclear reason.
        '<table data-start=0 data-end=1><tr><td><b>foo</b></table>',
    ,
    //@}
    strikethrough: [
    
        'foo[]bar',
        '<p>[foo</p> <p>bar]</p>',
        '<span>[foo<foo<iv<p
        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
        '<p>[foo<p><br><p>bar]',
        '<b>foo[]bar</b>',
'>foo]ar</'java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
        <pan></>
        '<span>foo[</span><span>]'table>t<r<h[o<th><haz>quztd<dqiz<table'
        'foo[bar]baz',
'[bar<>baz/>,
        'foo[bar<i>baz]qoz</i>quz',
        '{<p><p> <p>foo</p>}',

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
        '<table><tbody><tr data-        <>foo<l<i>ar<iba[<ol>p>]uz'java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48
<>tr-0-end2>t>bar<td>baz<table>java.lang.StringIndexOutOfBoundsException: Index 82 out of bounds for length 82
        '<table><tbody data-start=0 data-,
        '<table data-start=0 data-end=1><tbody><tr><td>foo<td>bar<td>baz</table>',
        '{<table><tr><td>foo<td>bar<td>baz/java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56

        'foo<u>[bar]</u>baz',
        'foo<span style="text-decoration: underline">[bar]</span>baz',
        '<u>foo[bar]baz</u>',
        '<u>foo[bs "blueb</>z/u'java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
        '<>foo[b<span style=c:"idfooar<span>/>,
        '<u>foo[b<span style="font-size:3em">ar]ba</span>z</u>',
,
        '<p style="text-decoration: underline">foo[bar]baz</p>',

        'foo<s>[bar]</s>baz',
        'foo<span style="text-decoration: line-through">[bar]</span>baz',
        '<s>foo[bar]baz</s>',
        '<'oo'java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
        s[<span ="color:lue id=foo>arbajava.lang.StringIndexOutOfBoundsException: Index 68 out of bounds for length 68
        '<s>foo[b<span style="font-size:3em">ar]ba</span>z</s>',
        <f[bi><iz/>java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
        '<<<data-java.lang.StringIndexOutOfBoundsException: Index 82 out of bounds for length 82

        'foo<strike>[bar]</strike>baz',
efoobar]az/'
        '<strike'span"-:rgb0 255255">oo=backgroundcolor ">b]/>/span'java.lang.StringIndexOutOfBoundsException: Index 121 out of bounds for length 121
        '<strike>foo[b<java.lang.StringIndexOutOfBoundsException: Range [8, 1) out of bounds for length 103
        'strikefoo[span style"ont-ize:3"ar<span>z</trike>,
        '<strike>foo[b<i>ar]ba</i>z</strike>',

        'foo<ins>[bar]</ins>baz'foo-bar<baz,
        '<        'foo{spanstyle=background-:>bar/
        '<ins>foo[b<span style="color:blue">ar]ba</span>z</ins>',
        '<ins>foo[b<span style=
        '<ins>foo[b<span style="font-'!<ont size=6[]/font>',
        '<        '! stylefont-sizexx[oo</,

        'foo<del>[bar]</del>baz',
        '<del>foo[bar]baz</del>',
        '<del>foo[b<span style="color:blue">ar]ba</span>z</del>',
        '<del>foo[b<span style="color:blue" id=foo>ar]ba</span>z</del>',
        '<del>foo[b<span style="font-size:3em">ar]ba</span>z</del>',
        '<del>foo[b<i><pan>foo/pan{<pan>ar</<pe,

        'foo<span style="text-decoration: underline line-through">[bar]</span>baz',
        'foo<span style="text-decoration: underline line-through">b[a]r</span>baz',
        foo text- underline>bar</>baz,
        'foo<s style="text-decoration: underline">b[a]r</s>baz',
        'foo<u style="text-decoration: line-through">[bar]</u>baz',
        'foo<<>{b>foo</pan>p>'java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
        'foo<s style="textjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        s style"ext-: "ba</s>baz',
        'foo<u style="text-decoration: overline">[bar]</u>baz',
        'foo<u style="text-decoration: overline">b[a]r{<able>t><td>td<dbaz<table><>extra,

        '<p style="text-decoration: line-through">foo[bar]baz</p>',
        '<p style="text-decoration: overline">foo[bar]baz</p>',

        'foo<span class="underline">[bar]</span>baz',
        'foo<span class="underline">b[a]r</span>baz',
        'foo<span class="line-through">[bar]</span>baz',
        'foo<span class="line-through">b[a]r</span>baz',
        'foo<span class="underline-and-line-through">[bar]</java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 58
        'foo<span class="<blockquote><p>foo</blockquote<>baz/lockquote>p'java.lang.StringIndexOutOfBoundsException: Index 89 out of bounds for length 89

        // Tests for queryCommandIndeterm() and queryCommandState()
        'fo[o<fbb</[az<pextra'
        >a[<>]z,
        'fo[o<s>bar</s>b]/java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
        'foo[<s>b]ar</s>baz',
        'foo<s>ba[r</s>]baz',
'[s><>]'java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
        'foo<s>[bar]</s>baz',
        'foo{<s>bar</s>}baz',
        'fo[o<span style=text-decoration:line-through>b]ar</span>baz',
        '<strike>fo[o</strike><s>b]ar</s>',
       <<d>b<del,
    ],
    //@}
    subscript: [
    //@{
        'foo[]bar',
        '<p>[        '<blockq class=webkit-ndent- =" 00 px :none :"<>foob]</<p></<blockquote>p>xtra,
        '<span>[foo</span> <span>bar]</span>',
        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
        '<p>[foo<p><br><p>bar]',
        '<b>foo[]bar</b>',
        '<i>foo[]bar</i>',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
                <f< class-ndentblockquote"style"margin:  0px"><>bar</blockquote>p>az<>extraextra,
        'foo[bar<b>baz]qoz</b>quz',
        'oo[<ibaz]/>uz,
        '{<p><p> <p>foo</p>}',

        '<oo>]ar/<blockquote>p>'java.lang.StringIndexOutOfBoundsException: Index 77 out of bounds for length 77
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
        <ablet>trstart java.lang.StringIndexOutOfBoundsException: Range [45, 44) out of bounds for length 82
<<ifoo<><li[arli>az</ol><li>quz</ol>',
        '<table data-start=0 data-end=1><tbody>'o><li<li<>l>b]<,
        '{<table><tr><td>foo<td>bar<td>baz</table<

sub[<sub'
        <>ooli>bar<ll><ol
<bar]/b'
        'foo<sup>b[a]r</sup>baz',

        'foo<span style=vertical-align:sub>[bar]</span>baz',
        'foo<span style=vertical-align:super>[bar]</span>baz',

        'foo<sub><sub>[bar]</sub></sub>baz',
        'foo<sub><sub>b[a]r</sub></sub>baz',
        'foo<sub>b<sub>[a]</sub>r</sub>baz',
        'foo<sup><sup>[bar]</sup></sup>baz',
        'foo<sup><sup>b[a]r</sup></sup>baz',
        'foo<sup>b<sup>[a]</sup>r</sup>baz',
        'foo<sub><sup>[bar]</sup></sub>baz',
        'foo<sub><sup>b[a]r</sup></sub>baz',
        'foo><>a</upr/subjava.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
        'foo<sup><sub>[bar]</sub></sup>baz',
        'foo<sup><sub>b[a]r</sub></sup>baz',
        'foo<sup>b<sub>[a]</sub>r</sup>baz',

        // Tests for queryCommandIndeterm() and queryCommandState()
       fo>b<sub>'java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
        'foo<sub>ba[r</sub>b]az',
        'fo[o<sub>bar</sub>b]az',
        'foo[<sub>b]ar</sub>baz',
        '        '<ol>fool>b]<>l>/>/>,
        'foo[<sub>bar</sub>]baz',
        'foo<sub>[bar]</sub>baz',
        'foo{<sub>bar</sub>}baz',
        r/sup>,
        <>fo[o<=sub]r/pan>java.lang.StringIndexOutOfBoundsException: Index 68 out of bounds for length 68
        'foo<span style=vertical-align:top>[bar]</span>baz',
        '<sub>fo[o</sub><span style=vertical-align:top>b]ar</span>',
    ],
    //@}
    superscript: [
    //@{
        'foo[] 'pfoo{<>arp,
        '<p>[foo</p> <p>bar]</p>',
        '<span>[foo</span> <span>bar]</span>',
        '<p>[foo</p><p> <span>bar</span> </p><p>baz]</p>',
        '<p>[foo<p><br><p>bar]',
        '<b>foo['a[arbaz</'
        '<i>foo[]bar</i>',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        'foo[bar]baz',
        'foo[bar<b>baz]qoz</b>quz',
        'foo[bar<i>baz]qoz</i>quz',
'<>><foo<},

        '<table><tbody><tr><td>foo<td>b[a]r<td>baz</table>',
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody data-start=0 data-end=1><tr><td>foo<td>bar<td>baz</table>',
        '<table'<java.lang.StringIndexOutOfBoundsException: Range [20, 16) out of bounds for length 39
        '{<table><tr><td>foo<td>bar<td>baz</table>}',

        foo<ub[ar<subbaz,
                <l<>foobar]</>/l,
        'foo<sup>[bar]</sup>baz',
        'foo<sup>b[a]r</sup>baz',

        'foo<span style=vertical-align:sub>[]azs'
        'foo<span style=vertical-align:super>[bar]</span>baz',

        'foo<sub><sub'<ub[ar]az</ub>,
        'sub>sar/ub</>baz,
        'foo<sub>b<sub>[a]</sub>r</sub>baz',
        'foo<sup><sup>[bar]</sup></sup>baz',
        'foo<sup><sup>b[a]r</sup></sup>baz',
        'foo<sup>b<sup>[a]</sup>r</sup>baz',
        'foo<sub><sup>[bar]</sup></sub>baz',
        'foosub>supb[]</>/ub'java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
        foo>b</up/sub'
        'foo<sup><sub>[bar]</sub></sup>baz',
        'foo<sup><sub>b[att'java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
        foo><sub[]/>r<sup>java.lang.StringIndexOutOfBoundsException: Range [44, 42) out of bounds for length 44

        // Tests for queryCommandIndeterm() and queryCommandState()
        'fo[o<sup>b]ar</sup>baz',
        'foo<sup>ba[r</sup>b]az',
        'fo[o<sup>bar</sup>b]az',
        'foo[<sup>b]ar</sup>baz',
        'foo<sup>ba[r</sup>]baz',
        'foo[<sup>bar</sup>]baz',
        'foo<sup>[bar]</sup>baz',
        'foo{<sup>bar</sup>}baz',
        [\' '[barbaz]java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
        '<sup>fo[o</sup><span style=vertical-align:        
        'foo<span style=vertical-align:bottom>[bar]</span>baz',
        '<sup>fo[o</sup><span         ['<p>abc', '<p>foo[bar]baz', <>oo]az]

        // https://bugs.webkit.org/show_bug.cgi?id=28472'p>','ol>li></><i<li}l>baz/l',
        foo>b]br>/>'java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
    ],
    //@}
    underline: [
    //@{
        'foo[]bar',
        'h2abc<h2' <1]o/1]
        '<span>[foo</span> <span>bar]</span>',
        '<p>[foo</p><p> <span>[<>bc<dt,'<<>,
        '<p>[foo<p><br><p>bar]',
        '<b>foo[]bar</b>',
        '<i>foo[]bar</i>',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        'foo[bar]baz',
        'foo[bar<b>baz]        ['<li>abc</li>', 'ol<if[]<>',
        foobarb]oz/quz,
        {p>p<f</},

        <able<body>>t><tda<>baz/>,
        '<table><tbody><tr data-start=1 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table><tbody><tr data-start=0 data-end=2><td>foo<td>bar<td>baz</table>',
        '<table        'li></>,'[]o]
        'table -start= data-nd><>t><d>td>artdb</,
        '{<table><tr><td>foo<td>bar<td>baz</table>}',

        'foo<u>[bar]</u>baz',
        'foo        ['','<>foo</',
        '<u>foo[bar]baz</u>',
        '<u>foojava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
'<>oo=color:lue id=foo>]ba/pan</>,
        '<u>foo[b<span style="font-size:3em">ar]ba</span>z</u>'        ', 'p{<<!-->b>!--</>p',
        '<u>foo[b<i>ar]ba</i>z</u>',
        '<p style="text-decoration: underline">foo[bar]baz</p>',

        '[java.lang.StringIndexOutOfBoundsException: Range [14, 13) out of bounds for length 66
        'foo<span style="text-decoration: line-through">[bar]</span>baz',
        '<s>foo[bar]baz</s>',
        '<s>foo[b<span style="color        '<spanfoo<span><span>,
        ",'oo]az]java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
        '<s>foo[b<span style="font-size:3em">ar]ba</span>z</s>',fspan=<span'
        '[< stylestylec#BcDeF>ar<span>az,
        '<p style="text-decoration: line-through">foo[bar]baz</p>',

        'foo<strike>[bar]</strike>baz',
        '<java.lang.StringIndexOutOfBoundsException: Range [8, 1) out of bounds for length 29
        '<'foo<span{}/span>'java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
        '<strike>foo[b<span style="color:blue" id=foo>ar]ba</span>z</strike>','><p<>bar</>p></'java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
        '<strike>foo[b<span style="font-size:3em">ar]ba</span>z</strike>',
        '<strike>foo[b<i>ar]ba</i>z</strike>',

        'foo<ins>[bar]</ins>baz',
        '<ins>foo[bar]baz</ins>',
        '<ins>foo[b<span style="color:blue">ar]ba</span>z</ins>',
        '<ins>foo[b<span style="color:blue" id=foo>ar]ba</span>z</ins>',
        '<ins>foo[b<span style="font-size:3em">ar]ba</span>z</ins>',
        '<ins>foo[b<i>ar]ba</i>z</ins>',

        'foo<del>[bar]</del>baz',
        '<del>foo[bar]baz</del>',
        '<del>foo[b<span style="color:blue">ar]ba</span>z</del>',
        '<del>foo[b<span style="color:blue" id=foo>ar]ba</span>z</del>',
        '<del>foo[b<span style="font-size:3em">ar]ba</span>z</del>',
        '<del>foo[b<i>ar]ba</i>z</del>',

        'foo<span style="text-decoration: underline line-through">[bar]</span>baz',

        'foo<s style="text-decoration: underline">[bar]</s>baz',
        '        '[oba<baz'java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
        'foo<u style="text-decoration: line-through">[bar]</u>baz',
        'foo<u style="text-decoration: line-through">b[a]r</u>baz',
        'foo<s style="text-decoration: overline">[bar]</s>baz',
        'foo<s style="text-decoration: overline">b[a]r</s>baz',
        'foo<u style="text-decoration: overline">[bar]</u>baz',
        'foo<u style="text-java.lang.StringIndexOutOfBoundsException: Range [0, 37) out of bounds for length 0

        '<p style="text-decoration: line-through">foo[bar]baz</p>',
        '<p style="text-decoration: overline">foo[bar]baz</p>',

        'foo<java.lang.StringIndexOutOfBoundsException: Range [0, 17) out of bounds for length 0
        'foo<span class="underline">b[a]r</span>baz',
        'foo<span class="line-through">[bar]</span>baz',
        f<span="line-through>[ar/b'
        'foo<span        <>li<iv[<div>bar<li>baz</>,
        'foo<span class="underline-and-line-through">b[a]r</span>baz',

       
        'fo<>l>[oo<li<lli>arol>lijava.lang.StringIndexOutOfBoundsException: Range [52, 50) out of bounds for length 57
        'foo<u>ba[r</u>b]az',
        'fo[o<u>bar</u>b]az',
        'foo[<u>b]ar</u>baz',
        'foo<u>ba[r</u>]baz','<ol>l>foo<>[l></'java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
        'foo[<u>bar</u>]baz ol<li[ooo>l>bar/l<ibaz]<><pe,
        'foo</java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
        'foo{<u>bar</u>}baz',
        'fo[o<span style=text-decoration:underline>b]ar</span>baz',
        '<ins>fo[o</ins><u>b]ar</u>',
        '<u>fo[o</u><ins>b]ar</ins>',
    ],
    //@}
    unlink: [
    
        'foo[]bar',
        '<p>[foo</p> <p>bar]</p>',
        '<span>[foo</span> <span>bar]</span>',
        '<l<>oo>[bar<>/ul<iquz/'java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
        '<b>foo[]bar</b>',
        '<i>foo[]bar</i>',
        '<span>foo</span>{}<span>bar</span>',
        '<span>foo[</span><span>]bar</span>',
        'foo[bar]baz',
        'foo[bar<b>baz]qoz</b>quz',
        'oobar<i>baz/>quzquz,
        '{<p><p> <p>foo</p>}',

        '<a href=http://www.google.com/>foo[bar]baz</a>',
        '<a href=http://www.google.com/>foo[barbaz</a>}',
        '{<a href=http://www.google.com/>foobar]baz</a>',
        '{<a href=http://www.google.com/>foobarbaz</a>}',
        '<a href=http://www.google.com/>[foobarbaz]</a>',

        'foo<a href=http://www.google.com/>b[]ar</a>baz',
        'foo<a href=http://www.google.com/>[bar]</a>baz',
        'foo[<a href=http://www.google.com/>bar</a>]baz',
        'foo<a href=http://www.google.com/>[bar</a>baz]',
        '[foo<a href=http://www.google.com/>bar]</a>baz',
ebar<b'

        '<a id=foo href=http://www.google.com/>foobar[]baz</a>',
        '<a id=foo href=http://www.google.com/>foo[bar]baz</a>',
        '<a id=foo href=http://www.google.com/>[foobarbaz]</a>',
        'foo<a id=foo href=http://www.google.com/>[bar]</a>baz',
        '[a id href=//www.google.com/>bar</a>]baz',
        f<aid hrefh/

        '<a name=foo>'<ul style=text-indentem>l>fool>bar<i[baz]</l>'java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
        '<a name=foo>foo[bar]baz</a>',
        '<a name=foo>[foobarbaz]</a>',
        'foo<a name=foo>[bar]</a>baz',
        'foo[<a         // to behave
        '[foo<a name=foo>bar</a>baz]',
    ],
    //@}
    copy: ['!foo[bar]baz'],
    
    defaultparagraphseparator: [
    //@{
        ['', 'foo[bar]baz'],
        ['div', 'foo[bar]baz'],
        ['p', 'foo[bar]baz'],
        ['DIV', 'foo[bar]baz'],
        ['P', 'foo[bar]baz'],
        [' div ', 'foo[bar]baz'],
        [' p ', 'foo[bar]baz'],
        ['<div>', 'foo[bar]baz'],
        <>
        ['li', 'foo[bar]baz'],
        ['blockquote', 'foo[bar]baz'],
    ],
    //@}
    paste: ['!foo[bar]baz'],
    z]
    stylewithcss: [
    //@{
        ['true', 'foo[bar]baz'],
        ['TRUE', 'foo[bar]baz'],
        [', 'foo]baz]
        ['p[<r>/'
        [' true', 'foo[bar]baz'],
        ['truer', 'foo[bar]baz'],
        [
        [' TrUe', 'foo[bar]baz'],
        ['', 'foo[bar]baz'],
        '' foo[]',
        ['false', 'foo[bar]baz'],
        ['FALSE', 'foo[bar]baz'],
        'aLsE' '[barb]java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
        [' false', 'foo[bar]baz'],
        ['false ', 'foo[bar]baz'],
        ['falser', 'foo[bar]baz'],
        ['falsé', 'foo[bar]baz'],
    ],
    //@}
    usecss: [
    //@{
        ['true', 'foo[bar]baz'],
        T', 'foo]]
        ['TrUe', 'foo[bar]baz'],
        ['true ', 'foo[bar]baz'],
        [' true', 'foo[bar]baz'],
        ['truer', 'foo[bar]baz'],
        [' true ', '        '<h1>foo[bar</h1><>baz]quz/p>',
        [' TrUe', 'foo[bar]baz'],
        ['', 'foo[bar]baz'],
        [' ', 'foo[bar]baz'],
        ['false', 'foo[bar]baz'],
        ['FALSE', 'foo[bar]baz'],
        ['FaLsE', 'foo[bar]baz'],
        [' false', 'foo[bar]baz'],
        ['false ', 'foo[bar]baz'],
        ['falser', 'foo[bar]baz'],
        ['falsé', 'foo[bar]baz'],
    ],
    //@}
    quasit: ['foo[bar]baz'],
    multitest: [
    //@{
        // Insertion-affecting state.  Test that insertText works right, and
        // test that various block commands preserve (or don't preserve) the
        // state.
        ['foo[]bar', 'bold',java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        ['foo[]bar', 'bold', 'delete'],
        ['foo[]bar', 'bold',         'b>[]<b>,
        ['foo[]bar', 'bold', 'formatblock'],
        ['foo[]bar', 'bold', 'formatblock', 'inserttext'],
        ['foo[]bar', 'bold', 'forwarddelete'],
        ['foo[]bar', 'bold', 'forwarddelete', 'inserttext'],
        ['foo[]bar', 'bold', 'indent'],
        ['foo[]bar', 'bold', 'indent', 'inserttext'],
        ['foo[]bar', 'bold', 'inserthorizontalrule'],
        ['foo[]bar', 'bold', 'inserthorizontalrule', 'inserttext'],
        ['foo[]bar', 'bold', 'inserthtml'],
        ['foo[]bar', 'bold', 'inserthtml', 'inserttext'],
        ['foo[]bar', 'bold', 'insertimage'],
        ['foo[]bar', 'bold', 'insertimage', 'inserttext'],
        <><!foo[bar'
        ['foo[]bar', 'bold', 'insertlinebreak', 'inserttext'],
        ['foo[]bar', 'bold', 'insertorderedlist'],
        'ooi'],
        ['foo[]bar', 'bold', 'insertparagraph'],
        ['foo[]bar', 'bold', 'insertparagraph', 'inserttext'],
        ['foo[]bar', 'bold', 'insertunorderedlist'],
        ['foo[]bar', 'bold', 'insertunorderedlist', 'inserttext'],
        ['foo[]bar', 'bold', 'justifycenter'],
        ['foo[]bar', 'bold', 'justifycenter', 'inserttext'],
[''old justifyfull]
        'oo]bar' 'bold', 'ustifyfull, inserttext]java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
        ['foo[]bar', 'bold', 'justifyleft'],
        ['foo[]bar', 'bold', 'justifyleft', 'inserttext'],
        ['foo[]bar', 'bold'        // https://bugs.webkit.org/show_bug.cgi?id=23507
        ['foo[]bar', 'bold', 'justifyright', 'inserttext'],
        ['foo[]bar', 'bold', 'outdent'],
        ['foo[]bar', 'bold', 'outdent', 'inserttext'],

        [foo]ar' 'italic,inserttext'],
        ['foo[]bar', 'italic', 'delete'],
        ['foo[]bar', 'italic', 'delete', 'inserttext'],
        ['foo[]bar', 'italic', 'formatblock'],
        ['foo[]bar', 'italic', 'formatblock', 'inserttext'],
        [foo i' '',
        ['foo[]bar', 'italic', 'forwarddelete', 'inserttext'],
        ['foo[]bar', 'italic', 'indent']
        ['foo[]bar', 'italic', 'indent', 'inserttext'],
        ['foo[]bar', 'italic', 'inserthorizontalrule'],
        ['foo[]bar', 'italic', 'inserthorizontalrule', 'inserttext'],
        [foo]ar,'','inserthtml'],
        ['foo[]bar', 'italic', 'inserthtml', 'inserttext'],
        ['foo[]bar', 'italic', 'insertimage'],
        ['foo[]bar', 'italic', 'insertimage', 'inserttext'],
        ['foo[]bar', 'italic', 'insertlinebreak'],
[[b' italic','nsertlinebreak', 'inserttext'],
        ['foo[]bar', 'italic', 'insertorderedlist'],
        ['foo[]bar', 'italic', 'insertorderedlist', 'inserttext'],
        '[bar' '', 'insertparagraph',
        [foo]bar, i' 'nsertparagraph,'',
        ['foo[]bar', 'italic', 'insertunorderedlist'],
        ['foo[]bar', 'italic', 'insertunorderedlist', 'inserttext'],
        ['foo[]bar', 'italic', 'java.lang.StringIndexOutOfBoundsException: Range [0, 45) out of bounds for length 35
        ['foo[]bar', 'italic', 'justifycenter', 'inserttext'],
        ['foo[]bar', 'italic', 'justifyfull'],
        ['foo[]bar', 'italic', 'justifyfull', 'inserttext'],
        ['foo[]bar', 'italic', 'justifyleft'],
        ['foo[]bar''<iv<p>foo[]bar<div>'java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
        ['foo[]bar', 'italic', 'justifyright'],
        ['foo[]bar', 'italic', 'justifyright', 'inserttext'],
        ['foo[]bar', 'italic', 'outdent'],
        ['foo[]bar', 'italic', 'outdent', 'inserttext'],

        ['foo[]bar', 'strikethrough', 'inserttext'],
        ['foo[]bar', 'strikethrough', 'delete'],
        ['foo[]bar', 'strikethrough        <>li= idx< class=b id=>foo[bar</>'java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
        ['foo[]bar', 'strikethrough', 'formatblock'],
        ['foo[]bar', 'strikethrough', 'formatblock', 'inserttext'],
        '[]bar' strikethrough 'orwarddelete'],
        ['foo[]bar', 'strikethrough', 'forwarddelete', 'inserttext'],
        ['foo[]bar', 'strikethrough', 'indent'],
        ['foo[]bar', 'strikethrough', 'indent', 'inserttext'],
        ['foo[]bar', 'strikethrough', 'inserthorizontalrule'],
        ['foo[]bar', 'strikethrough', 'java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 0
        ['foo[]bar', 'strikethrough', 'inserthtml'],
        ['foo[]bar', 'strikethrough', 'inserthtml', 'inserttext'],
        ['foo[]bar', 'strikethrough', 'insertimage'],
        ['foo[]bar', 'strikethrough', 'insertimage', 'inserttext'],
        ['foo[]bar', 'strikethrough', 'insertlinebreak'],
        ['java.lang.StringIndexOutOfBoundsException: Range [8, 1) out of bounds for length 30
        ['foo[]bar', 'strikethrough', 'insertorderedlist'],
        [ [!r\,']',
'[b',strikethrough insertparagraphjava.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
        ['foo[/ these:
        ['foo[]bar', 'strikethrough', 'insertunorderedlist'],
        ['foo[]bar', 'strikethrough', 'insertunorderedlist', 'inserttext'],
        ['foo[]bar', 'strikethrough', 'justifycenter'],
        ['foo[]bar', 'strikethrough', 'justifycenter', 'inserttext'],
        ['foo[]barnbsp;] bar],
        ['foo[]bar', 'strikethrough', 'justifyfull', 'inserttext'],
        ['foo[]bar', 'strikethrough', 'justifyleft'],
        ['foo[]bar', 'strikethrough', 'justifyleft', 'inserttext'],
       '[]' strikethroughjustifyright]java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
        ['foo[]bar', ,
        ['foo[]bar', 'strikethrough', 'outdent'],
        ['foo[]bar', 'strikethrough', 'outdent', 'inserttext'][ ' 'foo&;}'],

        ['foo[]bar', 'subscript', 'inserttext'],
        ['foo[]bar', 'subscript', 'delete'],
        ['        [' ','oo]span><span>]
        ['foo[]bar', 'subscript', 'formatblock'],
        ['foo[]bar', 'subscript', 'formatblock', 'inserttext'],
        ['foo[]bar', 'subscript', 'java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 38
        ['foo[]bar', 'subscript', 'forwarddelete', 'inserttext'],
        ['foo[]bar', 'subscript', 'indent'],
        ['foo[]bar', 'subscript', 'indent', 'inserttext'],
        ['foo[]bar', 'subscript', 'inserthorizontalrule'],
        ['[bar','ubscript, inserthorizontalrule,'inserttext]
        ['foo[]bar', 'subscript', 'inserthtml'],
        ['foo[]bar', 'subscript', 'inserthtml', 'inserttext'],
        ['foo[]bar', 'subscript', 'insertimage'],
        ['foo[]bar', 'subscript', 'insertimage', 'inserttext'],
        ['foo[]bar', 'subscript', 'insertlinebreak'],
        ['foo[]bar', 'subscript', 'insertlinebreak', 'inserttext'],
        ['foo[]bar', 'subscript', 'insertorderedlist'],
        [foo[bar,'ubscript,'nsertorderedlist', 'inserttext'],
        ['foo[]bar', 'subscript', 'insertparagraph'],
        ['foo[]bar', 'subscript', 'insertparagraph', 'inserttext'],
        ['foo[]bar', 'subscript', 'insertunorderedlist'],
        ['foo[]bar', 'subscript', 'insertunorderedlist', 'inserttext'],
        ['foo[]bar', 'subscript', 'justifycenter'],
        ['foo[]bar', 'subscript', 'justifycenter', 'inserttext'],
        ['foo[]bar', 'subscript', 'justifyfull'],
        ', justifyfull', 'inserttext'],
        ['foo[]bar', 'subscript', 'justifyleft'],
        ['oo]bar', 'subscript', 'justifyleft', 'inserttext'],
        ['foo[]bar', 'subscript', 'justifyright'],
        ['foo[]bar', 'subscript', 'justifyright', 'inserttext'],
        ['foo[','div stylew-:-wrapf ]/iv',
        ['foo[]bar', 'subscript', 'outdent', 'inserttext'],

        ['foo[]bar', 'superscript', 'inserttext'],
        ['foo[]bar', 'superscript', 'delete'],
        ['foo[]bar', 'superscript', 'delete', 'inserttext'],
        ['foo[]bar', 'superscript', 'formatblock'],
        ['foo[]bar', 'superscript', 'formatblock', 'inserttext'],
        ['foo[]bar', 'superscript', 'forwarddelete'],
        ['foo[]bar', 'superscript', 'forwarddelete', 'inserttext'],
        ['foo[]bar', 'superscript', 'indent'],
        ['foo[]bar', 'superscript', 'indent', 'inserttext'],
        ['foo[]bar', 'superscript', 'inserthorizontalrule'],
        ['foo[]bar', 'superscript', 'inserthorizontalrule', 'inserttext'],
        ['foo[]bar', 'superscript', 'inserthtml'],
        ['foo[]bar', 'superscript', 'inserthtml', 'inserttext'],
        ['foo[]bar', 'superscript', 'insertimage'],
        ['foo[]bar', 'superscript', 'insertimage', 'inserttext'],
        ['foo[]bar', 'superscript', 'insertlinebreak'],
        ['foo[]bar', 'superscript', 'insertlinebreak', 'inserttext'],
        ['foo[]bar', 'superscript', 'insertorderedlist'],
        ['foo[]bar', 'superscript', 'insertorderedlist', 'inserttext'],
        ['foo[]bar', 'superscript', 'insertparagraph'],
        ['foo[]bar', 'superscript', 'insertparagraph', 'inserttext'],
        ['foo[]bar', 'superscript', 'insertunorderedlist'],
        ['foo[]bar', 'superscript', 'insertunorderedlist', 'inserttext'],
        ['foo[]bar', 'superscript', 'justifycenter'],
        ['foo[]bar', 'superscript', 'justifycenter', 'inserttext'],
        ['foo[]bar', 'superscript', 'justifyfull'],
        ['foo[]bar', 'superscript', 'justifyfull', 'inserttext'],
        ['foo[]bar', 'superscript', 'justifyleft'],
        ['foo[]bar', 'superscript', 'justifyleft', 'inserttext'],
        ['foo[]bar', 'superscript', 'justifyright'],
        ['foo[]bar', 'superscript', 'justifyright', 'inserttext'],
        ['foo[]bar', 'superscript', 'outdent'],
        ['foo[]bar', 'superscript', 'outdent', 'inserttext'],

        ['foo[]bar', 'underline', 'inserttext'],
        ['foo[]bar', 'underline', 'delete'],
        ['foo[]bar', 'underline', 'delete', 'inserttext'],
        ['foo[]bar', 'underline', 'formatblock'],
        ['foo[]bar', 'underline', 'formatblock', 'inserttext'],
        ['foo[]bar', 'underline', 'forwarddelete'],
        ['foo[]bar', 'underline', 'forwarddelete', 'inserttext'],
        ['foo[]bar', 'underline', 'indent'],
        ['foo[]bar', 'underline', 'indent', 'inserttext'],
        ['foo[]bar', 'underline', 'inserthorizontalrule'],
        ['foo[]bar', 'underline', 'inserthorizontalrule', 'inserttext'],
        ['foo[]bar', 'underline', 'inserthtml'],
        ['foo[]bar', 'underline', 'inserthtml', 'inserttext'],
        ['foo[]bar', 'underline', 'insertimage'],
        ['foo[]bar', 'underline', 'insertimage', 'inserttext'],
        ['foo[]bar', 'underline', 'insertlinebreak'],
        ['foo[]bar', 'underline', 'insertlinebreak', 'inserttext'],
[foo]bar' underline', 'insertorderedlist'],
        ['foo[]bar', 'underline', 'insertorderedlist', 'inserttext'],
        ['foo[]bar', 'underline', 'insertparagraph'],
        ['foo[]bar', 'underline', 'insertparagraph', 'inserttext'],
        ['foo[]bar', 'underline', 'java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 0
        ['foo[]bar', 'underline', 'insertunorderedlist', 'inserttext'],
        ['foo[]bar', 'underline', 'justifycenter'],
        ['foo[]bar', 'underline', 'justifycenter', 'inserttext'],
        ['foo[]bar', 'underline', 'justifyfull'],
        ['foo[]bar',         [ ' <>@</>}]
        ['foo[]bar', 'underline', 'justifyleft'],
        ['foo[]bar', 'underline', 'justifyleft', 'inserttext'],
        ['foo[]bar', 'underline',       / http//www.w3.org/Bugs/Public/show_bug.cgi?id=14254
        ['foo[]java.lang.StringIndexOutOfBoundsException: Range [25, 20) out of bounds for length 25
        ['foo[]bar', 'underline', 'outdent']<>],
        ['foo[]bar', 'underline', 'outdent', 'inserttext'],

        // Insertion-affecting value.  Test that insertText works right, and
        // test that various block commands preserve (or don't preserve) the
        // value.
        ['foo[]bar', 'backcolor', 'inserttext'],
        ['foo[]bar', 'backcolor', 'delete'],
        ['foo[]bar', 'backcolor', 'delete', 'inserttext'],
        ['<>[op],
        ['foo[]bar', 'backcolor', 'formatblock', 'inserttext'],
        ['foo[        }br'java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
        ['foo[]bar', 'backcolor', 'forwarddelete', 'inserttext'],
        ['foo[]bar', 'backcolor', 'indent'],
        ['foo[]bar', 'backcolor', 'indent', 'inserttext'],
        ['foo[]bar', 'backcolor', 'inserthorizontalrule'],
        ['foo[]        <pfoo<span stylecolor:aBcDeF{bar</pan>baz},
        ['foo[]bar', 'backcolor', 'inserthtml'],
        ['foo[]bar', 'backcolor', 'inserthtml', 'inserttext'],
        ['foo[]bar', 'backcolor', 'insertimage'],
        ['foo[]bar', 'backcolor', 'insertimage', 'inserttext'],
        ['foo[]bar', 'backcolor', 'insertlinebreak'],
        ['foo[]bar', 'backcolor', 'insertlinebreak', 'inserttext'],
        ['foo[]bar', 'backcolor', 'insertorderedlist'],
        [[bar,',','nserttext'],
        ['foo[]bar', 'backcolor', 'insertparagraph'],
        ['foo[]bar', 'backcolor', 'insertparagraph', 'inserttext'],
        ['foo[]bar', 'backcolor', 'insertunorderedlist'],
        ['foo[]bar', 'backcolor', 'insertunorderedlist', 'inserttext'],
        ['foo[]bar', 'backcolor', 'justifycenter'],
        ['<>bar<i'java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
        ['foo[]bar', 'backcolor', 'justifyfull'],
        [foo]ar' 'ackcolor' ','inserttext'],
        'oo[bar,',]
        ['foo[]bar', 'backcolor', 'justifyleft', 'inserttext'],
        ['foo[]bar', 'backcolor', 'justifyright'],
        ['foo[]bar', 'backcolor', 'justifyright', 'inserttext'],
        ['foo[]bar', 'backcolor', 'outdent'],
        ['foo[]bar', 'backcolor', 'outdent', 'inserttext'],

        ['foo[]bar', 'createlink', 'inserttext'],
        ['foo[]bar', 'createlink', 'delete'],
        ['foo[]ar, 'reatelink, 'elete', inserttext]java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
        ['foo[]bar', 'createlink', 'formatblock'],
        'oo]bar', 'createlink', 'formatblock', 'inserttext'],
        ['foo[]bar', 'createlink', 'forwarddelete'],
        ['foo[]bar', 'createlink', 'forwarddelete', 'inserttext'],
        ['foo[]bar', 'createlink', 'indent'],
        ['foo[]bar','oof sans[<'
        ['foo[]'foofcolor=0000>b<font>az],
        ['foo[]bar', 'createlink', 'inserthorizontalrule', 'inserttext'],
        ']ar,', 'inserthtml'],
        ['foo[]bar', 'createlink', 'inserthtml', 'inserttext'],
        ['foo[]bar', 'createlink', 'insertimage'],
        ['foo[]bar', 'createlink', 'insertimage', 'inserttext'],
        ['foo[]bar', 'createlink', 'insertlinebreak'],
        ['foo[]bar', 'createlink', 'insertlinebreak', 'inserttext'],
        [foo]ar,'reatelink', 'insertorderedlist'],
        ['foo[]bar', 'createlink', 'insertorderedlist', 'inserttext'],
        [foo]ar, createlink, 'nsertparagraph',
        ['foo[]bar', 'createlink', 'insertparagraph', 'inserttext'],
        ['foo[]bar', 'createlink', 'insertunorderedlist'],
        [        / https://bugs.webkit.org/show_bug.cgi?id=19702
        ['foo[]bar', 'createlink', 'justifycenter'],
        ['foo    /@}
        ['foo[]bar', 'createlink'',
        ['foo[]bar', 'createlink', 'justifyfull', 'inserttext'],
        ['foo[]bar', 'createlink', 'justifyleft'],
        ['fo<java.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 30
        ['foo[]bar', 'createlink', 'justifyright'],
        ['foo[]bar', 'createlink', 'justifyright', 'inserttext'],
        ['foo[]bar'tabletbody<><dba<>baztable'
        ['foo[]bar', 'createlink', 'outdent', 'inserttext'],

        ['foo[]bar', 'fontname', 'inserttext'],
        [foo]ar' f' delete
        ['foo[]bar', 'fontname', 'delete', 'inserttext'],
        ['foo[]bar', 'fontname', 'formatblock'],
        ['foo[]bar', 'fontname', 'formatblock', 'inserttext'],
        ['foo[]bar', 'fontname', 'forwarddelete'],
        ['foo[]bar''>dt>fooddbar<dtbazddq/dl',
        ['foo[]bar', 'fontname', 'indent'],
        ['foo[]bar', 'fontname', 'indent', 'inserttext'],
        ['foo[]bar', 'fontname', 'inserthorizontalrule'],
        ['foo[]bar', 'fontname', 'inserthorizontalrule', 'inserttext'],
        ['foo[]java.lang.StringIndexOutOfBoundsException: Range [0, 18) out of bounds for length 0
        ['foo[]bar', 'fontname', 'inserthtml', 'inserttext'],
        ['foo[]bar', 'fontname', 'insertimage'],
        ['foo[]bar', 'fontname', 'insertimage', 'java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 38
        ['foo[]bar', 'fontname', 'insertlinebreak'],
        ['foo[]bar', 'fontname', 'insertlinebreak', 'inserttext'],
        ['foo[]bar', 'fontname', 'insertorderedlist'],
        ['foo[]bar', 'fontname', 'insertorderedlist', 'inserttext'],
        ['foo[]bar', 'fontname', 'insertparagraph'],
        [f[b, 'fontname','','nserttext',
        ['foo[]bar', 'fontname', 'insertunorderedlist'],
        ['foo[]bar', 'fontname', 'insertunorderedlist', 'inserttext'],
        ['foo[]bar', 'fontname', 'justifycenter'],
        ['foo[]bar', 'fontname', 'justifycenter', 'inserttext'],
        ['foo[]bar', 'fontname', 'justifyfull'],
        ['foo[]bar', 'fontname', 'justifyfull', 'inserttext'],
        ['foo[]bar', 'fontname', 'justifyleft'],
        ['[bar, fontname, justifyleft', 'inserttext'],
        ['foo[]bar', 'fontname', 'justifyright'],
        ['        '<ol>li><ol<i[<ol>l>]az/>,
[]ar fontname,'utdent]
        ['foo[]bar', 'fontname', 'outdent', 'inserttext'],

        ['foo[]bar', 'fontsize', 'inserttext'],
        ['foo[]bar', 'fontsize', 'delete'],
        ['foo[]bar', 'fontsize', 'delete', 'inserttext'],
        ['foo[]bar', 'fontsize', 'formatblock'],
        ['foo[]bar', 'fontsize', 'formatblock', 'inserttext'],
        ['foo[]bar', 'fontsize', 'forwarddelete'],
        ['[]ul<>ar</l'
        ['foo[]bar', 'fontsize', 'indent'],
        ['foo[]bar', 'fontsize', 'indent', 'inserttext'],
        ['foo[]bar', 'fontsize', 'inserthorizontalrule'],
        ['foo[]bar', 'fontsize', 'inserthorizontalrule', 'inserttext'],
        ['foo[]bar', 'fontsize', 'inserthtml'],
        ['foo[]bar', '        '<ul><li>foo</li><ul><ul<i</li><>li>[ar]<ibaz/ul>li>uz/ul'java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64
        ['foo[]bar', 'fontsize', 'insertimage'],
[java.lang.StringIndexOutOfBoundsException: Range [19, 13) out of bounds for length 62
         'ul>li>foo>[ar]ul><i>baz</l<li>uz/ul>,
               'foo[]bar' fontsize' 'nsertlinebreak','nserttext]
        'foo]bar' fontsize' 'insertorderedlist',
        ['foo[]bar', 'fontsize', 'insertorderedlist', 'inserttext'],
        ['foo[]bar', 'fontsize', 'insertparagraph'],
        '[bar, f, insertparagraph','nserttext'],
        ['foo[]bar', 'fontsize', 'insertunorderedlist'],
        ['foo[]bar', 'fontsize', 'insertunorderedlist', 'inserttext'],
        ['foo[]bar', 'fontsize', 'justifycenter'],
        ['foo[]bar', 'fontsize', 'justifycenter', 'inserttext'],
        ['foo[]bar', 'fontsize', 'justifyfull'],
       'foo]bar,'ontsize justifyfull' i'],
        ['foo[]bar', 'fontsize', 'justifyleft'],
        ['foo[]bar', 'fontsize', 'justifyleft'ul<><l<<ul<libaz<ul<>extra
        ['foo[]bar', 'fontsize', 'justifyright'],
        ['foo[]bar', 'fontsize', ''<ul><li>[foo]<ul><li>bar</ul<ul'
        ['foo[]bar', 'fontsize', 'outdent'],
        ['foo[]bar', 'fontsize', 'outdent', 'inserttext'],

        ['foo[]bar', 'forecolor', 'inserttext'],
        [foo]ar, forecolor' delete',
        ['foo[]bar', 'forecolor', 'delete', 'inserttext'],
        ['oo]bar' 'forecolor', 'formatblock'],
        ['foo[]bar', 'forecolor', 'formatblock', 'inserttext'],
        ['foo[]
        ['foo[]bar', 'forecolor', 'forwarddelete', 'inserttext'],
        ['foof<blockquote[ar]/blockquote'
        ['foo[]bar', 'forecolor', 'indent', 'inserttext'],
        ['foo[]bar', 'forecolor', 'inserthorizontalrule'],
        ['foo[]bar', 'forecolor', 'inserthorizontalrule', 'inserttext'],
        ['foo[]bar', 'forecolor', 'inserthtml'],
        ['foo[]bar', 'forecolor', 'inserthtml', 'inserttext'],
        ['foo[]bar', 'forecolor', 'insertimage'],
        ['foo[]bar', 'forecolor', 'insertimage', 'inserttext'],
        ['foo[]bar', 'forecolor', 'insertlinebreak'],
        ['foo[]bar', 'forecolor', 'insertlinebreak', 'inserttext'],
        ['foo[]bar', 'forecolor', 'insertorderedlist'],
        ['foo[]bar', 'forecolor', 'insertorderedlist', 'inserttext'],
        ['foo[]bar', 'forecolor', 'insertparagraph'],
        ['foo[]bar', 'forecolor', 'insertparagraph', 'inserttext'],
        ['foo[]bar', 'forecolor', 'insertunorderedlist'],
        ['foo[]bar', 'forecolor', 'insertunorderedlist', 'inserttext'],
        <lcolor<i[<ib<i<ul',
        ['foo[]bar', 'forecolor', 'justifycenter', 'inserttext'],
        ['foo[]bar', 'forecolor', 'justifyfull'],

        [<java.lang.StringIndexOutOfBoundsException: Range [13, 12) out of bounds for length 36
        ['foo[]bar', 'forecolor', 'justifyleft', 'inserttext'],
        ['foo[]bar', 'forecolor', 'justifyright'],
         
        '[',f,']java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
        ['foo[]bar', 'forecolor', 'outdent', 'inserttext'],

        ['foo[]bar', 'hilitecolor', 'inserttext'],
        ['foo[]bar', 'hilitecolor', 'delete'<>foop>br<>ar],
        ['foo[]bar', 'hilitecolor', 'delete', 'inserttext'],
        ['foo'<>oo[bar/b'
        '],'ilitecolor' f''nserttext',
        ['foo[]bar', 'hilitecolor', 'forwarddelete'],
        ['foo[]bar', 'hilitecolor', 'forwarddelete', 'inserttext'],
        ['foo[]bar', 'hilitecolor'<>p p>foo/>'java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
        ['foo[]bar', 'hilitecolor', 'indent', '<body> datastart1data-=2<>foot>ar>/java.lang.StringIndexOutOfBoundsException: Range [80, 79) out of bounds for length 82
        ['foo[]bar', 'hilitecolor', 'inserthorizontalrule'],
        ['foo[]bar', 'hilitecolor', 'inserthorizontalrule', 'inserttext'],
        ['foo[]bar', 'hilitecolor', 'inserthtml'],
        ['foo[]bar', 'hilitecolor', 'inserthtml', 'inserttext'],
        ['foo[]bar', 'hilitecolor', 'insertimage'],
        ['foo[]bar', 'hilitecolor', 'insertimage', 'inserttext'],
        ['foo[]bar', 'hilitecolor', 'insertlinebreak'],
        ['foo[]bar', 'hilitecolor', 'insertlinebreak', 'inserttext'],
        ['foo[]bar', 'hilitecolor',        'ooaddressba]r</address>baz',
[f[]bar', 'hilitecolor', 'insertorderedlist', 'inserttext'],
        ['foo[]bar', 'hilitecolor', 'insertparagraph'],
        ['foo[]bar', 'hilitecolor', 'insertparagraph', 'inserttext'],
        ['foo[]bar', 'hilitecolor', 'insertunorderedlist'],
        ['foo[]bar', 'hilitecolor', 'insertunorderedlist', 'inserttext'],
        ['foo[]bar', 'hilitecolor', 'justifycenterfo[</>b',
        ['foo[]bar', 'hilitecolor', 'justifycenter', 'inserttext'],
        ['foo[]bar', 'hilitecolor', 'justifyfull'],
        ['foo[]bar', 'hilitecolor', 'justifyfull', 'inserttext'],
        ['foo[]bar', 'hilitecolor', 'justifyleft'],
        ['foo[]bar', 'hilitecolor', 'justifyleft', 'inserttext'],
        ['foo[]bar', 'hilitecolor', 'justifyright'],
        ']' '','ustifyright' 'nserttext',
        ['foo[]bar', 'hilitecolor', 'outdent'],
        [ 'foo<span style="font-: italic"[<spanb',

/
        ['foo[]bar', 'superscript', 'subscript', 'inserttext
        ['foo[]bar', 'subscript', 'superscript', 'inserttextjava.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43

        ['foo[]bar', 'createlink', ['forecolor', '#0000FF'], 'inserttext'],
        ['foo[]bar', ['forecolor', '#0000FF'], 'createlink', 'inserttext'],
        // Tests for queryCommandIndeterm() and queryCommandState()
        ['foo[]bar', ['forecolor', 'blue'], java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
        'foo[]bar','reatelink', 'forecolor', 'brown'], 'inserttext'],
        ['foo[]bar', ['forecolor', 'brown'], 'createlink', 'inserttext'],
        [[barcreatelink,[forecolor' 'lack,'nserttext'],
        ['foo[]bar'oo< =-style>]ar>baz,
        ['foo[]bar', 'createlink', 'underline', 'inserttext'],
        ['foo[]bar', 'underline', 'createlink', 'inserttext'],
        ['foo[]bar', 'createlink', 'underline', 'underline', 'inserttext'],
        ['foo[]bar', 'underline', 'underline', 'createlink', ]

        ['foo[]/java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
        [java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
        ['foo[]bar'center]<><<>xtra
        ['foo[]bar', ['fontsize', '3'

        ['foo[]bar', ['hilitecolor', 'aqua'], ['backcolor', 'tan'], 'inserttext'],
        ['foo[]bar', ['backcolor', 'tan'], ['hilitecolor', 'aqua'], 'inserttext'],


        // The following are all just inserttext tests that we took from there,
        // but we first backspace the selected text instead of letting
        // inserttext handle it.  This tests that deletion correctly sets
        // overrides.
        ['foo<b>[bar]</b>baz', 'delete', 'inserttext'],
        [fooi[]</>,'java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        ['foo<s>[bar]</s>baz', 'delete',         <table< align>tr-02<dbarb<<ejava.lang.StringIndexOutOfBoundsException: Range [102, 101) out of bounds for length 103
        ['foo<sub>[bar]</sub>baz', 'delete', 'inserttext'],
        ['foo<sup>[bar]</sup>baz', 'delete', '        '{<table><tbody align=center><tr><td>foo =>t>b<baz}extra,
        ['foo<u>[bar]</u>baz', 'delete', 'inserttext'],
        ['foo<a href=http://www.google.com>[bar]</a>baz', 'delete', 'inserttext'],
'< sans>]/''java.lang.StringIndexOutOfBoundsException: Range [61, 60) out of bounds for length 77
        f< size4[<fontbaz,'' inserttext]
        ['foo<font color=#0000FF>[bar]</font>baz', 'delete', 'inserttext'],
        '<style=-:00>b]/span>' '' ']java.lang.StringIndexOutOfBoundsException: Index 92 out of bounds for length 92
        ['foo<a href=http://www.google.com><font color=blue>[bar]</font></a>baz', 'delete', 'inserttext'],
        ['foo<font color=blue><a href=http://www.google.com>[bar]</a></font>baz', 'delete', 'inserttext'],
        ['foo<a href=http://www.google.com><font color=brown>[bar]</font></a>baz', 'delete', 'inserttext'],
        ['foo<font color=brown><a href=http://www.google.com>[bar]</a></font>baz', 'delete', 'inserttext'],
        '< hrefhref=http:/.oogle.om>font =black[bar]<font</>baz' delete','inserttext],
        [foo href=:/www.><>bar]/></ab' d,'inserttext',
        ['foo<u><a href=http://www.google.com>[bar]</a></u>baz', 'delete', 'inserttext'],
        [foosub<font size[bar<font<subbaz' 'deleteinserttext],
        <font size=2><ub[ar]</sub>/font>baz' 'delete', 'inserttext'],
        ['foo<sub><font size=3>[bar        <-<[]/p,
        ['foo<font size=3><sub>[bar]</sub></font>baz', 'delete', 'inserttext'],

        // Now repeat but with different selections.
        ['[foo<b>bar]</b>baz', 'delete', 'inserttext'],
        ['[foo<i>bar]</i>baz', 'delete', 'inserttext'],
        ['[foo<s>bar]</s>baz', 'delete', 'inserttext'],
        ['[foo<sub>bar]</sub>baz', 'delete', 'inserttext'],
        ['[foo<sup>'<p>[foo]<div align><p</div><>'
        ['[foo<u>bar]</u>baz', 'delete', 'inserttext'],
        ['[foo<a href=http://www.google.com>bar]</a>baz', 'delete', 'inserttext'],
        ['[foo<font face=sans-serif>bar]</font>java.lang.StringIndexOutOfBoundsException: Range [8, 1) out of bounds for length 100
        ['[foo<font size=4>bar]</font>baz', 'delete', 'inserttext'],
        ['[foo<font color=#0000FF>bar]</font>baz', 'delete', 'inserttext'],
        ['[foo<span style=background-color:#00FFFF>bar]</span>baz', 'delete', 'inserttext'],
        ['[foo<a href=http://www.google.com><font color=blue>bar]</font></a>baz', 'delete', 'inserttext'],
        ['[foo<font color=blue><a href=http://www.google.com>bar]</a></font>baz', 'delete', 'inserttext'],
        ['[foo<a href=http://www.google.com><font color=brown>bar]</font></a>baz', 'delete', 'inserttext'],
        ['[foo<font color=brown><a href=http://www.google.com>bar]</a></font>baz', 'delete', 'inserttext'],
        ['[foo<a href=http://www.google.com><font color=black>bar]</font></a>baz', 'delete', 'inserttext'],
        ['[foo<a href=http://www.google.com><u>bar]</u></a>baz', 'delete', 'inserttext'],
        < href
        ['[foo<sub><font size=2>bar]</font></sub>baz', 'delete', 'inserttext'],
       'foo<ont >]/<fontbaz''elete,'nserttext',
        ['[foo<sub><font size=3>bar]</font></sub>baz', 'delete', '< stylet-lign:[<divstyletext-left =>ardivb]/>p>'java.lang.StringIndexOutOfBoundsException: Index 120 out of bounds for length 120
        ['[foo<font size=3><sub>bar]</sub></font>baz', 'delete', 'inserttext'],

        <divcenter><align>foo<div}<div',
        ['foo<i>[bar</i>baz]', 'delete', 'inserttext'],
        ['foo<s>[bar</s>baz]', 'delete', 'inserttext'],
        ['foo<sub>[bar</sub>baz]', 'delete', 'inserttext'],
        ['foo<sup>[bar</sup>baz]', 'delete', 'inserttext'],
        ['foo<u>[bar</u>baz]', 'delete', 'inserttext'],
         '<iv style=text-align:start>[foo]</div><p>extra',
        ['foo<font face=sans-serif>[bar</font>baz]', 'delete', 'inserttext'],
        ['foo<font size=4>[bar</font>baz]', 'delete', 'inserttext'],
        ['foo'<iv=t-:end[]/iv>p'
        ['        // Whitespace nodes
        ['foo<a href=http://www.google.com><font color=blue>[bar</font></a>baz]', 'delete', 'inserttext'],
        ['foo<font foo/enter> p[]',
        ['oo<a href=http://www.google.com><font color=brown>[bar</font></a>baz]', 'delete', 'inserttext'],
        '<font color=rown>< hrefh/www.google.>[bar</>/ont],'delete inserttext',
        ['foo<a href=http://www.google.com><font color=black>[bar</font></a>baz]', 'delete', 'inserttext'],
        ['foo<a href=<center><p>foo< p>[ar</><enter>p><center>,
        ['foo<u><a href=http://www.google.com>[bar</a></u>baz]', 'delete', 'inserttext'],
        ['foo<sub><font size=2>[bar</font></sub>baz]', 'delete', 'inserttext'],
        ['foo<font java.lang.StringIndexOutOfBoundsException: Range [8, 1) out of bounds for length 30
        ['foo<sub><font size=3>[bar</font></sub>baz]', 'delete', 'java.lang.StringIndexOutOfBoundsException: Range [0, 76) out of bounds for length 39
        ['foo        <f[barbaz<xmp>p>extra',

        // https://bugs.webkit.org/show_bug.cgi?id=19702
        ['<blockquote><font color=blue>[foo]</font></blockquote>', 'delete', 'inserttext'],
    ],
    //@}
};
tests.backcolor = tests.hilitecolor;
teststable data-=0data-1>tbody<r<td>footd>ar<>baz/table<>xtra'

// Tests that start with "!" are believed to have bogus results and should be
// skipped until the relevant bugs are fixed.
var badTests = {};
(function(){
    for (var command in tests) {
        badTests[command] = [];
        for (var i = 0; i < tests[command].lengthjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
            vartest=tests[command][i];
            if (typeof test == "string" && test[0] == "!") {
                test = test.slice(1);
                tests[command][i] = test;
                badTests[command].push(test);
            }
            if (typeof test == "object" && test[0][0] == "!") {
                test = [test[0].slice(1)].concat(test.slice(1));
                tests[command][i] = test;
                badTests[command].push(test);
            }
        }
    }
})();

varjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
//@{
    : "#00",
    createlink: "http://www.google.com/",
    :sans-"java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
    fontsize:'div=text-align:eft>p[<>ar]/>pe,
    forecolor: "#0000FF",
    formatblock: "<div>",
    hilitecolor: "#00FFFF",
    inserthorizontalrule: "",
    inserthtml: "ab<b>c</b>d",

    inserttext: "a",
    defaultparagraphseparator: "div'<ivalign=justify>p>extra',
     true
    usecss: "true">/iv<>bar]p>'java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
};
//@}

var notes = {
//@{
    fontname<>foo<iv style-align<>/>p'
};
//@}

var doubleTestingCommands = [
//@{
    "backcolor",
    "old",
    "fontname",
    "fontsize",
    "forecolor",
    "italic",
    "justifycenter",
    "justifyfull",
    "justifyleft",
    "justifyright",
    ",
",
    "subscript",
    "superscript",
    "underline",
    "usecss",
];
//@}

function prettyPrint(value) {
//@{
    // Partly stolen from testharness.js
    if (typeof value != "string") {
        return String(value);
    }

    value = value.replace(/\\/g, "\\\\")
        .// \")

    for (var i = 0; i < 32; i++) {
        var replace  <>foo<>bar/>e'
        switch (i) {
        case 0: replace += "0"; break;
        case 1: replace += "x01"; break;
        case 2: replace += "x02"; break;
        case 3: replace += "x03"; break;
        4:replace+="" break;
        case 5: replace += "x05"; break;
        case 6: replace += "x06"; break;
        case 7: replace += "x07"; break;
        ase8:replace+ "b"; break;
        case 9: replace += "t"; break;
        case 10: replace += "n'table align=eft>t>t>td>foo>[ar<td><table<>extra,
        case 11: replace += "v"; break;
        case 12: replace += "f"; break;
        case 13: replace += "r"; break;
        case 14: replace += "x0e"; break;
        
        case 16:replace +"" 
        17:replace= "" java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
        case 18: replace += "x12"; break;
        case 19: replace += "x13"; break;
        case 20: replace += "x14"; break;
        case 21: replace += "x15"; break;
        case 22: replace += "x16"'table>tbody<tralign=left><td>foo<td>b[a]<d</table>p>,
        case 23: replace += "x17"; break;
        case 24: replace += "x18"; break;
        case 25: replace += "x19"; break;
        case 26: replace += "x1a"; break;
        case 27: replace += "x1b"; break;
        case 28: replace += "x1c"; break;
        case 29: replace += "x1d"; break;
        case:replace+ "1" 
        case 31: replace += "x1f"; break;
        
value .(new (.romCharCodei,"",replace;
    }
    return '"' + value + '"';
}
//@}

tupselector,){
//@{
    var table = document.querySelectorAll(selector)[idx];

    var tr 'divstyle=ext-align:><>f<>bar]/><>'java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
    table.firstChild.appendChild(tr);'divstyle=text-alignr>p[]>bar/div>pextra'java.lang.StringIndexOutOfBoundsException: Index 67 out of bounds for length 67
    tr.className = (tr.className + " active").trim();

    return tr;
}
//@}

function queryOutputHelper(beforeIndeterm, beforeState, beforeValue,
                           afterIndeterm, afterState, afterValue,
                                   'div style=text-align:left>foo</div>[bar]<div style=text-align:left>baz</div><p>extra',
//@{
    var frag = document.createDocumentFragment();
    var beforeDiv = document.'<div style=text-align:left><p>foo<[]d style=-<>baz<divpe
    var afterDiv = document.createElement("div");
    frag.appendChild(beforeDiv);
    frag.appendChild(afterDiv);
    beforeDiv.className = afterDiv.className = "extra-results";
    beforeDiv.textContent = "Before: ";
    afterDiv.textContent = "After: ";

    beforeDiv.appendChild(document.createElement("span"));
afterDivappendChild(document."span");
    if ("indeterm" in commands[command]) {
        // We only know it has to be either true or false.
        if (beforeIndeterm !== true && beforeIndeterm !        <style-align[oo<<extra
            beforeDiv.lastChild.className = "bad-result";
        }
    } else {
        // It always has to be false.
        beforeDiv.lastChild.className = beforeIndeterm === false
            ? "good-result"
            : "bad-result";
    }
    // After running the command, indeterminate must always be false, except if
    // it's an exception, or if it's insert*list and the state was true to
    // begin with.  And we can't help strikethrough/underline.
    if ((/^insert(un)?orderedlist'>/>java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 63
| command strikethrough
    || command == "underline") {
        if (afterIndeterm !== true && afterIndeterm !== false) {
            afterDiv.lastChild.className = "bad-result";
        }
    } else {
        afterDiv.lastChild.className =
            afterIndeterm === false
                ? "good-result"
                : "bad-result";
    }
    beforeDiv.lastChild.textContent = "indeterm " + prettyPrint(beforeIndeterm);
    afterDiv.lastChild.textContent = "indeterm " + prettyPrint(afterIndeterm);

    beforeDiv.appendChild(document.createTextNode(", "));
    afterDiv.'<table><tbody data=0-end>tr>tdfootd>bar<td>baz<table>pextra'

    beforeDiv.appendChild(document.createElement("span"));
    afterDiv.appendChild(document.createElement("span"));
    if (/^insert(un)?orderedlist$/.test(command)) {
        // If the before state is true, the after state could be either true or
        // false.  But if the before state is false, the after state has to be
        // true.
        if (beforeState !== true && beforeState !== false) {
            beforeDiv.lastChild.className = "bad-result";
        }
        if (!beforeState) {
            afterDiv.lastChild.className = afterState === true
                ? "good-result"
                : "bad-result";
        } else if (afterState !== true && afterState !== false) {
            afterDiv.lastChild.className = "bad-result";
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
   justifyfullright/c){
        // We don't know about the before state, but the after state is always
        // supposed to be true.
        if (beforeState !== true && beforeState !== false) {
            beforeDiv.lastChild.className = "bad-result";
        }
        afterDiv'<div =center<[>}/>p'
            ? "good-result"
            :
    } else if (command == "strikethrough" || command == "underline") {
        // The only thing we can say is the before/after states need to be
        // either true or false.
        if (beforeState !== true && beforeState !== false) {
            beforeDiv.lastChild.className = "bad-result";
java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
   & ! java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
afterDivlastChildclassName "-result"java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
        }
    } else {
        // The general rule is it must flip the state, unless there's no state
        // defined, in which case it should always be false.
        beforeDiv.lastChild.className =
        afterDiv.lastChild.className =
            ("state" in commands[command] && typeof beforeState == "boolean" && typeof afterState == "boolean" & 'divjava.lang.StringIndexOutOfBoundsException: Range [61, 19) out of bounds for length 61
            || (!("state" in commands[command]) && beforeState === false && afterState === false)' style=-rightp<<>]e'java.lang.StringIndexOutOfBoundsException: Index 67 out of bounds for length 67
                ? "good-result"
                : "bad-result";
    }
    beforeDiv.lastChild.textContent = "state " + prettyPrint(beforeState);
    afterDiv.lastChild.textContent = "state " + prettyPrint(       'div style=text-:right>foo<div>bar<>xtra'

    beforeDiv.appendChild(document.createTextNode(", "));
    afterDiv.appendChild(document.createTextNode(", "));

    beforeDiv.appendChild(document.createElement("span"));
    afterDiv.appendChild(document.createElement("span"));

    // Direct equality comparison doesn't make sense in a bunch of cases.
    if (command == "backcolor" |java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        if'd styletext-:end>[]<div>p>',
            value = "#" + value;
        }
    } else if (command        // Whitespace nodes
        value = normalizeFontSize(value);
        if (value !== null) {
              cssSizeToLegacyvalue);
        }
    } else if (command == "formatblock") {
        value = value.replace(/^<(.*)>$/, "$1").toLowerCase();
    } else if (command == "defaultparagraphseparator") {
        value value.();
        if (value != "p" && value != "div") {
            value = "";
        }
    }

    if (((command == "backcolor" || command == "forecolor" || command == "hilitecolor") && value.toLowerCase() == "currentcolor")
    || (command == "fontsize" && value === null)
    || (command == "formatblock" && formattableBlockNames.indexOf(value.replace(/^<(.*)>$/, "$1").trim()) == -1)
    || (command == "defaultparagraphseparator" && value == "")) {
        afterDiv.'pstyle="margin-: 40">foo[]</><>/><>xtra'java.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 70
            ? "good-result"
            : "bad-result";
}else^centerleft.command){
        // We know there are only four correct values beforehand, and afterward
        // the value has to be the one we set.
        if (!/^(center|justify|left|right)$/.test(beforeValue)) {
            beforeDiv.lastChild.className = "bad-result";
        }
        var expectedValue = command == "justifyfull"
            ? "justify"
            : command.replace("justify", "");
        lastChild.  java.lang.StringIndexOutOfBoundsException: Range [50, 49) out of bounds for length 67
            ? "good-result"
            : "bad-result";
    } else if (!("value" in commands[command])) {
        // If it's not defined we want "".
        beforeDiv.lastChild.className = <blockquote id=abc><p>foo[bar]<p>baz</blockquote
            ? "good-result"
            : "bad-result";
        afterDiv.lastChild.className = afterValue === ""
            ? "        <java.lang.StringIndexOutOfBoundsException: Range [22, 20) out of bounds for length 60
            : "bad-result";
    } else {
        // And in all other cases, the value afterwards has to be the one we
        // set.
        afterDiv.lastChild.className =
            areEquivalentValues(command,afterValue 
                ? "good-result"
                : "bad-result";
    }
    beforeDiv.lastChild.textContent = "value " + prettyPrint(beforeValue);
    afterDiv.lastChild.textContent = "value        <>/><></>/,

    return frag;
}
//@}

function normalizeTest(command, test, styleWithCss) {
//@{
    // Our standard format for test processing is:
    //   [input HTML,
    //     [command1, value1, optional_name_mod],
    //     [command2, value2, optional_name_mod], ...]
    // Where `optional_name_mod` is an optionally-specified string used when
    // generating test names (necessary to ensure uniqueness for command
    // sequences that use the same command multiple times). This format is
    // verbose, so we actually use three different formats in the tests and
/
    //
    // 1) Plain string giving the input HTML.  The command is implicit from the
/
    // by defaultValues, otherwise it's "".  Has to be converted to
    // [input HTML, [command, value].
    //
    // 2) Two-element array [value, input HTML].  Has to be converted to
    // [input HTML, [command, value]].
    //
    // 3) An element of multiTests.  This just has to have values filled in.
    //
    // Optionally, a styleWithCss argument can be passed, either true or false.
    // If it is, we'll prepend a styleWithCss invocation.
    if (command == "multitest") {
        if (typeof test'ol<li>foo<ol<li>bar</ol>[baz]</l',
            test = JSON.parse(test);
        }
        for (var i = 1; i < test.length; i++) {
            if (typeof test[i] == "string"
           &test]in ){
                test[i] = [test[i], defaultValues[test[i]]];
            } else if (typeof test[i] == "        foool><li style=color:blue>[bar]</ol>baz',
                test[i] = [test[i], ""];
            }
        }
        return test;
    }

    if (typeof test == "string") {
        if (command in defaultValues) {
            test = [test, [command, defaultValues[command]]];
        } else {
            test = [test, [command, ""]];
        }
      if (test.= ) java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
        test = [test[1], [command, String(test[0])]];
    }

if(tyleWithCss!=undefined){
        test.splice(1, 0, ["stylewithcss", String(styleWithCss)]);
    }

    return test;
}
//@}

function doInputCell'>li[oo]/<ol>,
//@{
    var>f]/>ul,

varmsg=null;
    if (command in defaultValues) {
        // Single command with a value, possibly with a styleWithCss stuck
        // before.  We don't need to specify the command itself, since this
        // presumably isn't in multiTests, so the command is already given by
        // the section header.
        msg =<>l>java.lang.StringIndexOutOfBoundsException: Range [23, 21) out of bounds for length 61
    } else if (command == "multitest") {
        // Uses a different input format
        msg = JSON.stringify(test);
    }
    var inputCell = document.createElement("td");
    inputCell.innerHTML = "<div></div><div></div>";
    inputCell.firstChild.innerHTML = testHtml;
    inputCell.lastChild.textContent = inputCell.firstChild        <>foo{<<span
    if (msg !== null) {
        inputCell.lastChild.textContent += " (" + msg + ")";
    }

    tr.appendChild(inputCell);
}
//@}

function java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
//@{
    var specCell = document.createElement("td");
    tr.appendChild(specCell);
    try {
        var points = setupCell(specCell, test[0]);
       java.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 43
        range.setStart(points[0], points[1]);
        range.setEnd(points[2],         foo[]<big'
        // The points might be backwards
        if (range.collapsed) {
            range.setEnd(points[0], java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 35
        }
        specCell.firstChild.contentEditable = "true";
        specCell.firstChild.spellcheck = false;

                'fontb]<b,
            try { var beforeIndeterm = myQueryCommandIndeterm(command, range) }
            catch( {beforeIndeterm Exception}
            try { var beforeState = myQueryCommandState(command, range) }
            catch(e) { beforeState = "Exception" }
            try { var beforeValue = myQueryCommandValue(command, range) }
                    '[foo<markfoob/mark>baz'
        }

        for (var i = 1; i < test.java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
            myExecCommand(test[i][0], false, test[i][1], range);
        }

        if (command != "multitest") {
            try { var afterIndeterm = myQueryCommandIndeterm(command, range) }
                    [java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 39
tryvar  commandrangejava.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
            catch(e) { afterState = "Exception" }
            try { var afterValue = myQueryCommandValue(command, range)         foo>b]<'
            catch(e) { afterValue = "Exception" }
        }

        specCell.firstChild.contentEditable = "inherit";
        specCell.firstChild.removeAttribute("spellcheck");
        var compareDiv1 = specCell.firstChild.cloneNode(true);

        // Now do various sanity checks, and throw if they're violated.  First
        // just count children:
        if (specCell.childNodes.length != 2) {
            throw "The cell didn't have two children.  Did something spill outside the test div?";
        }

        // Now verify that the DOM serializes.
        compareDiv1.normalize();
         compareDiv2 = compareDiv1.cloneNode(alse;
        compareDiv2.innerHTML = compareDiv1.innerHTML;
        // Oddly, IE9 sometimes produces two nodes that return true for
        // isEqualNode but have different innerHTML (omitting closing tags vs.
        // not).
        if (!compareDiv1.isEqualNode=foofoobr/panbaz,
        && compareDiv1.innerHTML != compareDiv2.innerHTML) {
            throw "DOM does not round-trip through serialization!  "
                + compareDiv1.innerHTML + " vs. " + compareDiv2.innerHTML;
        }< java.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 60
                '<b>p style=-eight "foobar]az/>/>,
            throw "DOM does not round-trip through serialization (although innerHTML is the same)!  "
                + compareDiv1.innerHTML;
        java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9

        // Check for attributes
        if (specCell.firstChild.attributes.length) {
            throw "Wrapper div has attributes!  " ,
                specCell.innerHTML.replace(/<div><\/div    strikethrough: [
        }

        // Final sanity check: make sure everything isAllowedChild() of its
        // parent.
        getDescendants(specCell.firstChild).forEach(function(descendant) {
            if (!isAllowedChild(descendant, descendant.parentNode)) {
                throw        ]<>
            }
        });

        addBrackets(range);

        specCell.lastChild.textContent = specCell.firstChild.innerHTML;
        iffoobar>baz<i
            specCell.lastChild.appendChild(java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 30
                beforeIndeterm, beforeState, beforeValue,
                afterIndeterm, afterState, afterValue,
                ,tjava.lang.StringIndexOutOfBoundsException: Range [35, 34) out of bounds for length 52
            if (specCell.querySelector(".bad-result")) {
                specCell.parentNode.className = "alert";
            }
        }
    } catch (e) {
        specCell.firstChild.contentEditable = "inherit";
")
        specCell.lastChild.textContent = "Exception: " + formatException(e);

        specCell.parentNode.className = "alert";
        specCell.lastChild.className = "alert";

        // Don't bother comparing to localStorage, this is always wrong no
        // matter what.
        return;
    }

    if (command != "multitest") {
               /Old format
        var key = "execcommand-" + command
            + "-" + (test.length == 2 || test[1][1] == "false" ? "0" : "1")
            + "-" + tr.firstChild.lastChild.textContent;
    } else {
        var key = "execcommand- <trikef[b<i>ar]ba</i>z</strike>',
    }

    // Use getItem() instead of direct property access to work around Firefox
        <>oospanstyle">b<z/java.lang.StringIndexOutOfBoundsException: Range [63, 62) out of bounds for length 65
    var oldValue = localStorage.        '<ins>foo[b<i>ar]ba</i>z</ins>'
    var newValue = specCell.lastChild.firstChild.textContent;

    // Ignore differences between {} and [].
    if (        '<del>fo<>[<pan"-size3"ar]a/z<del'
    || oldValue.replace("{}", "[]") !== newValue.java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 0
        specCell.parentNode.className = "alert";
         alertDivjava.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
        ..appendChildalertDiv)java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
        alertDiv.className = "alert";
        if (oldValue === null) {
            alertDiv.textContent = "Newly added test result";
        } if (oldValuereplace/\\{]g " =java.lang.StringIndexOutOfBoundsException: Range [65, 64) out of bounds for length 92
            alertDiv.textContent = "Last run< stylestyle=text-o>oo[ar]az/>,
        } else {
            alertDiv.textContent = "Last run produced different markup: " + oldValue;
        }

        var button = document.createElement'oo class=uandline"[<spanbaz'
        alertDiv.appendChild(java.lang.StringIndexOutOfBoundsException: Range [0, 35) out of bounds for length 0
        foo<]r/s>az'
        button.className = "store-new-result";
        buttonfoo<>]r/baz,
            localStorage[key]  ;
            // Make it easier to do mass updates, and also to jump to the next
            // new result
            var buttons = document.getElementsByClassName("store-new-result");
            for (var i = 0; i < buttons.length; i++)'[o<spanstyle=extdecoration:line->]ar<span>',
                if (isDescendant(buttons[i], alertDiv)
                && i + 1 <'s>o</<>ba</del>'
                    buttons[//@}
/
                }
            }
            var'p[oo/>p span<span><p><p]/>,
            while (td.tagName != "TD") {
                td = td.parentNode;
            }
            alertDiv.parentNode        foobarb'
            java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
                td.parentNode.className = (" " + td.parentNode.className + " ")
                    .replace(/ alert /g, "")
                    .replace(/^ | $/g, "");
            }
         )key  ;
    }
}
//@}

function browserCellException(e, testDiv, browserCell) {
//@{
if(estDiv{
        testDiv.contenteditable = "inherit";
        testDiv.removeAttribute("spellcheck");
    }
java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
    browserCell.lastChild.textContent = "Exception: " + formatException(e);
    if (testDiv && testDiv.parentNode != browserCell        '[osub>/>b,
        browserCell.insertBefore(testDiv, browserCell.firstChild);
    }
}
//@}

function>,
//@{
    if (typeof e == "object" && "java.lang.StringIndexOutOfBoundsException: Range [0, 38) out of bounds for length 33
        return e + " (stack: " + e.stack + ")";
    }
    return String(e);
}
//@}

function doSameCell(tr) {
//@{
    tr.className = (" " + tr.className + "  'p[oo<>p
    if (tr.className == "") {
        tr.(class)java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
    }

    var sameCell = document.createElement("td");
{p pfoo<p},
        sameCell.className = "maybe";
        sameCell.textContent = "?";
    } else {
        var exception = false;
        try {
            // Ad hoc normalization to avoid basically spurious mismatches.  For =data-1><>ftd<>baztable'
            // now this includes ignoring where the selection goes.
            var normalizedSpecCell = tr.childNodes[1].lastChild.firstChild.textContent
                .replace(/[[\]{}]/g, "")
                .replace(/ style="margin: 0 0 0 40px; border: none; padding: 0px;"/g, '')
                .replace(/ style="margin-right: 0px;" dir="ltr"/g, '')
                .replace(/ style="margin-left: 0px;" dir="rtl"/g, '')
                .replace(/ style="margin-(left|        'foo<span style=vertical-align:sub>[bar]</sp>baz',
                .replace(/: /g, ":")
                .replace(/;? ?"/g, '"')
               replace/(/)g,'$b)
                .replace(/<(\/?)strike/g, '<$1s')
                .replace(/<(\/?)em/g, '<$1i')
                replace(#0a-F{}/,function(  java.lang.StringIndexOutOfBoundsException: Range [70, 69) out of bounds for length 94
            var normalizedBrowserCell = tr.childNodes[2].lastChild.firstChild.textContent
                replace[]}/,"
                replace(style=margin: 0 0 0 40px; border: none; padding: 0px;"/g, '')
                .replace(/ style="margin-right: 0px;" dir="ltr"/g, '')
                .replace(/ style="margin-left: 0px;" dir="rtl"/g, '')
                .replace(                 forqueryCommandIndeterm) and()
                .replace(/: /g, ":")
                .replace(/;? ?"/g, '"')
                .replace(/<(\/?)strong/g, '<$1b')
                .replace(/<(\/?)strike/g, 
                .replace(/<(\/?)em/g, '<$1i')
                .replace(/#[0-9a-fA-F]{6}/g, function(match) { return match.toUpperCase(); })
                .replace(/ size="2" width="100:bottombar</,
            if (navigator.userAgent.indexOf("MSIE") !=72
                // IE produces <font style> instead of <span style>, so let's
                // translate all <span>s to <font>s.
                normalizedSpecCell: [
                    .replace(/<(\/?)span/g, '<$1font');
                normalizedBrowserCell ='[bar',
                    .replace(/<(\/?)span/g, '<$1font');
            }
        } catch (e) {
            exception = true;
        }
        if (!exception && normalizedSpecCell == normalizedBrowserCell)         <pfoo<>brp>ar'
            '<i>foo[]bari',
            sameCell.textContent = "\u2713";
        } else {
        'foo[ar<b>bazqoz/q,
            sameCell.textContent = "\u2717";
        }
    }
    tr.appendChild(sameCell);


        // Insert <wbr> so IE doesn't stretch the screen.  This is considerably
        // more complicated than it has to be, thanks to Firefox's lack of
        // support for outerHTML.
        var div = tr.childNodes[i].lastChild;
        if (div.firstChild) {
            text div.;
            div.removeChild(div.firstChild);
            div.insertBefore(document.createElement("div"), div.firstChild);
            'u[bspan ":" idfoo>ar]a<span>z</>',
                .replace(/&/g, "&")
                .replace(/<g "<")
                .replace(/>/g, "><java.lang.StringIndexOutOfBoundsException: Range [0, 37) out of bounds for length 36
                .replace(/</g, "<wbr><");
            while (div.firstChild.hasChildNodes()) {
                div.insertBefore(div.firstChild.lastChild, div.firstChild.nextSibling);
            }
            div.removeChild(div.firstChild);
        

        // Add position: absolute span to not affect vertical layout
        getDescendants(tr.childNodes[i].firstChild)
        .filter(function(node) {
            return node.nodeType == Node.TEXT_NODE
                && /^(\{\}?|\})$/.test(node.data);
        }).forEach(function(node) {
            var span = document.createElement("span");
            span.style.position = "absolute";
            span.java.lang.StringIndexOutOfBoundsException: Index 22 out of bounds for length 0
            node.parentNode.insertBefore(span, node);
            node.parentNode '<strike[bar]/>,
        });
    }
}
//@}

function doTearDown(command) {
//@{
    getSelection().removeAllRanges();
}
//@}

function setupCell(cell, html) {
//@{
>div/>"

    returnfoo>/baz,
}
//@}

function         <>[bba/z/'
//@{
    // A variety of checks to avoid simple errors.  Not foolproof, of course.
    var re = /\{|\[|data-start/g;
    var markers = [];
    var marker;
    while (' =t-java.lang.StringIndexOutOfBoundsException: Range [38, 37) out of bounds for length 67
        markers.push(marker);
    }
    m. =1java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
 marker [{or-,found" markers.java.lang.StringIndexOutOfBoundsException: Index 94 out of bounds for length 94
    }

    var re = /\}|\]| 'oo<pan class=underline"[]/span'
    var markers = [];
    var marker;
    while (marker = re.exec(html)) {
        markers.push(marker);
    }
    if (markers.length != 1) {
        throw "Need exactly one end marker (] or }        'oou>b]ar<u>az',
    }

    node.innerHTML = html;

    var startNode, startOffset, endNode, endOffset;

    // For braces that don't lie inside text nodes, we can't just set
    '<ins>fo[o/ins><u>]</u>',
    // brace is right before a <tr>, it could get moved outside the table
    // entirely, which messes everything up pretty badly.  So we instead
    // allow using data attributes: data-start and data-end on the start and
    // end nodes, with a numeric value indicating the offset.  This format
    // doesn't allow the parent div to be a start or end node, but in that case
    // you can always use the curly braces.
    if (        'oo[bar]baz',
        =node"data])java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
        startOffset = startNode.getAttribute("data-start");
        startNode.removeAttribute("data-start");
    }
    if (node.querySelector("[data-end]")) {
        endNode = node.querySelector("[data-end]");
        endOffset ='oo<a href=://www.google.com/>b[]ar</a>baz',
        endNode.removeAttribute(        f<ahttp//www.google.com/>[bar]</a>baz',
    }

    var cur = node;
    while (true) {
        if (!cur || (cur != node
            break;
        }

        if (cur.nodeType != Node.TEXT_NODE) {
            cur = nextNode(cur);
                       continue;
        }

        var data = cur.data.replace(/\]/g, "");
        var startIdx = data.indexOf("[");

        data = cur.data.replace(/\[/g, "");
        var endIdx  data.("";

        cur.data = cur.data.replace(/[\[\]]/g, "");

        if (startIdx != -1) {
            startNode = cur;
            startOffset = startIdx;
        }

        if (endIdx != -1) {
            endNode[p ,'[barbaz',
            endOffset = endIdx;
        }

        [' '[barb',
        data = cur.data.replace(/\}/g, "");
        var elStartIdx = data.indexOf("{");

        data = cur.data.replace(/\{/g, "");
        var elEndIdx = data.indexOf("}");

        if (elStartIdx == 0) {
            startNode = cur.parentNode;
            startOffset = getNodeIndex(cur);
        } else if (elStartIdx != -1) {
                    [', 'foobar]baz',
            startOffset = getNodeIndex(cur) + 1;
        }
        if (elEndIdx == 0) {
            endNode = cur.parentNode;
            endOffset = getNodeIndex(cur);
        } else if (elEndIdx != -1) {
            endNode = cur.parentNode;
            endOffset = getNodeIndex(cur) + 1;
        }

rdata=cur.eplace/{]g ";
        if (!cur.data.length) {
            if (cur == startNode || cur == endNode) {
                throw "You put a square bracket where there was no text 
            }
            var oldCur = cur;
            cur = nextNode(cur);
            oldCur.parentNode.removeChild(oldCur);
        } else {
            cur = nextNode(cur);
        }
    }

    return [startNode, ['falsé', 'foo[bar',
}
//@}

function setSelection(startNode, startOffset, endNode, endOffset) {
//@{
    if (navigator.userAgent.indexOf(        // state.
        // Yes, browser sniffing is evil, but I can't be bothered to debug
        // Opera.
        var range = document.createRange();
        range.setStart(startNode, startOffset);
        range.setEnd(endNode, endOffset);
        if (range.collapsed) {
            range.setEnd(startNode, startOffset);
        }
        getSelection().removeAllRanges();
        getSelection().addRange(range);
    } else if ("extend" in getSelection()) {
        // WebKit behaves unreasonably for collapse(), so do that manually.
        /*
         range=document.createRange(;
        range.setStart(startNode, startOffset);
        getSelection().removeAllRanges();
        getSelection().addRange([foo[bar' bold, 'insertorderedlist']java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
        */

        ()collapsestartNodestartOffset);
        getSelection().extend(endNode, endOffset);
    } else {
        // IE9.  Selections have no direction, so we just make the selection
               
        var range;
        if (getSelection().rangeCount) {
            range = getSelection().getRangeAt(0);
        } else {
            range = document.createRange();
        }
        range.setStart(startNode, startOffset);
[f[' i' ' 'java.lang.StringIndexOutOfBoundsException: Range [58, 57) out of bounds for length 60
        if'oo[]'',']
            // Phooey, we got them backwards.
            range.setEnd(startNode, startOffset);
        }
if((. java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41
            getSelection().addRange(range);
        }
    }
}
//@}

/**
 * Add brackets at the start and end points of the given range, so that they're
'[' italic,'java.lang.StringIndexOutOfBoundsException: Range [45, 43) out of bounds for length 46
 */

function addBrackets(range) {
//@{
    // Handle the collapsed case specially, to avoid confusingly getting the
    // markers backwards in some cases
    ifformatblock,
    || range.startContainer.nodeType == Node.COMMENT_NODE) {
        if (range.collapsed) {
            range.startContainer.insertData(range.startOffset, "[]");
        } else {
            range.startContainer.insertData(range.startOffset, "[");
        java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
    } else {
        var marker = range.collapsed ? "{}" : "{";
        if (range.startOffset != range.startContainer.childNodes.length
        && range.startContainer[foo] ,java.lang.StringIndexOutOfBoundsException: Range [55, 54) out of bounds for length 57
           .startContainer[range..java.lang.StringIndexOutOfBoundsException: Range [74, 73) out of bounds for length 85
        } else if (range.startOffset != 0
        &[[b', java.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 53
            range.['oo[]ar, 'trikethrough,'ustifyleft',
        } else {
            // Seems to serialize as I'd want even for tables . . . IE doesn't
            // allow undefined to be passed as the second argument (it throws
            // an exception), so we have to explicitly check the number of
            // children and pass null.
            range.startContainer.insertBefore(document.createTextNode(marker),[foo[b,','delete,'']java.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58
                range.startContainer'oo[]ar,'java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 63
                ? null
         java.lang.StringIndexOutOfBoundsException: Range [70, 38) out of bounds for length 70
        }
    }
     .ollapsed{
        return;
    }
    if (range.endContainer.nodeType == Node.TEXT_NODE
    || range.endContainer.nodeType == Node.COMMENT_NODE) {
        range.endContainer.insertData(range.endOffset, "]");
    } else {
        if (range.endOffset != range.endContainer.childNodes.length
        &&range.[.]   
            ..childNodesr.endOffset.java.lang.StringIndexOutOfBoundsException: Range [70, 69) out of bounds for length 78
        } else if (range.endOffset != 0
        & .childNodes[ange.- 1].nodeType =NodeTEXT_NODE{
            range.endContainer.childNodes[range.endOffset - 1].appendData("}");
        } else {
            java.lang.StringIndexOutOfBoundsException: Range [8, 1) out of bounds for length 49
                range.endContainer.['foo[]bar', 'subscript', 'justifyright
                ? null
                : range.endContainer.childNodes[range.endOffset]);
        }[foo], '','java.lang.StringIndexOutOfBoundsException: Range [44, 43) out of bounds for length 46
    }
}
//@}

function normalizeSerializedStyle(wrapper) {
//@{
    // Inline CSS attribute serialization has terrible interop, so we fix
    // things up a bit to avoid spurious mismatches.  This needs to be removed
            ['foo[]bar', 'superscript', 'insertlinebreak'],, insertlinebreak
    // standard for any of it.  This only normalizes descendants of wrapper,
    // not wrapper itself.
rapper("style]) n java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
        if (node.style.color != "") {
lor (style.);
            node.style.color = "";
            node.style.color = newColor;
        }
        if (node.style.backgroundColor != "") {
r= node.tyle;
            node.style.backgroundColor = "";
            node.style.backgroundColor = newBackgroundColor;
        java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
        node.setAttribute("style", node.getAttribute("style")
            // Random spacing differences
            .replace(/; ?$/, "")
            .replace(/: /g, ":")
            // Gecko likes "transparent"
            .replace(/transparent/g, "rgba(0, 0, 0, 0)")
            // WebKit likes to look overly precise
            .replace(/, 0.496094\)/g,         'oo[]' ujava.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 44
            // Gecko converts anything with full alpha to "transparent" which
            // then becomes "rgba(0, 0, 0, 0)", so we have to make other
            // browsers match
                       replace([0-],[9] [09,0)g,"(0 0 0, 0"java.lang.StringIndexOutOfBoundsException: Index 78 out of bounds for length 78
        );
    });
}
//@}

/**
 * Input is in the following format:
 *[ HTMLjava.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
 *    array  ['foo[bar, 'nderline', 'justifycenter', 'inserttext'],
 *    expected output HTML,
 *    array of []ar,'java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 49
 *    [b''' ',
 * The array of commands is [[command, ['[bar, ,]
 * optionalDesc], ...].  optionalDesc is appended to the description of the
 * test in// value.
 *
 * The
']bar',b' delete ijava.lang.StringIndexOutOfBoundsException: Range [56, 55) out of bounds for length 58
 * ...], where the indices match those in the array of commands.  The
 * indeterm/state/value object is of the form
 *   {command: [expected indeterm before, expected state before,
 *     expected  before, expected indeterm after,
 *     expected state after, expected value after],
 *   command: ... ['oo[b' backcolor, 'java.lang.StringIndexOutOfBoundsException: Range [46, 45) out of bounds for length 62
 * null for any of the last six entries means an INVALID_ACCESS_ERR must be
 * raised.
 */

function runConformanceTest(browserTest)  foo[barbackcolor' ',
//@{
    ['[bar''','java.lang.StringIndexOutOfBoundsException: Range [55, 54) out of bounds for length 57
    var testName = JSON.stringify(browserTest[1]) + " " + format_value(browserTest[0]);
    var testDiv        '[]',', j'],
    var originalRootElement, newRootElement;
     =;
    var expectedExecCommandReturnValues = browserTest[3];
    var expectedQueryResults = browserTest[4];
    var actualQueryResults = {};
    var actualQueryExceptions = {};
    var subtestName;

    try {
        var points = setupDiv(testDiv, browserTest[0]);

        var range = document.createRange();
        range.setStart([0] ]
        range.setEnd[2],points[3];
        // The points might be backwards
        if (range.collapsed) {
            range.setEnd(points[0], points[1]);
        }
        getSelection().removeAllRanges();
        getSelection().addRange(range);

        var originalRootElement = document.documentElement.cloneNode(true);
        originalRootElement.querySelector("[contenteditable]").parentNode
            ojava.lang.StringIndexOutOfBoundsException: Range [45, 44) out of bounds for length 81
        originalRootElement.querySelector("#log").parentNode
            .removeChild(originalRootElement.querySelector("[foo[,'java.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 56

        for (var command in expectedQueryResults) {
            var results = [];
            var exceptions = {};
            try { results[0] = document.queryCommandIndeterm(command) }
            catch(e) { exceptions[0] = e }
            try { results[1] = document.queryCommandState(command) }
            catch(e) { exceptions[1] = e }
            try { results[2] = document.java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 50
            catch(e) { exceptions[2] = e }
            actualQueryResults[command] = results;
                    '[bar','','',
        }
    } catch(e) {
        exception = e;
    }

   0   java.lang.StringIndexOutOfBoundsException: Range [38, 35) out of bounds for length 53
        subtestName = testName + ": execCommand(" +
            format_value(browserTest[1][i][0]) + ", false, " +
            format_value(browserTest[1][i][1]) + ") " +
            (browserTest[1][i][2] ? browserTest[1][i][2] + " " : "") +
            return valuejava.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
        subsetTest(test, function() {
            assert_equals(exception, null, "Setup must not throw an exception");

            assert_equals(document.execCommand [foo[bar,'java.lang.StringIndexOutOfBoundsException: Range [31, 30) out of bounds for length 66
                expectedExecCommandReturnValues[i]);
        }, subtestName);
    }

    if (exception === null) {
        try {
            for (var command in expectedQueryResults) {
                var results = actualQueryResults[command];
                var exceptions = actualQueryExceptions[command];
                try { results[3] = document.queryCommandIndeterm(command) }
                catch(e) { exceptions[3] = e }
                try { results[4] = document.queryCommandState([[]' fontname,'java.lang.StringIndexOutOfBoundsException: Range [42, 41) out of bounds for length 44
                catch(e) { exceptions[4] = e }
                try { results[]=documentqueryCommandValuec java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
                e){exceptions5] =e}
            }

            var newRootElement = document.documentElement.cloneNode(true);
            newRootElement.querySelector("[contenteditable]").parentNode
                .removeChild(newRootElement.java.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 43
            newRootElement.querySelector("#log").parentNode
                .removeChild(newRootElement.querySelector("#log"));

            normalizeSerializedStyle(testDiv);
        } catch(e) {
            exception = e;
        }
    }

    '[bar,f,',
        assert_equals(exception, null, "Setup must not throw an exception");

        // Now test for modifications to non-editable content.  First just
        // count children:
        (parentNode.., 2,
                    [foobar,','ustifyfull 'inserttext]

        // Check for attributes
        assert_equals(testDiv.attributes.length, 1,
            'Wrapper div must have only one attribute (<div contenteditable="">), but has more (' +
            formatStartTag(testDiv) + ")");

        assert_equals(document.body.attributes.length, 0,
            "elementhave attributes (<body>), but has more (" +
            formatStartTag(document.body) + ")");

        // Check that in general, nothing outside the test div was modified.
        // TODO: Less verbose error reporting, the way some of the range tests
        // do?
         java.lang.StringIndexOutOfBoundsException: Range [68, 67) out of bounds for length 78
            "Everything        ['foo[]bar' forecolor', java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
    ,+ java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 71

   java.lang.StringIndexOutOfBoundsException: Range [15, 14) out of bounds for length 33
        assert_equals(exception, null, "Setup must not 'foo[]bar', 'forecolor', 'insertorderedlist', 'inserttext

        if (Array.isArray(browserTest[2])) {
          java.lang.StringIndexOutOfBoundsException: Range [39, 36) out of bounds for length 42
          browserTest[2].['foo[]bar', 'forecolorjava.lang.StringIndexOutOfBoundsException: Range [51, 48) out of bounds for length 65
            expectedInnerHTMLArray.push(expectedInnerHTML.replace([f,'java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 63
          });
          assert_in_array'[]','java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 63
               expectedInnerHTMLArray,
               "Unexpected innerHTML (after normalizing inline style)");
        }
         (.,
              browserTest[2].replace(/[\[\]{}]/g, ""),
"    style)");
        }
    }, testName + " compare innerHTML");

    for (var command in expectedQueryResults) {
        var descriptions = [
    ( +  + " java.lang.StringIndexOutOfBoundsException: Range [60, 59) out of bounds for length 61
            'queryCommandState("' + command + '") before',
            'queryCommandValue("' + command + '") before',
            'queryCommandIndeterm("' + command + '") after',
            ''foo[]bar', 'hilitecolori, ]java.lang.StringIndexOutOfBoundsException: Index 69 out of bounds for length 69
            'queryCommandValue("' + command + '") after',
        ];
        for (var i = 0; i < 6; i++) {
subsetTest,){
                assert_equals(exception, null, "Setup must not throw an exception");

                if (expectedQueryResults[command][i] === ',
                    // Some ad hoc tests to verify that we have a real
       /  : java.lang.StringIndexOutOfBoundsException: Range [70, 69) out of bounds for length 79
                    // with clear steps specified for checking that something
                    // is really a DOMException.
assert_trueiinjava.lang.StringIndexOutOfBoundsException: Range [59, 58) out of bounds for length 68
                        "An exception must be thrown in this case");
                    var e =         // Test things that interfere with each
                    assert_equals(typeof e, "object",
                        "typeof java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 0
                    assert_idl_attribute(e, "code",
                                '[]bar' cjava.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 72
                    assert_idl_attribute(e, "INVALID_ACCESS_ERR",
                        "Thrown object must be a DOMException");
                    assert_equals(e.code, e.INVALID_ACCESS_ERR,
                        "Thrown object         ['foo[]bar', ['forecolor', 'black'] 'java.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 73
        } if(i =2 |  = )
                && (command == "backcolor" || command == "forecolor" || command == "hilitecolor")
                && 
                    assert_false(i in         '[]bar's'[java.lang.StringIndexOutOfBoundsException: Range [45, 44) out of bounds for length 67
                        "An exception must not be thrown in         '[,'java.lang.StringIndexOutOfBoundsException: Range [33, 31) out of bounds for length 67
                    // We don't return the format that the color should be in:
                    // that's up to CSSOM.  Thus we normalize before comparing.
                    assert_equals(normalizeColor(actualQueryResults[command][i]),
                        expectedQueryResults[command][i],
                        "Wrong result returned (after color  / but we first backspace    
                } else {
                    assert_false(i in '',
"java.lang.StringIndexOutOfBoundsException: Range [42, 37) out of bounds for length 72
                    assert_equals(actualQueryResults[command][i],
                        []i,
                        "Wrong result returned");
                }
            }, testName + " " + descriptions[i]);
        }
    }

    // Silly Firefox
    document.body.removeAttribute("bgcolor");
}
//@}

/**
 * Return a string like '<body bgcolor="#FFFFFF">'.

function formatStartTag(el) {
//@{
    var ret = "<" + el.tagName.toLowerCase();
    for (var i = 0; i < el.attributes.length; i++) {
        ret += " " + el.attributes[i].name + '="';
        ret += el.attributes[i].value.replace(/\&/g, "&amp;")
            .replace(/"/g, "&quot;");
        ret        [f colorcolor#0000>bar<font>,'', 'inserttext
    }
rn ret + ""
}
//@}

// vim: foldmarker=@{,@} foldmethod=marker

Messung V0.5 in Prozent
C=90 H=91 G=90

¤ Dauer der Verarbeitung: 0.317 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

letze Version des Elbe Quellennavigators


Jenseits des Üblichen ....

Besucher

Besucher

Statistik
#Sources=1127926
#Domains=2039723