diff options
-rw-r--r-- | components/layout_thread/lib.rs | 6 | ||||
-rw-r--r-- | components/style/data.rs | 35 | ||||
-rw-r--r-- | components/style/matching.rs | 4 | ||||
-rw-r--r-- | components/style/traversal.rs | 43 |
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); } } |