| <html> | |
| <head id="head"> | |
| <script src="../../resources/js-test-pre.js"></script> | |
| </head> | |
| <body> | |
| <script> | |
| description("This tests parsing and re-serialization of some CSS selectors."); | |
| function parseThenSerializeRule(rule) | |
| { | |
| var styleElement = document.getElementById("style"); | |
| var head = document.getElementById("head"); | |
| if (styleElement) | |
| head.removeChild(styleElement); | |
| styleElement = document.createElement("style"); | |
| styleElement.id = "style"; | |
| var head = document.getElementById("head"); | |
| head.appendChild(styleElement); | |
| styleElement.appendChild(document.createTextNode(rule)); | |
| return styleElement.sheet.cssRules[0].cssText; | |
| } | |
| function expectedSerializedLangSelector(selector) | |
| { | |
| var args = /:lang\(([^)]+)/.exec(selector); | |
| if (!args || !args[1]) | |
| return selector; | |
| args = args[1].split(/\s*,\s*/); | |
| var expected = ':lang('; | |
| for (var i = 0; i < args.length; ++i) { | |
| var arg = args[i]; | |
| var hasQuotes = arg.indexOf('"') == 0 && arg.lastIndexOf('"') == arg.length - 1; | |
| if (!hasQuotes) | |
| expected += '"'; | |
| expected += args[i]; | |
| if (!hasQuotes) | |
| expected += '"'; | |
| if (i < args.length - 1) | |
| expected += ', '; | |
| } | |
| expected += ')'; | |
| return expected; | |
| } | |
| function testSelectorRoundTrip(selector) | |
| { | |
| var expected = selector.indexOf(":lang") == 0 ? expectedSerializedLangSelector(selector) : selector; | |
| shouldBe("parseThenSerializeRule('" + selector + " { }')", "'" + expected + " { }'"); | |
| } | |
| testSelectorRoundTrip('*'); | |
| testSelectorRoundTrip('a'); | |
| testSelectorRoundTrip('#a'); | |
| testSelectorRoundTrip('.a'); | |
| testSelectorRoundTrip(':active'); | |
| testSelectorRoundTrip('[a]'); | |
| testSelectorRoundTrip('[a="b"]'); | |
| testSelectorRoundTrip('[a~="b"]'); | |
| testSelectorRoundTrip('[a|="b"]'); | |
| testSelectorRoundTrip('[a^="b"]'); | |
| testSelectorRoundTrip('[a$="b"]'); | |
| testSelectorRoundTrip('[a*="b"]'); | |
| testSelectorRoundTrip('[a="b" i]'); | |
| testSelectorRoundTrip('[a~="b" i]'); | |
| testSelectorRoundTrip('[a|="b" i]'); | |
| testSelectorRoundTrip('[a^="b" i]'); | |
| testSelectorRoundTrip('[a$="b" i]'); | |
| testSelectorRoundTrip('[a*="b" i]'); | |
| debug(''); | |
| testSelectorRoundTrip('*|a'); | |
| testSelectorRoundTrip('n|a'); | |
| testSelectorRoundTrip('*|*'); | |
| testSelectorRoundTrip('n|*'); | |
| testSelectorRoundTrip('|a'); | |
| testSelectorRoundTrip('|*'); | |
| testSelectorRoundTrip('[*|a]'); | |
| testSelectorRoundTrip('[n|a]'); | |
| shouldBe("parseThenSerializeRule('[|a] { }')", "'[a] { }'"); | |
| debug(''); | |
| testSelectorRoundTrip('a:active'); | |
| testSelectorRoundTrip('a b'); | |
| testSelectorRoundTrip('a >> b'); | |
| testSelectorRoundTrip('a + b'); | |
| testSelectorRoundTrip('a ~ b'); | |
| testSelectorRoundTrip('a > b'); | |
| debug(''); | |
| testSelectorRoundTrip(":active"); | |
| testSelectorRoundTrip(":any-link"); | |
| testSelectorRoundTrip(":checked"); | |
| testSelectorRoundTrip(":disabled"); | |
| testSelectorRoundTrip(":empty"); | |
| testSelectorRoundTrip(":enabled"); | |
| testSelectorRoundTrip(":first-child"); | |
| testSelectorRoundTrip(":first-of-type"); | |
| testSelectorRoundTrip(":focus"); | |
| testSelectorRoundTrip(":hover"); | |
| testSelectorRoundTrip(":indeterminate"); | |
| testSelectorRoundTrip(":link"); | |
| testSelectorRoundTrip(":not(:placeholder-shown)"); | |
| testSelectorRoundTrip(":placeholder-shown"); | |
| testSelectorRoundTrip(":root"); | |
| testSelectorRoundTrip(":target"); | |
| testSelectorRoundTrip(":visited"); | |
| debug(''); | |
| testSelectorRoundTrip(':lang("*-ab")'); | |
| testSelectorRoundTrip(':lang("*-ab-")'); | |
| testSelectorRoundTrip(':lang("*-DE-1996")'); | |
| debug(''); | |
| testSelectorRoundTrip(":lang(a)"); | |
| testSelectorRoundTrip(":lang(a, b, c)"); | |
| testSelectorRoundTrip(":lang(fr, de, en, id)"); | |
| testSelectorRoundTrip(":lang(fr, fr-ca, fr-be)"); | |
| testSelectorRoundTrip(":lang(de-DE, de-DE-1996, de-Latn-DE, de-Latf-DE, de-Latn-DE-1996)"); | |
| testSelectorRoundTrip(":lang(de-CH, it-CH, fr-CH, rm-CH)"); | |
| testSelectorRoundTrip(":lang(de-DE, de-DE-1996, de-Latn-DE, de-Latf-DE, de-Latn-DE-1996, de-CH, it-CH, fr-CH, rm-CH)"); | |
| debug(''); | |
| testSelectorRoundTrip(":lang(a, a, a)"); | |
| testSelectorRoundTrip(":lang(en, en, en)"); | |
| testSelectorRoundTrip(":lang(en-us, en-us, en-us)"); | |
| testSelectorRoundTrip(":lang(de-DE-1996, de-DE-1996, de-DE-1996)"); | |
| testSelectorRoundTrip(":lang(de-Latn-DE-1996, de-Latn-DE-1996, de-Latn-DE-1996)"); | |
| testSelectorRoundTrip(":lang(java, java, java)"); | |
| debug(''); | |
| testSelectorRoundTrip(":not(a)"); | |
| testSelectorRoundTrip(":-webkit-any(a, b, p)"); | |
| debug(''); | |
| testSelectorRoundTrip("::after"); | |
| testSelectorRoundTrip("::before"); | |
| testSelectorRoundTrip("::first-letter"); | |
| testSelectorRoundTrip("::first-line"); | |
| testSelectorRoundTrip("::selection"); | |
| debug(''); | |
| testSelectorRoundTrip(":-webkit-any-link"); | |
| testSelectorRoundTrip(":-webkit-autofill"); | |
| testSelectorRoundTrip(":-webkit-drag"); | |
| debug(''); | |
| testSelectorRoundTrip(":nth-child(odd)"); | |
| testSelectorRoundTrip(":nth-child(even)"); | |
| testSelectorRoundTrip(":nth-child(n)"); | |
| testSelectorRoundTrip(":nth-child(-n)"); | |
| testSelectorRoundTrip(":nth-child(5)"); | |
| testSelectorRoundTrip(":nth-child(-5)"); | |
| testSelectorRoundTrip(":nth-child(5n+7)"); | |
| testSelectorRoundTrip(":nth-child(-5n+7)"); | |
| testSelectorRoundTrip(":nth-child(5n-7)"); | |
| testSelectorRoundTrip(":nth-child(-5n-7)"); | |
| debug(''); | |
| testSelectorRoundTrip(":nth-child(odd of .foo, :nth-child(odd))"); | |
| testSelectorRoundTrip(":nth-child(even of .foo, :nth-child(odd))"); | |
| testSelectorRoundTrip(":nth-child(n of .foo, :nth-child(odd))"); | |
| testSelectorRoundTrip(":nth-child(-n of .foo, :nth-child(odd))"); | |
| testSelectorRoundTrip(":nth-child(5 of .foo, :nth-child(odd))"); | |
| testSelectorRoundTrip(":nth-child(-5 of .foo, :nth-child(odd))"); | |
| testSelectorRoundTrip(":nth-child(5n+7 of .foo, :nth-child(odd))"); | |
| testSelectorRoundTrip(":nth-child(-5n+7 of .foo, :nth-child(odd))"); | |
| testSelectorRoundTrip(":nth-child(5n-7 of .foo, :nth-child(odd))"); | |
| testSelectorRoundTrip(":nth-child(-5n-7 of .foo, :nth-child(odd))"); | |
| debug(''); | |
| testSelectorRoundTrip(":nth-last-child(odd of .foo, :nth-last-child(odd))"); | |
| testSelectorRoundTrip(":nth-last-child(even of .foo, :nth-last-child(odd))"); | |
| testSelectorRoundTrip(":nth-last-child(n of .foo, :nth-last-child(odd))"); | |
| testSelectorRoundTrip(":nth-last-child(-n of .foo, :nth-last-child(odd))"); | |
| testSelectorRoundTrip(":nth-last-child(5 of .foo, :nth-last-child(odd))"); | |
| testSelectorRoundTrip(":nth-last-child(-5 of .foo, :nth-last-child(odd))"); | |
| testSelectorRoundTrip(":nth-last-child(5n+7 of .foo, :nth-last-child(odd))"); | |
| testSelectorRoundTrip(":nth-last-child(-5n+7 of .foo, :nth-last-child(odd))"); | |
| testSelectorRoundTrip(":nth-last-child(5n-7 of .foo, :nth-last-child(odd))"); | |
| testSelectorRoundTrip(":nth-last-child(-5n-7 of .foo, :nth-last-child(odd))"); | |
| debug(''); | |
| testSelectorRoundTrip(':matches(single)'); | |
| testSelectorRoundTrip(':matches(a, b, p)'); | |
| testSelectorRoundTrip(':matches(#alice, #bob, #chris)'); | |
| testSelectorRoundTrip(':matches(.selector, #tama, #hanayo, #midoriko)'); | |
| testSelectorRoundTrip(':matches(.name, #ok, :visited)'); | |
| testSelectorRoundTrip(':matches(.name, #ok, :visited, :link)'); | |
| testSelectorRoundTrip(':matches(.name, #ok, :matches(:visited))'); | |
| testSelectorRoundTrip(':matches(.name, #ok, :not(:link))'); | |
| testSelectorRoundTrip(':matches(.name, #ok, :not(:link))'); | |
| testSelectorRoundTrip(':matches(.name, #ok, :-webkit-any(hello))'); | |
| testSelectorRoundTrip(':matches(.name, #ok, :-webkit-any(.selector, #tama, #hanayo, #midoriko))'); | |
| testSelectorRoundTrip(':matches([type="file"])'); | |
| testSelectorRoundTrip(':matches(:hover)'); | |
| testSelectorRoundTrip('input:matches([type="file"], :hover, :focus):enabled'); | |
| testSelectorRoundTrip(':matches(input[type="file"], a:hover, button:focus)'); | |
| testSelectorRoundTrip(':matches(.class1.class2.class3)'); | |
| testSelectorRoundTrip(':matches(.class1:hover)'); | |
| testSelectorRoundTrip(':matches(a.class1.class2.class3:hover)'); | |
| testSelectorRoundTrip(':matches(::first-letter, ::first-line)'); | |
| testSelectorRoundTrip(':matches(a > ::first-letter, b ~ ::first-line, c ::after, d + ::before)'); | |
| testSelectorRoundTrip(':matches(.ok a > ::first-letter, .ok b ~ ::first-line, .ok c ::after, .ok d + ::before)'); | |
| testSelectorRoundTrip(':matches(.ok a > .ok ::first-letter, .ok b ~ .ok ::first-line, .ok c .ok ::after, .ok d + .ok ::before)'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(single))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(a, b, p))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(#alice, #bob, #chris))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(.selector, #tama, #hanayo, #midoriko))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(.name, #ok, :visited))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(.name, #ok, :visited, :link))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(.name, #ok, :matches(:visited)))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(.name, #ok, :not(:link)))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(.name, #ok, :not(:link)))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(.name, #ok, :-webkit-any(hello)))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(.name, #ok, :-webkit-any(.selector, #tama, #hanayo, #midoriko)))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches([type="file"]))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(:hover))'); | |
| testSelectorRoundTrip(':-webkit-any(input:matches([type="file"], :hover, :focus):enabled)'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(input[type="file"], a:hover, button:focus))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(.class1.class2.class3))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(.class1:hover))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(a.class1.class2.class3:hover))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(::first-letter, ::first-line))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(a > ::first-letter, b ~ ::first-line, c ::after, d + ::before))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(.ok a > ::first-letter, .ok b ~ ::first-line, .ok c ::after, .ok d + ::before))'); | |
| testSelectorRoundTrip(':-webkit-any(:matches(.ok a > .ok ::first-letter, .ok b ~ .ok ::first-line, .ok c .ok ::after, .ok d + .ok ::before))'); | |
| debug(''); | |
| testSelectorRoundTrip(':not(div)'); | |
| testSelectorRoundTrip(':not(.div)'); | |
| testSelectorRoundTrip(':not(#div)'); | |
| testSelectorRoundTrip(':not([div])'); | |
| testSelectorRoundTrip(':not(:empty)'); | |
| testSelectorRoundTrip(':not(div.div#div[div]:empty)'); | |
| testSelectorRoundTrip(':not(div.div:empty[div]#div)'); | |
| testSelectorRoundTrip(':not(div.div, #div[div], :empty)'); | |
| testSelectorRoundTrip(':not(div, .div, #div, [div], :empty)'); | |
| testSelectorRoundTrip(':not(:not(div))'); | |
| testSelectorRoundTrip(':not(:not(div)):not(:not(foo)):not(:not(bar))'); | |
| testSelectorRoundTrip(':not(:not(div, :not(foo, bar))):not(:not(foo)):not(:not(bar, baz))'); | |
| testSelectorRoundTrip(':not(:matches(*))'); | |
| testSelectorRoundTrip(':not(:matches(foo, bar))'); | |
| testSelectorRoundTrip(':not(:matches(foo, bar), :matches(.foo, .bar), :matches(#foo, #bar), :matches([foo], [bar]))'); | |
| testSelectorRoundTrip(':not(:matches(foo, bar:not(:empty)), :matches(.foo, .bar:not(:not(.mosaic))), :matches(#foo, #bar), :matches([foo], [bar]))'); | |
| testSelectorRoundTrip(':nth-child(2n of :not(a.b, c#d.e))'); | |
| testSelectorRoundTrip(':not(:nth-child(2n of :not(a.b, c#d.e)))'); | |
| testSelectorRoundTrip(':not(a .b, #c > [d], e + f:empty, .g ~ #h:first-child)'); | |
| testSelectorRoundTrip('a:not(a .b, #c > [d], e + f:empty, .g ~ #h:first-child) b + c:not(a .b, #c > [d], e + f:empty, .g ~ #h:first-child) ~ d:not(a .b, #c > [d], e + f:empty, .g ~ #h:first-child) > d:not(a .b, #c > [d], e + f:empty, .g ~ #h:first-child)'); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule('::-webkit-file-upload-button { }')", "'*::-webkit-file-upload-button { }'"); | |
| shouldBe("parseThenSerializeRule('::-webkit-search-cancel-button { }')", "'*::-webkit-search-cancel-button { }'"); | |
| shouldBe("parseThenSerializeRule('::-webkit-search-decoration { }')", "'*::-webkit-search-decoration { }'"); | |
| shouldBe("parseThenSerializeRule('::-webkit-search-results-button { }')", "'*::-webkit-search-results-button { }'"); | |
| shouldBe("parseThenSerializeRule('::-webkit-search-results-decoration { }')", "'*::-webkit-search-results-decoration { }'"); | |
| shouldBe("parseThenSerializeRule('::-webkit-slider-thumb { }')", "'*::-webkit-slider-thumb { }'"); | |
| debug(''); | |
| testSelectorRoundTrip("a::-webkit-slider-thumb"); | |
| shouldBe("parseThenSerializeRule('a ::-webkit-slider-thumb { }')", "'a *::-webkit-slider-thumb { }'"); | |
| testSelectorRoundTrip("[a]::-webkit-slider-thumb"); | |
| shouldBe("parseThenSerializeRule('[a] ::-webkit-slider-thumb { }')", "'[a] *::-webkit-slider-thumb { }'"); | |
| testSelectorRoundTrip(".a::-webkit-slider-thumb"); | |
| shouldBe("parseThenSerializeRule('.a ::-webkit-slider-thumb { }')", "'.a *::-webkit-slider-thumb { }'"); | |
| testSelectorRoundTrip("#a::-webkit-slider-thumb"); | |
| shouldBe("parseThenSerializeRule('#a ::-webkit-slider-thumb { }')", "'#a *::-webkit-slider-thumb { }'"); | |
| shouldBe("parseThenSerializeRule('* ::-webkit-slider-thumb { }')", "'* *::-webkit-slider-thumb { }'"); | |
| debug(''); | |
| testSelectorRoundTrip("a[b]::-webkit-slider-thumb"); | |
| testSelectorRoundTrip("a.b::-webkit-slider-thumb"); | |
| testSelectorRoundTrip("a#b::-webkit-slider-thumb"); | |
| testSelectorRoundTrip("a[b].c#d::-webkit-slider-thumb"); | |
| debug(''); | |
| testSelectorRoundTrip("a[b]::placeholder"); | |
| testSelectorRoundTrip("a.b::placeholder"); | |
| testSelectorRoundTrip("a#b::placeholder"); | |
| testSelectorRoundTrip("a[b].c#d::placeholder"); | |
| testSelectorRoundTrip("a[b]::-webkit-input-placeholder"); | |
| testSelectorRoundTrip("a.b::-webkit-input-placeholder"); | |
| testSelectorRoundTrip("a#b::-webkit-input-placeholder"); | |
| testSelectorRoundTrip("a[b].c#d::-webkit-input-placeholder"); | |
| debug(''); | |
| testSelectorRoundTrip("a[b]:default"); | |
| testSelectorRoundTrip("a.b:default"); | |
| testSelectorRoundTrip("a#b:default"); | |
| testSelectorRoundTrip("a[b].c#d:default"); | |
| debug(''); | |
| testSelectorRoundTrip("a[b]:in-range"); | |
| testSelectorRoundTrip("a.b:in-range"); | |
| testSelectorRoundTrip("a#b:in-range"); | |
| testSelectorRoundTrip("a[b].c#d:in-range"); | |
| debug(''); | |
| testSelectorRoundTrip("a[b]:out-of-range"); | |
| testSelectorRoundTrip("a.b:out-of-range"); | |
| testSelectorRoundTrip("a#b:out-of-range"); | |
| testSelectorRoundTrip("a[b].c#d:out-of-range"); | |
| debug(''); | |
| testSelectorRoundTrip("a[b]:focus-within"); | |
| testSelectorRoundTrip("a.b:focus-within"); | |
| testSelectorRoundTrip("a#b:focus-within"); | |
| testSelectorRoundTrip("a[b].c#d:focus-within"); | |
| debug(''); | |
| testSelectorRoundTrip('input:not([type="file"]):focus'); | |
| testSelectorRoundTrip(':-webkit-any([type="file"])'); | |
| testSelectorRoundTrip(':-webkit-any(:hover)'); | |
| testSelectorRoundTrip('input:-webkit-any([type="file"], :hover, :focus):enabled'); | |
| testSelectorRoundTrip(':-webkit-any(input[type="file"], a:hover, button:focus)'); | |
| testSelectorRoundTrip(':-webkit-any(.class1.class2.class3)'); | |
| testSelectorRoundTrip(':-webkit-any(.class1:hover)'); | |
| testSelectorRoundTrip(':-webkit-any(a.class1.class2.class3:hover)'); | |
| testSelectorRoundTrip('a:any-link'); | |
| testSelectorRoundTrip('a :any-link'); | |
| testSelectorRoundTrip('div:any-link'); | |
| testSelectorRoundTrip('div :any-link'); | |
| testSelectorRoundTrip(':any-link > div'); | |
| testSelectorRoundTrip(':any-link + div'); | |
| testSelectorRoundTrip(':not(:any-link)'); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule('*:active { }')", "':active { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule('input[type=file]:focus { }')", "'input[type=\"file\"]:focus { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule('a>>b { }')", "'a >> b { }'"); | |
| shouldBe("parseThenSerializeRule('a >>b { }')", "'a >> b { }'"); | |
| shouldBe("parseThenSerializeRule('a >>b { }')", "'a >> b { }'"); | |
| shouldBe("parseThenSerializeRule('a>> b { }')", "'a >> b { }'"); | |
| shouldBe("parseThenSerializeRule('a>> b { }')", "'a >> b { }'"); | |
| shouldBe("parseThenSerializeRule('a >> b { }')", "'a >> b { }'"); | |
| shouldBe("parseThenSerializeRule('a+b { }')", "'a + b { }'"); | |
| shouldBe("parseThenSerializeRule('a~b { }')", "'a ~ b { }'"); | |
| shouldBe("parseThenSerializeRule('a>b { }')", "'a > b { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule(':after { }')", "'::after { }'"); | |
| shouldBe("parseThenSerializeRule(':before { }')", "'::before { }'"); | |
| shouldBe("parseThenSerializeRule(':first-letter { }')", "'::first-letter { }'"); | |
| shouldBe("parseThenSerializeRule(':first-line { }')", "'::first-line { }'"); | |
| shouldBe("parseThenSerializeRule(':-webkit-any( a.class1 , #id,[attr] ) { }')","':-webkit-any(a.class1, #id, [attr]) { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule(':matches(single ) { }')", "':matches(single) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches(a,b ,p) { }')", "':matches(a, b, p) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches(#alice, #bob,#chris) { }')", "':matches(#alice, #bob, #chris) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches( .selector,#tama, #hanayo,#midoriko) { }')", "':matches(.selector, #tama, #hanayo, #midoriko) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches( .name,#ok,:visited ) { }')", "':matches(.name, #ok, :visited) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches( .name,#ok, :visited, :link) { }')", "':matches(.name, #ok, :visited, :link) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches( .name,#ok, :matches(:visited )) { }')", "':matches(.name, #ok, :matches(:visited)) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches(.name, #ok,:not(:link)) { }')", "':matches(.name, #ok, :not(:link)) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches(.name,#ok,:not(:link)) { }')", "':matches(.name, #ok, :not(:link)) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches( .name,#ok,:-webkit-any( hello)) { }')", "':matches(.name, #ok, :-webkit-any(hello)) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches( .name,#ok, :-webkit-any(.selector, #tama, #hanayo, #midoriko)) { }')", "':matches(.name, #ok, :-webkit-any(.selector, #tama, #hanayo, #midoriko)) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches( [type=\"file\"]) { }')", "':matches([type=\"file\"]) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches( :hover ) { }')", "':matches(:hover) { }'"); | |
| shouldBe("parseThenSerializeRule('input:matches([type=\"file\"],:hover,:focus):enabled { }')", "'input:matches([type=\"file\"], :hover, :focus):enabled { }'"); | |
| shouldBe("parseThenSerializeRule(':matches(input[type=\"file\"], a:hover, button:focus) { }')", "':matches(input[type=\"file\"], a:hover, button:focus) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches( .class1.class2.class3 ) { }')", "':matches(.class1.class2.class3) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches(.class1:hover ) { }')", "':matches(.class1:hover) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches(a.class1.class2.class3:hover ) { }')", "':matches(a.class1.class2.class3:hover) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches(:first-letter,::first-line) { }')", "':matches(::first-letter, ::first-line) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches(a>:first-letter,b ~ ::first-line, c :after, d+ :before) { }')", "':matches(a > ::first-letter, b ~ ::first-line, c ::after, d + ::before) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches(.ok a > ::first-letter, .ok b~ ::first-line, .ok c :after, .ok d +:before) { }')", "':matches(.ok a > ::first-letter, .ok b ~ ::first-line, .ok c ::after, .ok d + ::before) { }'"); | |
| shouldBe("parseThenSerializeRule(':matches(.ok a> .ok ::first-letter, .ok b ~.ok :first-line, .ok c .ok ::after, .ok d + .ok ::before) { }')", "':matches(.ok a > .ok ::first-letter, .ok b ~ .ok ::first-line, .ok c .ok ::after, .ok d + .ok ::before) { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule(':not(single ) { }')", "':not(single) { }'"); | |
| shouldBe("parseThenSerializeRule(':not(a,b ,p) { }')", "':not(a, b, p) { }'"); | |
| shouldBe("parseThenSerializeRule(':not(#alice, #bob,#chris) { }')", "':not(#alice, #bob, #chris) { }'"); | |
| shouldBe("parseThenSerializeRule(':not( .selector,#tama, #hanayo,#midoriko) { }')", "':not(.selector, #tama, #hanayo, #midoriko) { }'"); | |
| shouldBe("parseThenSerializeRule(':not( .name,#ok,:visited ) { }')", "':not(.name, #ok, :visited) { }'"); | |
| shouldBe("parseThenSerializeRule(':not( .name,#ok, :visited, :link) { }')", "':not(.name, #ok, :visited, :link) { }'"); | |
| shouldBe("parseThenSerializeRule(':not( .name,#ok, :not(:visited )) { }')", "':not(.name, #ok, :not(:visited)) { }'"); | |
| shouldBe("parseThenSerializeRule(':not(.name, #ok,:not(:link)) { }')", "':not(.name, #ok, :not(:link)) { }'"); | |
| shouldBe("parseThenSerializeRule(':not(.name,#ok,:not(:link)) { }')", "':not(.name, #ok, :not(:link)) { }'"); | |
| shouldBe("parseThenSerializeRule(':not( .name,#ok,:-webkit-any( hello)) { }')", "':not(.name, #ok, :-webkit-any(hello)) { }'"); | |
| shouldBe("parseThenSerializeRule(':not( .name,#ok, :-webkit-any(.selector, #tama, #hanayo, #midoriko)) { }')", "':not(.name, #ok, :-webkit-any(.selector, #tama, #hanayo, #midoriko)) { }'"); | |
| shouldBe("parseThenSerializeRule(':not( [type=\"file\"]) { }')", "':not([type=\"file\"]) { }'"); | |
| shouldBe("parseThenSerializeRule(':not( :hover ) { }')", "':not(:hover) { }'"); | |
| shouldBe("parseThenSerializeRule('input:not([type=\"file\"],:hover,:focus):enabled { }')", "'input:not([type=\"file\"], :hover, :focus):enabled { }'"); | |
| shouldBe("parseThenSerializeRule(':not(input[type=\"file\"], a:hover, button:focus) { }')", "':not(input[type=\"file\"], a:hover, button:focus) { }'"); | |
| shouldBe("parseThenSerializeRule(':not( .class1.class2.class3 ) { }')", "':not(.class1.class2.class3) { }'"); | |
| shouldBe("parseThenSerializeRule(':not(.class1:hover ) { }')", "':not(.class1:hover) { }'"); | |
| shouldBe("parseThenSerializeRule(':not(a.class1.class2.class3:hover ) { }')", "':not(a.class1.class2.class3:hover) { }'"); | |
| shouldBe("parseThenSerializeRule(':not(:matches(single ),:matches(a,b ,p),:matches(#alice, #bob,#chris)) { }')", "':not(:matches(single), :matches(a, b, p), :matches(#alice, #bob, #chris)) { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule(':lang(a ) { }')", "':lang(\"a\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( a) { }')", "':lang(\"a\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(a, b, c) { }')", "':lang(\"a\", \"b\", \"c\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( a, b ,c) { }')", "':lang(\"a\", \"b\", \"c\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( a , b , c ) { }')", "':lang(\"a\", \"b\", \"c\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( a ,b,c) { }')", "':lang(\"a\", \"b\", \"c\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( a ,b ,c) { }')", "':lang(\"a\", \"b\", \"c\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( a ,b ,c ) { }')", "':lang(\"a\", \"b\", \"c\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(a,b ,c) { }')", "':lang(\"a\", \"b\", \"c\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(a,b, c) { }')", "':lang(\"a\", \"b\", \"c\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(a,b, c ) { }')", "':lang(\"a\", \"b\", \"c\") { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule(':lang(en, en, en) { }')", "':lang(\"en\", \"en\", \"en\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(en,en,en) { }')", "':lang(\"en\", \"en\", \"en\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(en,en, en) { }')", "':lang(\"en\", \"en\", \"en\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(en, en,en) { }')", "':lang(\"en\", \"en\", \"en\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(en, en,en ) { }')", "':lang(\"en\", \"en\", \"en\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( en, en,en ) { }')", "':lang(\"en\", \"en\", \"en\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(en, en, en) { }')", "':lang(\"en\", \"en\", \"en\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( en, en, en) { }')", "':lang(\"en\", \"en\", \"en\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( en, en, en ) { }')", "':lang(\"en\", \"en\", \"en\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( en , en , en ) { }')", "':lang(\"en\", \"en\", \"en\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( en,en,en ) { }')", "':lang(\"en\", \"en\", \"en\") { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-DE\", \"*-CH\", \"*-EN\") { }')", "':lang(\"*-DE\", \"*-CH\", \"*-EN\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-DE\",\"*-CH\",\"*-EN\") { }')", "':lang(\"*-DE\", \"*-CH\", \"*-EN\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( \"*-DE\" , \"*-CH\" , \"*-EN\" ) { }')", "':lang(\"*-DE\", \"*-CH\", \"*-EN\") { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule(':lang(\\\\*) { }')", "':lang(\"*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-\\\\*\") { }')", "':lang(\"*-*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-\\\\*-\\\\*\") { }')", "':lang(\"*-*-*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-\\\\*-\\\\*-\\\\*\") { }')", "':lang(\"*-*-*-*\") { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule(':lang(ab-\\\\*) { }')", "':lang(\"ab-*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-ab-\\\\*\") { }')", "':lang(\"*-ab-*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-ab-\\\\*-\") { }')", "':lang(\"*-ab-*-\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-foo-\\\\3A\") { }')", "':lang(\"*-foo-:\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-foo-\\\\3A\\\\`\\\\)\") { }')", "':lang(\"*-foo-:`)\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-foo-\\\\*\") { }')", "':lang(\"*-foo-*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-foo-\\\\0072 aisin\") { }')", "':lang(\"*-foo-raisin\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-foo-\\\\0062 \\\\0061 r\") { }')", "':lang(\"*-foo-bar\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-foo-col\\\\6Fr\") { }')", "':lang(\"*-foo-color\") { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule(':lang(\\\\* ) { }')", "':lang(\"*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en\" ) { }')", "':lang(\"*-en\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*\" ) { }')", "':lang(\"*-en-*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*-fr\" ) { }')", "':lang(\"*-en-*-fr\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*-fr\",br ) { }')", "':lang(\"*-en-*-fr\", \"br\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*-fr\", br ) { }')", "':lang(\"*-en-*-fr\", \"br\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*-fr\", br ) { }')", "':lang(\"*-en-*-fr\", \"br\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( \"*-en-\\\\*-fr\", br ) { }')", "':lang(\"*-en-*-fr\", \"br\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( \"*-en-\\\\*-fr\", br ) { }')", "':lang(\"*-en-*-fr\", \"br\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( \"*-en-\\\\*-fr\" , br ) { }')", "':lang(\"*-en-*-fr\", \"br\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*-fr\",\"*-br-zh\" ) { }')", "':lang(\"*-en-*-fr\", \"*-br-zh\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*-fr\", \"*-br-zh\" ) { }')", "':lang(\"*-en-*-fr\", \"*-br-zh\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*-fr\", \"*-br-zh\" ) { }')", "':lang(\"*-en-*-fr\", \"*-br-zh\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*-fr\", \"*-br-zh\" ) { }')", "':lang(\"*-en-*-fr\", \"*-br-zh\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*-fr\", \"*-br-zh\" ) { }')", "':lang(\"*-en-*-fr\", \"*-br-zh\") { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*-fr\",br-\\\\*-zh ) { }')", "':lang(\"*-en-*-fr\", \"br-*-zh\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*-fr\", br-\\\\*-zh ) { }')", "':lang(\"*-en-*-fr\", \"br-*-zh\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*-fr\", br-\\\\*-zh ) { }')", "':lang(\"*-en-*-fr\", \"br-*-zh\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\"*-en-\\\\*-fr\", br-\\\\*-zh ) { }')", "':lang(\"*-en-*-fr\", \"br-*-zh\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( \"*-en-\\\\*-fr\", br-\\\\*-zh ) { }')", "':lang(\"*-en-*-fr\", \"br-*-zh\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( \"*-en-\\\\*-fr\" , br-\\\\*-zh ) { }')", "':lang(\"*-en-*-fr\", \"br-*-zh\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( \"*-en-\\\\*-fr\" , br-\\\\*-zh ) { }')", "':lang(\"*-en-*-fr\", \"br-*-zh\") { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule(':lang(\\\\*) { }')", "':lang(\"*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\\\\* ) { }')", "':lang(\"*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(\\\\* ) { }')", "':lang(\"*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( \\\\* ) { }')", "':lang(\"*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( \\\\*) { }')", "':lang(\"*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( \\\\* ) { }')", "':lang(\"*\") { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule(':lang( \\\\*,id-\\\\*-sumatra ) { }')", "':lang(\"*\", \"id-*-sumatra\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( \\\\* ,id-\\\\*-sumatra) { }')", "':lang(\"*\", \"id-*-sumatra\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( \\\\* , id-\\\\*-sumatra ) { }')", "':lang(\"*\", \"id-*-sumatra\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( \\\\* , id-\\\\*-sumatra ) { }')", "':lang(\"*\", \"id-*-sumatra\") { }'"); | |
| debug(''); | |
| shouldBe("parseThenSerializeRule(':lang(en-\\\\*) { }')", "':lang(\"en-*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(en-\\\\*, fr-\\\\*) { }')", "':lang(\"en-*\", \"fr-*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang(en-\\\\*, fr-\\\\* ) { }')", "':lang(\"en-*\", \"fr-*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( en-\\\\* , fr-\\\\* ) { }')", "':lang(\"en-*\", \"fr-*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( en-\\\\* ,fr-\\\\* ) { }')", "':lang(\"en-*\", \"fr-*\") { }'"); | |
| shouldBe("parseThenSerializeRule(':lang( en-\\\\*,fr-\\\\* ) { }')", "':lang(\"en-*\", \"fr-*\") { }'"); | |
| debug(''); | |
| shouldThrow("parseThenSerializeRule(':lang() { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(12, b, c) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(a, 12, c) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(a, b, 12) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(a, 12, 12) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(12, b, 12) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(12, 12, 12) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(lang()) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(:lang()) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(:lang(id)) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(:lang(en, br)) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(<0_0>) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(99) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(88) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(00) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(}) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang({) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang({}) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(]) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang([) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang([]) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(@media screen {}) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*- ) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*--) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*---) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*----) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*)' { })"); | |
| shouldThrow("parseThenSerializeRule(':lang(**) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(-*-) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-*) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(de-*)')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-en-*) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-en-fr-*) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-en-*fr) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-*en-fr) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-1997) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-1997-*) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*a*) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*a) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(a*) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-a, a*) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-a, a**) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-a, *a) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-a, **a) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*- a*) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-a, br fr) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-a, br fr en *) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-1996, *-1997) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang(*-1996, *-1997 ) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang( *-1996 , *-1997 ) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang( *-1996 ,*-1997 ) { }')"); | |
| shouldThrow("parseThenSerializeRule(':lang( *-1996,*-1997 ) { }')"); | |
| debug(''); | |
| testSelectorRoundTrip(":role(a)"); | |
| testSelectorRoundTrip(":role(button)"); | |
| testSelectorRoundTrip(":role(LiNk)"); | |
| shouldBe("parseThenSerializeRule(':role( a ) { }')", "':role(a) { }'"); | |
| debug(''); | |
| shouldThrow("parseThenSerializeRule(':role() { }')"); | |
| shouldThrow("parseThenSerializeRule(':role(42) { }')"); | |
| shouldThrow("parseThenSerializeRule(':role(a, b) { }')"); | |
| shouldThrow("parseThenSerializeRule(':role(}) { }')"); | |
| shouldThrow("parseThenSerializeRule(':role()) { }')"); | |
| shouldThrow("parseThenSerializeRule(':role(role()) { }')"); | |
| shouldThrow("parseThenSerializeRule(':role(:role()) { }')"); | |
| shouldThrow("parseThenSerializeRule(':role(:role(a)) { }')"); | |
| debug(''); | |
| testSelectorRoundTrip(":dir(ltr)"); | |
| testSelectorRoundTrip(":dir(rtl)"); | |
| testSelectorRoundTrip(":dir(LTR)"); | |
| testSelectorRoundTrip(":dir(aBcD)"); | |
| shouldBe("parseThenSerializeRule(':dir( a ) { }')", "':dir(a) { }'"); | |
| debug(''); | |
| shouldThrow("parseThenSerializeRule(':dir() { }')"); | |
| shouldThrow("parseThenSerializeRule(':dir(42) { }')"); | |
| shouldThrow("parseThenSerializeRule(':dir(a, b) { }')"); | |
| shouldThrow("parseThenSerializeRule(':dir(}) { }')"); | |
| shouldThrow("parseThenSerializeRule(':dir()) { }')"); | |
| shouldThrow("parseThenSerializeRule(':dir(dir()) { }')"); | |
| shouldThrow("parseThenSerializeRule(':dir(:dir()) { }')"); | |
| shouldThrow("parseThenSerializeRule(':dir(:dir(ltr)) { }')"); | |
| </script> | |
| <script src="../../resources/js-test-post.js"></script> | |
| </body> | |
| </html> |