tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>