From 053a3d5a5a8fee080ebc83a71182c3ef8b85cc47 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 23 Sep 2019 10:54:36 +0200 Subject: [PATCH] Handle anonymous style in traverse_pseudo_element_contents --- components/layout_2020/dom_traversal.rs | 54 +++++++++++++++---------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/components/layout_2020/dom_traversal.rs b/components/layout_2020/dom_traversal.rs index b3a58cb2ade..c1ac55c2bfb 100644 --- a/components/layout_2020/dom_traversal.rs +++ b/components/layout_2020/dom_traversal.rs @@ -14,6 +14,7 @@ use std::marker::PhantomData as marker; use style::context::SharedStyleContext; use style::dom::TNode; use style::properties::ComputedValues; +use style::selector_parser::PseudoElement; #[derive(Clone, Copy)] pub(super) enum WhichPseudoElement { @@ -130,7 +131,7 @@ fn traverse_pseudo_element<'dom, Node>( Display::Contents => { element.unset_pseudo_element_box(which); let items = generate_pseudo_element_content(&style, element, context); - traverse_pseudo_element_contents(&style, items, handler); + traverse_pseudo_element_contents(&style, context, handler, items); }, Display::GeneratingBox(display) => { let items = generate_pseudo_element_content(&style, element, context); @@ -144,33 +145,42 @@ fn traverse_pseudo_element<'dom, Node>( fn traverse_pseudo_element_contents<'dom, Node>( pseudo_element_style: &Arc, - items: Vec, + context: &SharedStyleContext, handler: &mut impl TraversalHandler<'dom, Node>, + items: Vec, ) where - Node: 'dom, + Node: NodeExt<'dom>, { - // let mut anonymous_style = None; + let mut anonymous_style = None; for item in items { match item { PseudoElementContentItem::Text(text) => handler.handle_text(text, pseudo_element_style), PseudoElementContentItem::Replaced(contents) => { - // FIXME - // let item_style = anonymous_style.get_or_insert_with(|| { - // ComputedValues::anonymous_inheriting_from(Some(pseudo_element_style)) - // }); - // let display_inline = DisplayGeneratingBox::OutsideInside { - // outside: DisplayOutside::Inline, - // inside: DisplayInside::Flow, - // }; - // // `display` is not inherited, so we get the initial value - // debug_assert!(item_style.box_.display == Display::GeneratingBox(display_inline)); - // handler.handle_element( - // item_style, - // display_inline, - // Contents::Replaced(contents), - // // We don’t keep pointers to boxes generated by contents of pseudo-elements - // BoxSlot::dummy(), - // ) + let item_style = anonymous_style.get_or_insert_with(|| { + context + .stylist + .style_for_anonymous::( + &context.guards, + &PseudoElement::ServoText, + &pseudo_element_style, + ) + }); + let display_inline = DisplayGeneratingBox::OutsideInside { + outside: DisplayOutside::Inline, + inside: DisplayInside::Flow, + }; + // `display` is not inherited, so we get the initial value + debug_assert!( + Display::from(item_style.get_box().display) == + Display::GeneratingBox(display_inline) + ); + handler.handle_element( + item_style, + display_inline, + Contents::Replaced(contents), + // We don’t keep pointers to boxes generated by contents of pseudo-elements + BoxSlot::dummy(), + ) }, } } @@ -210,7 +220,7 @@ where match self { NonReplacedContents::OfElement(node) => traverse_children_of(node, context, handler), NonReplacedContents::OfPseudoElement(items) => { - traverse_pseudo_element_contents(inherited_style, items, handler) + traverse_pseudo_element_contents(inherited_style, context, handler, items) }, } }