mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
parent
3afa150cd8
commit
6a37877734
3 changed files with 37 additions and 19 deletions
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue