<!DOCTYPE html>
<html>
<head>
  <script>
  var resizeEventCounter = 0;
  var resizeCounter = 0;
  var currentTimerID;
  var timerScheduleTimes = [];
  
  window.onresize = function(event) {
    resizeEventCounter++;
  }

  function getRandomArbitrary(min, max) {
    return Math.random() * (max - min) + min;
  }

  function resizeMe() {
    document.getElementById('contentToResize').style.height = getRandomArbitrary(50, 500) + 'px';
    document.body.offsetHeight;
  
    if (++resizeCounter < 100) {
      currentTimerID = setTimeout('resizeMe();', 10);
      if (window.performance)
          timerScheduleTimes.push(performance.now());
      if (window.internals && internals.isTimerThrottled(currentTimerID))
        console.log("Timer " + currentTimerID + " is throttled, resizeCounter = " + resizeCounter);
    } else {
      parent.document.getElementById('result').innerHTML = resizeEventCounter > 100 ? "FAILED. Too many resize events" : "PASS";
      if (window.testRunner)
        testRunner.notifyDone();
    }
  }

  setTimeout(function() {
    console.log("Test timed out. Resized " + resizeCounter + " times, got " + resizeEventCounter + " events.");
    if (window.internals && internals.isTimerThrottled(currentTimerID))
      console.log("Timer was throttled.");
    if (window.performance)
      console.log("Timers were scheduled at: " + timerScheduleTimes);
    console.log("document.hidden = " + document.hidden + "; document.visibilityState = " + document.visibilityState);
    if (window.testRunner)
      testRunner.notifyDone();
  }, 20000);

</script>
</head>
<body onload='resizeMe();'>
    <p id='contentToResize'></p>
</body>
</html>
