diff --git a/components/atoms/static_atoms.txt b/components/atoms/static_atoms.txt index ebf4a2c27bee..d4f2f38da7e9 100644 --- a/components/atoms/static_atoms.txt +++ b/components/atoms/static_atoms.txt @@ -2,6 +2,7 @@ DOMContentLoaded abort activate addtrack +animationcancel animationend animationiteration animationstart @@ -132,6 +133,7 @@ track transitioncancel transitionend transitionrun +transitionstart unhandledrejection unload url diff --git a/components/script/animations.rs b/components/script/animations.rs index f9de0fc0a321..d0bfcef6f791 100644 --- a/components/script/animations.rs +++ b/components/script/animations.rs @@ -78,12 +78,15 @@ impl Animations { let mut sets = self.sets.write(); for set in sets.values_mut() { + self.start_pending_animations(set, now, pipeline_id); + // When necessary, iterate our running animations to the next iteration. for animation in set.animations.iter_mut() { if animation.iterate_if_necessary(now) { self.add_animation_event( animation, TransitionOrAnimationEventType::AnimationIteration, + now, pipeline_id, ); } @@ -97,7 +100,6 @@ impl Animations { /// Processes any new animations that were discovered after reflow. Collect messages /// that trigger events for any animations that changed state. - /// TODO(mrobinson): The specification dictates that this should happen before reflow. pub(crate) fn do_post_reflow_update(&self, window: &Window, now: f64) { let pipeline_id = window.pipeline_id(); let mut sets = self.sets.write(); @@ -140,6 +142,39 @@ impl Animations { .sum() } + /// Walk through the list of pending animations and start all of the ones that + /// have left the delay phase. + fn start_pending_animations( + &self, + set: &mut ElementAnimationSet, + now: f64, + pipeline_id: PipelineId, + ) { + for animation in set.animations.iter_mut() { + if animation.state == AnimationState::Pending && animation.started_at <= now { + animation.state = AnimationState::Running; + self.add_animation_event( + animation, + TransitionOrAnimationEventType::AnimationStart, + now, + pipeline_id, + ); + } + } + + for transition in set.transitions.iter_mut() { + if transition.state == AnimationState::Pending && transition.start_time <= now { + transition.state = AnimationState::Running; + self.add_transition_event( + transition, + TransitionOrAnimationEventType::TransitionStart, + now, + pipeline_id, + ); + } + } + } + /// Walk through the list of running animations and remove all of the ones that /// have ended. fn finish_running_animations( @@ -154,6 +189,7 @@ impl Animations { self.add_animation_event( animation, TransitionOrAnimationEventType::AnimationEnd, + now, pipeline_id, ); } @@ -192,7 +228,17 @@ impl Animations { } } - // TODO(mrobinson): We need to send animationcancel events. + for animation in &set.animations { + if animation.state == AnimationState::Canceled { + self.add_animation_event( + animation, + TransitionOrAnimationEventType::AnimationCancel, + now, + pipeline_id, + ); + } + } + set.clear_canceled_animations(); } @@ -263,14 +309,21 @@ impl Animations { now: f64, pipeline_id: PipelineId, ) { + // Calculate the `elapsed-time` property of the event and take the absolute + // value to prevent -0 values. let elapsed_time = match event_type { TransitionOrAnimationEventType::TransitionRun | + TransitionOrAnimationEventType::TransitionStart => transition + .property_animation + .duration + .min((-transition.delay).max(0.)), TransitionOrAnimationEventType::TransitionEnd => transition.property_animation.duration, TransitionOrAnimationEventType::TransitionCancel => { (now - transition.start_time).max(0.) }, _ => unreachable!(), - }; + } + .abs(); self.pending_events .borrow_mut() @@ -291,6 +344,7 @@ impl Animations { &self, animation: &Animation, event_type: TransitionOrAnimationEventType, + now: f64, pipeline_id: PipelineId, ) { let num_iterations = match animation.iteration_state { @@ -298,11 +352,25 @@ impl Animations { KeyframesIterationState::Infinite(current) => current, }; + let active_duration = match animation.iteration_state { + KeyframesIterationState::Finite(_, max) => max * animation.duration, + KeyframesIterationState::Infinite(_) => std::f64::MAX, + }; + + // Calculate the `elapsed-time` property of the event and take the absolute + // value to prevent -0 values. let elapsed_time = match event_type { + TransitionOrAnimationEventType::AnimationStart => { + (-animation.delay).max(0.).min(active_duration) + }, TransitionOrAnimationEventType::AnimationIteration | TransitionOrAnimationEventType::AnimationEnd => num_iterations * animation.duration, + TransitionOrAnimationEventType::AnimationCancel => { + (num_iterations * animation.duration) + (now - animation.started_at).max(0.) + }, _ => unreachable!(), - }; + } + .abs(); self.pending_events .borrow_mut() @@ -333,10 +401,13 @@ impl Animations { let event_atom = match event.event_type { TransitionOrAnimationEventType::AnimationEnd => atom!("animationend"), + TransitionOrAnimationEventType::AnimationStart => atom!("animationstart"), + TransitionOrAnimationEventType::AnimationCancel => atom!("animationcancel"), TransitionOrAnimationEventType::AnimationIteration => atom!("animationiteration"), TransitionOrAnimationEventType::TransitionCancel => atom!("transitioncancel"), TransitionOrAnimationEventType::TransitionEnd => atom!("transitionend"), TransitionOrAnimationEventType::TransitionRun => atom!("transitionrun"), + TransitionOrAnimationEventType::TransitionStart => atom!("transitionstart"), }; let parent = EventInit { bubbles: true, @@ -381,25 +452,39 @@ pub enum TransitionOrAnimationEventType { /// "The transitionrun event occurs when a transition is created (i.e., when it /// is added to the set of running transitions)." TransitionRun, + /// "The transitionstart event occurs when a transition’s delay phase ends." + TransitionStart, /// "The transitionend event occurs at the completion of the transition. In the /// case where a transition is removed before completion, such as if the /// transition-property is removed, then the event will not fire." TransitionEnd, /// "The transitioncancel event occurs when a transition is canceled." TransitionCancel, + /// "The animationstart event occurs at the start of the animation. If there is + /// an animation-delay then this event will fire once the delay period has expired." + AnimationStart, /// "The animationiteration event occurs at the end of each iteration of an /// animation, except when an animationend event would fire at the same time." AnimationIteration, /// "The animationend event occurs when the animation finishes" AnimationEnd, + /// "The animationcancel event occurs when the animation stops running in a way + /// that does not fire an animationend event..." + AnimationCancel, } impl TransitionOrAnimationEventType { /// Whether or not this event is a transition-related event. pub fn is_transition_event(&self) -> bool { match *self { - Self::TransitionRun | Self::TransitionEnd | Self::TransitionCancel => true, - Self::AnimationEnd | Self::AnimationIteration => false, + Self::TransitionRun | + Self::TransitionEnd | + Self::TransitionCancel | + Self::TransitionStart => true, + Self::AnimationEnd | + Self::AnimationIteration | + Self::AnimationStart | + Self::AnimationCancel => false, } } } diff --git a/components/style/animation.rs b/components/style/animation.rs index 2330f41f448e..152692a0b286 100644 --- a/components/style/animation.rs +++ b/components/style/animation.rs @@ -139,17 +139,27 @@ impl PropertyAnimation { /// This structure represents the state of an animation. #[derive(Clone, Debug, MallocSizeOf, PartialEq)] pub enum AnimationState { + /// The animation has been created, but is not running yet. This state + /// is also used when an animation is still in the first delay phase. + Pending, + /// This animation is currently running. + Running, /// This animation is paused. The inner field is the percentage of progress /// when it was paused, from 0 to 1. Paused(f64), - /// This animation is currently running. - Running, /// This animation has finished. Finished, /// This animation has been canceled. Canceled, } +impl AnimationState { + /// Whether or not this state requires its owning animation to be ticked. + fn needs_to_be_ticked(&self) -> bool { + *self == AnimationState::Running || *self == AnimationState::Pending + } +} + /// This structure represents a keyframes animation current iteration state. /// /// If the iteration count is infinite, there's no other state, otherwise we @@ -174,7 +184,8 @@ pub struct Animation { /// The internal animation from the style system. pub keyframes_animation: KeyframesAnimation, - /// The time this animation started at. + /// The time this animation started at, which is the current value of the animation + /// timeline when this animation was created plus any animation delay. pub started_at: f64, /// The duration of this animation. @@ -273,9 +284,11 @@ impl Animation { /// canceled due to changes in the style. pub fn has_ended(&self, time: f64) -> bool { match self.state { - AnimationState::Canceled | AnimationState::Paused(_) => return false, - AnimationState::Finished => return true, AnimationState::Running => {}, + AnimationState::Finished => return true, + AnimationState::Pending | AnimationState::Canceled | AnimationState::Paused(_) => { + return false + }, } if !self.iteration_over(time) { @@ -312,9 +325,31 @@ impl Animation { let old_direction = self.current_direction; let old_state = self.state.clone(); let old_iteration_state = self.iteration_state.clone(); + *self = other.clone(); - let mut new_started_at = old_started_at; + self.started_at = old_started_at; + self.current_direction = old_direction; + + // Don't update the iteration count, just the iteration limit. + // TODO: see how changing the limit affects rendering in other browsers. + // We might need to keep the iteration count even when it's infinite. + match (&mut self.iteration_state, old_iteration_state) { + ( + &mut KeyframesIterationState::Finite(ref mut iters, _), + KeyframesIterationState::Finite(old_iters, _), + ) => *iters = old_iters, + _ => {}, + } + + // Don't pause or restart animations that should remain finished. + // We call mem::replace because `has_ended(...)` looks at `Animation::state`. + let new_state = std::mem::replace(&mut self.state, Running); + if old_state == Finished && self.has_ended(now) { + self.state = Finished; + } else { + self.state = new_state; + } // If we're unpausing the animation, fake the start time so we seem to // restore it. @@ -322,28 +357,22 @@ impl Animation { // If the animation keeps paused, keep the old value. // // If we're pausing the animation, compute the progress value. - match (&mut self.state, old_state) { - (&mut Running, Paused(progress)) => new_started_at = now - (self.duration * progress), - (&mut Paused(ref mut new), Paused(old)) => *new = old, - (&mut Paused(ref mut progress), Running) => { + match (&mut self.state, &old_state) { + (&mut Pending, &Paused(progress)) => { + self.started_at = now - (self.duration * progress); + }, + (&mut Paused(ref mut new), &Paused(old)) => *new = old, + (&mut Paused(ref mut progress), &Running) => { *progress = (now - old_started_at) / old_duration }, _ => {}, } - // Don't update the iteration count, just the iteration limit. - // TODO: see how changing the limit affects rendering in other browsers. - // We might need to keep the iteration count even when it's infinite. - match (&mut self.iteration_state, old_iteration_state) { - ( - &mut KeyframesIterationState::Finite(ref mut iters, _), - KeyframesIterationState::Finite(old_iters, _), - ) => *iters = old_iters, - _ => {}, + // Try to detect when we should skip straight to the running phase to + // avoid sending multiple animationstart events. + if self.state == Pending && self.started_at <= now && old_state != Pending { + self.state = Running; } - - self.current_direction = old_direction; - self.started_at = new_started_at; } /// Update the given style to reflect the values specified by this `Animation` @@ -360,7 +389,7 @@ impl Animation { let started_at = self.started_at; let now = match self.state { - AnimationState::Running | AnimationState::Finished => { + AnimationState::Running | AnimationState::Pending | AnimationState::Finished => { context.current_time_for_animations }, AnimationState::Paused(progress) => started_at + duration * progress, @@ -551,9 +580,12 @@ pub struct Transition { pub node: OpaqueNode, /// The start time of this transition, which is the current value of the animation - /// timeline when this transition created. + /// timeline when this transition was created plus any animation delay. pub start_time: f64, + /// The delay used for this transition. + pub delay: f64, + /// The internal style `PropertyAnimation` for this transition. pub property_animation: PropertyAnimation, @@ -724,26 +756,25 @@ impl ElementAnimationSet { } /// Whether or not this state needs animation ticks for its transitions - /// or animations. New animations don't need ticks until they are no - /// longer marked as new. + /// or animations. pub fn needs_animation_ticks(&self) -> bool { self.animations .iter() - .any(|animation| animation.state == AnimationState::Running && !animation.is_new) || - self.transitions.iter().any(|transition| { - transition.state == AnimationState::Running && !transition.is_new - }) + .any(|animation| animation.state.needs_to_be_ticked()) || + self.transitions + .iter() + .any(|transition| transition.state.needs_to_be_ticked()) } /// The number of running animations and transitions for this `ElementAnimationSet`. pub fn running_animation_and_transition_count(&self) -> usize { self.animations .iter() - .filter(|animation| animation.state == AnimationState::Running) + .filter(|animation| animation.state.needs_to_be_ticked()) .count() + self.transitions .iter() - .filter(|transition| transition.state == AnimationState::Running) + .filter(|transition| transition.state.needs_to_be_ticked()) .count() } @@ -870,8 +901,9 @@ impl ElementAnimationSet { let mut new_transition = Transition { node: opaque_node, start_time: now + delay, + delay, property_animation, - state: AnimationState::Running, + state: AnimationState::Pending, is_new: true, reversing_adjusted_start_value, reversing_shortening_factor: 1.0, @@ -1040,7 +1072,7 @@ pub fn maybe_start_animations( let state = match box_style.animation_play_state_mod(i) { AnimationPlayState::Paused => AnimationState::Paused(0.), - AnimationPlayState::Running => AnimationState::Running, + AnimationPlayState::Running => AnimationState::Pending, }; let new_animation = Animation { diff --git a/tests/wpt/metadata-layout-2020/css/css-animations/animationevent-types.html.ini b/tests/wpt/metadata-layout-2020/css/css-animations/animationevent-types.html.ini deleted file mode 100644 index 256ea2378e50..000000000000 --- a/tests/wpt/metadata-layout-2020/css/css-animations/animationevent-types.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[animationevent-types.html] - expected: TIMEOUT - [animationstart event is instanceof AnimationEvent] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/css/css-animations/Element-getAnimations.tentative.html.ini b/tests/wpt/metadata/css/css-animations/Element-getAnimations.tentative.html.ini index 854c8c6e480b..5913cd5b9364 100644 --- a/tests/wpt/metadata/css/css-animations/Element-getAnimations.tentative.html.ini +++ b/tests/wpt/metadata/css/css-animations/Element-getAnimations.tentative.html.ini @@ -1,5 +1,5 @@ [Element-getAnimations.tentative.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26626 [getAnimations for CSS Animations with animation-name: none] expected: FAIL diff --git a/tests/wpt/metadata/css/css-animations/animationevent-pseudoelement.html.ini b/tests/wpt/metadata/css/css-animations/animationevent-pseudoelement.html.ini index 69cb0d12c276..c7f08fec5f78 100644 --- a/tests/wpt/metadata/css/css-animations/animationevent-pseudoelement.html.ini +++ b/tests/wpt/metadata/css/css-animations/animationevent-pseudoelement.html.ini @@ -1,5 +1,5 @@ [animationevent-pseudoelement.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/10316 expected: TIMEOUT [AnimationEvent should have the correct pseudoElement memeber] expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-animations/animationevent-types.html.ini b/tests/wpt/metadata/css/css-animations/animationevent-types.html.ini deleted file mode 100644 index 944fcee5779d..000000000000 --- a/tests/wpt/metadata/css/css-animations/animationevent-types.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[animationevent-types.html] - bug: https://github.com/servo/servo/issues/21564 - expected: TIMEOUT - [animationstart event is instanceof AnimationEvent] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/css/css-transitions/events-006.html.ini b/tests/wpt/metadata/css/css-transitions/events-006.html.ini index a884e8df5740..edacd476df2b 100644 --- a/tests/wpt/metadata/css/css-transitions/events-006.html.ini +++ b/tests/wpt/metadata/css/css-transitions/events-006.html.ini @@ -1,5 +1,5 @@ [events-006.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/10316 expected: TIMEOUT [transition padding-left on ::after] expected: NOTRUN diff --git a/tests/wpt/metadata/css/css-variables/variable-animation-from-to.html.ini b/tests/wpt/metadata/css/css-variables/variable-animation-from-to.html.ini index 79ed388547d1..ac3f2998e7f9 100644 --- a/tests/wpt/metadata/css/css-variables/variable-animation-from-to.html.ini +++ b/tests/wpt/metadata/css/css-variables/variable-animation-from-to.html.ini @@ -1,5 +1,5 @@ [variable-animation-from-to.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26625 expected: TIMEOUT [Verify CSS variable value before animation] expected: FAIL diff --git a/tests/wpt/metadata/css/css-variables/variable-animation-over-transition.html.ini b/tests/wpt/metadata/css/css-variables/variable-animation-over-transition.html.ini index c6edf5d258b5..6544dd3874eb 100644 --- a/tests/wpt/metadata/css/css-variables/variable-animation-over-transition.html.ini +++ b/tests/wpt/metadata/css/css-variables/variable-animation-over-transition.html.ini @@ -1,5 +1,5 @@ [variable-animation-over-transition.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26625 expected: TIMEOUT [Verify CSS variable value before animation] expected: FAIL diff --git a/tests/wpt/metadata/css/css-variables/variable-animation-substitute-into-keyframe-shorthand.html.ini b/tests/wpt/metadata/css/css-variables/variable-animation-substitute-into-keyframe-shorthand.html.ini index e61911d3325b..bed87a131592 100644 --- a/tests/wpt/metadata/css/css-variables/variable-animation-substitute-into-keyframe-shorthand.html.ini +++ b/tests/wpt/metadata/css/css-variables/variable-animation-substitute-into-keyframe-shorthand.html.ini @@ -1,2 +1,2 @@ [variable-animation-substitute-into-keyframe-shorthand.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26625 diff --git a/tests/wpt/metadata/css/css-variables/variable-animation-substitute-into-keyframe-transform.html.ini b/tests/wpt/metadata/css/css-variables/variable-animation-substitute-into-keyframe-transform.html.ini index 77ff1af8a7d3..4722727d2086 100644 --- a/tests/wpt/metadata/css/css-variables/variable-animation-substitute-into-keyframe-transform.html.ini +++ b/tests/wpt/metadata/css/css-variables/variable-animation-substitute-into-keyframe-transform.html.ini @@ -1,5 +1,5 @@ [variable-animation-substitute-into-keyframe-transform.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26625 [Verify transform before animation] expected: FAIL diff --git a/tests/wpt/metadata/css/css-variables/variable-animation-substitute-into-keyframe.html.ini b/tests/wpt/metadata/css/css-variables/variable-animation-substitute-into-keyframe.html.ini index ccac15c61813..99e8565a805c 100644 --- a/tests/wpt/metadata/css/css-variables/variable-animation-substitute-into-keyframe.html.ini +++ b/tests/wpt/metadata/css/css-variables/variable-animation-substitute-into-keyframe.html.ini @@ -1,2 +1,2 @@ [variable-animation-substitute-into-keyframe.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26625 diff --git a/tests/wpt/metadata/css/css-variables/variable-animation-substitute-within-keyframe-fallback.html.ini b/tests/wpt/metadata/css/css-variables/variable-animation-substitute-within-keyframe-fallback.html.ini index 8fe87ce4aa4e..3290f1660297 100644 --- a/tests/wpt/metadata/css/css-variables/variable-animation-substitute-within-keyframe-fallback.html.ini +++ b/tests/wpt/metadata/css/css-variables/variable-animation-substitute-within-keyframe-fallback.html.ini @@ -1,5 +1,5 @@ [variable-animation-substitute-within-keyframe-fallback.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26625 [Verify color after animation] expected: FAIL diff --git a/tests/wpt/metadata/css/css-variables/variable-animation-substitute-within-keyframe-multiple.html.ini b/tests/wpt/metadata/css/css-variables/variable-animation-substitute-within-keyframe-multiple.html.ini index 7046292ccd78..ca4fe4dfc757 100644 --- a/tests/wpt/metadata/css/css-variables/variable-animation-substitute-within-keyframe-multiple.html.ini +++ b/tests/wpt/metadata/css/css-variables/variable-animation-substitute-within-keyframe-multiple.html.ini @@ -1,5 +1,5 @@ [variable-animation-substitute-within-keyframe-multiple.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26625 [Verify color after animation] expected: FAIL diff --git a/tests/wpt/metadata/css/css-variables/variable-animation-substitute-within-keyframe.html.ini b/tests/wpt/metadata/css/css-variables/variable-animation-substitute-within-keyframe.html.ini index 705cf7ed37ad..d347620f3dcd 100644 --- a/tests/wpt/metadata/css/css-variables/variable-animation-substitute-within-keyframe.html.ini +++ b/tests/wpt/metadata/css/css-variables/variable-animation-substitute-within-keyframe.html.ini @@ -1,5 +1,5 @@ [variable-animation-substitute-within-keyframe.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26625 [Verify color after animation] expected: FAIL diff --git a/tests/wpt/metadata/css/css-variables/variable-animation-to-only.html.ini b/tests/wpt/metadata/css/css-variables/variable-animation-to-only.html.ini index 5e862e864ff6..976008b1d68a 100644 --- a/tests/wpt/metadata/css/css-variables/variable-animation-to-only.html.ini +++ b/tests/wpt/metadata/css/css-variables/variable-animation-to-only.html.ini @@ -1,5 +1,5 @@ [variable-animation-to-only.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26625 expected: TIMEOUT [Verify CSS variable value after animation] expected: TIMEOUT diff --git a/tests/wpt/metadata/css/css-variables/variable-transitions-from-no-value.html.ini b/tests/wpt/metadata/css/css-variables/variable-transitions-from-no-value.html.ini index 1d039975c270..b29d8db3da10 100644 --- a/tests/wpt/metadata/css/css-variables/variable-transitions-from-no-value.html.ini +++ b/tests/wpt/metadata/css/css-variables/variable-transitions-from-no-value.html.ini @@ -1,5 +1,5 @@ [variable-transitions-from-no-value.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26625 expected: TIMEOUT [Verify CSS variable value after transition] expected: NOTRUN diff --git a/tests/wpt/metadata/css/css-variables/variable-transitions-to-no-value.html.ini b/tests/wpt/metadata/css/css-variables/variable-transitions-to-no-value.html.ini index b36005d4be8c..a76040845612 100644 --- a/tests/wpt/metadata/css/css-variables/variable-transitions-to-no-value.html.ini +++ b/tests/wpt/metadata/css/css-variables/variable-transitions-to-no-value.html.ini @@ -1,5 +1,5 @@ [variable-transitions-to-no-value.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26625 expected: TIMEOUT [Verify CSS variable value after transition] expected: NOTRUN diff --git a/tests/wpt/metadata/css/css-variables/variable-transitions-transition-property-variable-before-value.html.ini b/tests/wpt/metadata/css/css-variables/variable-transitions-transition-property-variable-before-value.html.ini index 53ad4c18ded6..cb48c956d7d1 100644 --- a/tests/wpt/metadata/css/css-variables/variable-transitions-transition-property-variable-before-value.html.ini +++ b/tests/wpt/metadata/css/css-variables/variable-transitions-transition-property-variable-before-value.html.ini @@ -1,5 +1,5 @@ [variable-transitions-transition-property-variable-before-value.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26625 expected: TIMEOUT [Verify CSS variable value after transition] expected: NOTRUN diff --git a/tests/wpt/metadata/css/css-variables/variable-transitions-value-before-transition-property-variable.html.ini b/tests/wpt/metadata/css/css-variables/variable-transitions-value-before-transition-property-variable.html.ini index d9b360988cdb..81ca758a5996 100644 --- a/tests/wpt/metadata/css/css-variables/variable-transitions-value-before-transition-property-variable.html.ini +++ b/tests/wpt/metadata/css/css-variables/variable-transitions-value-before-transition-property-variable.html.ini @@ -1,5 +1,5 @@ [variable-transitions-value-before-transition-property-variable.html] - bug: https://github.com/servo/servo/issues/21564 + bug: https://github.com/servo/servo/issues/26625 expected: TIMEOUT [Verify CSS variable value after transition] expected: NOTRUN diff --git a/tests/wpt/mozilla/meta-layout-2020/css/animations/animation-events.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/animations/animation-events.html.ini new file mode 100644 index 000000000000..33f08914f308 --- /dev/null +++ b/tests/wpt/mozilla/meta-layout-2020/css/animations/animation-events.html.ini @@ -0,0 +1,2 @@ +prefs: ["layout.animations.test.enabled:false", + "dom.testbinding.enabled:false"] diff --git a/tests/wpt/mozilla/meta-layout-2020/css/animations/transition-events.html.ini b/tests/wpt/mozilla/meta-layout-2020/css/animations/transition-events.html.ini new file mode 100644 index 000000000000..f53fd6a50504 --- /dev/null +++ b/tests/wpt/mozilla/meta-layout-2020/css/animations/transition-events.html.ini @@ -0,0 +1,3 @@ +prefs: ["layout.animations.test.enabled:false", + "dom.testbinding.enabled:false"] + diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 70c41cd6def6..f5225f39757a 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -12849,6 +12849,15 @@ }, "css": { "animations": { + "animation-events.html": [ + "0975aa64ec47ca4b4c8fc1e0a40414a51719ad67", + [ + null, + { + "timeout": "long" + } + ] + ], "animation-fill-mode.html": [ "4cfaab9fbce0adccd83f592935e63fa8ff58a1cf", [ @@ -12884,6 +12893,13 @@ {} ] ], + "transition-events.html": [ + "b561fc8353276e6bdd13a9d1b965f57733ecd19b", + [ + null, + {} + ] + ], "transition-raf.html": [ "c38404503408e04b3c75b42df18ec3a7ec0819f5", [ diff --git a/tests/wpt/mozilla/meta/css/animations/animation-events.html.ini b/tests/wpt/mozilla/meta/css/animations/animation-events.html.ini new file mode 100644 index 000000000000..33f08914f308 --- /dev/null +++ b/tests/wpt/mozilla/meta/css/animations/animation-events.html.ini @@ -0,0 +1,2 @@ +prefs: ["layout.animations.test.enabled:false", + "dom.testbinding.enabled:false"] diff --git a/tests/wpt/mozilla/meta/css/animations/transition-events.html.ini b/tests/wpt/mozilla/meta/css/animations/transition-events.html.ini new file mode 100644 index 000000000000..f53fd6a50504 --- /dev/null +++ b/tests/wpt/mozilla/meta/css/animations/transition-events.html.ini @@ -0,0 +1,3 @@ +prefs: ["layout.animations.test.enabled:false", + "dom.testbinding.enabled:false"] + diff --git a/tests/wpt/mozilla/tests/css/animations/animation-events.html b/tests/wpt/mozilla/tests/css/animations/animation-events.html new file mode 100644 index 000000000000..0975aa64ec47 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/animations/animation-events.html @@ -0,0 +1,160 @@ + + +CSS animation event dispatch + + + + + +
+ diff --git a/tests/wpt/mozilla/tests/css/animations/transition-events.html b/tests/wpt/mozilla/tests/css/animations/transition-events.html new file mode 100644 index 000000000000..b561fc835327 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/animations/transition-events.html @@ -0,0 +1,131 @@ + + +CSS transition event dispatch + + + +
+