Skip to content

Commit 37c4f4d

Browse files
Add support for ::details-content and ::target-text (#930)
1 parent f2303df commit 37c4f4d

File tree

4 files changed

+97
-0
lines changed

4 files changed

+97
-0
lines changed

scripts/build-prefixes.js

+2
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,8 @@ let mdnFeatures = {
332332
accentSystemColor: mdn.css.types.color['system-color'].accentcolor_accentcolortext.__compat.support,
333333
animationTimelineShorthand: mdn.css.properties.animation['animation-timeline_included'].__compat.support,
334334
viewTransition: mdn.css.selectors['view-transition'].__compat.support,
335+
detailsContent: mdn.css.selectors['details-content'].__compat.support,
336+
targetText: mdn.css.selectors['target-text'].__compat.support,
335337
};
336338

337339
for (let key in mdn.css.types.length) {

selectors/parser.rs

+3
Original file line numberDiff line numberDiff line change
@@ -3929,6 +3929,9 @@ pub mod tests {
39293929
assert!(parse("foo:where()").is_err());
39303930
assert!(parse("foo:where(div, foo, .bar baz)").is_ok());
39313931
assert!(parse("foo:where(::before)").is_err());
3932+
3933+
assert!(parse("foo::details-content").is_ok());
3934+
assert!(parse("foo::target-text").is_ok());
39323935
}
39333936

39343937
#[test]

src/compat.rs

+82
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ pub enum Feature {
4242
DecimalLeadingZeroListStyleType,
4343
DecimalListStyleType,
4444
DefaultPseudo,
45+
DetailsContent,
4546
DevanagariListStyleType,
4647
Dialog,
4748
DirSelector,
@@ -191,6 +192,7 @@ pub enum Feature {
191192
StringListStyleType,
192193
SymbolsListStyleType,
193194
TamilListStyleType,
195+
TargetText,
194196
TeluguListStyleType,
195197
TextDecorationThicknessPercent,
196198
TextDecorationThicknessShorthand,
@@ -3505,6 +3507,86 @@ impl Feature {
35053507
return false;
35063508
}
35073509
}
3510+
Feature::DetailsContent => {
3511+
if let Some(version) = browsers.chrome {
3512+
if version < 8585216 {
3513+
return false;
3514+
}
3515+
}
3516+
if let Some(version) = browsers.edge {
3517+
if version < 8585216 {
3518+
return false;
3519+
}
3520+
}
3521+
if let Some(version) = browsers.opera {
3522+
if version < 5701632 {
3523+
return false;
3524+
}
3525+
}
3526+
if let Some(version) = browsers.safari {
3527+
if version < 1180672 {
3528+
return false;
3529+
}
3530+
}
3531+
if let Some(version) = browsers.ios_saf {
3532+
if version < 1180672 {
3533+
return false;
3534+
}
3535+
}
3536+
if let Some(version) = browsers.android {
3537+
if version < 8585216 {
3538+
return false;
3539+
}
3540+
}
3541+
if browsers.firefox.is_some() || browsers.ie.is_some() || browsers.samsung.is_some() {
3542+
return false;
3543+
}
3544+
}
3545+
Feature::TargetText => {
3546+
if let Some(version) = browsers.chrome {
3547+
if version < 5832704 {
3548+
return false;
3549+
}
3550+
}
3551+
if let Some(version) = browsers.edge {
3552+
if version < 5832704 {
3553+
return false;
3554+
}
3555+
}
3556+
if let Some(version) = browsers.firefox {
3557+
if version < 8585216 {
3558+
return false;
3559+
}
3560+
}
3561+
if let Some(version) = browsers.opera {
3562+
if version < 4128768 {
3563+
return false;
3564+
}
3565+
}
3566+
if let Some(version) = browsers.safari {
3567+
if version < 1180160 {
3568+
return false;
3569+
}
3570+
}
3571+
if let Some(version) = browsers.ios_saf {
3572+
if version < 1180160 {
3573+
return false;
3574+
}
3575+
}
3576+
if let Some(version) = browsers.samsung {
3577+
if version < 983040 {
3578+
return false;
3579+
}
3580+
}
3581+
if let Some(version) = browsers.android {
3582+
if version < 5832704 {
3583+
return false;
3584+
}
3585+
}
3586+
if browsers.ie.is_some() {
3587+
return false;
3588+
}
3589+
}
35083590
Feature::QUnit => {
35093591
if let Some(version) = browsers.chrome {
35103592
if version < 4128768 {

src/selector.rs

+10
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,8 @@ impl<'a, 'o, 'i> parcel_selectors::parser::Parser<'i> for SelectorParser<'a, 'o,
267267
"after" => After,
268268
"first-line" => FirstLine,
269269
"first-letter" => FirstLetter,
270+
"details-content" => DetailsContent,
271+
"target-text" => TargetText,
270272
"cue" => Cue,
271273
"cue-region" => CueRegion,
272274
"selection" => Selection(VendorPrefix::None),
@@ -887,6 +889,10 @@ pub enum PseudoElement<'i> {
887889
FirstLine,
888890
/// The [::first-letter](https://drafts.csswg.org/css-pseudo-4/#first-letter-pseudo) pseudo element.
889891
FirstLetter,
892+
/// The [::details-content](https://drafts.csswg.org/css-pseudo-4/#details-content-pseudo)
893+
DetailsContent,
894+
/// The [::target-text](https://drafts.csswg.org/css-pseudo-4/#selectordef-target-text)
895+
TargetText,
890896
/// The [::selection](https://drafts.csswg.org/css-pseudo-4/#selectordef-selection) pseudo element.
891897
#[cfg_attr(feature = "serde", serde(with = "PrefixWrapper"))]
892898
Selection(VendorPrefix),
@@ -1139,6 +1145,8 @@ where
11391145
Before => dest.write_str(":before"),
11401146
FirstLine => dest.write_str(":first-line"),
11411147
FirstLetter => dest.write_str(":first-letter"),
1148+
DetailsContent => dest.write_str("::details-content"),
1149+
TargetText => dest.write_str("::target-text"),
11421150
Marker => dest.write_str("::marker"),
11431151
Selection(prefix) => write_prefixed!(prefix, "selection"),
11441152
Cue => dest.write_str("::cue"),
@@ -1903,6 +1911,8 @@ pub(crate) fn is_compatible(selectors: &[Selector], targets: Targets) -> bool {
19031911
PseudoElement::After | PseudoElement::Before => Feature::Gencontent,
19041912
PseudoElement::FirstLine => Feature::FirstLine,
19051913
PseudoElement::FirstLetter => Feature::FirstLetter,
1914+
PseudoElement::DetailsContent => Feature::DetailsContent,
1915+
PseudoElement::TargetText => Feature::TargetText,
19061916
PseudoElement::Selection(prefix) if *prefix == VendorPrefix::None => Feature::Selection,
19071917
PseudoElement::Placeholder(prefix) if *prefix == VendorPrefix::None => Feature::Placeholder,
19081918
PseudoElement::Marker => Feature::MarkerPseudo,

0 commit comments

Comments
 (0)