<!doctype html>
<meta charset=utf-8>
<title>AnimationEffect.getComputedTiming() for CSS transitions</title>
<!--  TODO: Add a more specific link for this once it is specified.  -->
<link rel="help" href="https://drafts.csswg.org/css-transitions-2/#csstransition">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support/helper.js"></script>
<style>

.animated-div {
  margin-left: 100px;
}

</style>
<div id="log"></div>
<script>

'use strict';


// --------------------
// delay
// --------------------

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().delay, 0, 'Initial value of delay');
}, 'delay of a new tranisition');

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10s 10s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().delay, 10000,
                'Initial value of delay');
}, 'Positive delay of a new transition');

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10s -5s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().delay, -5000,
                'Initial value of delay');
}, 'Negative delay of a new transition');


// --------------------
// endDelay
// --------------------

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().endDelay, 0,
                'Initial value of endDelay');
}, 'endDelay of a new transition');


// --------------------
// fill
// --------------------

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().fill, 'backwards', 'Fill backwards');
}, 'fill of a new transition');


// --------------------
// iterationStart
// --------------------

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().iterationStart, 0,
                'Initial value of iterationStart');
}, 'iterationStart of a new transition');


// --------------------
// iterations
// --------------------

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().iterations, 1,
                'Initial value of iterations');
}, 'iterations of a new transition');


// --------------------
// duration
// --------------------

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().duration, 10000,
                'Initial value of duration');
}, 'duration of a new transition');


// --------------------
// direction
// --------------------

test(t => {
  const div = addDiv(t, { class : 'animated-div' });
  div.style.transition = 'margin-left 10s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().direction, 'normal',
                'Initial value of direction');
}, 'direction of a new transition');


// --------------------
// easing
// --------------------

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().easing, 'ease',
                'Initial value of easing');
}, 'easing of a new transition');

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10s steps(4)';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().easing, 'steps(4)',
                'Initial value of easing');
}, 'non-default easing of a new transition');


// ------------------------------
// endTime
// = max(start delay + active duration + end delay, 0)
// --------------------

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 100s -5s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  const answer = 100000 - 5000; // ms
  assert_equals(effect.getComputedTiming().endTime, answer,
                'Initial value of endTime');
}, 'endTime of a new transition');


// --------------------
// activeDuration
// = iteration duration * iteration count(==1)
// --------------------

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 100s -5s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().activeDuration, 100000,
                'Initial value of activeDuration');
}, 'activeDuration of a new transition');


// --------------------
// localTime
// --------------------

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 100s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().localTime, 0,
                'Initial value of localTime');
}, 'localTime of a new transition');

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 100s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const anim = div.getAnimations()[0];
  anim.currentTime = 5000;
  assert_equals(anim.effect.getComputedTiming().localTime, anim.currentTime,
                'current localTime after setting currentTime');
}, 'localTime is always equal to currentTime');

promise_test(async t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 100s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const anim = div.getAnimations()[0];
  anim.playbackRate = 2; // 2 times faster

  await anim.ready;

  assert_equals(anim.effect.getComputedTiming().localTime, anim.currentTime,
                'localTime is equal to currentTime');
  await waitForFrame();

  assert_equals(anim.effect.getComputedTiming().localTime, anim.currentTime,
                'localTime is equal to currentTime');
}, 'localTime reflects playbackRate immediately');


// --------------------
// progress
// --------------------

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10.5s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().progress, 0.0,
                'Initial value of progress');
}, 'progress of a new transition');

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10.5s 2s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().progress, 0.0,
                'Initial value of progress');
}, 'progress of a new transition with positive delay in before phase');

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10.5s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const anim = div.getAnimations()[0];
  anim.finish();
  assert_equals(anim.effect.getComputedTiming().progress, null,
                'finished progress');
}, 'progress of a finished transition');


// --------------------
// currentIteration
// --------------------

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().currentIteration, 0,
                'Initial value of currentIteration');
}, 'currentIteration of a new transition');

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10s 2s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const effect = div.getAnimations()[0].effect;
  assert_equals(effect.getComputedTiming().currentIteration, 0,
                'Initial value of currentIteration');
}, 'currentIteration of a new transition with positive delay in before phase');

test(t => {
  const div = addDiv(t, { class: 'animated-div' });
  div.style.transition = 'margin-left 10s';
  getComputedStyle(div).marginLeft;
  div.style.marginLeft = '10px';

  const anim = div.getAnimations()[0];
  anim.finish();
  assert_equals(anim.effect.getComputedTiming().currentIteration, null,
                'finished currentIteration');
}, 'currentIteration of a finished transition');

</script>
