File: supports-import-parsing.html

package info (click to toggle)
thunderbird 1%3A143.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 4,703,968 kB
  • sloc: cpp: 7,770,492; javascript: 5,943,842; ansic: 3,918,754; python: 1,418,263; xml: 653,354; asm: 474,045; java: 183,079; sh: 111,238; makefile: 20,410; perl: 14,359; objc: 13,059; yacc: 4,583; pascal: 3,405; lex: 1,720; ruby: 999; exp: 762; sql: 715; awk: 580; php: 436; lisp: 430; sed: 69; csh: 10
file content (92 lines) | stat: -rw-r--r-- 4,380 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<!doctype html>
<meta charset="utf-8">
<title>@import rule with supports parsing / serialization</title>
<link rel="author" href="mailto:oj@oojmed.com">
<link rel="help" href="https://drafts.csswg.org/css-cascade-4/#at-import">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
  function setupSheet(rule) {
    const style = document.createElement("style");
    document.head.append(style);
    const {sheet} = style;
    const {cssRules} = sheet;

    assert_equals(cssRules.length, 0, "Sheet should have no rules");
    sheet.insertRule(rule);
    assert_equals(cssRules.length, 1, "Sheet should have 1 rule");

    return {sheet, cssRules};
  }

  function test_valid_supports_import(rule, serialized) {
    if (serialized === undefined)
        serialized = rule;

    test(function() {
      const {sheet, cssRules} = setupSheet(rule);

      const serialization = cssRules[0].cssText;
      assert_equals(serialization, serialized, 'serialization should be canonical');

      sheet.deleteRule(0);
      assert_equals(cssRules.length, 0, 'Sheet should have no rule');
      sheet.insertRule(serialization);
      assert_equals(cssRules.length, 1, 'Sheet should have 1 rule');

      assert_equals(cssRules[0].cssText, serialization, 'serialization should round-trip');
    }, rule + ' should be a valid supports() import rule');
  }

  function test_unsupported_supports_import(rule) {
    test(function() {
      const {sheet, cssRules} = setupSheet(rule);

      sheet.deleteRule(0);
      assert_equals(cssRules.length, 0, 'Sheet should have no rule');
    }, rule + ' should still be a valid import rule with an invalid supports() declaration');
  }

  function test_invalid_supports_import(rule) {
    test(function() {
      const style = document.createElement("style");
      document.head.append(style);
      const {sheet} = style;
      const {cssRules} = sheet;

      assert_equals(cssRules.length, 0, "Sheet should have no rules");
    }, rule + ' should be an invalid import rule due to an invalid supports() declaration');
  }

  test_invalid_supports_import('@import url("nonexist.css") supports();');
  test_invalid_supports_import('@import url("nonexist.css") supports(foo: bar);');
  test_valid_supports_import('@import url("nonexist.css") supports(display:block);');
  test_valid_supports_import('@import url("nonexist.css") supports((display:flex));');
  test_valid_supports_import('@import url("nonexist.css") supports(not (display: flex));');
  test_valid_supports_import('@import url("nonexist.css") supports((display: flex) and (display: block));');
  test_valid_supports_import('@import url("nonexist.css") supports((display: flex) or (display: block));');
  test_valid_supports_import('@import url("nonexist.css") supports((display: flex) or (foo: bar));');
  test_valid_supports_import('@import url("nonexist.css") supports(display: block !important);');

  test_invalid_supports_import('@import url("nonexist.css") layer supports();');
  test_invalid_supports_import('@import url("nonexist.css") layer supports(foo: bar);');
  test_valid_supports_import('@import url("nonexist.css") layer(A) supports((display: flex) or (foo: bar));');
  test_valid_supports_import('@import url("nonexist.css") layer(A.B) supports((display: flex) and (foo: bar));');

  test_valid_supports_import('@import url("nonexist.css") supports(selector(a));');
  test_valid_supports_import('@import url("nonexist.css") supports(selector(p a));');
  test_valid_supports_import('@import url("nonexist.css") supports(selector(p > a));');
  test_valid_supports_import('@import url("nonexist.css") supports(selector(p + a));');

  test_valid_supports_import('@import url("nonexist.css") supports(font-tech(color-colrv1));');
  test_valid_supports_import('@import url("nonexist.css") supports(font-format(opentype));');

  test_valid_supports_import('@import url(nonexist.css) supports(display:block);',
                             '@import url("nonexist.css") supports(display:block);');

  test_valid_supports_import('@import "nonexist.css" supports(display:block);',
                             '@import url("nonexist.css") supports(display:block);');

  // “supports” gets parsed as an (unsupported) media query.
  test_unsupported_supports_import('@import url("nonexist.css") supports;');
</script>