1use super::prelude::*;
2
3use crate::DirValue;
4use css_parse::syntax::CommaSeparated;
5
6pseudo_element!(
7 #[node]
9 #[derive(ToCursors, ToSpan, SemanticEq, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
10 #[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
11 #[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
12#[derive(csskit_derives::NodeWithMetadata)]
13 pub enum MozPseudoElement {
14 AnonymousBlock: CssAtomSet::_MozAnonymousBlock,
15 AnonymousItem: CssAtomSet::_MozAnonymousItem,
16 AnonymousPositionedBlock: CssAtomSet::_MozAnonymousPositionedBlock,
17 BlockInsideInlineWrapper: CssAtomSet::_MozBlockInsideInlineWrapper,
18 BlockRubyContent: CssAtomSet::_MozBlockRubyContent,
19 ButtonContent: CssAtomSet::_MozButtonContent,
20 Canvas: CssAtomSet::_MozCanvas,
21 CellContent: CssAtomSet::_MozCellContent,
22 ColorSwatch: CssAtomSet::_MozColorSwatch,
23 ColumnContent: CssAtomSet::_MozColumnContent,
24 ColumnSet: CssAtomSet::_MozColumnSet,
25 ColumnSpanWrapper: CssAtomSet::_MozColumnSpanWrapper,
26 DropdownList: CssAtomSet::_MozDropdownList,
27 FieldsetContent: CssAtomSet::_MozFieldsetContent,
28 FileContent: CssAtomSet::_MozFileContent,
29 FirstLetterContinuation: CssAtomSet::_MozFirstLetterContinuation,
30 FocusInner: CssAtomSet::_MozFocusInner,
31 FocusOuter: CssAtomSet::_MozFocusOuter,
32 FramesetBlank: CssAtomSet::_MozFramesetBlank,
33 HframesetBorder: CssAtomSet::_MozHframesetBorder,
34 HtmlCanvasContent: CssAtomSet::_MozHtmlCanvasContent,
35 InlineTable: CssAtomSet::_MozInlineTable,
36 LineFrame: CssAtomSet::_MozLineFrame,
37 ListBullet: CssAtomSet::_MozListBullet,
38 ListNumber: CssAtomSet::_MozListNumber,
39 MathmlAnonymousBlock: CssAtomSet::_MozMathmlAnonymousBlock,
40 MeterBar: CssAtomSet::_MozMeterBar,
41 NumberSpinBox: CssAtomSet::_MozNumberSpinBox,
42 NumberSpinDown: CssAtomSet::_MozNumberSpinDown,
43 NumberSpinUp: CssAtomSet::_MozNumberSpinUp,
44 OofPlaceholder: CssAtomSet::_MozOofPlaceholder,
45 Page: CssAtomSet::_MozPage,
46 PageBreak: CssAtomSet::_MozPageBreak,
47 PageContent: CssAtomSet::_MozPageContent,
48 PageSequence: CssAtomSet::_MozPageSequence,
49 Pagebreak: CssAtomSet::_MozPagebreak,
50 Pagecontent: CssAtomSet::_MozPagecontent,
51 Placeholder: CssAtomSet::_MozPlaceholder,
52 PrintedSheet: CssAtomSet::_MozPrintedSheet,
53 ProgressBar: CssAtomSet::_MozProgressBar,
54 RangeProgress: CssAtomSet::_MozRangeProgress,
55 RangeThumb: CssAtomSet::_MozRangeThumb,
56 RangeTrack: CssAtomSet::_MozRangeTrack,
57 Reveal: CssAtomSet::_MozReveal,
58 Ruby: CssAtomSet::_MozRuby,
59 RubyBase: CssAtomSet::_MozRubyBase,
60 RubyBaseContainer: CssAtomSet::_MozRubyBaseContainer,
61 RubyText: CssAtomSet::_MozRubyText,
62 RubyTextContainer: CssAtomSet::_MozRubyTextContainer,
63 ScrolledCanvas: CssAtomSet::_MozScrolledCanvas,
64 ScrolledContent: CssAtomSet::_MozScrolledContent,
65 ScrolledPageSequence: CssAtomSet::_MozScrolledPageSequence,
66 SearchClearButton: CssAtomSet::_MozSearchClearButton,
67 SelectContent: CssAtomSet::_MozSelectContent,
68 Selection: CssAtomSet::_MozSelection,
69 SnapshotContainingBlock: CssAtomSet::_MozSnapshotContainingBlock,
70 SvgForeignContent: CssAtomSet::_MozSvgForeignContent,
71 SvgMarkerAnonChild: CssAtomSet::_MozSvgMarkerAnonChild,
72 SvgOuterSvgAnonChild: CssAtomSet::_MozSvgOuterSvgAnonChild,
73 SvgText: CssAtomSet::_MozSvgText,
74 Table: CssAtomSet::_MozTable,
75 TableCell: CssAtomSet::_MozTableCell,
76 TableColumn: CssAtomSet::_MozTableColumn,
77 TableColumnGroup: CssAtomSet::_MozTableColumnGroup,
78 TableOuter: CssAtomSet::_MozTableOuter,
79 TableRow: CssAtomSet::_MozTableRow,
80 TableRowGroup: CssAtomSet::_MozTableRowGroup,
81 TableWrapper: CssAtomSet::_MozTableWrapper,
82 Text: CssAtomSet::_MozText,
83 TextControlEditingRoot: CssAtomSet::_MozTextControlEditingRoot,
84 TextControlPreview: CssAtomSet::_MozTextControlPreview,
85 TreeCell: CssAtomSet::_MozTreeCell,
86 TreeCheckbox: CssAtomSet::_MozTreeCheckbox,
87 TreeSeparator: CssAtomSet::_MozTreeSeparator,
88 VframesetBorder: CssAtomSet::_MozVframesetBorder,
89 Viewport: CssAtomSet::_MozViewport,
90 ViewportScroll: CssAtomSet::_MozViewportScroll,
91 }
92);
93
94#[node]
95#[derive(Peek, ToCursors, ToSpan, SemanticEq, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
96#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
97#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
98#[derive(csskit_derives::NodeWithMetadata)]
99pub enum MozFunctionalPseudoElement<'a> {
100 TreeCell(
101 T![::],
102 #[atom(CssAtomSet::TreeCell)] T![Function],
103 CommaSeparated<'a, T![Ident]>,
104 #[semantic_eq(skip)] T![')'],
105 ),
106 TreeCellText(
107 T![::],
108 #[atom(CssAtomSet::TreeCellText)] T![Function],
109 CommaSeparated<'a, T![Ident]>,
110 #[semantic_eq(skip)] T![')'],
111 ),
112 TreeCheckbox(
113 T![::],
114 #[atom(CssAtomSet::TreeCheckbox)] T![Function],
115 CommaSeparated<'a, T![Ident]>,
116 #[semantic_eq(skip)] T![')'],
117 ),
118 TreeColumn(
119 T![::],
120 #[atom(CssAtomSet::TreeColumn)] T![Function],
121 CommaSeparated<'a, T![Ident]>,
122 #[semantic_eq(skip)] T![')'],
123 ),
124 TreeDropFeedback(
125 T![::],
126 #[atom(CssAtomSet::TreeDropFeedback)] T![Function],
127 CommaSeparated<'a, T![Ident]>,
128 #[semantic_eq(skip)] T![')'],
129 ),
130 TreeImage(
131 T![::],
132 #[atom(CssAtomSet::TreeImage)] T![Function],
133 CommaSeparated<'a, T![Ident]>,
134 #[semantic_eq(skip)] T![')'],
135 ),
136 TreeIndentation(
137 T![::],
138 #[atom(CssAtomSet::TreeIndentation)] T![Function],
139 CommaSeparated<'a, T![Ident]>,
140 #[semantic_eq(skip)] T![')'],
141 ),
142 TreeLine(
143 T![::],
144 #[atom(CssAtomSet::TreeLine)] T![Function],
145 CommaSeparated<'a, T![Ident]>,
146 #[semantic_eq(skip)] T![')'],
147 ),
148 TreeRow(
149 T![::],
150 #[atom(CssAtomSet::TreeRow)] T![Function],
151 CommaSeparated<'a, T![Ident]>,
152 #[semantic_eq(skip)] T![')'],
153 ),
154 TreeSeparator(
155 T![::],
156 #[atom(CssAtomSet::TreeSeparator)] T![Function],
157 CommaSeparated<'a, T![Ident]>,
158 #[semantic_eq(skip)] T![')'],
159 ),
160 TreeTwisty(
161 T![::],
162 #[atom(CssAtomSet::TreeTwisty)] T![Function],
163 CommaSeparated<'a, T![Ident]>,
164 #[semantic_eq(skip)] T![')'],
165 ),
166}
167
168#[node]
169#[derive(Parse, Peek, ToCursors, ToSpan, 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(skip))]
172#[derive(csskit_derives::NodeWithMetadata)]
173pub enum MozFunctionalPseudoElementKeyword {
174 #[atom(CssAtomSet::_MozTreeCell)]
175 TreeCell(T![Function]),
176 #[atom(CssAtomSet::_MozTreeCellText)]
177 TreeCellText(T![Function]),
178 #[atom(CssAtomSet::_MozTreeCheckbox)]
179 TreeCheckbox(T![Function]),
180 #[atom(CssAtomSet::_MozTreeColumn)]
181 TreeColumn(T![Function]),
182 #[atom(CssAtomSet::_MozTreeDropFeedback)]
183 TreeDropFeedback(T![Function]),
184 #[atom(CssAtomSet::_MozTreeImage)]
185 TreeImage(T![Function]),
186 #[atom(CssAtomSet::_MozTreeIndentation)]
187 TreeIndentation(T![Function]),
188 #[atom(CssAtomSet::_MozTreeLine)]
189 TreeLine(T![Function]),
190 #[atom(CssAtomSet::_MozTreeRow)]
191 TreeRow(T![Function]),
192 #[atom(CssAtomSet::_MozTreeSeparator)]
193 TreeSeparator(T![Function]),
194 #[atom(CssAtomSet::_MozTreeTwisty)]
195 TreeTwisty(T![Function]),
196}
197impl<'a> Parse<'a> for MozFunctionalPseudoElement<'a> {
198 fn parse<I>(p: &mut Parser<'a, I>) -> ParserResult<Self>
199 where
200 I: Iterator<Item = Cursor> + Clone,
201 {
202 let colons = p.parse::<T![::]>()?;
203 let keyword = p.parse::<MozFunctionalPseudoElementKeyword>()?;
204 let items = p.parse::<CommaSeparated<'a, T![Ident]>>()?;
205 let close = p.parse::<T![')']>()?;
206 Ok(match keyword {
207 MozFunctionalPseudoElementKeyword::TreeCell(function) => Self::TreeCell(colons, function, items, close),
208 MozFunctionalPseudoElementKeyword::TreeCellText(function) => {
209 Self::TreeCellText(colons, function, items, close)
210 }
211 MozFunctionalPseudoElementKeyword::TreeCheckbox(function) => {
212 Self::TreeCheckbox(colons, function, items, close)
213 }
214 MozFunctionalPseudoElementKeyword::TreeColumn(function) => Self::TreeColumn(colons, function, items, close),
215 MozFunctionalPseudoElementKeyword::TreeDropFeedback(function) => {
216 Self::TreeDropFeedback(colons, function, items, close)
217 }
218 MozFunctionalPseudoElementKeyword::TreeImage(function) => Self::TreeImage(colons, function, items, close),
219 MozFunctionalPseudoElementKeyword::TreeIndentation(function) => {
220 Self::TreeIndentation(colons, function, items, close)
221 }
222 MozFunctionalPseudoElementKeyword::TreeLine(function) => Self::TreeLine(colons, function, items, close),
223 MozFunctionalPseudoElementKeyword::TreeRow(function) => Self::TreeRow(colons, function, items, close),
224 MozFunctionalPseudoElementKeyword::TreeSeparator(function) => {
225 Self::TreeSeparator(colons, function, items, close)
226 }
227 MozFunctionalPseudoElementKeyword::TreeTwisty(function) => Self::TreeTwisty(colons, function, items, close),
228 })
229 }
230}
231
232pseudo_class!(
233 #[node]
234 #[derive(ToCursors, ToSpan, SemanticEq, Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
236 #[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
237 #[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
238#[derive(csskit_derives::NodeWithMetadata)]
239 pub enum MozPseudoClass {
240 Any: CssAtomSet::_MozAny,
241 AnyLink: CssAtomSet::_MozAnyLink,
242 AutofillPreview: CssAtomSet::_MozAutofillPreview,
243 Broken: CssAtomSet::_MozBroken,
244 DevtoolsHighlighted: CssAtomSet::_MozDevtoolsHighlighted,
245 DirAttrLikeAuto: CssAtomSet::_MozDirAttrLikeAuto,
246 DirAttrLtr: CssAtomSet::_MozDirAttrLtr,
247 DirAttrRtl: CssAtomSet::_MozDirAttrRtl,
248 DragOver: CssAtomSet::_MozDragOver,
249 FirstNode: CssAtomSet::_MozFirstNode,
250 FocusRing: CssAtomSet::_MozFocusring,
251 FullScreen: CssAtomSet::_MozFullScreen,
252 FullScreenAncestor: CssAtomSet::_MozFullScreenAncestor,
253 HandlerBlocked: CssAtomSet::_MozHandlerBlocked,
254 HandlerCrashed: CssAtomSet::_MozHandlerCrashed,
255 HandlerDisabled: CssAtomSet::_MozHandlerDisabled,
256 HasDirAttr: CssAtomSet::_MozHasDirAttr,
257 Inert: CssAtomSet::_MozInert,
258 IsHtml: CssAtomSet::_MozIsHtml,
259 LastNode: CssAtomSet::_MozLastNode,
260 Loading: CssAtomSet::_MozLoading,
261 LwTheme: CssAtomSet::_MozLwtheme,
262 LwThemeBrighttext: CssAtomSet::_MozLwthemeBrighttext,
263 LwThemeDarktext: CssAtomSet::_MozLwthemeDarktext,
264 MathIncrementScriptLevel: CssAtomSet::_MozMathIncrementScriptLevel,
265 MeterOptimum: CssAtomSet::_MozMeterOptimum,
266 MeterSubOptimum: CssAtomSet::_MozMeterSubOptimum,
267 MeterSubSubOptimum: CssAtomSet::_MozMeterSubSubOptimum,
268 NativeAnonymous: CssAtomSet::_MozNativeAnonymous,
269 OnlyWhitespace: CssAtomSet::_MozOnlyWhitespace,
270 Placeholder: CssAtomSet::_MozPlaceholder,
271 PlaceholderShown: CssAtomSet::_MozPlaceholderShown,
272 ReadOnly: CssAtomSet::_MozReadOnly,
273 ReadWrite: CssAtomSet::_MozReadWrite,
274 Revealed: CssAtomSet::_MozRevealed,
275 SelectListBox: CssAtomSet::_MozSelectListBox,
276 SubmitInvalid: CssAtomSet::_MozSubmitInvalid,
277 StyleeditorTransitioning: CssAtomSet::_MozStyleeditorTransitioning,
278 Suppressed: CssAtomSet::_MozSuppressed,
279 SuppressForPrintSelection: CssAtomSet::_MozSuppressForPrintSelection,
280 TableBorderNonzero: CssAtomSet::_MozTableBorderNonzero,
281 TopmostModal: CssAtomSet::_MozTopmostModal,
282 UiInvalid: CssAtomSet::_MozUiInvalid,
283 UiValid: CssAtomSet::_MozUiValid,
284 UserDisabled: CssAtomSet::_MozUserDisabled,
285 ValueEmpty: CssAtomSet::_MozValueEmpty,
286 WindowInactive: CssAtomSet::_MozWindowInactive,
287 }
288);
289#[node]
290#[derive(ToCursors, ToSpan, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
291#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
292#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit)]
293#[derive(csskit_derives::NodeWithMetadata)]
294pub enum MozFunctionalPseudoClass {
295 LocaleDir(MozLocaleDirFunctionalPseudoClass),
296}
297
298impl<'a> Parse<'a> for MozFunctionalPseudoClass {
299 fn parse<I>(p: &mut Parser<'a, I>) -> ParserResult<Self>
300 where
301 I: Iterator<Item = Cursor> + Clone,
302 {
303 let colon = p.parse::<T![:]>()?;
304 let function = p.parse::<T![Function]>()?;
305 let c: Cursor = function.into();
306 if p.equals_atom(c, &CssAtomSet::_MozLocaleDir) {
307 let value = p.parse::<DirValue>()?;
308 let close = p.parse_if_peek::<T![')']>()?;
309 Ok(Self::LocaleDir(MozLocaleDirFunctionalPseudoClass { colon, function, value, close }))
310 } else {
311 Err(Diagnostic::new(c, Diagnostic::unexpected_function))?
312 }
313 }
314}
315
316#[node]
317#[derive(ToCursors, ToSpan, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
318#[cfg_attr(feature = "serde", derive(serde::Serialize), serde())]
319#[cfg_attr(feature = "visitable", derive(csskit_derives::Visitable), visit(self))]
320#[derive(csskit_derives::NodeWithMetadata)]
321pub struct MozLocaleDirFunctionalPseudoClass {
322 pub colon: T![:],
323 pub function: T![Function],
324 pub value: DirValue,
325 pub close: Option<T![')']>,
326}
327
328#[cfg(test)]
329mod tests {
330 use super::*;
331 use crate::CssAtomSet;
332 use css_parse::assert_parse;
333
334 #[test]
335 fn test_writes() {
336 assert_parse!(CssAtomSet::ATOMS, MozPseudoElement, "::-moz-anonymous-block");
337 assert_parse!(CssAtomSet::ATOMS, MozPseudoElement, "::-moz-meter-bar");
338 assert_parse!(CssAtomSet::ATOMS, MozPseudoElement, "::-moz-file-content");
339 assert_parse!(CssAtomSet::ATOMS, MozPseudoElement, "::-moz-svg-outer-svg-anon-child");
340 assert_parse!(CssAtomSet::ATOMS, MozFunctionalPseudoElement, "::-moz-tree-twisty(selected,focus)");
341 assert_parse!(CssAtomSet::ATOMS, MozFunctionalPseudoElement, "::-moz-tree-drop-feedback(selected)");
342 assert_parse!(CssAtomSet::ATOMS, MozFunctionalPseudoElement, "::-moz-tree-indentation(selected)");
343 assert_parse!(CssAtomSet::ATOMS, MozPseudoClass, ":-moz-meter-optimum");
344 assert_parse!(CssAtomSet::ATOMS, MozPseudoClass, ":-moz-meter-sub-optimum");
345 assert_parse!(CssAtomSet::ATOMS, MozPseudoClass, ":-moz-meter-sub-sub-optimum");
346 assert_parse!(CssAtomSet::ATOMS, MozPseudoClass, ":-moz-placeholder");
347 assert_parse!(CssAtomSet::ATOMS, MozPseudoClass, ":-moz-autofill-preview");
348 }
349}