<html><!-- webkit-test-runner [ experimental:WebAnimationsCSSIntegrationEnabled=false ] -->
<head>
<title>Test removal of animation shorthand property</title>
<style type="text/css" media="screen">
.box {
  height: 10px;
  width: 10px;
  background-color: blue;
}

@-webkit-keyframes anim1 { }
</style>
  <script type="text/javascript" charset="utf-8">
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    const kProperties = [
      "webkitAnimationName",
      "webkitAnimationDuration",
      "webkitAnimationTimingFunction",
      "webkitAnimationDelay",
      "webkitAnimationIterationCount",
      "webkitAnimationDirection",
      "webkitAnimationFillMode"
    ];
    const kElements = [
      { id: "a",
        values: [ ]
      },
      { id: "b",
        values: [ "none", "0s", "ease", "0s", "1", "normal", "none" ]
      },
      { id: "c",
        values: [ "anim1", "10s" ]
      },
      { id: "d",
        values: [ "anim1", "10s", "linear" ]
      },
      { id: "e",
        values: [ "anim1", "10s", "linear", "5s" ]
      },
      { id: "f",
        values: [ "anim1", "10s", "linear", "5s", "3" ]
      },
      { id: "g",
        values: [ "anim1", "10s", "linear", "5s", "infinite", "alternate" ]
      },
      { id: "h",
        values: [ "anim1", "10s", "linear", "5s", "infinite", "alternate", "forwards" ]
      }
    ];
    const kExpectedResults = [ "none", "0s", "ease", "0s", "1", "normal", "none" ];

    function start() {
      kElements.forEach(function(curEl) {
        var el = document.getElementById(curEl.id);
        for (var i=0; i < curEl.values.length; i++) {
          el.style[kProperties[i]] = curEl.values[i];
        }
      });
      setTimeout(remove, 0);
    }

    function remove() {
      kElements.forEach(function(curEl) {
        var el = document.getElementById(curEl.id);
        el.style.removeProperty("-webkit-animation");
      });
      setTimeout(test, 0);
    }

    function test() {
      var resultsString = "";
      kElements.forEach(function(curEl) {
        var el = document.getElementById(curEl.id);
        var elStyle = window.getComputedStyle(el);

        for (var i=0; i < kProperties.length; i++) {
          var computedValue = elStyle[kProperties[i]];
          var expectedValue = kExpectedResults[i];
          if (computedValue == expectedValue)
            resultsString += "Testing " + kProperties[i] + " on " + curEl.id + ": PASS" + "<br>";
          else
            resultsString += "Testing " + kProperties[i] + " on " + curEl.id + " expected <code>" + expectedValue + "</code> got <code>" + computedValue + "</code>: FAIL" + "<br>";

        }
      });

      var results = document.getElementById('result');
      results.innerHTML = resultsString;
      if (window.testRunner)
          testRunner.notifyDone();
    }

    window.addEventListener('load', start, false);
  </script>
</head>
<body>
<div id="a" class="box"></div>
<div id="b" class="box"></div>
<div id="c" class="box"></div>
<div id="d" class="box"></div>
<div id="e" class="box"></div>
<div id="f" class="box"></div>
<div id="g" class="box"></div>
<div id="h" class="box"></div>
<div id="result">
</div>
</body>
</html>
