css_ast/selector/
webkit.rs

1use crate::{CompoundSelector, CssAtomSet, CssDiagnostic};
2use css_parse::{Cursor, Diagnostic, Parse, Parser, Result as ParserResult, T, pseudo_class, pseudo_element};
3use csskit_derives::{SemanticEq, ToCursors, ToSpan};
4
5pseudo_element!(
6	/// <https://searchfox.org/wubkat/source/Source/WebCore/css/CSSPseudoSelectors.json>
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		CalendarDatePickerIndicator: CssAtomSet::_WebkitCalendarPickerIndicator,
13		CapsLockIndicator: CssAtomSet::_WebkitCapsLockIndicator,
14		ColorSwatch: CssAtomSet::_WebkitColorSwatch,
15		ColorSwatchWrapper: CssAtomSet::_WebkitColorSwatchWrapper,
16		ContactsAutoFillButton: CssAtomSet::_WebkitContactsAutoFillButton,
17		CredentialsAutoFillButton: CssAtomSet::_WebkitCredentialsAutoFillButton,
18		CreditCardAutoFillButton: CssAtomSet::_WebkitCreditCardAutoFillButton,
19		DateAndTimeValue: CssAtomSet::_WebkitDateAndTimeValue,
20		DatetimeEdit: CssAtomSet::_WebkitDatetimeEdit,
21		DatetimeEditDayField: CssAtomSet::_WebkitDatetimeEditDayField,
22		DatetimeEditFieldsWrapper: CssAtomSet::_WebkitDatetimeEditFieldsWrapper,
23		DatetimeEditHourField: CssAtomSet::_WebkitDatetimeEditHourField,
24		DatetimeEditMeridiemField: CssAtomSet::_WebkitDatetimeEditMeridiemField,
25		DatetimeEditMillisecondField: CssAtomSet::_WebkitDatetimeEditMillisecondField,
26		DatetimeEditMinute: CssAtomSet::_WebkitDatetimeEditMinute,
27		DatetimeEditMinuteField: CssAtomSet::_WebkitDatetimeEditMinuteField,
28		DatetimeEditMonthField: CssAtomSet::_WebkitDatetimeEditMonthField,
29		DatetimeEditSecondField: CssAtomSet::_WebkitDatetimeEditSecondField,
30		DatetimeEditText: CssAtomSet::_WebkitDatetimeEditText,
31		DatetimeEditYearField: CssAtomSet::_WebkitDatetimeEditYearField,
32		DetailsMarker: CssAtomSet::_WebkitDetailsMarker,
33		FileUploadButton: CssAtomSet::_WebkitFileUploadButton, // Alias for `:file-selector-button`
34		GenericCueRoot: CssAtomSet::_WebkitGenericCueRoot,
35		InputPlaceholder: CssAtomSet::_WebkitInputPlaceholder, // Alias for `:placeholder`
36		InnerSpinButton: CssAtomSet::_WebkitInnerSpinButton,
37		ListButton: CssAtomSet::_WebkitListButton,
38		MediaTextTrackContainer: CssAtomSet::_WebkitMediaTextTrackContainer,
39		MediaTextTrackDisplay: CssAtomSet::_WebkitMediaTextTrackDisplay,
40		MediaTextTrackDisplayBackdrop: CssAtomSet::_WebkitMediaTextTrackDisplayBackdrop,
41		MediaTextTrackRegion: CssAtomSet::_WebkitMediaTextTrackRegion,
42		MediaTextTrackRegionContainer: CssAtomSet::_WebkitMediaTextTrackRegionContainer,
43		MeterBar: CssAtomSet::_WebkitMeterBar,
44		MeterEvenLessGoodValue: CssAtomSet::_WebkitMeterEvenLessGoodValue,
45		MeterInnerElement: CssAtomSet::_WebkitMeterInnerElement,
46		MeterOptimumValue: CssAtomSet::_WebkitMeterOptimumValue,
47		MeterSuboptimumValue: CssAtomSet::_WebkitMeterSuboptimumValue,
48		OuterSpinButton: CssAtomSet::_WebkitOuterSpinButton, // Deprecated
49		ProgressBar: CssAtomSet::_WebkitProgressBar,
50		ProgressInnerElement: CssAtomSet::_WebkitProgressInnerElement,
51		ProgressValue: CssAtomSet::_WebkitProgressValue,
52		Resizer: CssAtomSet::_WebkitResizer,
53		Scrollbar: CssAtomSet::_WebkitScrollbar,
54		ScrollbarButton: CssAtomSet::_WebkitScrollbarButton,
55		ScrollbarCorner: CssAtomSet::_WebkitScrollbarCorner,
56		ScrollbarThumb: CssAtomSet::_WebkitScrollbarThumb,
57		ScrollbarTrack: CssAtomSet::_WebkitScrollbarTrack,
58		ScrollbarTrackPiece: CssAtomSet::_WebkitScrollbarTrackPiece,
59		SearchCancelButton: CssAtomSet::_WebkitSearchCancelButton,
60		SearchDecoration: CssAtomSet::_WebkitSearchDecoration,
61		SearchResultsButton: CssAtomSet::_WebkitSearchResultsButton,
62		SliderContainer: CssAtomSet::_WebkitSliderContainer,
63		SliderRunnableTrack: CssAtomSet::_WebkitSliderRunnableTrack,
64		SliderThumb: CssAtomSet::_WebkitSliderThumb,
65		PasswordAutoFillButton: CssAtomSet::_WebkitPasswordAutoFillButton,
66		TextfieldDecorationContainer: CssAtomSet::_WebkitTextfieldDecorationContainer,
67		ValidationBubble: CssAtomSet::_WebkitValidationBubble,
68		ValidationBubbleArrow: CssAtomSet::_WebkitValidationBubbleArrow,
69		ValidationBubbleArrowClipper: CssAtomSet::_WebkitValidationBubbleArrowClipper,
70		ValidationBubbleBody: CssAtomSet::_WebkitValidationBubbleBody,
71		ValidationBubbleHeading: CssAtomSet::_WebkitValidationBubbleHeading,
72		ValidationBubbleIcon: CssAtomSet::_WebkitValidationBubbleIcon,
73		ValidationBubbleMessage: CssAtomSet::_WebkitValidationBubbleMessage,
74		ValidationBubbleTextBlock: CssAtomSet::_WebkitValidationBubbleTextBlock,
75	}
76);
77
78#[derive(ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
79#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
80#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit)]
81#[derive(csskit_derives::NodeWithMetadata)]
82pub enum WebkitFunctionalPseudoElement<'a> {
83	Distributed(WebkitDistrubutedFunctionalPseudoElement<'a>),
84}
85
86impl<'a> Parse<'a> for WebkitFunctionalPseudoElement<'a> {
87	fn parse<I>(p: &mut Parser<'a, I>) -> ParserResult<Self>
88	where
89		I: Iterator<Item = Cursor> + Clone,
90	{
91		let colons = p.parse::<T![::]>()?;
92		let function = p.parse::<T![Function]>()?;
93		let c: Cursor = function.into();
94		if p.equals_atom(c, &CssAtomSet::_WebkitDistributed) {
95			let value = p.parse::<CompoundSelector>()?;
96			let close = p.parse_if_peek::<T![')']>()?;
97			Ok(Self::Distributed(WebkitDistrubutedFunctionalPseudoElement { colons, function, value, close }))
98		} else {
99			Err(Diagnostic::new(c, Diagnostic::unexpected_function))?
100		}
101	}
102}
103
104#[derive(ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
105#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
106#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit)]
107#[derive(csskit_derives::NodeWithMetadata)]
108pub struct WebkitDistrubutedFunctionalPseudoElement<'a> {
109	#[cfg_attr(feature = "visitable", visit(skip))]
110	pub colons: T![::],
111	#[cfg_attr(feature = "visitable", visit(skip))]
112	pub function: T![Function],
113	pub value: CompoundSelector<'a>,
114	#[cfg_attr(feature = "visitable", visit(skip))]
115	pub close: Option<T![')']>,
116}
117
118#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable))]
119#[derive(ToCursors, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
120#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
121pub enum WebkitFunctionalPseudoClass<'a> {
122	Any(WebkitAnyFunctionalPseudoClass<'a>),
123}
124
125impl<'a> Parse<'a> for WebkitFunctionalPseudoClass<'a> {
126	fn parse<I>(p: &mut Parser<'a, I>) -> ParserResult<Self>
127	where
128		I: Iterator<Item = Cursor> + Clone,
129	{
130		let colon = p.parse::<T![:]>()?;
131		let function = p.parse::<T![Function]>()?;
132		let c: Cursor = function.into();
133		if p.equals_atom(c, &CssAtomSet::_WebkitAny) {
134			let value = p.parse::<CompoundSelector>()?;
135			let close = p.parse_if_peek::<T![')']>()?;
136			Ok(Self::Any(WebkitAnyFunctionalPseudoClass { colon, function, value, close }))
137		} else {
138			Err(Diagnostic::new(c, Diagnostic::unexpected_function))?
139		}
140	}
141}
142
143#[derive(ToCursors, ToSpan, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
144#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
145#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
146#[derive(csskit_derives::NodeWithMetadata)]
147pub struct WebkitAnyFunctionalPseudoClass<'a> {
148	pub colon: T![:],
149	pub function: T![Function],
150	pub value: CompoundSelector<'a>,
151	pub close: Option<T![')']>,
152}
153
154pseudo_class!(
155	/// <https://searchfox.org/wubkat/source/Source/WebCore/css/CSSPseudoSelectors.json>
156	#[derive(ToCursors, ToSpan, SemanticEq, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
157	#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
158	#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
159#[derive(csskit_derives::NodeWithMetadata)]
160	pub enum WebkitPseudoClass {
161		AnimatingFullScreenTransition: CssAtomSet::_WebkitAnimatingFullScreenTransition,
162		AnyLink: CssAtomSet::_WebkitAnyLink,  // Alias for :anyLink
163		Autofill: CssAtomSet::_WebkitAutofill, // Alias for :autofill
164		AutofillAndObscured: CssAtomSet::_WebkitAutofillAndObscured,
165		AutofillStrongPassword: CssAtomSet::_WebkitAutofillStrongPassword,
166		AutofillStrongPasswordViewable: CssAtomSet::_WebkitAutofillStrongPasswordViewable,
167		Drag: CssAtomSet::_WebkitDrag,
168		FullPageMedia: CssAtomSet::_WebkitFullPageMedia,
169		FullScreen: CssAtomSet::_WebkitFullScreen,
170		FullScreenAncestor: CssAtomSet::_WebkitFullScreenAncestor,
171		FullScreenControlsHidden: CssAtomSet::_WebkitFullScreenControlsHidden,
172		FullScreenDocument: CssAtomSet::_WebkitFullScreenDocument,
173	}
174);