Skip to content

Commit 4ebbcc5

Browse files
committed
Fix isValidInContext to allow a declaration with a standalone {}-block
- ref: https://drafts.csswg.org/css-syntax/#consume-declaration
1 parent 454675a commit 4ebbcc5

File tree

2 files changed

+103
-4
lines changed

2 files changed

+103
-4
lines changed

parse-css.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -1135,13 +1135,16 @@ function isValidInContext(construct, context) {
11351135
return true;
11361136
}
11371137

1138-
// Exclude properties that ended up with a {}-block
1139-
// in their value, unless they're custom.
1138+
// Exclude properties that ended up with a {}-block plus
1139+
// a non-whitespace component in their value, unless they're custom.
11401140
if(construct.type == "DECLARATION") {
11411141
if(construct.name.slice(0, 2) == "--") return true;
1142-
for(const val of construct.value) {
1143-
if(val.type == "BLOCK" && val.name == "{") return false;
1142+
1143+
const block = construct.value.find(t => t.type === "BLOCK" && t.name === "{");
1144+
if (block && construct.value.some(t => t.type !== "WHITESPACE" && t !== block)) {
1145+
return false;
11441146
}
1147+
11451148
return true;
11461149
}
11471150
}

tests.js

+96
Original file line numberDiff line numberDiff line change
@@ -3600,6 +3600,102 @@ return [
36003600
"important": false
36013601
}
36023602
},
3603+
{
3604+
"parser": "parseADeclaration",
3605+
"css": "foo:{}",
3606+
"expected": {
3607+
"type": "DECLARATION",
3608+
"name": "foo",
3609+
"value": [
3610+
{
3611+
"type": "BLOCK",
3612+
"name": "{",
3613+
"value": []
3614+
}
3615+
],
3616+
"important": false
3617+
}
3618+
},
3619+
{
3620+
"parser": "parseADeclaration",
3621+
"css": "foo: {}",
3622+
"expected": {
3623+
"type": "DECLARATION",
3624+
"name": "foo",
3625+
"value": [
3626+
{
3627+
"type": "BLOCK",
3628+
"name": "{",
3629+
"value": []
3630+
}
3631+
],
3632+
"important": false
3633+
}
3634+
},
3635+
{
3636+
"parser": "parseADeclaration",
3637+
"css": "foo:{} ",
3638+
"expected": {
3639+
"type": "DECLARATION",
3640+
"name": "foo",
3641+
"value": [
3642+
{
3643+
"type": "BLOCK",
3644+
"name": "{",
3645+
"value": []
3646+
}
3647+
],
3648+
"important": false
3649+
}
3650+
},
3651+
{
3652+
"parser": "parseADeclaration",
3653+
"css": "foo:bar{}",
3654+
"expectedThrow": {
3655+
"name": "SyntaxError"
3656+
}
3657+
},
3658+
{
3659+
"parser": "parseADeclaration",
3660+
"css": "foo:{}bar",
3661+
"expectedThrow": {
3662+
"name": "SyntaxError"
3663+
}
3664+
},
3665+
{
3666+
"parser": "parseADeclaration",
3667+
"css": "foo:{}{}",
3668+
"expectedThrow": {
3669+
"name": "SyntaxError"
3670+
}
3671+
},
3672+
{
3673+
"parser": "parseADeclaration",
3674+
"css": "-foo:bar{}",
3675+
"expectedThrow": {
3676+
"name": "SyntaxError"
3677+
}
3678+
},
3679+
{
3680+
"parser": "parseADeclaration",
3681+
"css": "--foo:bar{}",
3682+
"expected": {
3683+
"type": "DECLARATION",
3684+
"name": "--foo",
3685+
"value": [
3686+
{
3687+
"type": "IDENT",
3688+
"value": "bar"
3689+
},
3690+
{
3691+
"type": "BLOCK",
3692+
"name": "{",
3693+
"value": []
3694+
}
3695+
],
3696+
"important": false
3697+
}
3698+
},
36033699

36043700
// parseAComponentValue()
36053701
{

0 commit comments

Comments
 (0)