mirror of
https://github.com/servo/servo.git
synced 2025-06-25 17:44:33 +01:00
173 lines
5 KiB
HTML
173 lines
5 KiB
HTML
<!doctype html>
|
|
<title>Urange Parsing</title>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<style>
|
|
|
|
@font-face {
|
|
font-family: foo;
|
|
src: url(http://example.com);
|
|
}
|
|
|
|
.error {}
|
|
|
|
</style>
|
|
|
|
<meta name=author title="Tab Atkins-Bittner">
|
|
<link rel=help href="https://drafts.csswg.org/css-syntax/#urange-syntax">
|
|
|
|
<script>
|
|
|
|
function testUrange(input, expected) {
|
|
test(()=>{
|
|
const rule = document.styleSheets[0].cssRules[0];
|
|
rule.style.setProperty("unicode-range", "U+1357");
|
|
rule.style.setProperty("unicode-range", input);
|
|
assert_equals(rule.style.getPropertyValue("unicode-range").toUpperCase(), expected.toUpperCase());
|
|
}, `"${input}" => "${expected}"`)
|
|
}
|
|
function testInvalidUrange(input) {
|
|
test(()=>{
|
|
const rule = document.styleSheets[0].cssRules[0];
|
|
rule.style.setProperty("unicode-range", "U+1357");
|
|
rule.style.setProperty("unicode-range", input);
|
|
assert_equals(rule.style.getPropertyValue("unicode-range").toUpperCase(), "U+1357");
|
|
}, `"${input}" is invalid`);
|
|
}
|
|
|
|
/* First exercise all the clauses individually */
|
|
//<urange> =
|
|
// u '+' <ident-token> '?'* |
|
|
/* comments can go between tokens */
|
|
testUrange("u/**/+/**/a/**/?", "U+A0-AF");
|
|
/* capitalization doesn't matter */
|
|
testUrange("u+abc", "U+ABC");
|
|
testUrange("U+abc", "U+ABC");
|
|
testUrange("u+ABC", "U+ABC");
|
|
testUrange("U+ABC", "U+ABC");
|
|
testUrange("u+AbC", "U+ABC");
|
|
/* only hex */
|
|
testInvalidUrange("u+efg");
|
|
/* no spacing */
|
|
testInvalidUrange("u+ abc");
|
|
testInvalidUrange("u +abc");
|
|
testInvalidUrange("u + abc");
|
|
testInvalidUrange("U + a b c");
|
|
/* 1-6 characters */
|
|
testUrange("u+a", "U+A");
|
|
testUrange("u+aa", "U+AA");
|
|
testUrange("u+aaa", "U+AAA");
|
|
testUrange("u+aaaa", "U+AAAA");
|
|
testUrange("u+aaaaa", "U+AAAAA");
|
|
testInvalidUrange("u+aaaaaaa");
|
|
/* Or ? at the end, still up to 6 */
|
|
testUrange("u+a?", "U+A0-AF");
|
|
testUrange("u+a??", "U+A00-AFF");
|
|
testUrange("u+a???", "U+A000-AFFF");
|
|
testUrange("u+a????", "U+A0000-AFFFF");
|
|
testInvalidUrange("u+aaaaaa?");
|
|
testInvalidUrange("u+aaaaa??");
|
|
testInvalidUrange("u+aaaa???");
|
|
testInvalidUrange("u+aaa????");
|
|
testInvalidUrange("u+aa?????");
|
|
testInvalidUrange("u+a??????");
|
|
/* no characters after ? */
|
|
testInvalidUrange("u+a?a");
|
|
// Too large!
|
|
testInvalidUrange("u+aaaaaa");
|
|
testInvalidUrange("u+a?????");
|
|
|
|
// u <dimension-token> '?'* |
|
|
testUrange("u/**/+0a/**/?", "U+A0-AF");
|
|
testUrange("u+0a", "U+A");
|
|
testUrange("U+0a0", "U+A0");
|
|
testUrange("u+0aaaaa", "U+AAAAA");
|
|
testInvalidUrange("u+0aaaaaa");
|
|
testUrange("u+0a0000", "U+A0000");
|
|
testInvalidUrange("u+0a00000");
|
|
testInvalidUrange("u+0aaaaa0");
|
|
testUrange("u+00000a", "U+A");
|
|
testInvalidUrange("u+00000aa");
|
|
testInvalidUrange("u+00000a0")
|
|
testInvalidUrange("u+000000a");
|
|
testUrange("u+0a????", "U+A0000-AFFFF");
|
|
testInvalidUrange("u+0a?????");
|
|
testInvalidUrange("u+00a????");
|
|
// Too large!
|
|
testInvalidUrange("u+22222a");
|
|
// Scinot!
|
|
testUrange("u+1e9a", "U+1E9A");
|
|
|
|
// u <number-token> '?'* |
|
|
testUrange("u/**/+0/**/?", "U+0-F");
|
|
testInvalidUrange("u/**/0");
|
|
testUrange("u+0", "U+0");
|
|
testUrange("u+00", "U+0");
|
|
testUrange("u+000", "U+0");
|
|
testUrange("u+0000", "U+0");
|
|
testUrange("u+00000", "U+0");
|
|
testUrange("u+000000", "U+0");
|
|
testInvalidUrange("u+0000000");
|
|
testUrange("u+00000?", "U+0-F");
|
|
testUrange("u+0?????", "U+0-FFFFF");
|
|
testInvalidUrange("u+0?a");
|
|
testInvalidUrange("u+000000?");
|
|
testInvalidUrange("u+00000??");
|
|
testInvalidUrange("u+0??????");
|
|
// Scinot!
|
|
testUrange("u+1e3", "U+1E3");
|
|
testUrange("u+1e-20", "U+1E-20");
|
|
// Too large!
|
|
testInvalidUrange("u+222222");
|
|
testInvalidUrange("u+2?????");
|
|
|
|
// u <number-token> <dimension-token> |
|
|
testUrange("u/**/+0/**/-0a", "U+0-A");
|
|
testUrange("u+0-0a", "U+0-A");
|
|
testUrange("u+000000-0aaaaa", "U+0-AAAAA");
|
|
testInvalidUrange("u+0000000-0a");
|
|
testInvalidUrange("u+0-0aaaaaa");
|
|
testInvalidUrange("u+0-000000a");
|
|
testInvalidUrange("u+0+0a");
|
|
testInvalidUrange("u+0?-0a");
|
|
testInvalidUrange("u+0-0a?");
|
|
// Too large!
|
|
testInvalidUrange("u+222222-22222a");
|
|
|
|
// u <number-token> <number-token> |
|
|
testUrange("u/**/+0/**/-1", "U+0-1");
|
|
testUrange("u+0-1", "U+0-1");
|
|
testInvalidUrange("u-0-1");
|
|
testInvalidUrange("u-0+1");
|
|
testInvalidUrange("u+0+1");
|
|
testUrange("u+000000-000001", "U+0-1");
|
|
testInvalidUrange("u+0000000-1");
|
|
testInvalidUrange("u+0-0000001");
|
|
// Too large!
|
|
testInvalidUrange("u+0-222222");
|
|
|
|
// u '+' '?'+
|
|
testUrange("u/**/+/**/?", "U+0-F");
|
|
testUrange("u+?", "U+0-F");
|
|
testUrange("u+?????", "u+0-FFFFF");
|
|
testInvalidUrange("u+???????");
|
|
testInvalidUrange("u+?a");
|
|
// U+FFFFFF is too large!
|
|
testInvalidUrange("u+??????");
|
|
|
|
|
|
/* Finally, verify that u+a is properly parsed
|
|
as IDENT(u) DELIM(+) IDENT(a) in other contexts */
|
|
|
|
test(()=>{
|
|
const rule = document.styleSheets[0].cssRules[1];
|
|
// Establish that it works with whitespace...
|
|
rule.selectorText = "u + a";
|
|
assert_equals(rule.selectorText, "u + a");
|
|
// And then again without...
|
|
rule.selectorText = ".error";
|
|
rule.selectorText = "u+a";
|
|
assert_equals(rule.selectorText, "u + a");
|
|
}, "u+a is a valid selector");
|
|
|
|
</script>
|