diff --git a/components/layout/construct.rs b/components/layout/construct.rs index 876e7545957..873be2b2743 100644 --- a/components/layout/construct.rs +++ b/components/layout/construct.rs @@ -1507,11 +1507,13 @@ impl<'a, ConcreteThreadSafeLayoutNode> PostorderNodeMutTraversal display::T::inline, - PseudoElementType::Before(display) => display, - PseudoElementType::After(display) => display, - PseudoElementType::DetailsContent(display) => display, - PseudoElementType::DetailsSummary(display) => display, + PseudoElementType::Normal + => display::T::inline, + PseudoElementType::Before(maybe_display) | + PseudoElementType::After(maybe_display) | + PseudoElementType::DetailsContent(maybe_display) | + PseudoElementType::DetailsSummary(maybe_display) + => maybe_display.unwrap_or(style.get_box().display), }; (display, style.get_box().float, style.get_box().position) } diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index 3912af79eac..c31bf7e31b8 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -671,7 +671,7 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq { /// Creates a new `ThreadSafeLayoutNode` for the same `LayoutNode` /// with a different pseudo-element type. - fn with_pseudo(&self, pseudo: PseudoElementType) -> Self; + fn with_pseudo(&self, pseudo: PseudoElementType>) -> Self; /// Converts self into an `OpaqueNode`. fn opaque(&self) -> OpaqueNode; @@ -695,26 +695,28 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq { fn as_element(&self) -> Self::ConcreteThreadSafeLayoutElement; #[inline] - fn get_pseudo_element_type(&self) -> PseudoElementType; + fn get_pseudo_element_type(&self) -> PseudoElementType>; #[inline] fn get_before_pseudo(&self) -> Option { - self.borrow_layout_data().unwrap() - .style_data.per_pseudo - .get(&PseudoElement::Before) - .map(|style| { - self.with_pseudo(PseudoElementType::Before(style.get_box().display)) - }) + if self.borrow_layout_data().unwrap() + .style_data.per_pseudo + .contains_key(&PseudoElement::Before) { + Some(self.with_pseudo(PseudoElementType::Before(None))) + } else { + None + } } #[inline] fn get_after_pseudo(&self) -> Option { - self.borrow_layout_data().unwrap() - .style_data.per_pseudo - .get(&PseudoElement::After) - .map(|style| { - self.with_pseudo(PseudoElementType::After(style.get_box().display)) - }) + if self.borrow_layout_data().unwrap() + .style_data.per_pseudo + .contains_key(&PseudoElement::After) { + Some(self.with_pseudo(PseudoElementType::After(None))) + } else { + None + } } #[inline] @@ -722,12 +724,7 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq { if self.is_element() && self.as_element().get_local_name() == &atom!("details") && self.as_element().get_namespace() == &ns!(html) { - self.borrow_layout_data().unwrap() - .style_data.per_pseudo - .get(&PseudoElement::DetailsSummary) - .map(|style| { - self.with_pseudo(PseudoElementType::DetailsSummary(style.get_box().display)) - }) + Some(self.with_pseudo(PseudoElementType::DetailsSummary(None))) } else { None } @@ -735,22 +732,18 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq { #[inline] fn get_details_content_pseudo(&self) -> Option { - if !self.is_element() { - return None; - } - - let element = self.as_element(); - if element.get_local_name() != &atom!("details") || - element.get_namespace() != &ns!(html) { - return None; - } - - let display = if element.get_attr(&ns!(), &atom!("open")).is_some() { - display::T::block + if self.is_element() && + self.as_element().get_local_name() == &atom!("details") && + self.as_element().get_namespace() == &ns!(html) { + let display = if self.as_element().get_attr(&ns!(), &atom!("open")).is_some() { + None // Specified by the stylesheet + } else { + Some(display::T::none) + }; + Some(self.with_pseudo(PseudoElementType::DetailsContent(display))) } else { - display::T::none - }; - Some(self.with_pseudo(PseudoElementType::DetailsContent(display))) + None + } } /// Borrows the layout data immutably. Fails on a conflicting borrow. @@ -933,7 +926,9 @@ pub struct ServoThreadSafeLayoutNode<'ln> { /// The wrapped node. node: ServoLayoutNode<'ln>, - pseudo: PseudoElementType, + /// The pseudo-element type, with (optionally), + /// an specified display value to override the stylesheet. + pseudo: PseudoElementType>, } impl<'a> PartialEq for ServoThreadSafeLayoutNode<'a> { @@ -983,7 +978,8 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> { type ConcreteThreadSafeLayoutElement = ServoThreadSafeLayoutElement<'ln>; type ChildrenIterator = ThreadSafeLayoutNodeChildrenIterator; - fn with_pseudo(&self, pseudo: PseudoElementType) -> ServoThreadSafeLayoutNode<'ln> { + fn with_pseudo(&self, + pseudo: PseudoElementType>) -> ServoThreadSafeLayoutNode<'ln> { ServoThreadSafeLayoutNode { node: self.node.clone(), pseudo: pseudo, @@ -1028,7 +1024,7 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> { } } - fn get_pseudo_element_type(&self) -> PseudoElementType { + fn get_pseudo_element_type(&self) -> PseudoElementType> { self.pseudo } diff --git a/resources/servo.css b/resources/servo.css index 25e41f82f04..0ef23b8f86d 100644 --- a/resources/servo.css +++ b/resources/servo.css @@ -54,6 +54,7 @@ details[open]::-servo-details-summary { *|*::-servo-details-content { margin-left: 40px; overflow: hidden; + display: block; } /* * Until servo supports svg properly, make sure to at least prevent svg