chromium/third_party/blink/web_tests/animations/retarget-modified-transition.html

<!doctype html>
<meta charset=utf-8>
<title>Reversal of transitions previously modified by GetKeyframes</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
'use strict';

function addDiv(t) {
  var div = document.createElement('div');

  document.body.appendChild(div);
  t.add_cleanup(function() {
    if (div.parentNode) {
      div.remove();
    }
  });
  return div;
};

// These are simillar to wpt/css/css-transitions/KeyframeEffect-getKeyframes
// but these use a getComputedStyle to force style evaluation of the modified
// animation, simulating the effect of modifying and reversing the transition
// on separate frames. This is intended as a regression test for our partial
// implementation of this behavior.

function retarget_test(description, newKeyframes, reversed_start) {
  test(t => {
    const div = addDiv(t);

    div.style.left = '0px';
    getComputedStyle(div).transitionProperty;
    div.style.transition = 'left 100s linear';
    div.style.left = '100px';

    const transition = div.getAnimations()[0];
    transition.currentTime = 50000;
    transition.effect.setKeyframes(newKeyframes);

    // Sync on style so the setKeyframes and the reversal happen on different frames.
    getComputedStyle(div).left;

    // Reverse transition
    div.style.left = '0px';
    const reversedTransition = div.getAnimations()[0];

    assert_approx_equals(
      reversedTransition.effect.getComputedTiming().activeDuration,
      50000, 1,
      "The reversed transition has correctly reduced duration"
    );
    assert_equals(reversedTransition.effect.getKeyframes()[0].left, reversed_start,
        "The reversed transition starts at the expected point");
  },  description);
}

retarget_test("A transition with replaced keyframes (same property) still exhibits " +
    "normal reversing behavior.",
    {left: ['200px', '300px', '100px']}, '300px');

retarget_test("A transition with replaced keyframes (different property) still exhibits " +
    "normal reversing behavior  (reversing from the base value).",
    {top: ['200px', '300px', '100px']}, '100px');

retarget_test("A transition with replaced keyframes (empty) still exhibits " +
    "normal reversing behavior (reversing from the base value).",
    {}, '100px');

</script>