diff options
author | Martin Robinson <mrobinson@igalia.com> | 2024-06-21 12:13:31 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-21 10:13:31 +0000 |
commit | 66edef806579fd0b386f4ceba473e6a9f7d0ca34 (patch) | |
tree | 830c4bb55c77f933ccd7808c91491c76c3ee85b1 /components/layout_2020/dom_traversal.rs | |
parent | 44064b14392838fd7da148000b58c9a3cc07d4e7 (diff) | |
download | servo-66edef806579fd0b386f4ceba473e6a9f7d0ca34.tar.gz servo-66edef806579fd0b386f4ceba473e6a9f7d0ca34.zip |
layout: Simplify `Contents` a little (#32487)
Instead of duplicating some of `NonReplacedContents` in `Contents`,
divide it into either replaced and non-replaced content, since this is
how the layout system processes `Contents` always. In addition, stop
using `TryInto` to match replaced or non-replaced contents, as it is
quite confusing to handle an `Err` as a success case.
Diffstat (limited to 'components/layout_2020/dom_traversal.rs')
-rw-r--r-- | components/layout_2020/dom_traversal.rs | 47 |
1 files changed, 21 insertions, 26 deletions
diff --git a/components/layout_2020/dom_traversal.rs b/components/layout_2020/dom_traversal.rs index 10ae9ae3978..7d9be02634e 100644 --- a/components/layout_2020/dom_traversal.rs +++ b/components/layout_2020/dom_traversal.rs @@ -122,20 +122,19 @@ where #[derive(Debug)] pub(super) enum Contents { - /// Refers to a DOM subtree, plus `::before` and `::after` pseudo-elements. - OfElement, - + /// Any kind of content that is not replaced, including the contents of pseudo-elements. + NonReplaced(NonReplacedContents), /// Example: an `<img src=…>` element. /// <https://drafts.csswg.org/css2/conform.html#replaced-element> Replaced(ReplacedContent), - - /// Content of a `::before` or `::after` pseudo-element that is being generated. - /// <https://drafts.csswg.org/css2/generate.html#content> - OfPseudoElement(Vec<PseudoElementContentItem>), } +#[derive(Debug)] pub(super) enum NonReplacedContents { + /// Refers to a DOM subtree, plus `::before` and `::after` pseudo-elements. OfElement, + /// Content of a `::before` or `::after` pseudo-element that is being generated. + /// <https://drafts.csswg.org/css2/generate.html#content> OfPseudoElement(Vec<PseudoElementContentItem>), } @@ -221,7 +220,8 @@ fn traverse_element<'dom, Node>( } }, Display::GeneratingBox(display) => { - let contents = replaced.map_or(Contents::OfElement, Contents::Replaced); + let contents = + replaced.map_or(NonReplacedContents::OfElement.into(), Contents::Replaced); let display = display.used_value_for_contents(&contents); let box_slot = element.element_box_slot(); let info = NodeAndStyleInfo::new(element, style); @@ -251,7 +251,7 @@ fn traverse_pseudo_element<'dom, Node>( Display::GeneratingBox(display) => { let items = generate_pseudo_element_content(&info.style, element, context); let box_slot = element.pseudo_element_box_slot(which); - let contents = Contents::OfPseudoElement(items); + let contents = NonReplacedContents::OfPseudoElement(items).into(); handler.handle_element(&info, display, contents, box_slot); }, } @@ -310,30 +310,25 @@ fn traverse_pseudo_element_contents<'dom, Node>( impl Contents { /// Returns true iff the `try_from` impl below would return `Err(_)` pub fn is_replaced(&self) -> bool { - match self { - Contents::OfElement | Contents::OfPseudoElement(_) => false, - Contents::Replaced(_) => true, - } + matches!(self, Contents::Replaced(_)) } } -impl std::convert::TryFrom<Contents> for NonReplacedContents { - type Error = ReplacedContent; - - fn try_from(contents: Contents) -> Result<Self, Self::Error> { - match contents { - Contents::OfElement => Ok(NonReplacedContents::OfElement), - Contents::OfPseudoElement(items) => Ok(NonReplacedContents::OfPseudoElement(items)), - Contents::Replaced(replaced) => Err(replaced), - } +impl From<NonReplacedContents> for Contents { + fn from(non_replaced_contents: NonReplacedContents) -> Self { + Contents::NonReplaced(non_replaced_contents) } } -impl From<NonReplacedContents> for Contents { - fn from(contents: NonReplacedContents) -> Self { +impl std::convert::TryFrom<Contents> for NonReplacedContents { + type Error = &'static str; + + fn try_from(contents: Contents) -> Result<Self, Self::Error> { match contents { - NonReplacedContents::OfElement => Contents::OfElement, - NonReplacedContents::OfPseudoElement(items) => Contents::OfPseudoElement(items), + Contents::NonReplaced(non_replaced_contents) => Ok(non_replaced_contents), + Contents::Replaced(_) => { + Err("Tried to covnert a `Contents::Replaced` into `NonReplacedContent`") + }, } } } |