<!doctype html>
<meta charset=utf-8>
<title>Canceling a CSS animation</title>
<!-- TODO: Add a more specific link for this once it is specified. -->
<link rel="help" href="https://drafts.csswg.org/css-animations-2/">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/testcommon.js"></script>
<style>
@keyframes translateAnim {
  to { transform: translate(100px) }
}
@keyframes marginLeftAnim {
  to { margin-left: 100px }
}
@keyframes marginLeftAnim100To200 {
  from { margin-left: 100px }
  to { margin-left: 200px }
}
</style>
<div id="log"></div>
<script>
'use strict';

promise_test(async t => {
  const div = addDiv(t, { style: 'animation: translateAnim 100s' });
  const animation = div.getAnimations()[0];

  await animation.ready;

  assert_not_equals(getComputedStyle(div).transform, 'none',
                    'transform style is animated before canceling');
  animation.cancel();
  assert_equals(getComputedStyle(div).transform, 'none',
                'transform style is no longer animated after canceling');
}, 'Animated style is cleared after canceling a running CSS animation');

promise_test(async t => {
  const div = addDiv(t, { style: 'animation: translateAnim 100s forwards' });
  const animation = div.getAnimations()[0];
  animation.finish();

  await animation.ready;

  assert_not_equals(getComputedStyle(div).transform, 'none',
                    'transform style is filling before canceling');
  animation.cancel();
  assert_equals(getComputedStyle(div).transform, 'none',
                'fill style is cleared after canceling');
}, 'Animated style is cleared after canceling a filling CSS animation');

test(t => {
  const div = addDiv(t, { style: 'animation: marginLeftAnim 100s linear' });
  const animation = div.getAnimations()[0];
  animation.cancel();

  assert_equals(getComputedStyle(div).marginLeft, '0px',
                'margin-left style is not animated after canceling');

  animation.currentTime = 50 * 1000;
  assert_equals(getComputedStyle(div).marginLeft, '50px',
                'margin-left style is updated when canceled animation is'
                + ' seeked');
}, 'After canceling an animation, it can still be seeked');

promise_test(async t => {
  const div =
    addDiv(t, { style: 'animation: marginLeftAnim100To200 100s linear' });
  const animation = div.getAnimations()[0];

  await animation.ready;

  animation.cancel();
  assert_equals(getComputedStyle(div).marginLeft, '0px',
                'margin-left style is not animated after canceling');
  animation.play();
  assert_equals(getComputedStyle(div).marginLeft, '100px',
                'margin-left style is animated after re-starting animation');

  await animation.ready;

  assert_equals(animation.playState, 'running',
                'Animation succeeds in running after being re-started');
}, 'After canceling an animation, it can still be re-used');

test(t => {
  const div =
    addDiv(t, { style: 'animation: marginLeftAnim100To200 100s linear' });
  const animation = div.getAnimations()[0];
  animation.cancel();
  assert_equals(getComputedStyle(div).marginLeft, '0px',
                'margin-left style is not animated after canceling');

  // Trigger a change to some animation properties and check that this
  // doesn't cause the animation to become live again
  div.style.animationDuration = '200s';
  assert_equals(getComputedStyle(div).marginLeft, '0px',
                'margin-left style is still not animated after updating'
                + ' animation-duration');
  assert_equals(animation.playState, 'idle',
                'Animation is still idle after updating animation-duration');
}, 'After canceling an animation, updating animation properties doesn\'t make'
   + ' it live again');

test(t => {
  const div =
    addDiv(t, { style: 'animation: marginLeftAnim100To200 100s linear' });
  const animation = div.getAnimations()[0];
  animation.cancel();
  assert_equals(getComputedStyle(div).marginLeft, '0px',
                'margin-left style is not animated after canceling');

  // Make some changes to animation-play-state and check that the
  // animation doesn't become live again. This is because it should be
  // possible to cancel an animation from script such that all future
  // changes to style are ignored.

  // Redundant change
  div.style.animationPlayState = 'running';
  assert_equals(animation.playState, 'idle',
                'Animation is still idle after a redundant change to'
                + ' animation-play-state');

  // Pause
  div.style.animationPlayState = 'paused';
  assert_equals(animation.playState, 'idle',
                'Animation is still idle after setting'
                + ' animation-play-state: paused');

  // Play
  div.style.animationPlayState = 'running';
  assert_equals(animation.playState, 'idle',
                'Animation is still idle after re-setting'
                + ' animation-play-state: running');

}, 'After canceling an animation, updating animation-play-state doesn\'t'
   + ' make it live again');

promise_test(async t => {
  const div = addDiv(t, { style: 'animation: translateAnim 10s both' });
  div.style.marginLeft = '0px';

  const animation = div.getAnimations()[0];

  await animation.ready;

  assert_equals(animation.playState, 'running');

  div.style.animationName = 'none';
  flushComputedStyle(div);

  await waitForFrame();

  assert_equals(animation.playState, 'idle');
  assert_equals(getComputedStyle(div).marginLeft, '0px');
}, 'Setting animation-name to \'none\' cancels the animation');

promise_test(async t => {
  const div = addDiv(t, { style: 'animation: translateAnim 10s both' });
  const animation = div.getAnimations()[0];

  await animation.ready;

  assert_equals(animation.playState, 'running');

  div.style.display = 'none';

  await waitForFrame();

  assert_equals(animation.playState, 'idle');
  assert_equals(getComputedStyle(div).marginLeft, '0px');
}, 'Setting display:none on an element cancel its animations');

promise_test(async t => {
  const parentDiv = addDiv(t);
  const childDiv  = document.createElement('div');
  parentDiv.appendChild(childDiv);

  childDiv.setAttribute('style', 'animation: translateAnim 10s both');
  flushComputedStyle(childDiv);

  const animation = childDiv.getAnimations()[0];

  await animation.ready;

  assert_equals(animation.playState, 'running');

  parentDiv.style.display = 'none';
  await waitForFrame();

  assert_equals(animation.playState, 'idle');
  assert_equals(getComputedStyle(childDiv).marginLeft, '0px');
}, 'Setting display:none on an ancestor element cancels animations on ' +
   'descendants');

</script>
