aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <me@emiliocobos.me>2016-04-23 14:36:20 +0200
committerEmilio Cobos Álvarez <me@emiliocobos.me>2016-04-29 22:54:47 +0200
commit979c3a54b9469049d12ad1d391a8b21a42e6fa13 (patch)
tree23e59a7a50dce51eaaed9200b9b8bd68aa5875bc /components
parent5a43c7e3cd7997ad09a5abc7d162237a737f331e (diff)
downloadservo-979c3a54b9469049d12ad1d391a8b21a42e6fa13.tar.gz
servo-979c3a54b9469049d12ad1d391a8b21a42e6fa13.zip
layout: Tidy a bit style pseudo-elements stuff
Diffstat (limited to 'components')
-rw-r--r--components/layout/wrapper.rs67
-rw-r--r--components/style/selector_impl.rs21
2 files changed, 45 insertions, 43 deletions
diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs
index 9a92e8b9816..9c96ec557e3 100644
--- a/components/layout/wrapper.rs
+++ b/components/layout/wrapper.rs
@@ -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());
+ }
};
}
diff --git a/components/style/selector_impl.rs b/components/style/selector_impl.rs
index f25b364dda1..7c9f7d3be89 100644
--- a/components/style/selector_impl.rs
+++ b/components/style/selector_impl.rs
@@ -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]