1use super::prelude::*;
2use crate::CompoundSelector;
3
4pseudo_element!(
5 #[node]
7 #[derive(ToCursors, ToSpan, SemanticEq, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
8 #[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
9 #[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
10#[derive(csskit_derives::NodeWithMetadata)]
11 pub enum WebkitPseudoElement {
12 Backdrop: CssAtomSet::_WebkitBackdrop,
13 CalendarDatePickerIndicator: CssAtomSet::_WebkitCalendarPickerIndicator,
14 CapsLockIndicator: CssAtomSet::_WebkitCapsLockIndicator,
15 ColorSwatch: CssAtomSet::_WebkitColorSwatch,
16 ColorSwatchWrapper: CssAtomSet::_WebkitColorSwatchWrapper,
17 ContactsAutoFillButton: CssAtomSet::_WebkitContactsAutoFillButton,
18 CredentialsAutoFillButton: CssAtomSet::_WebkitCredentialsAutoFillButton,
19 CreditCardAutoFillButton: CssAtomSet::_WebkitCreditCardAutoFillButton,
20 DateAndTimeValue: CssAtomSet::_WebkitDateAndTimeValue,
21 DatetimeEdit: CssAtomSet::_WebkitDatetimeEdit,
22 DatetimeEditDayField: CssAtomSet::_WebkitDatetimeEditDayField,
23 DatetimeEditFieldsWrapper: CssAtomSet::_WebkitDatetimeEditFieldsWrapper,
24 DatetimeEditHourField: CssAtomSet::_WebkitDatetimeEditHourField,
25 DatetimeEditMeridiemField: CssAtomSet::_WebkitDatetimeEditMeridiemField,
26 DatetimeEditMillisecondField: CssAtomSet::_WebkitDatetimeEditMillisecondField,
27 DatetimeEditMinute: CssAtomSet::_WebkitDatetimeEditMinute,
28 DatetimeEditMinuteField: CssAtomSet::_WebkitDatetimeEditMinuteField,
29 DatetimeEditMonthField: CssAtomSet::_WebkitDatetimeEditMonthField,
30 DatetimeEditSecondField: CssAtomSet::_WebkitDatetimeEditSecondField,
31 DatetimeEditText: CssAtomSet::_WebkitDatetimeEditText,
32 DatetimeEditYearField: CssAtomSet::_WebkitDatetimeEditYearField,
33 DetailsMarker: CssAtomSet::_WebkitDetailsMarker,
34 FileUploadButton: CssAtomSet::_WebkitFileUploadButton, GenericCueRoot: CssAtomSet::_WebkitGenericCueRoot,
36 InnerSpinButton: CssAtomSet::_WebkitInnerSpinButton,
37 InputPlaceholder: CssAtomSet::_WebkitInputPlaceholder, ListButton: CssAtomSet::_WebkitListButton,
39 MediaControls: CssAtomSet::_WebkitMediaControls,
40 MediaTextTrackContainer: CssAtomSet::_WebkitMediaTextTrackContainer,
41 MediaTextTrackDisplay: CssAtomSet::_WebkitMediaTextTrackDisplay,
42 MediaTextTrackDisplayBackdrop: CssAtomSet::_WebkitMediaTextTrackDisplayBackdrop,
43 MediaTextTrackRegion: CssAtomSet::_WebkitMediaTextTrackRegion,
44 MediaTextTrackRegionContainer: CssAtomSet::_WebkitMediaTextTrackRegionContainer,
45 MeterBar: CssAtomSet::_WebkitMeterBar,
46 MeterEvenLessGoodValue: CssAtomSet::_WebkitMeterEvenLessGoodValue,
47 MeterInnerElement: CssAtomSet::_WebkitMeterInnerElement,
48 MeterOptimumValue: CssAtomSet::_WebkitMeterOptimumValue,
49 MeterSuboptimumValue: CssAtomSet::_WebkitMeterSuboptimumValue,
50 OuterSpinButton: CssAtomSet::_WebkitOuterSpinButton, PasswordAutoFillButton: CssAtomSet::_WebkitPasswordAutoFillButton,
52 ProgressBar: CssAtomSet::_WebkitProgressBar,
53 ProgressInnerElement: CssAtomSet::_WebkitProgressInnerElement,
54 ProgressValue: CssAtomSet::_WebkitProgressValue,
55 Resizer: CssAtomSet::_WebkitResizer,
56 Scrollbar: CssAtomSet::_WebkitScrollbar,
57 ScrollbarButton: CssAtomSet::_WebkitScrollbarButton,
58 ScrollbarCorner: CssAtomSet::_WebkitScrollbarCorner,
59 ScrollbarThumb: CssAtomSet::_WebkitScrollbarThumb,
60 ScrollbarTrack: CssAtomSet::_WebkitScrollbarTrack,
61 ScrollbarTrackPiece: CssAtomSet::_WebkitScrollbarTrackPiece,
62 SearchCancelButton: CssAtomSet::_WebkitSearchCancelButton,
63 SearchDecoration: CssAtomSet::_WebkitSearchDecoration,
64 SearchResultsButton: CssAtomSet::_WebkitSearchResultsButton,
65 SearchResultsDecoration: CssAtomSet::_WebkitSearchResultsDecoration,
66 Selection: CssAtomSet::_WebkitSelection,
67 SliderContainer: CssAtomSet::_WebkitSliderContainer,
68 SliderRunnableTrack: CssAtomSet::_WebkitSliderRunnableTrack,
69 SliderThumb: CssAtomSet::_WebkitSliderThumb,
70 StrongPasswordAutoFillButton: CssAtomSet::_WebkitStrongPasswordAutoFillButton,
71 TextfieldDecorationContainer: CssAtomSet::_WebkitTextfieldDecorationContainer,
72 ValidationBubble: CssAtomSet::_WebkitValidationBubble,
73 ValidationBubbleArrow: CssAtomSet::_WebkitValidationBubbleArrow,
74 ValidationBubbleArrowClipper: CssAtomSet::_WebkitValidationBubbleArrowClipper,
75 ValidationBubbleBody: CssAtomSet::_WebkitValidationBubbleBody,
76 ValidationBubbleHeading: CssAtomSet::_WebkitValidationBubbleHeading,
77 ValidationBubbleIcon: CssAtomSet::_WebkitValidationBubbleIcon,
78 ValidationBubbleMessage: CssAtomSet::_WebkitValidationBubbleMessage,
79 ValidationBubbleTextBlock: CssAtomSet::_WebkitValidationBubbleTextBlock,
80 }
81);
82
83#[node]
84#[derive(ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
85#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
86#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit)]
87#[derive(csskit_derives::NodeWithMetadata)]
88pub enum WebkitFunctionalPseudoElement<'a> {
89 Distributed(WebkitDistrubutedFunctionalPseudoElement<'a>),
90}
91
92impl<'a> Parse<'a> for WebkitFunctionalPseudoElement<'a> {
93 fn parse<I>(p: &mut Parser<'a, I>) -> ParserResult<Self>
94 where
95 I: Iterator<Item = Cursor> + Clone,
96 {
97 let colons = p.parse::<T![::]>()?;
98 let function = p.parse::<T![Function]>()?;
99 let c: Cursor = function.into();
100 if p.equals_atom(c, &CssAtomSet::_WebkitDistributed) {
101 let value = p.parse::<CompoundSelector>()?;
102 let close = p.parse_if_peek::<T![')']>()?;
103 Ok(Self::Distributed(WebkitDistrubutedFunctionalPseudoElement { colons, function, value, close }))
104 } else {
105 Err(Diagnostic::new(c, Diagnostic::unexpected_function))?
106 }
107 }
108}
109
110#[node]
111#[derive(ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
112#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
113#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit)]
114#[derive(csskit_derives::NodeWithMetadata)]
115pub struct WebkitDistrubutedFunctionalPseudoElement<'a> {
116 #[cfg_attr(feature = "visitable", visit(skip))]
117 #[semantic_eq(skip)]
118 pub colons: T![::],
119 #[cfg_attr(feature = "visitable", visit(skip))]
120 pub function: T![Function],
121 pub value: CompoundSelector<'a>,
122 #[cfg_attr(feature = "visitable", visit(skip))]
123 #[semantic_eq(skip)]
124 pub close: Option<T![')']>,
125}
126
127#[node]
128#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable))]
129#[derive(ToCursors, ToSpan, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
130#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
131pub enum WebkitFunctionalPseudoClass<'a> {
132 Any(WebkitAnyFunctionalPseudoClass<'a>),
133}
134
135impl<'a> Parse<'a> for WebkitFunctionalPseudoClass<'a> {
136 fn parse<I>(p: &mut Parser<'a, I>) -> ParserResult<Self>
137 where
138 I: Iterator<Item = Cursor> + Clone,
139 {
140 let colon = p.parse::<T![:]>()?;
141 let function = p.parse::<T![Function]>()?;
142 let c: Cursor = function.into();
143 if p.equals_atom(c, &CssAtomSet::_WebkitAny) {
144 let value = p.parse::<CompoundSelector>()?;
145 let close = p.parse_if_peek::<T![')']>()?;
146 Ok(Self::Any(WebkitAnyFunctionalPseudoClass { colon, function, value, close }))
147 } else {
148 Err(Diagnostic::new(c, Diagnostic::unexpected_function))?
149 }
150 }
151}
152
153#[node]
154#[derive(ToCursors, ToSpan, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
155#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
156#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
157#[derive(csskit_derives::NodeWithMetadata)]
158pub struct WebkitAnyFunctionalPseudoClass<'a> {
159 pub colon: T![:],
160 pub function: T![Function],
161 pub value: CompoundSelector<'a>,
162 pub close: Option<T![')']>,
163}
164
165pseudo_class!(
166 #[node]
169 #[derive(ToCursors, ToSpan, SemanticEq, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
170 #[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
171 #[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
172#[derive(csskit_derives::NodeWithMetadata)]
173 pub enum WebkitPseudoClass {
174 AnimatingFullScreenTransition: CssAtomSet::_WebkitAnimatingFullScreenTransition,
175 AnyLink: CssAtomSet::_WebkitAnyLink, Autofill: CssAtomSet::_WebkitAutofill, AutofillAndObscured: CssAtomSet::_WebkitAutofillAndObscured,
178 AutofillStrongPassword: CssAtomSet::_WebkitAutofillStrongPassword,
179 AutofillStrongPasswordViewable: CssAtomSet::_WebkitAutofillStrongPasswordViewable,
180 CornerPresent: CssAtomSet::CornerPresent,
181 Decrement: CssAtomSet::Decrement,
182 DoubleButton: CssAtomSet::DoubleButton,
183 Drag: CssAtomSet::_WebkitDrag,
184 End: CssAtomSet::End,
185 FullPageMedia: CssAtomSet::_WebkitFullPageMedia,
186 FullScreen: CssAtomSet::_WebkitFullScreen,
187 FullScreenAncestor: CssAtomSet::_WebkitFullScreenAncestor,
188 FullScreenControlsHidden: CssAtomSet::_WebkitFullScreenControlsHidden,
189 FullScreenDocument: CssAtomSet::_WebkitFullScreenDocument,
190 Horizontal: CssAtomSet::Horizontal,
191 Increment: CssAtomSet::Increment,
192 NoButton: CssAtomSet::NoButton,
193 SingleButton: CssAtomSet::SingleButton,
194 Start: CssAtomSet::Start,
195 Vertical: CssAtomSet::Vertical,
196 WindowInactive: CssAtomSet::WindowInactive,
197 }
198);
199
200#[cfg(test)]
201mod tests {
202 use super::*;
203 use crate::{CssAtomSet, SelectorList};
204 use css_parse::assert_parse;
205
206 #[test]
207 fn test_writes() {
208 assert_parse!(CssAtomSet::ATOMS, WebkitPseudoElement, "::-webkit-search-results-decoration");
209 assert_parse!(CssAtomSet::ATOMS, WebkitPseudoClass, ":horizontal");
210 assert_parse!(CssAtomSet::ATOMS, WebkitPseudoClass, ":window-inactive");
211 assert_parse!(CssAtomSet::ATOMS, SelectorList, "::-webkit-scrollbar-button:horizontal:decrement");
212 assert_parse!(CssAtomSet::ATOMS, SelectorList, "::-webkit-scrollbar-thumb:window-inactive");
213 }
214}