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