mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
layout: Don't force to overwrite display for pseudo-elements.
This commit is contained in:
parent
2a499d5a0b
commit
cf5c090576
3 changed files with 42 additions and 43 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue