// 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[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',
// 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>',
// 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>'],
// 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>',
// 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',
// 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',
// 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'],
['\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'],
// 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',
// 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>',
// 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',
// 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',
'<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
// 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><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<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]
// 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>}',
'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<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,
'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<
'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<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</},
'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<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
'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>}',
[<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', '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'
// 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'],
// 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'
}; //@}
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.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";
} elseif (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"
:
} elseif (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'
// 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;
}
} elseif (command // Whitespace nodes
value = normalizeFontSize(value); if (value !== null) {
cssSizeToLegacyvalue);
}
} elseif (command == "formatblock") {
value = value.replace(/^<(.*)>$/, "$1").toLowerCase();
} elseif (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";
} elseif (!("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]]];
} elseif (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])]];
}
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
} elseif (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;
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);
// 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: 00040px; 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.("";
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);
} elseif ("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);
}
}
} //@}
/** *Addbracketsatthestartandendpointsofthegivenrange,sothatthey'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
} elseif (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
} elseif (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
);
});
} //@}
/** *Inputisinthefollowingformat: *[HTMLjava.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17 *array['foo[bar,'nderline','justifycenter','inserttext'], *expectedoutputHTML, *arrayof[]ar,'java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 49 *[b'''', *Thearrayofcommandsis[[command,['[bar,,] *optionalDesc],...].optionalDescisappendedtothedescriptionofthe *testin// value. * *The ']bar',b'deleteijava.lang.StringIndexOutOfBoundsException: Range [56, 55) out of bounds for length 58 *...],wheretheindicesmatchthoseinthearrayofcommands.The *indeterm/state/valueobjectisoftheform *{command:[expectedindetermbefore,expectedstatebefore, *expected before,expectedindetermafter, *expectedstateafter,expectedvalueafter], *command:...['oo[b'backcolor,'java.lang.StringIndexOutOfBoundsException: Range [46, 45) out of bounds for length 62 *nullforanyofthelastsixentriesmeansanINVALID_ACCESS_ERRmustbe *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"));
'[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]);
}
}
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.