diff options
author | Hiroyuki Ikezoe <hikezoe@mozilla.com> | 2017-09-25 13:49:39 +0900 |
---|---|---|
committer | Hiroyuki Ikezoe <hikezoe@mozilla.com> | 2017-09-25 13:53:30 +0900 |
commit | aefea7230f77face8643203d2b3c29a0f4907637 (patch) | |
tree | f533b1b67e2c21a4773344d0b532d055cb475f67 | |
parent | fd0295ead241147bf31390cc812cc5eb1c18b751 (diff) | |
download | servo-aefea7230f77face8643203d2b3c29a0f4907637.tar.gz servo-aefea7230f77face8643203d2b3c29a0f4907637.zip |
Handle display property change from 'none' only if there is restyle hint for SMIL
We only need to handle changes when the display property is changed from 'none'
when we have a restyle hint for SMIL. The only other case where we expect to
see changes to display property during an animation are from using the CSSOM.
However, when the display property is changed from 'none' by the CSSOM, during
the animation-only restyle we can skip all descendants since they will be
traversed in the subsequent normal traversal because at that time we flush
style sheets and traverse all elements in the document. So we don't need to
care about the descendants during animation-only restyle.
-rw-r--r-- | components/style/matching.rs | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/components/style/matching.rs b/components/style/matching.rs index 9e54ae9c299..8d96de06b9e 100644 --- a/components/style/matching.rs +++ b/components/style/matching.rs @@ -186,6 +186,9 @@ trait PrivateMatchMethods: TElement { use context::DISPLAY_CHANGED_FROM_NONE_FOR_SMIL; use properties::longhands::display::computed_value as display; + debug_assert!(restyle_hints.intersects(RESTYLE_SMIL), + "Should have restyle hint for SMIL"); + let display_changed_from_none = old_values.map_or(false, |old| { let old_display_style = old.get_box().clone_display(); let new_display_style = new_values.get_box().clone_display(); @@ -219,10 +222,12 @@ trait PrivateMatchMethods: TElement { use context::UpdateAnimationsTasks; if context.shared.traversal_flags.for_animation_only() { - self.handle_display_change_for_smil_if_needed(context, - old_values.as_ref().map(|v| &**v), - new_values, - restyle_hint); + if restyle_hint.intersects(RESTYLE_SMIL) { + self.handle_display_change_for_smil_if_needed(context, + old_values.as_ref().map(|v| &**v), + new_values, + restyle_hint); + } return; } |