| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>Reversal of accelerated in-flight CSS Transitions</title> |
| <style type="text/css" media="screen"> |
| |
| .target.opacity { |
| transition: opacity 2s linear; |
| } |
| |
| .target.opacity.in-flight { |
| opacity: 0; |
| } |
| |
| .target.transform { |
| transition: transform 2s linear; |
| } |
| |
| .target.transform.in-flight { |
| transform: scale(0); |
| } |
| |
| </style> |
| <body> |
| <script src="../resources/testharness.js"></script> |
| <script src="../resources/testharnessreport.js"></script> |
| <script> |
| |
| 'use strict'; |
| |
| function targetTest(propertyName) |
| { |
| async_test(test => { |
| const target = document.body.appendChild(document.createElement("div")); |
| target.classList.add("target"); |
| target.classList.add(propertyName); |
| |
| let initialTransition; |
| let reversedTransition; |
| |
| // Start the initial transition. |
| requestAnimationFrame(() => { |
| target.classList.add("in-flight"); |
| const animations = target.getAnimations(); |
| assert_equals(animations.length, 1, "There is one animation applied to the target after starting the initial transition."); |
| |
| initialTransition = animations[0]; |
| assert_true(initialTransition instanceof CSSTransition, "There is one animation applied to the target after starting the initial transition."); |
| |
| // Wait for the initial transition to start and then two frames before reversing the transition, to be certain that the animation did start. |
| // Indeed, the "transitionstart" event will be fired right before the next rAF callback is called, as the animation starts in that very same |
| // frame, and so progress will be 0 and the transition wouldn't be reversable until the next frame when the animation has progress > 0. |
| target.addEventListener("transitionstart", event => { |
| requestAnimationFrame(() => { |
| requestAnimationFrame(() => { |
| target.classList.remove("in-flight"); |
| const animations = target.getAnimations(); |
| assert_equals(animations.length, 1, "There is one animation applied to the target after reversing the initial transition."); |
| |
| reversedTransition = animations[0]; |
| assert_true(reversedTransition instanceof CSSTransition, "There is one animation applied to the target after reversing the initial transition."); |
| assert_not_equals(initialTransition, reversedTransition, "The animation applied to the target after reversing the initial transition is different than the original transition."); |
| |
| target.remove(); |
| test.done(); |
| }); |
| }); |
| }); |
| }); |
| }, `A CSS transition targeting ${propertyName} can be reversed in-flight.`); |
| } |
| |
| targetTest("opacity"); |
| targetTest("transform"); |
| |
| </script> |
| </body> |