<!DOCTYPE html><!-- webkit-test-runner [ experimental: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>
