<!DOCTYPE html><!-- webkit-test-runner [ RequestIdleCallbackEnabled=true ] -->
<title>window.requestIdleCallback deals with timeouts correctly</title>
<meta name="timeout" content="long">
<link rel="author" title="Ross McIlroy" href="mailto:rmcilroy@chromium.org" />
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>

async_test(function() {
  // Check whether requestIdleCallback with a timeout works when the event loop
  // is busy.
  var busy_loop_iterations_remaining = 10;  // Should take 20 * 40 = 400ms
  var idle_callback_scheduled;
  var idle_callback = this.step_func_done(function(deadline) {
    assert_false(deadline.didTimeout, "IdleDeadline.didTimeout MUST be false if requestIdleCallback wasn't scheduled due to a timeout");
    assert_equals(busy_loop_iterations_remaining, 0, "Busy event loop should be finished by the time we get scheduled");
  });

  var busy_loop_iterations_remaining = 10;  // Should take 20 * 40 = 400ms
  step_timeout(this.step_func(function busyLoop() {
    var start_time = performance.now();
    if (!idle_callback_scheduled) {
      idle_callback_scheduled = start_time;
      requestIdleCallback(idle_callback);
    }

    // Use up more than a frames worth of budget.
    while (performance.now() - start_time < 40) {
    }
    if (busy_loop_iterations_remaining > 0) {
      busy_loop_iterations_remaining--;
      step_timeout(busyLoop);
    }
  }));
}, 'requestIdleCallback not scheduled when event loop is busy.');

async_test(function() {
  // Check whether requestIdleCallback with a timeout works when the event loop
  // is busy.
  var busy_loop_iterations_remaining = 10;  // Should take 20 * 40 = 400ms
  var timeout = 200;
  var idle_callback_scheduled;
  var idle_callback = this.step_func_done(function(deadline) {
    var time_delta = performance.now() - idle_callback_scheduled;
    assert_true(time_delta >= timeout, "Should only have been run after timeout");
    assert_true(deadline.timeRemaining() == 0, "IdleDeadline.timeRemaining MUST be equal to zero if requestIdleCallback was scheduled due to a timeout");
    assert_true(deadline.didTimeout, "IdleDeadline.didTimeout MUST be true if requestIdleCallback was scheduled due to a timeout");
    assert_true(busy_loop_iterations_remaining > 0, "Busy event loop should still be going");
  });

  step_timeout(this.step_func(function busyLoop() {
    var start_time = performance.now();
    if (!idle_callback_scheduled) {
      idle_callback_scheduled = start_time;
      requestIdleCallback(idle_callback, { timeout: timeout });
    }

    // Use up more than a frames worth of budget.
    while (performance.now() - start_time < 40) {
    }
    if (busy_loop_iterations_remaining > 0) {
      busy_loop_iterations_remaining--;
      step_timeout(busyLoop);
    }
  }));
}, 'requestIdleCallback scheduled with timeout when event loop is busy.');

</script>
<h1>Test of requestIdleCallback timeout behavior</h1>
<div id="log"></div>
