| 'use strict'; |
| |
| // Common utility methods for testing animation effects |
| |
| // Tests the |property| member of |animation's| target effect's computed timing |
| // at the various points indicated by |values|. |
| // |
| // |values| has the format: |
| // |
| // { |
| // before, // value to test during before phase |
| // activeBoundary, // value to test at the very beginning of the active |
| // // phase when playing forwards, or the very end of |
| // // the active phase when playing backwards. |
| // // This should be undefined if the active duration of |
| // // the effect is zero. |
| // after, // value to test during the after phase or undefined if the |
| // // active duration is infinite |
| // } |
| // |
| function assert_computed_timing_for_each_phase(animation, property, values) { |
| // Some computed timing properties (e.g. 'progress') require floating-point |
| // comparison, whilst exact equality suffices for others. |
| const assert_property_equals = |
| (property === 'progress') ? assert_times_equal : assert_equals; |
| |
| const effect = animation.effect; |
| const timing = effect.getComputedTiming(); |
| |
| // The following calculations are based on the definitions here: |
| // https://drafts.csswg.org/web-animations/#animation-effect-phases-and-states |
| const beforeActive = Math.max(Math.min(timing.delay, timing.endTime), 0); |
| const activeAfter = |
| Math.max(Math.min(timing.delay + timing.activeDuration, timing.endTime), 0); |
| const direction = animation.playbackRate < 0 ? 'backwards' : 'forwards'; |
| |
| // Before phase |
| if (direction === 'forwards') { |
| animation.currentTime = beforeActive - 1; |
| } else { |
| animation.currentTime = beforeActive; |
| } |
| assert_property_equals(effect.getComputedTiming()[property], values.before, |
| `Value of ${property} in the before phase`); |
| |
| // Active phase |
| if (effect.getComputedTiming().activeDuration > 0) { |
| if (direction === 'forwards') { |
| animation.currentTime = beforeActive; |
| } else { |
| animation.currentTime = activeAfter; |
| } |
| assert_property_equals(effect.getComputedTiming()[property], values.activeBoundary, |
| `Value of ${property} at the boundary of the active phase`); |
| } else { |
| assert_equals(values.activeBoundary, undefined, |
| 'Test specifies a value to check during the active phase but' |
| + ' the animation has a zero duration'); |
| } |
| |
| // After phase |
| if (effect.getComputedTiming().activeDuration !== Infinity) { |
| if (direction === 'forwards') { |
| animation.currentTime = activeAfter; |
| } else { |
| animation.currentTime = activeAfter + 1; |
| } |
| assert_property_equals(effect.getComputedTiming()[property], values.after, |
| `Value of ${property} in the after phase`); |
| } else { |
| assert_equals(values.after, undefined, |
| 'Test specifies a value to check during the after phase but' |
| + ' the animation has an infinite duration'); |
| } |
| } |