chromium/tools/perf/page_sets/tough_animation_cases/css_animations_staggered_chaining_by_inserting_style_element.html

<!DOCTYPE html>
<meta name="viewport" content="width=device-width, user-scalable=no">
<link rel="stylesheet" type="text/css" href="resources/tablet.css">
<script src="resources/perf_test_helper.js"></script>

<container id="container"></container>

<script>
var N = PerfTestHelper.getN(500);
var duration = 1000;

function startAnimation() {
  var target = document.createElement('target');
  container.appendChild(target);
  updateStyle(target);
  target.addEventListener('animationend', function(e) {
    updateStyle(target);
  });
}

var nextId = 0;
var nextAnim = 0;
function updateStyle(element) {
  if (!element.id) {
    element.id = 'e' + nextId++;
  }
  if (element.styleSheet) {
    element.styleSheet.remove();
  }
  var id = element.id;
  var anim = id + 'anim' + nextAnim++;
  var style = document.createElement('style');
  style.textContent = '\
  #' + id + ' {\
    animation: ' + anim + ' 1s;\
  }\n\
  @keyframes ' + anim + ' {\
    0% { opacity: 0; }\
    100% { opacity: 1; }\
  }';
  container.appendChild(style);
  element.styleSheet = style;
}

requestAnimationFrame(function(t) {
  var base = t;
  var i = 0;

  function staggeredStart(t) {
    elapsed = t - base;
    for (; i < N * elapsed / duration; i++) {
      startAnimation();
    }
    if (i < N) {
      requestAnimationFrame(staggeredStart);
    } else {
      PerfTestHelper.signalReady();
    }
  }
  requestAnimationFrame(staggeredStart);
});
</script>