layout: Tidy a bit style pseudo-elements stuff

This commit is contained in:
Emilio Cobos Álvarez 2016-04-23 14:36:20 +02:00
parent 5a43c7e3cd
commit 979c3a54b9
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
2 changed files with 45 additions and 43 deletions

View file

@ -650,6 +650,16 @@ impl<T> PseudoElementType<T> {
PseudoElementType::DetailsContent(_) => PseudoElementType::DetailsContent(()),
}
}
pub fn style_pseudo_element(&self) -> PseudoElement {
match *self {
PseudoElementType::Normal => unreachable!("style_pseudo_element called with PseudoElementType::Normal"),
PseudoElementType::Before(_) => PseudoElement::Before,
PseudoElementType::After(_) => PseudoElement::After,
PseudoElementType::DetailsSummary(_) => PseudoElement::DetailsSummary,
PseudoElementType::DetailsContent(_) => PseudoElement::DetailsContent,
}
}
}
/// A thread-safe version of `LayoutNode`, used during flow construction. This type of layout
@ -768,37 +778,31 @@ 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() {
PseudoElementType::Normal => {
Ref::map(self.borrow_layout_data().unwrap(), |data| {
data.style_data.style.as_ref().unwrap()
})
},
other => {
// Precompute non-eagerly-cascaded pseudo-element styles if not
// cached before.
let style_pseudo = other.style_pseudo_element();
if !style_pseudo.is_eagerly_cascaded() &&
!self.borrow_layout_data().unwrap().style_data.per_pseudo.contains_key(&style_pseudo) {
let mut data = self.mutate_layout_data().unwrap();
let new_style = data.style_data
.precomputed
.computed_values_for(&PseudoElement::DetailsContent,
.computed_values_for(&style_pseudo,
data.style_data.style.as_ref());
data.style_data.per_pseudo.insert(PseudoElement::DetailsContent, new_style.unwrap());
data.style_data.per_pseudo.insert(style_pseudo.clone(), new_style.unwrap());
}
}
_ => {},
};
Ref::map(self.borrow_layout_data().unwrap(), |data| {
let style = match self.get_pseudo_element_type() {
PseudoElementType::Before(_)
=> data.style_data.per_pseudo.get(&PseudoElement::Before),
PseudoElementType::After(_)
=> data.style_data.per_pseudo.get(&PseudoElement::After),
PseudoElementType::DetailsSummary(_)
=> data.style_data.per_pseudo.get(&PseudoElement::DetailsSummary),
PseudoElementType::DetailsContent(_)
=> data.style_data.per_pseudo.get(&PseudoElement::DetailsContent),
PseudoElementType::Normal
=> data.style_data.style.as_ref(),
};
style.unwrap()
})
Ref::map(self.borrow_layout_data().unwrap(), |data| {
data.style_data.per_pseudo.get(&style_pseudo).unwrap()
})
}
}
}
#[inline]
@ -817,21 +821,12 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq {
let mut data = self.mutate_layout_data().unwrap();
match self.get_pseudo_element_type() {
PseudoElementType::Before(_) => {
data.style_data.per_pseudo.remove(&PseudoElement::Before);
}
PseudoElementType::After(_) => {
data.style_data.per_pseudo.remove(&PseudoElement::After);
}
PseudoElementType::DetailsSummary(_) => {
data.style_data.per_pseudo.remove(&PseudoElement::DetailsSummary);
}
PseudoElementType::DetailsContent(_) => {
data.style_data.per_pseudo.remove(&PseudoElement::DetailsContent);
}
PseudoElementType::Normal => {
data.style_data.style = None;
}
other => {
data.style_data.per_pseudo.remove(&other.style_pseudo_element());
}
};
}

View file

@ -56,6 +56,19 @@ pub enum PseudoElement {
DetailsContent,
}
impl PseudoElement {
#[inline]
pub fn is_eagerly_cascaded(&self) -> bool {
match *self {
PseudoElement::Before |
PseudoElement::After |
PseudoElement::Selection |
PseudoElement::DetailsSummary => true,
PseudoElement::DetailsContent => false,
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, HeapSizeOf, Hash)]
pub enum NonTSPseudoClass {
AnyLink,
@ -161,13 +174,7 @@ impl SelectorImplExt for ServoSelectorImpl {
#[inline]
fn is_eagerly_cascaded_pseudo_element(pseudo: &PseudoElement) -> bool {
match *pseudo {
PseudoElement::Before |
PseudoElement::After |
PseudoElement::Selection |
PseudoElement::DetailsSummary => true,
PseudoElement::DetailsContent => false,
}
pseudo.is_eagerly_cascaded()
}
#[inline]