| <!doctype html> |
| <title>Serialization of consecutive tokens.</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| |
| <meta name="author" title="Tab Atkins-Bittner"> |
| <link rel=help href="https://drafts.csswg.org/css-syntax/#serialization"> |
| <body> |
| <!-- |
| The serialization chapter provides a table listing all the combinations of consecutive tokens that will, |
| if naively serialized next to each other, |
| produce a different set of tokens when re-parsed. |
| The spec requires that a comment must be inserted between such tokens in the serialization, |
| to ensure that they round-trip correctly. |
| --> |
| |
| <script> |
| |
| function testTokenPairs(t1, t2) { |
| const b = document.body; |
| test(()=>{ |
| b.style.setProperty("--t1", t1); |
| b.style.setProperty("--t2", t2); |
| b.style.setProperty("--result", "var(--t1)var(--t2)"); |
| const result = getComputedStyle(b).getPropertyValue("--result"); |
| assert_equals(result.slice(0, t1.length), t1, `Result must start with ${t1}`); |
| assert_equals(result.slice(-t2.length), t2, `Result must end with ${t2}`); |
| assert_not_equals(result, t1+t2, `Result must have a comment between ${t1} and ${t2}`); |
| }, `Serialization of consecutive ${t1} and ${t2} tokens.`); |
| } |
| testTokenPairs("foo", "bar"); |
| testTokenPairs("foo", "bar()"); |
| testTokenPairs("foo", "url(bar)"); |
| testTokenPairs("foo", "-"); |
| testTokenPairs("foo", "123"); |
| testTokenPairs("foo", "123%"); |
| testTokenPairs("foo", "123em"); |
| testTokenPairs("foo", "-->"); |
| testTokenPairs("foo", "()"); |
| |
| testTokenPairs("@foo", "bar"); |
| testTokenPairs("@foo", "bar()"); |
| testTokenPairs("@foo", "url(bar)"); |
| testTokenPairs("@foo", "-"); |
| testTokenPairs("@foo", "123"); |
| testTokenPairs("@foo", "123%"); |
| testTokenPairs("@foo", "123em"); |
| testTokenPairs("@foo", "-->"); |
| |
| testTokenPairs("#foo", "bar"); |
| testTokenPairs("#foo", "bar()"); |
| testTokenPairs("#foo", "url(bar)"); |
| testTokenPairs("#foo", "-"); |
| testTokenPairs("#foo", "123"); |
| testTokenPairs("#foo", "123%"); |
| testTokenPairs("#foo", "123em"); |
| testTokenPairs("#foo", "-->"); |
| |
| testTokenPairs("123foo", "bar"); |
| testTokenPairs("123foo", "bar()"); |
| testTokenPairs("123foo", "url(bar)"); |
| testTokenPairs("123foo", "-"); |
| testTokenPairs("123foo", "123"); |
| testTokenPairs("123foo", "123%"); |
| testTokenPairs("123foo", "123em"); |
| testTokenPairs("123foo", "-->"); |
| |
| testTokenPairs("#", "bar"); |
| testTokenPairs("#", "bar()"); |
| testTokenPairs("#", "url(bar)"); |
| testTokenPairs("#", "-"); |
| testTokenPairs("#", "123"); |
| testTokenPairs("#", "123%"); |
| testTokenPairs("#", "123em"); |
| |
| testTokenPairs("-", "bar"); |
| testTokenPairs("-", "bar()"); |
| testTokenPairs("-", "url(bar)"); |
| testTokenPairs("-", "-"); |
| testTokenPairs("-", "123"); |
| testTokenPairs("-", "123%"); |
| testTokenPairs("-", "123em"); |
| |
| testTokenPairs("123", "bar"); |
| testTokenPairs("123", "bar()"); |
| testTokenPairs("123", "url(bar)"); |
| testTokenPairs("123", "123"); |
| testTokenPairs("123", "123%"); |
| testTokenPairs("123", "123em"); |
| testTokenPairs("123", "%"); |
| |
| testTokenPairs("@", "bar"); |
| testTokenPairs("@", "bar()"); |
| testTokenPairs("@", "url(bar)"); |
| testTokenPairs("@", "-"); |
| |
| testTokenPairs(".", "123"); |
| testTokenPairs(".", "123%"); |
| testTokenPairs(".", "123em"); |
| |
| testTokenPairs("+", "123"); |
| testTokenPairs("+", "123%"); |
| testTokenPairs("+", "123em"); |
| |
| testTokenPairs("/", "*"); |
| |
| </script> |