<!DOCTYPE html><!-- webkit-test-runner [ experimental:WebAnimationsCSSIntegrationEnabled=false ] -->

<html>
<head>
  <style>
    #target {
      position: relative;
      left: 100px;
      height: 100px;
      width: 100px;
      background-color: blue;
      -webkit-animation-duration: 1s;
      -webkit-animation-timing-function: linear;
    }

    @-webkit-keyframes anim {
      from { left: 10px; }
      40% { left: 30px; }
      60% { left: 15px; }
      to { left: 20px; }
    }
   </style>

   <script src="resources/animation-test-helpers.js"></script>
   <script>
    if (window.testRunner)
      testRunner.dumpAsText();

    function animationStarted()
    {
      if (window.testRunner) {
        var target = document.getElementById('target');
        var paused = internals.pauseAnimationAtTimeOnElement("anim", 1, target);
        var result;
        if (paused)
          result = "PASS: correctly paused animation";
        else
          result = "FAIL: failed to pause animation";

        document.getElementById('results').innerText = result;
        testRunner.notifyDone();
      } else
        document.getElementById('results').innerText = "This test requires WebCore Internals";
    }

    function startTest()
    {
      var target = document.getElementById('target');
      target.style.webkitAnimationName = "anim";
      waitForAnimationToStart(target, animationStarted);
    }
   </script>
</head>
<body onload="startTest()">
  <!-- Test for Internals' pauseAnimationAtTimeOnElement() API on animations with multiple keyframes -->
  <div id="target"></div>
  <div id="results"></div>

</body>
</html>
