Skip to content

Commit 284debf

Browse files
committed
Don't put unknown pseudo elements in an :is()
Fixes parcel-bundler#536
1 parent 633f63e commit 284debf

File tree

2 files changed

+28
-7
lines changed

2 files changed

+28
-7
lines changed

selectors/parser.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ bitflags! {
136136

137137
const AFTER_WEBKIT_SCROLLBAR = 1 << 8;
138138
const AFTER_VIEW_TRANSITION = 1 << 9;
139+
const AFTER_UNKNOWN_PSEUDO_ELEMENT = 1 << 10;
139140
}
140141
}
141142

@@ -2004,9 +2005,6 @@ where
20042005

20052006
let mut builder = SelectorBuilder::default();
20062007

2007-
let mut has_pseudo_element = false;
2008-
let mut slotted = false;
2009-
let mut part = false;
20102008
'outer_loop: loop {
20112009
// Parse a sequence of simple selectors.
20122010
let empty = parse_compound_selector(parser, state, input, &mut builder)?;
@@ -2019,10 +2017,6 @@ where
20192017
}
20202018

20212019
if state.intersects(SelectorParsingState::AFTER_PSEUDO) {
2022-
has_pseudo_element = state.intersects(SelectorParsingState::AFTER_PSEUDO_ELEMENT);
2023-
slotted = state.intersects(SelectorParsingState::AFTER_SLOTTED);
2024-
part = state.intersects(SelectorParsingState::AFTER_PART);
2025-
debug_assert!(has_pseudo_element || slotted || part);
20262020
break;
20272021
}
20282022

@@ -2102,6 +2096,10 @@ where
21022096
}
21032097
}
21042098

2099+
let has_pseudo_element = state
2100+
.intersects(SelectorParsingState::AFTER_PSEUDO_ELEMENT | SelectorParsingState::AFTER_UNKNOWN_PSEUDO_ELEMENT);
2101+
let slotted = state.intersects(SelectorParsingState::AFTER_SLOTTED);
2102+
let part = state.intersects(SelectorParsingState::AFTER_PART);
21052103
let (spec, components) = builder.build(has_pseudo_element, slotted, part);
21062104
Ok(Selector(spec, components))
21072105
}
@@ -2647,6 +2645,8 @@ where
26472645
if !p.is_unknown() {
26482646
state.insert(SelectorParsingState::AFTER_PSEUDO_ELEMENT);
26492647
builder.push_combinator(Combinator::PseudoElement);
2648+
} else {
2649+
state.insert(SelectorParsingState::AFTER_UNKNOWN_PSEUDO_ELEMENT);
26502650
}
26512651
if !p.accepts_state_pseudo_classes() {
26522652
state.insert(SelectorParsingState::AFTER_NON_STATEFUL_PSEUDO_ELEMENT);

src/lib.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9611,6 +9611,27 @@ mod tests {
96119611
},
96129612
);
96139613

9614+
prefix_test(
9615+
r#"
9616+
a::unknown-a, a::unknown-b {
9617+
color: red;
9618+
}
9619+
"#,
9620+
indoc! {r#"
9621+
a::unknown-a {
9622+
color: red;
9623+
}
9624+
9625+
a::unknown-b {
9626+
color: red;
9627+
}
9628+
"#},
9629+
Browsers {
9630+
safari: Some(14 << 16),
9631+
..Browsers::default()
9632+
},
9633+
);
9634+
96149635
nesting_test_with_targets(
96159636
r#"
96169637
.foo {

0 commit comments

Comments
 (0)