diff options
author | bors-servo <servo-ops@mozilla.com> | 2020-04-01 15:19:15 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-01 15:19:15 -0400 |
commit | 516279e24f3d77e0050aeeed17ef24c9701edc1a (patch) | |
tree | f469887f1532704aaca28715b4d897cc3b69e9b6 /components | |
parent | af1ebe79efd799498010f196983a233aa5203d64 (diff) | |
parent | 2bb6ab4567802c3b77ee8a926ea55daf60ff441a (diff) | |
download | servo-516279e24f3d77e0050aeeed17ef24c9701edc1a.tar.gz servo-516279e24f3d77e0050aeeed17ef24c9701edc1a.zip |
Auto merge of #26074 - jdm:transition-fix, r=SimonSapin
Avoid infinitely looping CSS transitions.
This change addresses the long-standing issue of CSS transitions not ending appropriately. It does not fundamentally change the way we process transitions/animations.
---
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix #20379
- [x] There are tests for these changes
Diffstat (limited to 'components')
-rw-r--r-- | components/layout/animation.rs | 1 | ||||
-rw-r--r-- | components/style/animation.rs | 35 | ||||
-rw-r--r-- | components/style/matching.rs | 7 |
3 files changed, 23 insertions, 20 deletions
diff --git a/components/layout/animation.rs b/components/layout/animation.rs index 96e4801fa4e..8a99a75fc72 100644 --- a/components/layout/animation.rs +++ b/components/layout/animation.rs @@ -110,6 +110,7 @@ pub fn update_animation_state<E>( .unwrap(); } + debug!("expiring animation for {:?}", running_animation); expired_animations .entry(*key) .or_insert_with(Vec::new) diff --git a/components/style/animation.rs b/components/style/animation.rs index 7f96e55b18f..d98cc901b6a 100644 --- a/components/style/animation.rs +++ b/components/style/animation.rs @@ -425,6 +425,11 @@ pub fn start_transitions_if_applicable( // above. property_animation.update(Arc::get_mut(new_style).unwrap(), 0.0); + debug!( + "checking {:?} for matching end value", + possibly_expired_animations + ); + // Per [1], don't trigger a new transition if the end state for that // transition is the same as that of a transition that's already // running on the same node. @@ -852,26 +857,18 @@ 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(); - 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 { - debug!("Updating expired animation {:?}", animation); - // TODO: support animation-fill-mode - if let Animation::Transition(_, _, ref frame) = *animation { - frame.property_animation.update(Arc::make_mut(style), 1.0); - } + expired_animations: &mut Vec<crate::animation::PropertyAnimation>, +) { + let mut all_expired_animations = context.expired_animations.write(); + if let Some(animations) = all_expired_animations.remove(&node) { + debug!("removing expired animations for {:?}", node); + for animation in animations { + debug!("Updating expired animation {:?}", animation); + // TODO: support animation-fill-mode + if let Animation::Transition(_, _, frame) = animation { + frame.property_animation.update(Arc::make_mut(style), 1.0); + expired_animations.push(frame.property_animation); } } } - - if had_animations_to_expire { - context.expired_animations.write().remove(&node); - } - - had_animations_to_expire } diff --git a/components/style/matching.rs b/components/style/matching.rs index 06e74810cfd..37843fca776 100644 --- a/components/style/matching.rs +++ b/components/style/matching.rs @@ -607,7 +607,12 @@ trait PrivateMatchMethods: TElement { // Finish any expired transitions. let this_opaque = self.as_node().opaque(); - animation::complete_expired_transitions(this_opaque, style, context); + animation::complete_expired_transitions( + this_opaque, + style, + context, + possibly_expired_animations, + ); // Merge any running animations into the current style, and cancel them. let had_running_animations = context |