geckolib: Make anon-box PEs an ADT.

This commit is contained in:
Emilio Cobos Álvarez 2016-04-29 23:16:24 +02:00
parent 9caaa6004e
commit 18c1fee3c7
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C

View file

@ -22,7 +22,13 @@ pub enum PseudoElement {
FirstLine, FirstLine,
// TODO: Probably a few more are missing here // TODO: Probably a few more are missing here
// https://mxr.mozilla.org/mozilla-central/source/layout/style/nsCSSAnonBoxList.h AnonBox(AnonBoxPseudoElement),
}
// https://mxr.mozilla.org/mozilla-central/source/layout/style/nsCSSAnonBoxList.h
#[derive(Clone, Debug, PartialEq, Eq, HeapSizeOf, Hash)]
pub enum AnonBoxPseudoElement {
MozNonElement, MozNonElement,
MozAnonymousBlock, MozAnonymousBlock,
MozAnonymousPositionedBlock, MozAnonymousPositionedBlock,
@ -89,36 +95,6 @@ pub enum PseudoElement {
MozSVGText, MozSVGText,
} }
impl PseudoElement {
fn is_anon_box_pseudo(&self) -> bool {
use self::PseudoElement::*;
match *self {
MozNonElement | MozAnonymousBlock | MozAnonymousPositionedBlock |
MozMathMLAnonymousBlock | MozXULAnonymousBlock |
MozHorizontalFramesetBorder | MozVerticalFramesetBorder |
MozLineFrame | MozButtonContent | MozButtonLabel | MozCellContent |
MozDropdownList | MozFieldsetContent | MozFramesetBlank |
MozDisplayComboboxControlFrame |
MozHTMLCanvasContent | MozInlineTable | MozTable | MozTableCell |
MozTableColumnGroup | MozTableColumn | MozTableOuter |
MozTableRowGroup | MozTableRow | MozCanvas | MozPageBreak |
MozPage | MozPageContent | MozPageSequence | MozScrolledContent |
MozScrolledCanvas | MozScrolledPageSequence | MozColumnContent |
MozViewport | MozViewportScroll | MozAnonymousFlexItem |
MozAnonymousGridItem | MozRuby | MozRubyBase |
MozRubyBaseContainer | MozRubyText | MozRubyTextContainer |
MozTreeColumn | MozTreeRow | MozTreeSeparator | MozTreeCell |
MozTreeIndentation | MozTreeLine | MozTreeTwisty | MozTreeImage |
MozTreeCellText | MozTreeCheckbox | MozTreeProgressMeter |
MozTreeDropFeedback | MozSVGMarkerAnonChild |
MozSVGOuterSVGAnonChild | MozSVGForeignContent |
MozSVGText => true,
_ => false,
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, HeapSizeOf, Hash)] #[derive(Clone, Debug, PartialEq, Eq, HeapSizeOf, Hash)]
pub enum NonTSPseudoClass { pub enum NonTSPseudoClass {
AnyLink, AnyLink,
@ -183,6 +159,7 @@ impl SelectorImpl for GeckoSelectorImpl {
fn parse_pseudo_element(context: &ParserContext, fn parse_pseudo_element(context: &ParserContext,
name: &str) -> Result<PseudoElement, ()> { name: &str) -> Result<PseudoElement, ()> {
use self::AnonBoxPseudoElement::*;
use self::PseudoElement::*; use self::PseudoElement::*;
// The braces here are unfortunate, but they're needed for // The braces here are unfortunate, but they're needed for
@ -198,7 +175,7 @@ impl SelectorImpl for GeckoSelectorImpl {
return Err(()) return Err(())
} }
Ok(match_ignore_ascii_case! { name, Ok(AnonBox(match_ignore_ascii_case! { name,
"-moz-non-element" => MozNonElement, "-moz-non-element" => MozNonElement,
"-moz-anonymous-block" => MozAnonymousBlock, "-moz-anonymous-block" => MozAnonymousBlock,
@ -265,7 +242,7 @@ impl SelectorImpl for GeckoSelectorImpl {
"-moz-svg-text" => MozSVGText, "-moz-svg-text" => MozSVGText,
_ => return Err(()) _ => return Err(())
}) }))
} }
} }
@ -277,87 +254,85 @@ impl SelectorImplExt for GeckoSelectorImpl {
match *pseudo { match *pseudo {
PseudoElement::Before | PseudoElement::Before |
PseudoElement::After => PseudoElementCascadeType::Eager, PseudoElement::After => PseudoElementCascadeType::Eager,
_ => { PseudoElement::AnonBox(_) => PseudoElementCascadeType::Precomputed,
if pseudo.is_anon_box_pseudo() { _ => PseudoElementCascadeType::Lazy,
PseudoElementCascadeType::Precomputed
} else {
PseudoElementCascadeType::Lazy
}
}
} }
} }
#[inline] #[inline]
fn each_pseudo_element<F>(mut fun: F) fn each_pseudo_element<F>(mut fun: F)
where F: FnMut(PseudoElement) { where F: FnMut(PseudoElement) {
fun(PseudoElement::Before); use self::PseudoElement::*;
fun(PseudoElement::After); use self::AnonBoxPseudoElement::*;
fun(PseudoElement::FirstLine);
fun(PseudoElement::MozNonElement); fun(Before);
fun(PseudoElement::MozAnonymousBlock); fun(After);
fun(PseudoElement::MozAnonymousPositionedBlock); fun(FirstLine);
fun(PseudoElement::MozMathMLAnonymousBlock);
fun(PseudoElement::MozXULAnonymousBlock);
fun(PseudoElement::MozHorizontalFramesetBorder); fun(AnonBox(MozNonElement));
fun(PseudoElement::MozVerticalFramesetBorder); fun(AnonBox(MozAnonymousBlock));
fun(PseudoElement::MozLineFrame); fun(AnonBox(MozAnonymousPositionedBlock));
fun(PseudoElement::MozButtonContent); fun(AnonBox(MozMathMLAnonymousBlock));
fun(PseudoElement::MozButtonLabel); fun(AnonBox(MozXULAnonymousBlock));
fun(PseudoElement::MozCellContent);
fun(PseudoElement::MozDropdownList);
fun(PseudoElement::MozFieldsetContent);
fun(PseudoElement::MozFramesetBlank);
fun(PseudoElement::MozDisplayComboboxControlFrame);
fun(PseudoElement::MozHTMLCanvasContent); fun(AnonBox(MozHorizontalFramesetBorder));
fun(PseudoElement::MozInlineTable); fun(AnonBox(MozVerticalFramesetBorder));
fun(PseudoElement::MozTable); fun(AnonBox(MozLineFrame));
fun(PseudoElement::MozTableCell); fun(AnonBox(MozButtonContent));
fun(PseudoElement::MozTableColumnGroup); fun(AnonBox(MozButtonLabel));
fun(PseudoElement::MozTableColumn); fun(AnonBox(MozCellContent));
fun(PseudoElement::MozTableOuter); fun(AnonBox(MozDropdownList));
fun(PseudoElement::MozTableRowGroup); fun(AnonBox(MozFieldsetContent));
fun(PseudoElement::MozTableRow); fun(AnonBox(MozFramesetBlank));
fun(AnonBox(MozDisplayComboboxControlFrame));
fun(PseudoElement::MozCanvas); fun(AnonBox(MozHTMLCanvasContent));
fun(PseudoElement::MozPageBreak); fun(AnonBox(MozInlineTable));
fun(PseudoElement::MozPage); fun(AnonBox(MozTable));
fun(PseudoElement::MozPageContent); fun(AnonBox(MozTableCell));
fun(PseudoElement::MozPageSequence); fun(AnonBox(MozTableColumnGroup));
fun(PseudoElement::MozScrolledContent); fun(AnonBox(MozTableColumn));
fun(PseudoElement::MozScrolledCanvas); fun(AnonBox(MozTableOuter));
fun(PseudoElement::MozScrolledPageSequence); fun(AnonBox(MozTableRowGroup));
fun(PseudoElement::MozColumnContent); fun(AnonBox(MozTableRow));
fun(PseudoElement::MozViewport);
fun(PseudoElement::MozViewportScroll);
fun(PseudoElement::MozAnonymousFlexItem);
fun(PseudoElement::MozAnonymousGridItem);
fun(PseudoElement::MozRuby); fun(AnonBox(MozCanvas));
fun(PseudoElement::MozRubyBase); fun(AnonBox(MozPageBreak));
fun(PseudoElement::MozRubyBaseContainer); fun(AnonBox(MozPage));
fun(PseudoElement::MozRubyText); fun(AnonBox(MozPageContent));
fun(PseudoElement::MozRubyTextContainer); fun(AnonBox(MozPageSequence));
fun(AnonBox(MozScrolledContent));
fun(AnonBox(MozScrolledCanvas));
fun(AnonBox(MozScrolledPageSequence));
fun(AnonBox(MozColumnContent));
fun(AnonBox(MozViewport));
fun(AnonBox(MozViewportScroll));
fun(AnonBox(MozAnonymousFlexItem));
fun(AnonBox(MozAnonymousGridItem));
fun(PseudoElement::MozTreeColumn); fun(AnonBox(MozRuby));
fun(PseudoElement::MozTreeRow); fun(AnonBox(MozRubyBase));
fun(PseudoElement::MozTreeSeparator); fun(AnonBox(MozRubyBaseContainer));
fun(PseudoElement::MozTreeCell); fun(AnonBox(MozRubyText));
fun(PseudoElement::MozTreeIndentation); fun(AnonBox(MozRubyTextContainer));
fun(PseudoElement::MozTreeLine);
fun(PseudoElement::MozTreeTwisty);
fun(PseudoElement::MozTreeImage);
fun(PseudoElement::MozTreeCellText);
fun(PseudoElement::MozTreeCheckbox);
fun(PseudoElement::MozTreeProgressMeter);
fun(PseudoElement::MozTreeDropFeedback);
fun(PseudoElement::MozSVGMarkerAnonChild); fun(AnonBox(MozTreeColumn));
fun(PseudoElement::MozSVGOuterSVGAnonChild); fun(AnonBox(MozTreeRow));
fun(PseudoElement::MozSVGForeignContent); fun(AnonBox(MozTreeSeparator));
fun(PseudoElement::MozSVGText); fun(AnonBox(MozTreeCell));
fun(AnonBox(MozTreeIndentation));
fun(AnonBox(MozTreeLine));
fun(AnonBox(MozTreeTwisty));
fun(AnonBox(MozTreeImage));
fun(AnonBox(MozTreeCellText));
fun(AnonBox(MozTreeCheckbox));
fun(AnonBox(MozTreeProgressMeter));
fun(AnonBox(MozTreeDropFeedback));
fun(AnonBox(MozSVGMarkerAnonChild));
fun(AnonBox(MozSVGOuterSVGAnonChild));
fun(AnonBox(MozSVGForeignContent));
fun(AnonBox(MozSVGText));
} }
#[inline] #[inline]