aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Howell <michael@notriddle.com>2016-07-27 10:39:48 -0700
committerMichael Howell <michael@notriddle.com>2016-07-28 11:22:20 -0700
commit6a37877734614bc2f494f9cfae062c8ebb94a983 (patch)
treed0d631323fbcf0e7c15b0c60d69067062ad2efa5
parent3afa150cd8ef9f1d370ed425399aa0e1f42b339e (diff)
downloadservo-6a37877734614bc2f494f9cfae062c8ebb94a983.tar.gz
servo-6a37877734614bc2f494f9cfae062c8ebb94a983.zip
Complete animations whether or not cascade is done
Fixes #12554
-rw-r--r--components/style/animation.rs26
-rw-r--r--components/style/matching.rs21
-rw-r--r--components/style/traversal.rs9
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();