diff options
Diffstat (limited to 'components/layout_2020/dom_traversal.rs')
-rw-r--r-- | components/layout_2020/dom_traversal.rs | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/components/layout_2020/dom_traversal.rs b/components/layout_2020/dom_traversal.rs index 2e1d81ad8fb..a41bead9d0f 100644 --- a/components/layout_2020/dom_traversal.rs +++ b/components/layout_2020/dom_traversal.rs @@ -5,6 +5,7 @@ use crate::cell::ArcRefCell; use crate::context::LayoutContext; use crate::element_data::{LayoutBox, LayoutDataForElement}; +use crate::fragment_tree::{BaseFragmentInfo, FragmentFlags, Tag}; use crate::geom::PhysicalSize; use crate::replaced::{CanvasInfo, CanvasSource, ReplacedContent}; use crate::style_ext::{Display, DisplayGeneratingBox, DisplayInside, DisplayOutside}; @@ -74,6 +75,31 @@ impl<Node: Clone> NodeAndStyleInfo<Node> { } } +impl<'dom, Node> From<&NodeAndStyleInfo<Node>> for BaseFragmentInfo +where + Node: NodeExt<'dom>, +{ + fn from(info: &NodeAndStyleInfo<Node>) -> Self { + let pseudo = info.pseudo_element_type.map(|pseudo| match pseudo { + WhichPseudoElement::Before => PseudoElement::Before, + WhichPseudoElement::After => PseudoElement::After, + }); + + let threadsafe_node = info.node.to_threadsafe(); + let flags = match threadsafe_node.as_element() { + Some(element) if element.is_body_element_of_html_element_root() => { + FragmentFlags::IS_BODY_ELEMENT_OF_HTML_ELEMENT_ROOT + }, + _ => FragmentFlags::empty(), + }; + + Self { + tag: Tag::new_pseudo(threadsafe_node.opaque(), pseudo), + flags, + } + } +} + pub(super) enum Contents { /// Refers to a DOM subtree, plus `::before` and `::after` pseudo-elements. OfElement, |