css_ast/selector/
webkit.rs

1use crate::{CompoundSelector, diagnostics};
2use css_parse::{Cursor, Parse, Parser, Result as ParserResult, T, pseudo_class, pseudo_element};
3use csskit_derives::{ToCursors, Visitable};
4
5pseudo_element!(
6	/// <https://searchfox.org/wubkat/source/Source/WebCore/css/CSSPseudoSelectors.json>
7	#[derive(Visitable)]
8	#[visit(self)]
9	pub enum WebkitPseudoElement {
10		CalendarDatePickerIndicator: "-webkit-calendar-picker-indicator",
11		CapsLockIndicator: "-webkit-caps-lock-indicator",
12		ColorSwatch: "-webkit-color-swatch",
13		ColorSwatchWrapper: "-webkit-color-swatch-wrapper",
14		ContactsAutoFillButton: "-webkit-contacts-auto-fill-button",
15		CredentialsAutoFillButton: "-webkit-credentials-auto-fill-button",
16		CreditCardAutoFillButton: "-webkit-credit-card-auto-fill-button",
17		DateAndTimeValue: "-webkit-date-and-time-value",
18		DatetimeEdit: "-webkit-datetime-edit",
19		DatetimeEditDayField: "-webkit-datetime-edit-day-field",
20		DatetimeEditFieldsWrapper: "-webkit-datetime-edit-fields-wrapper",
21		DatetimeEditHourField: "-webkit-datetime-edit-hour-field",
22		DatetimeEditMeridiemField: "-webkit-datetime-edit-meridiem-field",
23		DatetimeEditMillisecondField: "-webkit-datetime-edit-millisecond-field",
24		DatetimeEditMinute: "-webkit-datetime-edit-minute",
25		DatetimeEditMinuteField: "-webkit-datetime-edit-minute-field",
26		DatetimeEditMonthField: "-webkit-datetime-edit-month-field",
27		DatetimeEditSecondField: "-webkit-datetime-edit-second-field",
28		DatetimeEditText: "-webkit-datetime-edit-text",
29		DatetimeEditYearField: "-webkit-datetime-edit-year-field",
30		DetailsMarker: "-webkit-details-marker",
31		FileUploadButton: "-webkit-file-upload-button", // Alias for `:file-selector-button`
32		GenericCueRoot: "-webkit-generic-cue-root",
33		InputPlaceholder: "-webkit-input-placeholder", // Alias for `:placeholder`
34		InnerSpinButton: "-webkit-inner-spin-button",
35		ListButton: "-webkit-list-button",
36		MediaTextTrackContainer: "-webkit-media-text-track-container",
37		MediaTextTrackDisplay: "-webkit-media-text-track-display",
38		MediaTextTrackDisplayBackdrop: "-webkit-media-text-track-display-backdrop",
39		MediaTextTrackRegion: "-webkit-media-text-track-region",
40		MediaTextTrackRegionContainer: "-webkit-media-text-track-region-container",
41		MeterBar: "-webkit-meter-bar",
42		MeterEvenLessGoodValue: "-webkit-meter-even-less-good-value",
43		MeterInnerElement: "-webkit-meter-inner-element",
44		MeterOptimumValue: "-webkit-meter-optimum-value",
45		MeterSuboptimumValue: "-webkit-meter-suboptimum-value",
46		OuterSpinButton: "-webkit-outer-spin-button", // Deprecated
47		ProgressBar: "-webkit-progress-bar",
48		ProgressInnerElement: "-webkit-progress-inner-element",
49		ProgressValue: "-webkit-progress-value",
50		Resizer: "-webkit-resizer",
51		Scrollbar: "-webkit-scrollbar",
52		ScrollbarButton: "-webkit-scrollbar-button",
53		ScrollbarCorner: "-webkit-scrollbar-corner",
54		ScrollbarThumb: "-webkit-scrollbar-thumb",
55		ScrollbarTrack: "-webkit-scrollbar-track",
56		ScrollbarTrackPiece: "-webkit-scrollbar-track-piece",
57		SearchCancelButton: "-webkit-search-cancel-button",
58		SearchDecoration: "-webkit-search-decoration",
59		SearchResultsButton: "-webkit-search-results-button",
60		SliderContainer: "-webkit-slider-container",
61		SliderRunnableTrack: "-webkit-slider-runnable-track",
62		SliderThumb: "-webkit-slider-thumb",
63		PasswordAutoFillButton: "-webkit-password-auto-fill-button",
64		TextfieldDecorationContainer: "-webkit-textfield-decoration-container",
65		ValidationBubble: "-webkit-validation-bubble",
66		ValidationBubbleArrow: "-webkit-validation-bubble-arrow",
67		ValidationBubbleArrowClipper: "-webkit-validation-bubble-arrow-clipper",
68		ValidationBubbleBody: "-webkit-validation-bubble-body",
69		ValidationBubbleHeading: "-webkit-validation-bubble-heading",
70		ValidationBubbleIcon: "-webkit-validation-bubble-icon",
71		ValidationBubbleMessage: "-webkit-validation-bubble-message",
72		ValidationBubbleTextBlock: "-webkit-validation-bubble-text-block",
73	}
74);
75
76#[derive(ToCursors, Visitable, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
77#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(rename_all = "kebab-case"))]
78#[visit]
79pub enum WebkitFunctionalPseudoElement<'a> {
80	Distributed(WebkitDistrubutedFunctionalPseudoElement<'a>),
81}
82
83impl<'a> Parse<'a> for WebkitFunctionalPseudoElement<'a> {
84	fn parse(p: &mut Parser<'a>) -> ParserResult<Self> {
85		let colons = p.parse::<T![::]>()?;
86		let function = p.parse::<T![Function]>()?;
87		let c: Cursor = function.into();
88		if p.eq_ignore_ascii_case(c, "-webkit-distributed") {
89			let value = p.parse::<CompoundSelector>()?;
90			let close = p.parse_if_peek::<T![')']>()?;
91			Ok(Self::Distributed(WebkitDistrubutedFunctionalPseudoElement { colons, function, value, close }))
92		} else {
93			Err(diagnostics::UnexpectedFunction(p.parse_str(c).into(), c))?
94		}
95	}
96}
97
98#[derive(ToCursors, Visitable, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
99#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(rename_all = "kebab-case"))]
100#[visit]
101pub struct WebkitDistrubutedFunctionalPseudoElement<'a> {
102	#[visit(skip)]
103	pub colons: T![::],
104	#[visit(skip)]
105	pub function: T![Function],
106	pub value: CompoundSelector<'a>,
107	#[visit(skip)]
108	pub close: Option<T![')']>,
109}
110
111#[derive(ToCursors, Visitable, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
112#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(rename_all = "kebab-case"))]
113#[visit]
114pub enum WebkitFunctionalPseudoClass<'a> {
115	Any(WebkitAnyFunctionalPseudoClass<'a>),
116}
117
118impl<'a> Parse<'a> for WebkitFunctionalPseudoClass<'a> {
119	fn parse(p: &mut Parser<'a>) -> ParserResult<Self> {
120		let colon = p.parse::<T![:]>()?;
121		let function = p.parse::<T![Function]>()?;
122		let c: Cursor = function.into();
123		if p.eq_ignore_ascii_case(c, "-webkit-any") {
124			let value = p.parse::<CompoundSelector>()?;
125			let close = p.parse_if_peek::<T![')']>()?;
126			Ok(Self::Any(WebkitAnyFunctionalPseudoClass { colon, function, value, close }))
127		} else {
128			Err(diagnostics::UnexpectedFunction(p.parse_str(c).into(), c))?
129		}
130	}
131}
132
133#[derive(ToCursors, Visitable, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
134#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(rename_all = "kebab-case"))]
135#[visit(self)]
136pub struct WebkitAnyFunctionalPseudoClass<'a> {
137	pub colon: T![:],
138	pub function: T![Function],
139	pub value: CompoundSelector<'a>,
140	pub close: Option<T![')']>,
141}
142
143pseudo_class!(
144	/// <https://searchfox.org/wubkat/source/Source/WebCore/css/CSSPseudoSelectors.json>
145	#[derive(Visitable)]
146	#[visit(self)]
147	pub enum WebkitPseudoClass {
148		AnimatingFullScreenTransition: "-webkit-animating-full-screen-transition",
149		AnyLink: "-webkit-any-link",  // Alias for :any-link
150		Autofill: "-webkit-autofill", // Alias for :autofill
151		AutofillAndObscured: "-webkit-autofill-and-obscured",
152		AutofillStrongPassword: "-webkit-autofill-strong-password",
153		AutofillStrongPasswordViewable: "-webkit-autofill-strong-password-viewable",
154		Drag: "-webkit-drag",
155		FullPageMedia: "-webkit-full-page-media",
156		FullScreen: "-webkit-full-screen",
157		FullScreenAncestor: "-webkit-full-screen-ancestor",
158		FullScreenControlsHidden: "-webkit-full-screen-controls-hidden",
159		FullScreenDocument: "-webkit-full-screen-document",
160	}
161);