<!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 anim {
    from {
      margin-left: 0px;
    }
    to {
      margin-left: 100px;
    }
  }
</style>
<body>
<div id="log"></div>
<script>
'use strict';

promise_test(function(t) {
  var div = addDiv(t);
  div.style.animation = 'anim 100s';

  var watcher = new EventWatcher(t, div, [ 'animationend',
                                           'animationcancel' ]);
  var animation = div.getAnimations()[0];
  return animation.ready.then(function() {
    animation.currentTime = 50 * MS_PER_SEC;
    animation.effect = null;
    assert_equals(animation.playState, 'finished');
    assert_equals(getComputedStyle(div).marginLeft, '0px');
    return watcher.wait_for('animationend');
  });
}, 'Setting a null effect on a running animation fires an animationend event');

promise_test(function(t) {
  var div = addDiv(t);
  div.style.animation = 'anim 100s';

  var animation = div.getAnimations()[0];
  return animation.ready.then(function() {
    animation.currentTime = 50 * MS_PER_SEC;
    animation.effect = new KeyframeEffect(div,
                                          { left: [ '0px' , '100px'] },
                                          100 * MS_PER_SEC);
    assert_equals(animation.playState, 'running');
    assert_equals(getComputedStyle(div).marginLeft, '0px');
    assert_equals(getComputedStyle(div).left, '50px');
  });
}, 'Replacing an animation\'s effect with an effect that targets a different ' +
   'property should update both properties');

promise_test(function(t) {
  var div = addDiv(t);
  div.style.animation = 'anim 100s';

  var animation = div.getAnimations()[0];
  return animation.ready.then(function() {
    animation.currentTime = 50 * MS_PER_SEC;
    animation.effect = new KeyframeEffect(div,
                                          { left: [ '0px' , '100px'] },
                                          20 * MS_PER_SEC);
    assert_equals(animation.playState, 'finished');
  });
}, 'Replacing an animation\'s effect with a shorter one that should have ' +
   'already finished, the animation finishes immediately');

promise_test(function(t) {
  var div = addDiv(t);
  div.style.animation = 'anim 100s';

  var animation = div.getAnimations()[0];
  assert_true(animation.pending);

  animation.effect = new KeyframeEffect(div,
                                        { left: [ '0px' , '100px'] },
                                        100 * MS_PER_SEC);
  assert_true(animation.pending);

  return animation.ready.then(function() {
    assert_false(animation.pending);
  });
}, 'A play-pending animation\'s effect whose effect is replaced still exits ' +
   'the pending state');

promise_test(function(t) {
  var div1 = addDiv(t);
  var div2 = addDiv(t);

  var watcher1 = new EventWatcher(t, div1, 'animationstart');
  // Watch |div2| as well to ensure it does *not* get events.
  var watcher2 = new EventWatcher(t, div2, 'animationstart');

  div1.style.animation = 'anim 100s';

  var animation = div1.getAnimations()[0];
  animation.effect = new KeyframeEffect(div2,
                                        { left: [ '0px', '100px' ] },
                                        100 * MS_PER_SEC);

  return watcher1.wait_for('animationstart').then(function() {
    assert_equals(animation.effect.target, div2);

    // Then wait a couple of frames and check that no event was dispatched.
    return waitForAnimationFrames(2);
  });
}, 'The event is dispatched at the original element even after setting an ' +
   'effect with a different target element');

promise_test(function(t) {
  var div = addDiv(t);
  var watcher = new EventWatcher(t, div, [ 'animationstart',
                                           'animationend',
                                           'animationcancel' ]);
  div.style.animation = 'anim 100s';
  var animation = div.getAnimations()[0];
  animation.finish();

  return watcher.wait_for([ 'animationstart',
                            'animationend' ]).then(function(evt) {
    // Set a longer effect
    animation.effect = new KeyframeEffect(div,
                                          { left: [ '0px', '100px' ] },
                                          200 * MS_PER_SEC);
    return watcher.wait_for('animationstart');
  });
}, 'After replacing a finished animation\'s effect with a longer one ' +
   'it fires an animationstart event');

</script>
</body>
