layout: Don't force to overwrite display for pseudo-elements.

This commit is contained in:
Emilio Cobos Álvarez 2016-04-24 19:12:40 +02:00
parent 2a499d5a0b
commit cf5c090576
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
3 changed files with 42 additions and 43 deletions

View file

@ -1507,11 +1507,13 @@ impl<'a, ConcreteThreadSafeLayoutNode> PostorderNodeMutTraversal<ConcreteThreadS
// Pseudo-element. // Pseudo-element.
let style = node.style(self.style_context()); let style = node.style(self.style_context());
let display = match node.get_pseudo_element_type() { let display = match node.get_pseudo_element_type() {
PseudoElementType::Normal => display::T::inline, PseudoElementType::Normal
PseudoElementType::Before(display) => display, => display::T::inline,
PseudoElementType::After(display) => display, PseudoElementType::Before(maybe_display) |
PseudoElementType::DetailsContent(display) => display, PseudoElementType::After(maybe_display) |
PseudoElementType::DetailsSummary(display) => 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) (display, style.get_box().float, style.get_box().position)
} }

View file

@ -671,7 +671,7 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq {
/// Creates a new `ThreadSafeLayoutNode` for the same `LayoutNode` /// Creates a new `ThreadSafeLayoutNode` for the same `LayoutNode`
/// with a different pseudo-element type. /// with a different pseudo-element type.
fn with_pseudo(&self, pseudo: PseudoElementType<display::T>) -> Self; fn with_pseudo(&self, pseudo: PseudoElementType<Option<display::T>>) -> Self;
/// Converts self into an `OpaqueNode`. /// Converts self into an `OpaqueNode`.
fn opaque(&self) -> OpaqueNode; fn opaque(&self) -> OpaqueNode;
@ -695,26 +695,28 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq {
fn as_element(&self) -> Self::ConcreteThreadSafeLayoutElement; fn as_element(&self) -> Self::ConcreteThreadSafeLayoutElement;
#[inline] #[inline]
fn get_pseudo_element_type(&self) -> PseudoElementType<display::T>; fn get_pseudo_element_type(&self) -> PseudoElementType<Option<display::T>>;
#[inline] #[inline]
fn get_before_pseudo(&self) -> Option<Self> { fn get_before_pseudo(&self) -> Option<Self> {
self.borrow_layout_data().unwrap() if self.borrow_layout_data().unwrap()
.style_data.per_pseudo .style_data.per_pseudo
.get(&PseudoElement::Before) .contains_key(&PseudoElement::Before) {
.map(|style| { Some(self.with_pseudo(PseudoElementType::Before(None)))
self.with_pseudo(PseudoElementType::Before(style.get_box().display)) } else {
}) None
}
} }
#[inline] #[inline]
fn get_after_pseudo(&self) -> Option<Self> { fn get_after_pseudo(&self) -> Option<Self> {
self.borrow_layout_data().unwrap() if self.borrow_layout_data().unwrap()
.style_data.per_pseudo .style_data.per_pseudo
.get(&PseudoElement::After) .contains_key(&PseudoElement::After) {
.map(|style| { Some(self.with_pseudo(PseudoElementType::After(None)))
self.with_pseudo(PseudoElementType::After(style.get_box().display)) } else {
}) None
}
} }
#[inline] #[inline]
@ -722,12 +724,7 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq {
if self.is_element() && if self.is_element() &&
self.as_element().get_local_name() == &atom!("details") && self.as_element().get_local_name() == &atom!("details") &&
self.as_element().get_namespace() == &ns!(html) { self.as_element().get_namespace() == &ns!(html) {
self.borrow_layout_data().unwrap() Some(self.with_pseudo(PseudoElementType::DetailsSummary(None)))
.style_data.per_pseudo
.get(&PseudoElement::DetailsSummary)
.map(|style| {
self.with_pseudo(PseudoElementType::DetailsSummary(style.get_box().display))
})
} else { } else {
None None
} }
@ -735,22 +732,18 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq {
#[inline] #[inline]
fn get_details_content_pseudo(&self) -> Option<Self> { fn get_details_content_pseudo(&self) -> Option<Self> {
if !self.is_element() { if self.is_element() &&
return None; 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() {
let element = self.as_element(); None // Specified by the stylesheet
if element.get_local_name() != &atom!("details") || } else {
element.get_namespace() != &ns!(html) { Some(display::T::none)
return None; };
} Some(self.with_pseudo(PseudoElementType::DetailsContent(display)))
let display = if element.get_attr(&ns!(), &atom!("open")).is_some() {
display::T::block
} else { } else {
display::T::none None
}; }
Some(self.with_pseudo(PseudoElementType::DetailsContent(display)))
} }
/// Borrows the layout data immutably. Fails on a conflicting borrow. /// Borrows the layout data immutably. Fails on a conflicting borrow.
@ -933,7 +926,9 @@ pub struct ServoThreadSafeLayoutNode<'ln> {
/// The wrapped node. /// The wrapped node.
node: ServoLayoutNode<'ln>, node: ServoLayoutNode<'ln>,
pseudo: PseudoElementType<display::T>, /// The pseudo-element type, with (optionally),
/// an specified display value to override the stylesheet.
pseudo: PseudoElementType<Option<display::T>>,
} }
impl<'a> PartialEq for ServoThreadSafeLayoutNode<'a> { impl<'a> PartialEq for ServoThreadSafeLayoutNode<'a> {
@ -983,7 +978,8 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> {
type ConcreteThreadSafeLayoutElement = ServoThreadSafeLayoutElement<'ln>; type ConcreteThreadSafeLayoutElement = ServoThreadSafeLayoutElement<'ln>;
type ChildrenIterator = ThreadSafeLayoutNodeChildrenIterator<Self>; type ChildrenIterator = ThreadSafeLayoutNodeChildrenIterator<Self>;
fn with_pseudo(&self, pseudo: PseudoElementType<display::T>) -> ServoThreadSafeLayoutNode<'ln> { fn with_pseudo(&self,
pseudo: PseudoElementType<Option<display::T>>) -> ServoThreadSafeLayoutNode<'ln> {
ServoThreadSafeLayoutNode { ServoThreadSafeLayoutNode {
node: self.node.clone(), node: self.node.clone(),
pseudo: pseudo, pseudo: pseudo,
@ -1028,7 +1024,7 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> {
} }
} }
fn get_pseudo_element_type(&self) -> PseudoElementType<display::T> { fn get_pseudo_element_type(&self) -> PseudoElementType<Option<display::T>> {
self.pseudo self.pseudo
} }

View file

@ -54,6 +54,7 @@ details[open]::-servo-details-summary {
*|*::-servo-details-content { *|*::-servo-details-content {
margin-left: 40px; margin-left: 40px;
overflow: hidden; overflow: hidden;
display: block;
} }
/* /*
* Until servo supports svg properly, make sure to at least prevent svg * Until servo supports svg properly, make sure to at least prevent svg