aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/layout_thread/lib.rs6
-rw-r--r--components/style/data.rs35
-rw-r--r--components/style/matching.rs4
-rw-r--r--components/style/traversal.rs43
4 files changed, 30 insertions, 58 deletions
diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs
index 364ce2745ac..f381caed992 100644
--- a/components/layout_thread/lib.rs
+++ b/components/layout_thread/lib.rs
@@ -111,9 +111,9 @@ use std::thread;
use style::animation::Animation;
use style::context::{QuirksMode, ReflowGoal, SharedStyleContext};
use style::context::{StyleSystemOptions, ThreadLocalStyleContextCreationInfo};
-use style::data::StoredRestyleHint;
use style::dom::{ShowSubtree, ShowSubtreeDataAndPrimaryValues, TElement, TNode};
use style::error_reporting::{NullReporter, RustLogReporter};
+use style::invalidation::element::restyle_hints::RestyleHint;
use style::logical_geometry::LogicalPoint;
use style::media_queries::{Device, MediaList, MediaType};
use style::selector_parser::SnapshotMap;
@@ -1119,7 +1119,7 @@ impl LayoutThread {
let el = node.as_element().unwrap();
if let Some(mut d) = element.mutate_data() {
if d.has_styles() {
- d.ensure_restyle().hint.insert(StoredRestyleHint::subtree());
+ d.ensure_restyle().hint.insert(RestyleHint::restyle_subtree());
}
}
if let Some(p) = el.parent_element() {
@@ -1155,7 +1155,7 @@ impl LayoutThread {
if needs_dirtying {
if let Some(mut d) = element.mutate_data() {
if d.has_styles() {
- d.ensure_restyle().hint.insert(StoredRestyleHint::subtree());
+ d.ensure_restyle().hint.insert(RestyleHint::restyle_subtree());
}
}
}
diff --git a/components/style/data.rs b/components/style/data.rs
index 2ab5e6e0e34..46d9fe8afe0 100644
--- a/components/style/data.rs
+++ b/components/style/data.rs
@@ -357,19 +357,12 @@ pub struct RestyleData {
/// for this element, its children, and its descendants.
pub hint: RestyleHint,
+ /// Whether we reframed/reconstructed any ancestor or self.
+ pub reconstructed_ancestor: bool,
+
/// The restyle damage, indicating what kind of layout changes are required
/// afte restyling.
pub damage: RestyleDamage,
-
- /// The restyle damage that has already been handled by our ancestors, and does
- /// not need to be applied again at this element. Only non-empty during the
- /// traversal, once ancestor damage has been calculated.
- ///
- /// Note that this optimization mostly makes sense in terms of Gecko's top-down
- /// frame constructor and change list processing model. We don't bother with it
- /// for Servo for now.
- #[cfg(feature = "gecko")]
- pub damage_handled: RestyleDamage,
}
impl RestyleData {
@@ -377,28 +370,6 @@ impl RestyleData {
pub fn has_invalidations(&self) -> bool {
self.hint.has_self_invalidations()
}
-
- /// Returns damage handled.
- #[cfg(feature = "gecko")]
- pub fn damage_handled(&self) -> RestyleDamage {
- self.damage_handled
- }
-
- /// Returns damage handled (always empty for servo).
- #[cfg(feature = "servo")]
- pub fn damage_handled(&self) -> RestyleDamage {
- RestyleDamage::empty()
- }
-
- /// Sets damage handled.
- #[cfg(feature = "gecko")]
- pub fn set_damage_handled(&mut self, d: RestyleDamage) {
- self.damage_handled = d;
- }
-
- /// Sets damage handled. No-op for Servo.
- #[cfg(feature = "servo")]
- pub fn set_damage_handled(&mut self, _: RestyleDamage) {}
}
/// Style system data associated with an Element.
diff --git a/components/style/matching.rs b/components/style/matching.rs
index 7866aea0a22..e10c19baaca 100644
--- a/components/style/matching.rs
+++ b/components/style/matching.rs
@@ -697,8 +697,8 @@ trait PrivateMatchMethods: TElement {
// for followup work to make the optimization here more optimal by considering
// each bit individually.
let skip_applying_damage =
- restyle.damage_handled.contains(RestyleDamage::reconstruct()) ||
- restyle.damage.contains(RestyleDamage::reconstruct());
+ restyle.damage.contains(RestyleDamage::reconstruct()) ||
+ restyle.reconstructed_ancestor;
let difference = self.compute_style_difference(&old_values,
&new_values,
diff --git a/components/style/traversal.rs b/components/style/traversal.rs
index c3e8e9ce251..9f085cfe374 100644
--- a/components/style/traversal.rs
+++ b/components/style/traversal.rs
@@ -297,8 +297,8 @@ pub trait DomTraversal<E: TElement> : Sync {
if let Some(parent) = el.traversal_parent() {
let parent_data = parent.borrow_data().unwrap();
let going_to_reframe = parent_data.get_restyle().map_or(false, |r| {
- (r.damage | r.damage_handled())
- .contains(RestyleDamage::reconstruct())
+ r.reconstructed_ancestor ||
+ r.damage.contains(RestyleDamage::reconstruct())
});
let mut is_before_or_after_pseudo = false;
@@ -730,14 +730,16 @@ pub fn recalc_style_at<E, D>(traversal: &D,
DontLog) &&
(has_dirty_descendants_for_this_restyle ||
!propagated_hint.is_empty()) {
- let damage_handled = data.get_restyle().map_or(RestyleDamage::empty(), |r| {
- r.damage_handled() | r.damage.handled_for_descendants()
+ let reconstructed_ancestor = data.get_restyle().map_or(false, |r| {
+ r.reconstructed_ancestor ||
+ r.damage.contains(RestyleDamage::reconstruct())
});
-
- preprocess_children::<E, D>(context,
- element,
- propagated_hint,
- damage_handled);
+ preprocess_children::<E, D>(
+ context,
+ element,
+ propagated_hint,
+ reconstructed_ancestor,
+ )
}
// If we are in a restyle for reconstruction, drop the existing restyle
@@ -840,12 +842,15 @@ fn compute_style<E, D>(_traversal: &D,
}
}
-fn preprocess_children<E, D>(context: &mut StyleContext<E>,
- element: E,
- propagated_hint: RestyleHint,
- damage_handled: RestyleDamage)
- where E: TElement,
- D: DomTraversal<E>,
+fn preprocess_children<E, D>(
+ context: &mut StyleContext<E>,
+ element: E,
+ propagated_hint: RestyleHint,
+ reconstructed_ancestor: bool,
+)
+where
+ E: TElement,
+ D: DomTraversal<E>,
{
trace!("preprocess_children: {:?}", element);
@@ -880,9 +885,7 @@ fn preprocess_children<E, D>(context: &mut StyleContext<E>,
// If the child doesn't have pre-existing RestyleData and we don't have
// any reason to create one, avoid the useless allocation and move on to
// the next child.
- if propagated_hint.is_empty() &&
- damage_handled.is_empty() &&
- !child_data.has_restyle() {
+ if !reconstructed_ancestor && propagated_hint.is_empty() && !child_data.has_restyle() {
continue;
}
@@ -890,10 +893,8 @@ fn preprocess_children<E, D>(context: &mut StyleContext<E>,
// Propagate the parent restyle hint, that may make us restyle the whole
// subtree.
+ restyle_data.reconstructed_ancestor = reconstructed_ancestor;
restyle_data.hint.insert(propagated_hint);
-
- // Store the damage already handled by ancestors.
- restyle_data.set_damage_handled(damage_handled);
}
}