Skip to main content

css_ast/selector/
webkit.rs

1use super::prelude::*;
2use crate::CompoundSelector;
3
4pseudo_element!(
5	/// <https://searchfox.org/wubkat/source/Source/WebCore/css/CSSPseudoSelectors.json>
6	#[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, // Alias for `:file-selector-button`
35		GenericCueRoot: CssAtomSet::_WebkitGenericCueRoot,
36		InnerSpinButton: CssAtomSet::_WebkitInnerSpinButton,
37		InputPlaceholder: CssAtomSet::_WebkitInputPlaceholder, // Alias for `:placeholder`
38		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, // Deprecated
51		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	/// <https://searchfox.org/wubkat/source/Source/WebCore/css/CSSPseudoSelectors.json>
167	//  <https://searchfox.org/wubkat/source/Source/WebCore/css/SelectorChecker.cpp#1263-1273>
168	#[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,  // Alias for :anyLink
176		Autofill: CssAtomSet::_WebkitAutofill, // Alias for :autofill
177		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}