urange-parsing.html (5181B)
1 <!doctype html> 2 <title>Urange Parsing</title> 3 <script src="/resources/testharness.js"></script> 4 <script src="/resources/testharnessreport.js"></script> 5 <style> 6 7 @font-face { 8 font-family: foo; 9 src: url(http://example.com); 10 } 11 12 .error {} 13 14 </style> 15 16 <meta name=author title="Tab Atkins-Bittner"> 17 <link rel=help href="https://drafts.csswg.org/css-syntax/#urange-syntax"> 18 19 <script> 20 21 function testUrange(input, expected) { 22 test(()=>{ 23 const rule = document.styleSheets[0].cssRules[0]; 24 rule.style.setProperty("unicode-range", "U+1357"); 25 rule.style.setProperty("unicode-range", input); 26 assert_equals(rule.style.getPropertyValue("unicode-range").toUpperCase(), expected.toUpperCase()); 27 }, `"${input}" => "${expected}"`) 28 } 29 function testInvalidUrange(input) { 30 test(()=>{ 31 const rule = document.styleSheets[0].cssRules[0]; 32 rule.style.setProperty("unicode-range", "U+1357"); 33 rule.style.setProperty("unicode-range", input); 34 assert_equals(rule.style.getPropertyValue("unicode-range").toUpperCase(), "U+1357"); 35 }, `"${input}" is invalid`); 36 } 37 38 /* First exercise all the clauses individually */ 39 //<urange> = 40 // u '+' <ident-token> '?'* | 41 /* comments can go between tokens */ 42 testUrange("u/**/+/**/a/**/?", "U+A0-AF"); 43 /* capitalization doesn't matter */ 44 testUrange("u+abc", "U+ABC"); 45 testUrange("U+abc", "U+ABC"); 46 testUrange("u+ABC", "U+ABC"); 47 testUrange("U+ABC", "U+ABC"); 48 testUrange("u+AbC", "U+ABC"); 49 /* only hex */ 50 testInvalidUrange("u+efg"); 51 /* no spacing */ 52 testInvalidUrange("u+ abc"); 53 testInvalidUrange("u +abc"); 54 testInvalidUrange("u + abc"); 55 testInvalidUrange("U + a b c"); 56 /* 1-6 characters */ 57 testUrange("u+a", "U+A"); 58 testUrange("u+aa", "U+AA"); 59 testUrange("u+aaa", "U+AAA"); 60 testUrange("u+aaaa", "U+AAAA"); 61 testUrange("u+aaaaa", "U+AAAAA"); 62 testInvalidUrange("u+aaaaaaa"); 63 /* Or ? at the end, still up to 6 */ 64 testUrange("u+a?", "U+A0-AF"); 65 testUrange("u+a??", "U+A00-AFF"); 66 testUrange("u+a???", "U+A000-AFFF"); 67 testUrange("u+a????", "U+A0000-AFFFF"); 68 testInvalidUrange("u+aaaaaa?"); 69 testInvalidUrange("u+aaaaa??"); 70 testInvalidUrange("u+aaaa???"); 71 testInvalidUrange("u+aaa????"); 72 testInvalidUrange("u+aa?????"); 73 testInvalidUrange("u+a??????"); 74 /* no characters after ? */ 75 testInvalidUrange("u+a?a"); 76 // Too large! 77 testInvalidUrange("u+aaaaaa"); 78 testInvalidUrange("u+a?????"); 79 80 // u <dimension-token> '?'* | 81 testUrange("u/**/+0a/**/?", "U+A0-AF"); 82 testUrange("u+0a", "U+A"); 83 testUrange("U+0a0", "U+A0"); 84 testUrange("u+0aaaaa", "U+AAAAA"); 85 testInvalidUrange("u+0aaaaaa"); 86 testUrange("u+0a0000", "U+A0000"); 87 testInvalidUrange("u+0a00000"); 88 testInvalidUrange("u+0aaaaa0"); 89 testUrange("u+00000a", "U+A"); 90 testInvalidUrange("u+00000aa"); 91 testInvalidUrange("u+00000a0") 92 testInvalidUrange("u+000000a"); 93 testUrange("u+0a????", "U+A0000-AFFFF"); 94 testInvalidUrange("u+0a?????"); 95 testInvalidUrange("u+00a????"); 96 // Too large! 97 testInvalidUrange("u+22222a"); 98 // Scinot! 99 testUrange("u+1e9a", "U+1E9A"); 100 101 // u <number-token> '?'* | 102 testUrange("u/**/+0/**/?", "U+0-F"); 103 testInvalidUrange("u/**/0"); 104 testUrange("u+0", "U+0"); 105 testUrange("u+00", "U+0"); 106 testUrange("u+000", "U+0"); 107 testUrange("u+0000", "U+0"); 108 testUrange("u+00000", "U+0"); 109 testUrange("u+000000", "U+0"); 110 testInvalidUrange("u+0000000"); 111 testUrange("u+00000?", "U+0-F"); 112 testUrange("u+0?????", "U+0-FFFFF"); 113 testInvalidUrange("u+0?a"); 114 testInvalidUrange("u+000000?"); 115 testInvalidUrange("u+00000??"); 116 testInvalidUrange("u+0??????"); 117 // Scinot! 118 testUrange("u+1e3", "U+1E3"); 119 testUrange("u+1e-20", "U+1E-20"); 120 // Too large! 121 testInvalidUrange("u+222222"); 122 testInvalidUrange("u+2?????"); 123 124 // u <number-token> <dimension-token> | 125 testUrange("u/**/+0/**/-0a", "U+0-A"); 126 testUrange("u+0-0a", "U+0-A"); 127 testUrange("u+000000-0aaaaa", "U+0-AAAAA"); 128 testInvalidUrange("u+0000000-0a"); 129 testInvalidUrange("u+0-0aaaaaa"); 130 testInvalidUrange("u+0-000000a"); 131 testInvalidUrange("u+0+0a"); 132 testInvalidUrange("u+0?-0a"); 133 testInvalidUrange("u+0-0a?"); 134 // Too large! 135 testInvalidUrange("u+222222-22222a"); 136 137 // u <number-token> <number-token> | 138 testUrange("u/**/+0/**/-1", "U+0-1"); 139 testUrange("u+0-1", "U+0-1"); 140 testInvalidUrange("u-0-1"); 141 testInvalidUrange("u-0+1"); 142 testInvalidUrange("u+0+1"); 143 testUrange("u+000000-000001", "U+0-1"); 144 testInvalidUrange("u+0000000-1"); 145 testInvalidUrange("u+0-0000001"); 146 testUrange("u+0-10ffff", "U+0-10FFFF"); 147 // Too large! 148 testInvalidUrange("u+0-110000"); 149 testInvalidUrange("u+0-222222"); 150 151 // u '+' '?'+ 152 testUrange("u/**/+/**/?", "U+0-F"); 153 testUrange("u+?", "U+0-F"); 154 testUrange("u+?????", "u+0-FFFFF"); 155 testInvalidUrange("u+???????"); 156 testInvalidUrange("u+?a"); 157 // U+FFFFFF is too large! 158 testInvalidUrange("u+??????"); 159 160 testInvalidUrange("()U+123"); 161 162 /* Finally, verify that u+a is properly parsed 163 as IDENT(u) DELIM(+) IDENT(a) in other contexts */ 164 165 test(()=>{ 166 const rule = document.styleSheets[0].cssRules[1]; 167 // Establish that it works with whitespace... 168 rule.selectorText = "u + a"; 169 assert_equals(rule.selectorText, "u + a"); 170 // And then again without... 171 rule.selectorText = ".error"; 172 rule.selectorText = "u+a"; 173 assert_equals(rule.selectorText, "u + a"); 174 }, "u+a is a valid selector"); 175 176 </script>