<!DOCTYPE html><!-- webkit-test-runner [ experimental:WebAnimationsCSSIntegrationEnabled=false ] -->
<html>
<head>
  <style>
    #target1 {
      -webkit-transition-property: none;
    }
    #target2 {
      transition-property: none;
    }
  </style>
  <script>
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    function testValue(actual, expected) {
      if (actual == expected)
        document.getElementById('result').innerHTML += 'PASS: transition-property was ' + expected + '<br>';
      else
        document.getElementById('result').innerHTML += 'FAIL: transition-property was ' + actual + ', expected ' + expected + '<br>';
    }


    function testProperties()
    {
      var target1 = document.getElementById('target1');
      var target2 = document.getElementById('target2');
      testValue(getComputedStyle(target1).webkitTransitionProperty, 'none');
      testValue(getComputedStyle(target2).transitionProperty, 'none');

      target1.style.webkitTransitionProperty = 'initial';
      target2.style.transitionProperty = 'initial';
      testValue(getComputedStyle(target1).webkitTransitionProperty, 'all');
      testValue(getComputedStyle(target2).transitionProperty, 'all');

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

    }

    window.addEventListener('load', testProperties, false);
  </script>
</head>
<body>
<p>Tests that explicitly setting the transition-property property to 'initial' works for both prefixed and unprefixed versions.

<div id="target1"></div>
<div id="target2"></div>

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

</body>
</html>