<!doctype html>
<meta charset=utf-8>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../resources/testcommon.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';

promise_test(function(t) {
  var div = addDiv(t);
  var watcher = new EventWatcher(t, div, [ 'transitionend',
                                           'transitioncancel' ]);
  div.style.left = '0px';

  div.style.transition = 'left 100s';
  flushComputedStyle(div);
  div.style.left = '100px';

  var transition = div.getAnimations()[0];
  return transition.ready.then(function() {
    transition.currentTime = 50 * MS_PER_SEC;
    transition.effect = null;
    assert_equals(transition.transitionProperty, 'left');
    assert_equals(transition.playState, 'finished');
    assert_equals(getComputedStyle(div).left, '100px');
    return watcher.wait_for('transitionend');
  });
}, 'Test for removing a transition effect');

promise_test(function(t) {
  var div = addDiv(t);
  var watcher = new EventWatcher(t, div, [ 'transitionend',
                                           'transitioncancel' ]);
  div.style.left = '0px';

  div.style.transition = 'left 100s';
  flushComputedStyle(div);
  div.style.left = '100px';

  var transition = div.getAnimations()[0];
  return transition.ready.then(function() {
    transition.currentTime = 50 * MS_PER_SEC;
    transition.effect = new KeyframeEffect(div,
                                           { marginLeft: [ '0px' , '100px'] },
                                           100 * MS_PER_SEC);
    assert_equals(transition.transitionProperty, 'left');
    assert_equals(transition.playState, 'running');
    assert_equals(getComputedStyle(div).left, '100px');
    assert_equals(getComputedStyle(div).marginLeft, '50px');
  });
}, 'Test for replacing the transition effect by a new keyframe effect');

promise_test(function(t) {
  var div = addDiv(t);
  var watcher = new EventWatcher(t, div, [ 'transitionend',
                                           'transitioncancel' ]);
  div.style.left = '0px';
  div.style.width = '0px';

  div.style.transition = 'left 100s';
  flushComputedStyle(div);
  div.style.left = '100px';

  var transition = div.getAnimations()[0];
  return transition.ready.then(function() {
    transition.currentTime = 50 * MS_PER_SEC;
    transition.effect = new KeyframeEffect(div,
                                           { marginLeft: [ '0px' , '100px'] },
                                           20 * MS_PER_SEC);
    assert_equals(transition.playState, 'finished');
  });
}, 'Test for setting a new keyframe effect with a shorter duration');

promise_test(function(t) {
  var div = addDiv(t);
  var watcher = new EventWatcher(t, div, [ 'transitionend',
                                           'transitioncancel' ]);
  div.style.left = '0px';
  div.style.width = '0px';

  div.style.transition = 'left 100s';
  flushComputedStyle(div);
  div.style.left = '100px';

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

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

  return transition.ready.then(function() {
    assert_false(transition.pending);
  });
}, 'Test for setting a new keyframe effect to a pending transition');

</script>
</body>
