style: Allow inheritance when computing anonymous box styles

This is used a lot by Gecko, not still for servo though.
This commit is contained in:
Emilio Cobos Álvarez 2016-04-23 14:08:49 +02:00
parent 3563ecb770
commit 5a43c7e3cd
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
4 changed files with 56 additions and 31 deletions

View file

@ -738,8 +738,8 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq {
self.borrow_layout_data().unwrap()
.style_data
.precomputed
.non_eagerly_cascaded_pseudo_elements
.get(&PseudoElement::DetailsContent)
.computed_values_for(&PseudoElement::DetailsContent,
Some(&*self.style()))
.map(|style| {
let display = if element.get_attr(&ns!(), &atom!("open")).is_some() {
style.get_box().display
@ -768,6 +768,22 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq {
/// Unlike the version on TNode, this handles pseudo-elements.
#[inline]
fn style(&self) -> Ref<Arc<ServoComputedValues>> {
// Precompute anonymous-box pseudo-element style if not cached.
match self.get_pseudo_element_type() {
PseudoElementType::DetailsContent(_) => {
if self.borrow_layout_data().unwrap()
.style_data.per_pseudo.get(&PseudoElement::DetailsContent).is_none() {
let mut data = self.mutate_layout_data().unwrap();
let new_style = data.style_data
.precomputed
.computed_values_for(&PseudoElement::DetailsContent,
data.style_data.style.as_ref());
data.style_data.per_pseudo.insert(PseudoElement::DetailsContent, new_style.unwrap());
}
}
_ => {},
};
Ref::map(self.borrow_layout_data().unwrap(), |data| {
let style = match self.get_pseudo_element_type() {
PseudoElementType::Before(_)
@ -777,10 +793,7 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq {
PseudoElementType::DetailsSummary(_)
=> data.style_data.per_pseudo.get(&PseudoElement::DetailsSummary),
PseudoElementType::DetailsContent(_)
=> data.style_data
.precomputed
.non_eagerly_cascaded_pseudo_elements
.get(&PseudoElement::DetailsContent),
=> data.style_data.per_pseudo.get(&PseudoElement::DetailsContent),
PseudoElementType::Normal
=> data.style_data.style.as_ref(),
};
@ -791,7 +804,9 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq {
#[inline]
fn selected_style(&self) -> Ref<Arc<ServoComputedValues>> {
Ref::map(self.borrow_layout_data().unwrap(), |data| {
data.style_data.per_pseudo.get(&PseudoElement::Selection).unwrap_or(data.style_data.style.as_ref().unwrap())
data.style_data.per_pseudo
.get(&PseudoElement::Selection)
.unwrap_or(data.style_data.style.as_ref().unwrap())
})
}
@ -814,7 +829,6 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq {
PseudoElementType::DetailsContent(_) => {
data.style_data.per_pseudo.remove(&PseudoElement::DetailsContent);
}
PseudoElementType::Normal => {
data.style_data.style = None;
}