<!doctype html><!-- webkit-test-runner [ enableCSSAnimationsAndCSSTransitionsBackedByWebAnimations=true ] -->
<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>
