diff options
author | Michael Howell <michael@notriddle.com> | 2016-07-27 10:39:48 -0700 |
---|---|---|
committer | Michael Howell <michael@notriddle.com> | 2016-07-28 11:22:20 -0700 |
commit | 6a37877734614bc2f494f9cfae062c8ebb94a983 (patch) | |
tree | d0d631323fbcf0e7c15b0c60d69067062ad2efa5 | |
parent | 3afa150cd8ef9f1d370ed425399aa0e1f42b339e (diff) | |
download | servo-6a37877734614bc2f494f9cfae062c8ebb94a983.tar.gz servo-6a37877734614bc2f494f9cfae062c8ebb94a983.zip |
Complete animations whether or not cascade is done
Fixes #12554
-rw-r--r-- | components/style/animation.rs | 26 | ||||
-rw-r--r-- | components/style/matching.rs | 21 | ||||
-rw-r--r-- | components/style/traversal.rs | 9 |
3 files changed, 37 insertions, 19 deletions
diff --git a/components/style/animation.rs b/components/style/animation.rs index c36cde3caea..a4600418023 100644 --- a/components/style/animation.rs +++ b/components/style/animation.rs @@ -668,3 +668,29 @@ where Damage: TRestyleDamage { } } } + +/// Update the style in the node when it finishes. +pub fn complete_expired_transitions(node: OpaqueNode, style: &mut Arc<ComputedValues>, + context: &SharedStyleContext) -> bool { + let had_animations_to_expire; + { + let all_expired_animations = context.expired_animations.read().unwrap(); + let animations_to_expire = all_expired_animations.get(&node); + had_animations_to_expire = animations_to_expire.is_some(); + if let Some(ref animations) = animations_to_expire { + for animation in *animations { + // TODO: support animation-fill-mode + if let Animation::Transition(_, _, ref frame, _) = *animation { + frame.property_animation.update(Arc::make_mut(style), 1.0); + } + } + } + } + + if had_animations_to_expire { + context.expired_animations.write().unwrap().remove(&node); + } + + had_animations_to_expire +} + diff --git a/components/style/matching.rs b/components/style/matching.rs index 2c4dfc990cd..2cd51352355 100644 --- a/components/style/matching.rs +++ b/components/style/matching.rs @@ -466,25 +466,8 @@ trait PrivateMatchMethods: TNode // Finish any expired transitions. let this_opaque = self.opaque(); - let had_animations_to_expire; - { - let all_expired_animations = context.expired_animations.read().unwrap(); - let animations_to_expire = all_expired_animations.get(&this_opaque); - had_animations_to_expire = animations_to_expire.is_some(); - if let Some(ref animations) = animations_to_expire { - for animation in *animations { - // NB: Expiring a keyframes animation is the same as not - // applying the keyframes style to it, so we're safe. - if let Animation::Transition(_, _, ref frame, _) = *animation { - frame.property_animation.update(Arc::make_mut(style), 1.0); - } - } - } - } - - if had_animations_to_expire { - context.expired_animations.write().unwrap().remove(&this_opaque); - } + let had_animations_to_expire = + animation::complete_expired_transitions(this_opaque, style, context); // Merge any running transitions into the current style, and cancel them. let had_running_animations = context.running_animations diff --git a/components/style/traversal.rs b/components/style/traversal.rs index 76f8539c72f..496680843a6 100644 --- a/components/style/traversal.rs +++ b/components/style/traversal.rs @@ -4,6 +4,7 @@ //! Traversing the DOM tree; the bloom filter. +use animation; use context::{SharedStyleContext, StyleContext}; use dom::{OpaqueNode, TElement, TNode, TRestyleDamage, UnsafeNode}; use matching::{ApplicableDeclarations, ElementMatchMethods, MatchMethods, StyleSharingResult}; @@ -11,6 +12,7 @@ use selector_impl::SelectorImplExt; use selectors::Element; use selectors::bloom::BloomFilter; use std::cell::RefCell; +use std::sync::Arc; use tid::tid; use util::opts; use values::HasViewportPercentage; @@ -232,6 +234,13 @@ pub fn recalc_style_at<'a, N, C>(context: &'a C, node.set_restyle_damage(damage); } } + } else { + // Finish any expired transitions. + animation::complete_expired_transitions( + node.opaque(), + node.mutate_data().unwrap().style.as_mut().unwrap(), + context.shared_context() + ); } let unsafe_layout_node = node.to_unsafe(); |