From 49bdb5bb4ea4110a3096bbf763bb43aab9806983 Mon Sep 17 00:00:00 2001 From: Bobby Holley Date: Tue, 8 Aug 2017 19:08:27 -0700 Subject: [PATCH] Be more careful about the flags we clear for forgetful traversals. MozReview-Commit-ID: ETDL8KsInAn --- components/style/data.rs | 21 +++++++++++++++------ components/style/traversal.rs | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/components/style/data.rs b/components/style/data.rs index 07870fad7a6..38099cb6eb6 100644 --- a/components/style/data.rs +++ b/components/style/data.rs @@ -69,14 +69,23 @@ impl RestyleData { } /// Clear all the restyle state associated with this element. - fn clear(&mut self) { - *self = Self::new(); + /// + /// FIXME(bholley): The only caller of this should probably just assert that + /// the hint is empty and call clear_flags_and_damage(). + fn clear_restyle_state(&mut self) { + self.clear_restyle_flags_and_damage(); + self.hint = RestyleHint::empty(); } /// Clear restyle flags and damage. - fn clear_flags_and_damage(&mut self) { + /// + /// Note that we don't touch the TRAVERSED_WITHOUT_STYLING bit, which gets + /// set to the correct value on each traversal. There's no reason anyone + /// needs to clear it, and clearing it accidentally mid-traversal could + /// cause incorrect style sharing behavior. + fn clear_restyle_flags_and_damage(&mut self) { self.damage = RestyleDamage::empty(); - self.flags = RestyleFlags::empty(); + self.flags = self.flags & TRAVERSED_WITHOUT_STYLING; } /// Returns whether this element or any ancestor is going to be @@ -420,12 +429,12 @@ impl ElementData { /// Drops any restyle state from the element. pub fn clear_restyle_state(&mut self) { - self.restyle.clear(); + self.restyle.clear_restyle_state(); } /// Drops restyle flags and damage from the element. pub fn clear_restyle_flags_and_damage(&mut self) { - self.restyle.clear_flags_and_damage(); + self.restyle.clear_restyle_flags_and_damage(); } } diff --git a/components/style/traversal.rs b/components/style/traversal.rs index a430ad22ad7..c0e795f13a1 100644 --- a/components/style/traversal.rs +++ b/components/style/traversal.rs @@ -603,7 +603,7 @@ where // data here, since we won't need to perform a post-traversal to pick up // any change hints. if flags.contains(traversal_flags::Forgetful) { - data.clear_restyle_state(); + data.clear_restyle_flags_and_damage(); } // There are two cases when we want to clear the dity descendants bit here