22
22
< div id ="expected "> </ div >
23
23
24
24
< script >
25
- const dimensionTypeToUnits = {
26
- "length" : [ "em" , "ex" , "cap" , "ch" , "ic" , "rem" , "lh" , "rlh" , "vw" , "vh " , "vi" , "vb" , "vmin" , "vmax" ] ,
27
- "angle" : [ "deg" , "grad" , "rad" , "turn" ] ,
28
- "time" : [ "ms" , "ms" ] ,
29
- "frequency" : [ "Hz" , "kHz" ] ,
30
- "flex" : [ "fr" ]
31
- } ;
32
- const dimensionTypeToProperty = {
33
- "length" : [ "width" ] ,
34
- "angle" : [ "font-style" ] ,
35
- "time" : [ "transition-duration" ] ,
36
- "flex" : [ "grid-template-columns" ]
37
- }
38
-
39
25
function test_valid_attr ( property , attrString , attrValue , expectedValue ) {
40
26
var elem = document . getElementById ( "attr" ) ;
41
27
elem . setAttribute ( "data-foo" , attrValue ) ;
70
56
elem . style . setProperty ( property , null ) ;
71
57
}
72
58
73
- function test_dimension_types_and_units ( ) {
74
- for ( const [ type , units ] of Object . entries ( dimensionTypeToUnits ) ) {
75
- const property = dimensionTypeToProperty [ type ] ;
76
- const val = "3" ;
77
- units . forEach ( unit => {
78
- const expectedValue = val + unit ;
79
-
80
- const dimensionTypeAttrString = 'attr(data-foo ' + type + ')' ;
81
- test_valid_attr ( property , dimensionTypeAttrString , expectedValue , expectedValue ) ;
82
-
83
- const dimensionUnitAttrString = 'attr(data-foo ' + unit + ')' ;
84
- test_valid_attr ( property , dimensionUnitAttrString , val , expectedValue ) ;
85
- } ) ;
86
- }
87
- }
88
-
89
59
test_valid_attr ( 'content' , 'attr(data-foo)' , 'abc' , '"abc"' ) ;
90
60
test_valid_attr ( 'content' , 'attr(data-foo,)' , 'abc' , '"abc"' ) ;
91
61
92
- test_valid_attr ( 'content' , 'attr(data-foo string)' , 'abc' , '"abc"' ) ;
93
- test_valid_attr ( 'content' , 'attr(data-foo string,)' , 'abc' , '"abc"' ) ;
94
- test_valid_attr ( 'content' , 'attr(data-foo string)' , 'attr(data-foo)' , '"attr(data-foo)"' ) ;
95
-
96
- test_valid_attr ( 'animation-name' , 'attr(data-foo ident)' , 'anim' , 'anim' ) ;
97
- test_valid_attr ( 'animation-name' , 'attr(data-foo ident, anim-fallback)' , '"anim"' , 'anim-fallback' ) ;
98
- test_valid_attr ( 'animation-name' , 'attr(data-foo ident, anim-fallback)' , 'initial' , 'anim-fallback' ) ;
99
-
100
- test_valid_attr ( 'background-color' , 'attr(data-foo color)' , 'red' , 'red' ) ;
101
- test_valid_attr ( 'background-color' , 'attr(data-foo color)' , '#ff0099aa' , '#ff0099aa' ) ;
102
- test_valid_attr ( 'background-color' , 'attr(data-foo color, red)' , '10' , 'red' ) ;
103
- test_valid_attr ( 'background-color' , 'attr(data-foo color, green)' , '1000px' , 'green' ) ;
104
- test_valid_attr ( 'background-color' , 'attr(data-foo color, green)' , 'rgb(255, 0, 0)' , 'green' ) ;
105
-
106
- test_valid_attr ( 'font-weight' , 'attr(data-foo number)' , '10' , '10' ) ;
107
- test_valid_attr ( 'font-weight' , 'attr(data-foo number, 30)' , '10px' , '30' ) ;
108
- test_valid_attr ( 'font-weight' , 'attr(data-foo number, calc(10 + 20))' , '10px' , '30' ) ;
109
-
110
- test_valid_attr ( 'font-size' , 'attr(data-foo percentage)' , '10%' , '10%' ) ;
111
- test_valid_attr ( 'font-size' , 'attr(data-foo percentage, 10px)' , 'abc' , '10px' ) ;
112
- test_valid_attr ( '--x' , 'attr(data-foo percentage, abc)' , '10' , 'abc' ) ;
113
-
114
- test_valid_attr ( 'width' , 'attr(data-foo length)' , '10px' , '10px' ) ;
115
- test_valid_attr ( 'width' , 'attr(data-foo length, red)' , '10px' , '10px' ) ;
116
- test_valid_attr ( 'width' , 'attr(data-foo length, 42px)' , 'calc(1px + 3px)' , '42px' ) ;
117
-
118
- test_valid_attr ( 'font-style' , 'attr(data-foo angle)' , '10deg' , '10deg' ) ;
119
- test_valid_attr ( 'font-style' , 'attr(data-foo angle, 10deg)' , '30' , '10deg' ) ;
120
- test_valid_attr ( 'font-style' , 'attr(data-foo angle, italic)' , '30' , 'italic' ) ;
121
-
122
- test_valid_attr ( 'transition-duration' , 'attr(data-foo time)' , '10ms' , '10ms' ) ;
123
- test_valid_attr ( 'transition-duration' , 'attr(data-foo time, 30s)' , '10m' , '30s' ) ;
124
- test_valid_attr ( 'transition-duration' , 'attr(data-foo time, calc(10s + 20s))' , '10m' , '30s' ) ;
125
-
126
- test_valid_attr ( 'grid-template-columns' , '30px attr(data-foo flex)' , '1fr' , '30px 1fr' ) ;
127
- test_valid_attr ( 'grid-template-columns' , 'attr(data-foo flex, 3fr)' , '1fr 1fr' , '3fr' ) ;
128
- test_valid_attr ( 'grid-template-columns' , 'attr(data-foo flex, calc(1px + 2px))' , '10px' , '3px' ) ;
129
-
130
- test_valid_attr ( 'height' , 'attr(data-foo px)' , '10' , '10px' ) ;
131
- test_valid_attr ( 'width' , 'calc(attr(data-foo px) + 1px)' , '10' , '11px' ) ;
132
- test_valid_attr ( '--x' , 'attr(data-foo px) 11px' , '10' , '10px 11px' ) ;
133
- test_valid_attr ( 'grid-template-columns' , 'attr(data-foo fr)' , '10' , '10fr' ) ;
134
- test_valid_attr ( 'grid-template-columns' , 'attr(data-foo fr, 3fr)' , '10fr' , '3fr' ) ;
135
-
136
- test_valid_attr ( '--string' , 'attr(data-foo string)' , 'hello' , '"hello"' ) ;
137
- test_valid_attr ( '--string-list' , 'attr(data-foo string)' , 'hello' , '"hello"' ) ;
138
-
139
- test_dimension_types_and_units ( ) ;
140
-
141
- test_invalid_attr ( 'animation-name' , 'attr(data-foo ident)' , 'initial' ) ;
142
- test_invalid_attr ( 'animation-name' , 'attr(data-foo ident)' , '"anim"' ) ;
143
- test_invalid_attr ( 'animation-name' , 'attr(data-foo ident)' , '"none"' ) ;
144
-
145
- test_invalid_attr ( 'background-color' , 'attr(data-foo color)' , 'rgb(0 255 0)' ) ;
146
- test_invalid_attr ( 'background-color' , 'attr(data-foo color)' , 'color-mix(in lch, red, pink)' ) ;
147
- test_invalid_attr ( 'background-color' , 'attr(data-foo color)' , 'light-dark(#333b3c, #efefec)' ) ;
148
- test_invalid_attr ( 'background-color' , 'attr(data-foo red)' , 'abc' ) ;
149
- test_invalid_attr ( 'background-color' , 'attr(data-foo, red)' , 'abc' ) ;
150
-
151
- test_invalid_attr ( 'font-size' , 'attr(data-foo number)' , '10' ) ;
152
- test_invalid_attr ( 'font-weight' , 'attr(data-foo number),' , '10' ) ;
153
- test_invalid_attr ( 'font-weight' , 'attr(data-foo number)' , 'calc(1 + 3)' ) ;
154
-
155
- test_invalid_attr ( 'font-size' , 'attr(data-foo percentage)' , 'abc' ) ;
156
- test_invalid_attr ( 'font-size' , 'attr(data-foo percentage)' , '10% a' ) ;
157
- test_invalid_attr ( 'font-size' , 'attr(data-foo percentage, 10rad)' , 'abc' ) ;
158
-
159
- test_invalid_attr ( 'width' , 'attr(data-foo length)' , '10' ) ;
160
- test_invalid_attr ( 'width' , 'attr(data-foo length, 30)' , 'calc(10 + 20)' ) ;
161
- test_invalid_attr ( 'width' , 'attr(data-foo length, calc(10 + 20))' , 'abc' ) ;
162
-
163
- test_invalid_attr ( 'font-style' , 'attr(data-foo angle)' , '10%' ) ;
164
- test_invalid_attr ( 'font-style' , 'attr(data-foo angle)' , 'calc(10px + 20px)' ) ;
165
- test_invalid_attr ( 'font-style' , 'attr(data-foo angle, calc(10 + 20))' , 'calc(10px + 20px)' ) ;
166
-
167
- test_invalid_attr ( 'transition-duration' , 'attr(data-foo time)' , '10' ) ;
168
- test_invalid_attr ( 'transition-duration' , 'attr(data-foo time)' , '10 ms' ) ;
169
- test_invalid_attr ( 'transition-duration' , 'attr(data-foo time)' , 'calc(1ms + 2ms)s' ) ;
170
-
171
- test_invalid_attr ( 'grid-template-columns' , 'attr(data-foo flex)' , '10px' ) ;
172
- test_invalid_attr ( 'grid-template-columns' , 'attr(data-foo flex)' , '"30fr"' ) ;
173
- test_invalid_attr ( 'grid-template-columns' , 'attr(data-foo flex, calc(1deg + 2deg))' , '10px' ) ;
174
-
175
- test_invalid_attr ( 'width' , 'attr(data-foo px)' , '10px' ) ;
176
- test_invalid_attr ( 'height' , 'attr(data-foo fr)' , '10' ) ;
177
- test_invalid_attr ( 'transition-duration' , 'attr(data-foo ms)' , '10px' ) ;
178
- test_invalid_attr ( 'transition-duration' , 'attr(data-foo ms)' , '10px foo' ) ;
62
+ test_valid_attr ( 'content' , 'attr(data-foo <string>)' , '"abc"' , '"abc"' ) ;
63
+ test_valid_attr ( 'content' , 'attr(data-foo <string>,)' , '"abc"' , '"abc"' ) ;
64
+ test_valid_attr ( 'content' , 'attr(data-foo <string>)' , '"attr(data-foo)"' , '"attr(data-foo)"' ) ;
65
+
66
+ test_valid_attr ( 'animation-name' , 'attr(data-foo <custom-ident>)' , 'anim' , 'anim' ) ;
67
+ test_valid_attr ( 'animation-name' , 'attr(data-foo <custom-ident>, anim-fallback)' , '"anim"' , 'anim-fallback' ) ;
68
+ test_valid_attr ( 'animation-name' , 'attr(data-foo <custom-ident>, anim-fallback)' , 'initial' , 'anim-fallback' ) ;
69
+
70
+ test_valid_attr ( 'background-color' , 'attr(data-foo <color>)' , 'red' , 'red' ) ;
71
+ test_valid_attr ( 'background-color' , 'attr(data-foo <color>)' , '#ff0099aa' , '#ff0099aa' ) ;
72
+ test_valid_attr ( 'background-color' , 'attr(data-foo <color>, red)' , '10' , 'red' ) ;
73
+ test_valid_attr ( 'background-color' , 'attr(data-foo <color>, green)' , '1000px' , 'green' ) ;
74
+ test_valid_attr ( 'background-color' , 'attr(data-foo <color>, green)' , 'rgb(255, 0, 0)' , 'rgb(255, 0, 0)' ) ;
75
+ test_valid_attr ( 'background-color' , 'attr(data-foo <color>)' , 'color-mix(in lch, red, pink)' , 'color-mix(in lch, red, pink)' ) ;
76
+ test_valid_attr ( 'background-color' , 'attr(data-foo <color>)' , 'light-dark(#333b3c, #efefec)' , 'light-dark(#333b3c, #efefec)' ) ;
77
+
78
+ test_valid_attr ( 'font-weight' , 'attr(data-foo <number>)' , '10' , '10' ) ;
79
+ test_valid_attr ( 'font-weight' , 'attr(data-foo <number>, 30)' , '10px' , '30' ) ;
80
+ test_valid_attr ( 'font-weight' , 'attr(data-foo <number> | lighter | bold, bold)' , 'lighter' , 'lighter' ) ;
81
+ test_valid_attr ( 'font-weight' , 'attr(data-foo <number> | lighter | bold, lighter)' , '10px' , 'lighter' ) ;
82
+ test_valid_attr ( 'font-weight' , 'attr(data-foo <number>)' , 'calc(3 + 3)' , '6' ) ;
83
+ test_valid_attr ( 'font-weight' , 'attr(data-foo <number>, calc(10 + 20))' , '10px' , '30' ) ;
84
+
85
+ test_valid_attr ( 'font-size' , 'attr(data-foo <percentage>)' , '10%' , '10%' ) ;
86
+ test_valid_attr ( 'font-size' , 'attr(data-foo <percentage>, 10px)' , 'abc' , '10px' ) ;
87
+ test_valid_attr ( 'font-size' , 'attr(data-foo <percentage> | <length>, 10)' , '10px' , '10px' ) ;
88
+ test_valid_attr ( '--x' , 'attr(data-foo <percentage>, abc)' , '10' , 'abc' ) ;
89
+
90
+ test_valid_attr ( 'width' , 'attr(data-foo <length>)' , '10px' , '10px' ) ;
91
+ test_valid_attr ( 'width' , 'attr(data-foo <length>, red)' , '10px' , '10px' ) ;
92
+ test_valid_attr ( 'width' , 'attr(data-foo <length>, 42px)' , 'calc(1px + 3px)' , '4px' ) ;
93
+
94
+ test_valid_attr ( 'font-style' , 'attr(data-foo <angle>)' , '10deg' , '10deg' ) ;
95
+ test_valid_attr ( 'font-style' , 'attr(data-foo <angle>, 10deg)' , '30' , '10deg' ) ;
96
+ test_valid_attr ( 'font-style' , 'attr(data-foo <angle>, italic)' , '30' , 'italic' ) ;
97
+ test_valid_attr ( 'font-style' , 'attr(data-foo <angle>, 3deg)' , 'italic' , '3deg' ) ;
98
+ test_valid_attr ( 'font-style' , 'attr(data-foo <angle> | italic, 3deg)' , 'italic' , 'italic' ) ;
99
+
100
+ test_valid_attr ( 'transition-duration' , 'attr(data-foo <time>)' , '10ms' , '10ms' ) ;
101
+ test_valid_attr ( 'transition-duration' , 'attr(data-foo <time>, 30s)' , '10m' , '30s' ) ;
102
+ test_valid_attr ( 'transition-duration' , 'attr(data-foo <time>, calc(10s + 20s))' , '10m' , '30s' ) ;
103
+
104
+ test_valid_attr ( '--x' , 'attr(data-foo <number>) 11' , '10' , '10 11' ) ;
105
+ test_valid_attr ( '--string' , 'attr(data-foo <string>)' , '"hello"' , '"hello"' ) ;
106
+ test_valid_attr ( '--string-list' , 'attr(data-foo <string>+)' , '"hello" "hi"' , '"hello" "hi"' ) ;
107
+
108
+ test_invalid_attr ( 'animation-name' , 'attr(data-foo string)' , 'abc' ) ;
109
+ test_invalid_attr ( 'animation-name' , 'attr(data-foo < string>)' , 'abc' ) ;
110
+ test_invalid_attr ( 'animation-name' , 'attr(data-foo <string >)' , 'abc' ) ;
111
+
112
+ test_invalid_attr ( 'animation-name' , 'attr(data-foo <custom-ident>)' , 'initial' ) ;
113
+ test_invalid_attr ( 'animation-name' , 'attr(data-foo <custom-ident>)' , '"anim"' ) ;
114
+ test_invalid_attr ( 'animation-name' , 'attr(data-foo <custom-ident>)' , '"none"' ) ;
115
+ test_invalid_attr ( 'animation-name' , 'attr(data-foo <custom-ident> <ident>)' , '"none"' ) ;
116
+
117
+ test_invalid_attr ( 'background-color' , 'attr(data-foo <color>)' , 'rgb(0)' ) ;
118
+ test_invalid_attr ( 'background-color' , 'attr(data-foo <red>)' , 'abc' ) ;
119
+ test_invalid_attr ( 'background-color' , 'attr(data-foo <color> | <red>)' , 'abc' ) ;
120
+ test_invalid_attr ( 'background-color' , 'attr(data-foo <color> |)' , 'abc' ) ;
121
+ test_invalid_attr ( 'background-color' , 'attr(data-foo, <red>)' , 'abc' ) ;
122
+
123
+ test_invalid_attr ( 'font-size' , 'attr(data-foo <number>)' , '10' ) ;
124
+ test_invalid_attr ( 'font-size' , 'attr(data-foo <number> !)' , '10' ) ;
125
+ test_invalid_attr ( 'font-weight' , 'attr(data-foo <number>),' , '10' ) ;
126
+ test_invalid_attr ( 'width' , 'attr(data-foo <number>, 30px)' , '10' ) ;
127
+
128
+ test_invalid_attr ( 'font-size' , 'attr(data-foo <percentage>)' , 'abc' ) ;
129
+ test_invalid_attr ( 'font-size' , 'attr(data-foo <percentage>)' , '10% a' ) ;
130
+ test_invalid_attr ( 'font-size' , 'attr(data-foo <percentage>, 10rad)' , 'abc' ) ;
131
+ test_invalid_attr ( 'font-size' , 'attr(data-foo <number> | <length>, 30px)' , '10' ) ;
132
+
133
+ test_invalid_attr ( 'width' , 'attr(data-foo <length>)' , '10' ) ;
134
+ test_invalid_attr ( 'width' , 'attr(data-foo <length>, 30)' , 'calc(10 + 20)' ) ;
135
+ test_invalid_attr ( 'width' , 'attr(data-foo <length>, calc(10 + 20))' , 'abc' ) ;
136
+
137
+ test_invalid_attr ( 'font-style' , 'attr(data-foo <angle>)' , '10%' ) ;
138
+ test_invalid_attr ( 'font-style' , 'attr(data-foo <angle>)' , 'calc(10px + 20px)' ) ;
139
+ test_invalid_attr ( 'font-style' , 'attr(data-foo <angle>, calc(10 + 20))' , 'calc(10px + 20px)' ) ;
140
+
141
+ test_invalid_attr ( 'transition-duration' , 'attr(data-foo <time>)' , '10' ) ;
142
+ test_invalid_attr ( 'transition-duration' , 'attr(data-foo <time>)' , '10 ms' ) ;
143
+ test_invalid_attr ( 'transition-duration' , 'attr(data-foo <time>)' , 'calc(1ms + 2ms)s' ) ;
179
144
180
145
test_invalid_attr ( 'width' , 'attr(())' , '10px' ) ;
181
146
</ script >
0 commit comments