<!doctype html>
<meta charset=utf-8>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../resources/testcommon.js"></script>
<style>
@keyframes abc {
  to { transform: translate(10px) }
}
@keyframes def {}
</style>
<body>
<div id="log"></div>
<script>
'use strict';

const ANIM_PROP_VAL = 'abc 100s';
const ANIM_DURATION = 100 * MS_PER_SEC;

promise_test(function(t) {
  var div = addDiv(t);
  // Set up pending animation
  div.style.animation = ANIM_PROP_VAL;
  var animation = div.getAnimations()[0];
  var previousFinishedPromise = animation.finished;
  // Set up listeners on finished promise
  var retPromise = animation.finished.then(function() {
    assert_unreached('finished promise is fulfilled');
  }).catch(function(err) {
    assert_equals(err.name, 'AbortError',
                  'finished promise is rejected with AbortError');
    assert_not_equals(animation.finished, previousFinishedPromise,
                      'Finished promise should change after the original is ' +
                      'rejected');
  });

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

  return retPromise;
}, 'finished promise is rejected when an animation is cancelled by resetting ' +
   'the animation property');

promise_test(function(t) {
  var 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 = ANIM_PROP_VAL;
  var animation = div.getAnimations()[0];
  var previousFinishedPromise = animation.finished;

  // Set up listeners on finished promise
  var retPromise = animation.finished.then(function() {
    assert_unreached('finished promise was fulfilled');
  }).catch(function(err) {
    assert_equals(err.name, 'AbortError',
                  'finished promise is rejected with AbortError');
    assert_not_equals(animation.finished, previousFinishedPromise,
                      'Finished promise should change after the original is ' +
                      'rejected');
  });

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

  return retPromise;
}, 'finished promise is rejected when an animation is cancelled by changing ' +
   'the animation property');

promise_test(function(t) {
  var div = addDiv(t);
  div.style.animation = ANIM_PROP_VAL;
  var animation = div.getAnimations()[0];
  var previousFinishedPromise = animation.finished;
  animation.currentTime = ANIM_DURATION;
  return animation.finished.then(function() {
    div.style.animationPlayState = 'running';
    return waitForAnimationFrames(2);
  }).then(function() {
    assert_equals(animation.finished, previousFinishedPromise,
                  'Should not replay when animation-play-state changes to ' +
                  '"running" on finished animation');
    assert_equals(animation.currentTime, ANIM_DURATION,
                  'currentTime should not change when animation-play-state ' +
                  'changes to "running" on finished animation');
  });
}, 'Test finished promise changes when animationPlayState set to running');

</script>
</body>
