File: attr-cycle.html

package info (click to toggle)
thunderbird 1%3A140.3.1esr-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,608,628 kB
  • sloc: cpp: 7,671,698; javascript: 5,901,131; ansic: 3,898,955; python: 1,413,270; xml: 653,997; asm: 462,284; java: 180,948; sh: 113,489; makefile: 20,460; perl: 14,288; objc: 13,059; yacc: 4,583; pascal: 3,352; lex: 1,720; ruby: 1,222; exp: 762; sql: 715; awk: 580; php: 436; lisp: 430; sed: 70; csh: 10
file content (124 lines) | stat: -rw-r--r-- 5,500 bytes parent folder | download | duplicates (6)
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<!DOCTYPE html>
<title>CSS Values and Units Test: attr</title>
<meta name="assert" content="test attr values">
<link rel="help" href="https://drafts.csswg.org/css-values-5/#attr-notations">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<div id="attr"></div>
<div id="expected"></div>

<script>
  function test_attr_cycle(property, propertyValue, attrValue) {
    var elem = document.getElementById("attr");
    var expectedValue = window.getComputedStyle(elem).getPropertyValue(property);

    elem.setAttribute("data-foo", attrValue);
    elem.style.setProperty(property, propertyValue);

    test(() => {
      assert_equals(window.getComputedStyle(elem).getPropertyValue(property), expectedValue,
        "Setting property \'" + property + "\' to the value \'" + propertyValue +
        "\', where \'data-foo=" + attrValue + "\' should not change it's value.");
    });
    elem.style.setProperty(property, null);
  }

  function test_attr_no_cycle(property, propertyValue, attrValue, expectedValue) {
    var elem = document.getElementById("attr");
    elem.setAttribute("data-foo", attrValue);
    elem.style.setProperty(property, propertyValue);

    var expectedElem = document.getElementById("expected");
    expectedElem.style.setProperty(property, expectedValue);

    test(() => {
      assert_equals(window.getComputedStyle(elem).getPropertyValue(property),
        window.getComputedStyle(expectedElem).getPropertyValue(property),
        "Value \'" + propertyValue + "\', where \'data-foo=" + attrValue +
        "\' should be valid for the property \'" + property + "\'.");
    });

    elem.style.setProperty(property, null);
    expectedElem.style.setProperty(property, null);
  }

  /* Simple cycle */
  test_attr_cycle('--x', 'attr(data-foo type(<ident>))', 'attr(data-foo)');
  test_attr_cycle('--x', 'attr(data-foo type(<length>))', 'attr(data-foo type(<length>))');
  test_attr_cycle('--y', 'attr(data-foo type(*))', 'attr(data-foo type(*))');

  var attrElem = document.getElementById("attr");

  attrElem.setAttribute('data-bar', 'attr(data-foo)');
  test_attr_cycle('--y', 'attr(data-foo type(*))', 'attr(data-bar type(*))');
  attrElem.removeAttribute('data-bar');

  /* Cycle with attr() and var() */
  attrElem.style.setProperty('--x', 'attr(data-foo type(*))');
  test_attr_cycle('--y', 'attr(data-foo type(*))', 'var(--x)');
  attrElem.style.setProperty('--x', null);

  attrElem.setAttribute('data-bar', 'var(--y)');
  test_attr_cycle('--y', 'attr(data-foo type(<string>))', 'attr(data-bar type(<string>))');
  attrElem.removeAttribute('data-bar');

  attrElem.setAttribute('data-bar', 'var(--x)');
  test_attr_cycle('--x', 'attr(data-foo type(*), attr(data-bar))', 'attr(data-foo type(*))');
  attrElem.removeAttribute('data-bar');

  attrElem.style.setProperty('--x', 'attr(data-foo type(*))');
  attrElem.setAttribute('data-bar', 'var(--x)');
  test_attr_cycle('--y', 'attr(data-foo type(*))', 'attr(data-bar type(*), 11) var(--x)');
  attrElem.style.setProperty('--x', null);
  attrElem.removeAttribute('data-bar');

  /* Cycle with fallback */
  test_attr_cycle('--x', 'attr(data-foo type(<length>), 11px)', 'attr(data-foo type(<length>))');
  test_attr_cycle('--x', 'attr(data-foo type(<length>))', 'attr(data-foo type(<length>), 11px)');
  test_attr_cycle('--y', 'attr(data-foo type(*), 11px)', 'attr(data-foo type(*))');

  attrElem.setAttribute('data-bar', '11px');
  test_attr_cycle('--x', 'attr(data-foo type(<length>), attr(data-bar type(<length>)))', 'attr(data-foo type(*))');
  attrElem.removeAttribute('data-bar');
  attrElem.setAttribute('data-bar', 'abc');
  test_attr_cycle('--y', 'attr(data-foo type(*), attr(data-bar))', 'attr(data-foo type(*))');
  attrElem.removeAttribute('data-bar');

  /* Cycle with var() and fallback */
  attrElem.style.setProperty('--x', 'var(--y)');
  test_attr_cycle('--y', 'var(--x, 100)', 'var(--y)');
  attrElem.style.setProperty('--x', null);

  attrElem.setAttribute('data-bar', 'var(--y)');
  attrElem.style.setProperty('--x', 'attr(data-foo)');
  test_attr_cycle('--y', 'attr(data-foo type(*))', 'attr(data-bar type(*), 11) var(--x, 3)');
  attrElem.style.setProperty('--x', null);
  attrElem.removeAttribute('data-bar');

  /* Cycle in unused fallbacks */
  test_attr_no_cycle('--y', 'attr(data-foo type(*), var(--y))', '3', '3');
  test_attr_no_cycle('--y', 'attr(data-foo type(*), attr(data-foo))', '3', '3');

  attrElem.style.setProperty('--x', 'var(--y)');
  test_attr_no_cycle('--y', 'attr(data-foo type(*), var(--x))', '3', '3');
  attrElem.style.setProperty('--x', null);

  attrElem.setAttribute('data-bar', 'attr(data-foo type(*))');
  test_attr_no_cycle('--y', 'attr(data-foo type(*), attr(data-bar type(*)))', '3', '3');
  attrElem.removeAttribute('data-bar');

  /* Cycle in fallback */
  test_attr_cycle('--y', 'attr(data-unknown type(*), var(--y))', '3');

  /* No cycle, use raw CSS string without substitution */
  attrElem.setAttribute('data-bar', 'var(--y)');
  test_attr_no_cycle('--y', 'attr(data-foo type(<string>))', 'attr(data-bar type(<string>))', '');
  attrElem.removeAttribute('data-bar');

  attrElem.style.setProperty('--x', 'attr(data-foo)');
  attrElem.setAttribute('data-bar', 'var(--x)');
  test_attr_no_cycle('--y', 'attr(data-foo type(*))', 'attr(data-bar, 11) var(--x, 3)', '"var(--x)" "attr(data-bar, 11) var(--x, 3)"');
  attrElem.removeAttribute('data-bar');
  attrElem.style.setProperty('--x', null);
</script>