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

<html>
<head>
  <style>
    #box {
      height: 100px;
      width: 100px;
      background-color: blue;
      -webkit-transition-duration: 1s;
      -webkit-transition-timing-function: linear;
      -webkit-transition-property: -webkit-transform;
    }
  </style>
  <script>
    if (window.testRunner) {
      testRunner.dumpAsText();
      testRunner.waitUntilDone();
    }
    
    var result = "PASS";
    const defaultTolerance = 10;
    var transitionStartTime;
    
    function isCloseEnough(actual, desired)
    {
        var diff = Math.abs(actual - desired);
        return diff < defaultTolerance;
    }
    
    function changeValues()
    {
        var box = document.getElementById('box');
        box.style.webkitTransitionDuration = "0.1s";
    }
    
    function getXPosition()
    {
        var t = window.getComputedStyle(document.getElementById('box')).webkitTransform;
        t = t.split("(");
        t = t[1].split(",");
        return t[4];
    }
    
    function checkIntermediateValue()
    {
        // We should be roughly halfway in the transition from 0 to 100, but the
        // timeout may not fire exactly then. Figure out where we should be 
        // based on a linear interpolation of timestamps.
        var actualXPos = getXPosition();
        var expectedXPos = (new Date().getTime() - transitionStartTime)/1000 * 100;
        if (!isCloseEnough(actualXPos, expectedXPos))
            result = 'FAIL for intermediate value (was: ' + actualXPos + ', expected: ' + expectedXPos + ')';
    }

    function checkFinalValue()
    {
        var actualXPos = getXPosition();
        var transitionFraction = (new Date().getTime() - transitionStartTime)/100;
        var expectedXPos = 100 - Math.min(transitionFraction, 1) * 100;
 
        if (!isCloseEnough(actualXPos, expectedXPos)) {
            if (result == 'PASS')
                result = '';
            result += 'FAIL for final value (was: ' + actualXPos + ', expected: ' + expectedXPos + ')';
        }
        
        document.getElementById('result').innerText = result;
        if (window.testRunner)
            testRunner.notifyDone();
    }
    
    function goBack()
    {
        var box = document.getElementById('box');
        box.style.webkitTransform = 'translateX(0)';
        transitionStartTime = new Date().getTime();
    }

    function start()
    {
        var box = document.getElementById('box');
        setTimeout(changeValues, 100);
        setTimeout(checkIntermediateValue, 500);
        setTimeout(checkFinalValue, 1300);
        box.style.webkitTransform = 'translateX(100px)';
        transitionStartTime = new Date().getTime();
    }
    
    window.addEventListener('load', start, false);
    document.addEventListener('webkitTransitionEnd', goBack, false);
  </script>
</head>
<body>

<p>Test changes -webkit-transition-duration while the transition is running to ensure that the running transition is not affected</p>
<div id="box">
</div>
<div id="result">
</div>
</body>
</html>
