<html>
<head>
  <style>
    .box {
      position: relative;
      left: 0;
      height: 100px;
      width: 100px;
      margin: 10px;
      background-color: blue;
    }
    .transition {
      -webkit-transition-property: left;
      -webkit-transition-duration: 2s;
      -webkit-transition-timing-function: linear;
    }
    #box4 {
      -webkit-transition-property: inherit;
      -webkit-transition-duration: inherit;
      -webkit-transition-timing-function: inherit;
    }
  </style>
  <script>
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    var kExpectedProp = [
      'all', /* box1 */
      'left', /* box2 */
      'left', /* box3 */
      'left', /* box4 */ /* inherits from box3 */
      'left', /* box5 */
      'all', /* box6 */ /* does NOT inherit */
    ];

    var kExpectedDuration = [
      '0s', /* box1 */
      '2s', /* box2 */
      '2s', /* box3 */
      '2s', /* box4 */ /* inherits from box3 */
      '2s', /* box5 */
      '0s', /* box6 */ /* does NOT inherit */
    ];

    var kExpectedTimingFunction = [
      'ease', /* box1 */
      'linear', /* box2 */
      'linear', /* box3 */
      'linear', /* box4 */ /* inherits from box3 */
      'linear', /* box5 */
      'ease', /* box6 */ /* does NOT inherit */
    ];

    var result = '';

    function testValue(index, name, actual, expected) {
      if (actual == expected)
        result += "PASS -- ";
      else
        result += "FAIL -- ";
      result += "Box " + index + " computed transition " + name + ": " + actual + " expected: " + expected + "<br>";
    }
    
    function testProperties()
    {
      var boxes = document.body.getElementsByClassName('box');
      for (var i = 0; i < boxes.length; ++i) {
        var curBox = boxes[i];
        testValue(i+1, "property", window.getComputedStyle(curBox).webkitTransitionProperty, kExpectedProp[i]);
        testValue(i+1, "duration", window.getComputedStyle(curBox).webkitTransitionDuration, kExpectedDuration[i]);
        testValue(i+1, "timing function", window.getComputedStyle(curBox).webkitTransitionTimingFunction, kExpectedTimingFunction[i]);
      }

      document.body.removeChild(document.getElementById('container'));
      document.getElementById('result').innerHTML = result;
      if (window.testRunner)
          testRunner.notifyDone();
    }

    window.addEventListener('load', testProperties, false);
  </script>
</head>
<body>

<div id="container">
  <div id="box1" class="box"></div>
  <div id="box2" class="box transition"></div>
  <div id="box3" class="box transition">
    <div id="box4" class="box"></div>
  </div>
  <div id="box5" class="box transition">
    <div id="box6" class="box"></div>
  </div>
</div>

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

</body>
</html>