<!doctype html>
<meta charset=utf-8>
<title>CSSAnimation.ready</title>
<!-- TODO: Add a more specific link for this once it is specified. -->
<link rel="help" href="https://drafts.csswg.org/css-animations-2/#cssanimation">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/testcommon.js"></script>
<style>
@keyframes abc {
  to { transform: translate(10px) }
}
</style>
<div id="log"></div>
<script>
'use strict';

promise_test(async t => {
  const div = addDiv(t);
  div.style.animation = 'abc 100s paused';
  const animation = div.getAnimations()[0];
  const originalReadyPromise = animation.ready;

  await animation.ready;

  div.style.animationPlayState = 'running';
  assert_not_equals(animation.ready, originalReadyPromise,
                    'After updating animation-play-state a new ready promise'
                    + ' object is created');
}, 'A new ready promise is created when setting animation-play-state: running');

promise_test(async t => {
  const div = addDiv(t);

  // Set up pending animation
  div.style.animation = 'abc 100s';
  const animation = div.getAnimations()[0];
  assert_true(animation.pending, 'Animation is initially pending');
  const readyPromise = animation.ready;

  // Cancel the animation and flush styles
  div.style.animation = '';
  getComputedStyle(div).animation;

  await promise_rejects_dom(t, 'AbortError', readyPromise,
                        'ready promise is rejected with AbortError');
}, 'ready promise is rejected when an animation is canceled by resetting'
   + ' the animation property');

promise_test(async t => {
  const div = addDiv(t);

  // As before, but this time instead of removing all animations, simply update
  // the list of animations. At least for Firefox, updating is a different
  // code path.

  // Set up pending animation
  div.style.animation = 'abc 100s';
  const animation = div.getAnimations()[0];
  assert_true(animation.pending, 'Animation is initially pending');
  const readyPromise = animation.ready;

  // Update the animation and flush styles
  div.style.animation = 'def 100s';
  getComputedStyle(div).animation;

  await promise_rejects_dom(t, 'AbortError', readyPromise,
                        'ready promise is rejected with AbortError');
}, 'ready promise is rejected when an animation is canceled by updating'
   + ' the animation property');

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

  await animation.ready;

  div.style.animationPlayState = 'paused';
  assert_not_equals(animation.ready, originalReadyPromise,
                    'A new Promise object is generated when setting'
                    + ' animation-play-state: paused');
}, 'A new ready promise is created when setting animation-play-state: paused');

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

  await animation.ready;

  div.style.animationPlayState = 'paused';
  const firstReadyPromise = animation.ready;
  animation.pause();
  assert_equals(animation.ready, firstReadyPromise,
                'Ready promise objects are identical after redundant pause');
}, 'Pausing twice re-uses the same Promise');

</script>
