<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><!-- webkit-test-runner [ experimental:WebAnimationsCSSIntegrationEnabled=false ] -->

<html lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>Test simple animation with fill modes</title>
  <style type="text/css" media="screen">
    .box {
      position: relative;
      left: 100px;
      top: 10px;
      height: 30px;
      width: 200px;
      -webkit-animation-delay: 0.1s;
      -webkit-animation-duration: 0.1s;
      -webkit-animation-timing-function: linear;
    }

    .two-keyframes {
      -webkit-animation-name: anim1;
    }

    .three-keyframes {
      -webkit-animation-name: anim2;
    }

    @-webkit-keyframes anim1 {
        from { left: 200px; }
        to   { left: 300px; }
    }
    @-webkit-keyframes anim2 {
        from { left: 200px; }
        50% { left: 250px; }
        to   { left: 300px; }
    }

    #a, #f {
      background-color: blue;
      -webkit-animation-fill-mode: none;
    }
    #b, #g {
      background-color: red;
      -webkit-animation-fill-mode: backwards;
    }
    #c, #h {
      background-color: green;
      -webkit-animation-fill-mode: forwards;
    }
    #d, #i {
      background-color: yellow;
      -webkit-animation-fill-mode: both;
    }
    #e, #j {
      background-color: #999;
      -webkit-animation-fill-mode: both;
      -webkit-animation-iteration-count: 2;
      -webkit-animation-direction: alternate;
    }
  </style>
  <script type="text/javascript" charset="utf-8">
    const numAnims = 10;
    var animsFinished = 0;
    const allowance = 5;
    const expectedValues = [
      {id: "a", start: 100, end: 100},
      {id: "b", start: 200, end: 100},
      {id: "c", start: 100, end: 300},
      {id: "d", start: 200, end: 300},
      {id: "e", start: 200, end: 200},
      {id: "f", start: 100, end: 100},
      {id: "g", start: 200, end: 100},
      {id: "h", start: 100, end: 300},
      {id: "i", start: 200, end: 300},
      {id: "j", start: 200, end: 200}
    ];
    var result = "";

    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    function animationEnded(event) {
        if (++animsFinished == numAnims) {
            setTimeout(endTest, 0); // this set timeout should be ok in the test environment
                                    // since we're just giving style a chance to resolve
        }
    };

    function endTest() {

        for (var i=0; i < expectedValues.length; i++) {
            var el = document.getElementById(expectedValues[i].id);
            var expectedValue = expectedValues[i].end;
            var realValue = window.getComputedStyle(el).getPropertyCSSValue("left").getFloatValue(CSSPrimitiveValue.CSS_NUMBER);
            if (Math.abs(expectedValue - realValue) < allowance) {
              result += "PASS";
            } else {
              result += "FAIL";
            }
            result += " - end of animation - id: " + expectedValues[i].id + " expected: " + expectedValue + " actual: " + realValue + "<br>";
        }
        document.getElementById('result').innerHTML = result;

        if (window.testRunner)
            testRunner.notifyDone();
    }

    window.onload = function () {
        for (var i=0; i < expectedValues.length; i++) {
            var el = document.getElementById(expectedValues[i].id);
            var expectedValue = expectedValues[i].start;
            var realValue = window.getComputedStyle(el).getPropertyCSSValue("left").getFloatValue(CSSPrimitiveValue.CSS_NUMBER);
            if (Math.abs(expectedValue - realValue) < allowance) {
              result += "PASS";
            } else {
              result += "FAIL";
            }
            result += " - start of animation - id: " + expectedValues[i].id + " expected: " + expectedValue + " actual: " + realValue + "<br>";
        }
        document.addEventListener("webkitAnimationEnd", animationEnded, false);
    };

  </script>
</head>
<body>
This test performs an animation of the left property with four different
fill modes on two sets of objects. The first set has animations with
only from and to keyframes. The second set has animations with from, to and
a third keyframe at 50%. It animates over 0.1 second with a 0.1 second delay.
It takes snapshots at document load and the end of the animation.

<div id="a" class="box two-keyframes">
  None - 2 keyframes
</div>
<div id="b" class="box two-keyframes">
  Backwards - 2 keyframes
</div>
<div id="c" class="box two-keyframes">
  Forwards - 2 keyframes
</div>
<div id="d" class="box two-keyframes">
  Both - 2 keyframes
</div>
<div id="e" class="box two-keyframes">
  Both iterating - 2 keyframes
</div>

<div id="f" class="box three-keyframes">
  None - 3 keyframes
</div>
<div id="g" class="box three-keyframes">
  Backwards - 3 keyframes
</div>
<div id="h" class="box three-keyframes">
  Forwards - 3 keyframes
</div>
<div id="i" class="box three-keyframes">
  Both - 3 keyframes
</div>
<div id="j" class="box three-keyframes">
  Both iterating - 3 keyframes
</div>

<div id="result">
</div>
</body>
</html>
