aboutsummaryrefslogtreecommitdiffstats
path: root/components/script_layout_interface
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <emilio@crisal.io>2017-05-21 17:35:47 +0200
committerEmilio Cobos Álvarez <emilio@crisal.io>2017-05-21 17:40:33 +0200
commita8fe5d65d4bd620416b37dc8718f3b272edbaced (patch)
treec5412153e688882f6f15b8589a84dee7b8d441d1 /components/script_layout_interface
parent3d40b516c8ac6e946cadace2378581cbac7b1e1b (diff)
downloadservo-a8fe5d65d4bd620416b37dc8718f3b272edbaced.tar.gz
servo-a8fe5d65d4bd620416b37dc8718f3b272edbaced.zip
layout: Stop mutating the style data from layout.
This is part of #16982. Right now we have some code that tries to cache stuff in the style data during layout. This code is extremely rarely executed, only for `<details>` and `<summary>`. I think if we really really want to cache these, we should find a place in the layout data for it. For now, let's move it away (and all the other layout code) from mutating the style data from layout.
Diffstat (limited to 'components/script_layout_interface')
-rw-r--r--components/script_layout_interface/wrapper_traits.rs73
1 files changed, 28 insertions, 45 deletions
diff --git a/components/script_layout_interface/wrapper_traits.rs b/components/script_layout_interface/wrapper_traits.rs
index 40b719f6dbd..2a59e6f768e 100644
--- a/components/script_layout_interface/wrapper_traits.rs
+++ b/components/script_layout_interface/wrapper_traits.rs
@@ -8,7 +8,7 @@ use HTMLCanvasData;
use LayoutNodeType;
use OpaqueStyleAndLayoutData;
use SVGSVGData;
-use atomic_refcell::AtomicRefCell;
+use atomic_refcell::AtomicRef;
use gfx_traits::{ByteIndex, FragmentType, combine_id_with_fragment_type};
use html5ever::{Namespace, LocalName};
use msg::constellation_msg::{BrowsingContextId, PipelineId};
@@ -338,18 +338,14 @@ pub trait ThreadSafeLayoutElement: Clone + Copy + Sized + Debug +
fn get_attr_enum(&self, namespace: &Namespace, name: &LocalName) -> Option<&AttrValue>;
- fn get_style_data(&self) -> Option<&AtomicRefCell<ElementData>>;
+ fn style_data(&self) -> AtomicRef<ElementData>;
#[inline]
fn get_pseudo_element_type(&self) -> PseudoElementType<Option<display::T>>;
#[inline]
fn get_before_pseudo(&self) -> Option<Self> {
- if self.get_style_data()
- .unwrap()
- .borrow()
- .styles().pseudos
- .has(&PseudoElement::Before) {
+ if self.style_data().styles().pseudos.has(&PseudoElement::Before) {
Some(self.with_pseudo(PseudoElementType::Before(None)))
} else {
None
@@ -358,11 +354,7 @@ pub trait ThreadSafeLayoutElement: Clone + Copy + Sized + Debug +
#[inline]
fn get_after_pseudo(&self) -> Option<Self> {
- if self.get_style_data()
- .unwrap()
- .borrow()
- .styles().pseudos
- .has(&PseudoElement::After) {
+ if self.style_data().styles().pseudos.has(&PseudoElement::After) {
Some(self.with_pseudo(PseudoElementType::After(None)))
} else {
None
@@ -400,50 +392,41 @@ pub trait ThreadSafeLayoutElement: Clone + Copy + Sized + Debug +
/// Unlike the version on TNode, this handles pseudo-elements.
#[inline]
fn style(&self, context: &SharedStyleContext) -> Arc<ServoComputedValues> {
+ let data = self.style_data();
match self.get_pseudo_element_type() {
- PseudoElementType::Normal => self.get_style_data().unwrap().borrow()
- .styles().primary.values().clone(),
+ PseudoElementType::Normal => {
+ data.styles().primary.values().clone()
+ },
other => {
// Precompute non-eagerly-cascaded pseudo-element styles if not
// cached before.
let style_pseudo = other.style_pseudo_element();
- let mut data = self.get_style_data().unwrap().borrow_mut();
match style_pseudo.cascade_type() {
// Already computed during the cascade.
PseudoElementCascadeType::Eager => {
- data.styles().pseudos.get(&style_pseudo)
+ self.style_data()
+ .styles().pseudos.get(&style_pseudo)
.unwrap().values().clone()
},
PseudoElementCascadeType::Precomputed => {
- if !data.styles().cached_pseudos.contains_key(&style_pseudo) {
- let new_style =
- context.stylist.precomputed_values_for_pseudo(
- &context.guards,
- &style_pseudo,
- Some(data.styles().primary.values()),
- CascadeFlags::empty(),
- &ServoMetricsProvider);
- data.styles_mut().cached_pseudos
- .insert(style_pseudo.clone(), new_style);
- }
- data.styles().cached_pseudos.get(&style_pseudo)
- .unwrap().values().clone()
+ context.stylist.precomputed_values_for_pseudo(
+ &context.guards,
+ &style_pseudo,
+ Some(data.styles().primary.values()),
+ CascadeFlags::empty(),
+ &ServoMetricsProvider)
+ .values().clone()
}
PseudoElementCascadeType::Lazy => {
- if !data.styles().cached_pseudos.contains_key(&style_pseudo) {
- let new_style =
- context.stylist
- .lazily_compute_pseudo_element_style(
- &context.guards,
- unsafe { &self.unsafe_get() },
- &style_pseudo,
- data.styles().primary.values(),
- &ServoMetricsProvider);
- data.styles_mut().cached_pseudos
- .insert(style_pseudo.clone(), new_style.unwrap());
- }
- data.styles().cached_pseudos.get(&style_pseudo)
- .unwrap().values().clone()
+ context.stylist
+ .lazily_compute_pseudo_element_style(
+ &context.guards,
+ unsafe { &self.unsafe_get() },
+ &style_pseudo,
+ data.styles().primary.values(),
+ &ServoMetricsProvider)
+ .unwrap()
+ .values().clone()
}
}
}
@@ -452,7 +435,7 @@ pub trait ThreadSafeLayoutElement: Clone + Copy + Sized + Debug +
#[inline]
fn selected_style(&self) -> Arc<ServoComputedValues> {
- let data = self.get_style_data().unwrap().borrow();
+ let data = self.style_data();
data.styles().pseudos
.get(&PseudoElement::Selection).map(|s| s)
.unwrap_or(&data.styles().primary)
@@ -468,7 +451,7 @@ pub trait ThreadSafeLayoutElement: Clone + Copy + Sized + Debug +
/// element style is precomputed, not from general layout itself.
#[inline]
fn resolved_style(&self) -> Arc<ServoComputedValues> {
- let data = self.get_style_data().unwrap().borrow();
+ let data = self.style_data();
match self.get_pseudo_element_type() {
PseudoElementType::Normal
=> data.styles().primary.values().clone(),