<!DOCTYPE html>
<!--
 | Test case which ensures that transitionend events are fired on transitions
 | and they all resolve in the correct order.
 -->
<html>
<head>
  <style>
    .block {
      width: 200px;
      padding: 5px 5px 5px 5px;
      margin: 2px 2px 2px 2px;
      height: 50px;
      opacity: 0;
      background-color: rgb(150, 50, 255);
      font-size: 30px;
    }
  </style>
</head>
<body>
  <div id="container"></div>

<script>
  var transitionsEnded = 0;

  if (window.testRunner) {
    window.testRunner.waitUntilDone();
  }

  // First create all the divs and attach them to the container.
  var NUM_DIVS = 5;
  var containerDiv = document.getElementById('container');
  var divs = []
  for (var i = 0; i < NUM_DIVS; ++i) {
    var newDiv = document.createElement('div');
    newDiv.className = 'block';
    newDiv.style.transitionDuration = (NUM_DIVS - i) * 10 + 'ms';
    newDiv.addEventListener('transitionend', function (e) {
      e.target.innerHTML = ++transitionsEnded + ' ' + e.propertyName;
      if (transitionsEnded == NUM_DIVS) {
        // Take a snapshot after all the divs have finished transitioning.
        if (window.testRunner) {
          window.testRunner.notifyDone();
        }
      }
    });
    containerDiv.appendChild(newDiv);
    divs.push(newDiv);
  }

  window.addEventListener('load', function() {
    if (window.testRunner) {
      // Do a layout upon the load event so that we setup our source styles
      // that we will be transitioning from.
      window.testRunner.DoNonMeasuredLayout();
    }

    // Now go through each of them and start their transitions.
    for (var i = 0; i < NUM_DIVS; ++i) {
      divs[i].style.opacity = 1;
    }

    if (window.testRunner) {
      // Do another layout to start the transitions.
      window.testRunner.DoNonMeasuredLayout();

      // Advance the clock to exactly the end of the transition
      // durations.
      window.testRunner.AdvanceClockByMs(NUM_DIVS * 10);
    }
  });
</script>

</body>
</html>
