<!DOCTYPE html><!-- webkit-test-runner [ RequestIdleCallbackEnabled=true ] -->
<title>window.requestIdleCallback callback behavior during idle periods.</title>
<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 that if an idle callback calls requestIdleCallback, the new callback
  // doesn't get the same deadline (i.e., runs in a new idle period).
  var previous_deadline = undefined;
  var idle_callbacks_remaining = 10;
  var rIC = this.step_func(function(deadline) {
    var now = performance.now();
    var remaining = deadline.timeRemaining();
    var new_deadline = now + remaining;
    if (previous_deadline != undefined) {
      assert_true(new_deadline > previous_deadline, "A requestIdleCallback scheduled during an idle period should be called back with a deadline greater than that in the current idle period.");
    }

    // Schedule a new requestIdleCallback.
    if (--idle_callbacks_remaining > 0) {
      previous_deadline = new_deadline;
      requestIdleCallback(rIC);
    } else {
      this.done();
    }
  });

  // Spin an empty rAF loop to cause an idle period each frame.
  var idle_task_posted = false;
  requestAnimationFrame(function rAFLoop() {
    if (!idle_task_posted) {
      requestIdleCallback(rIC);
      idle_task_posted = true;
    }
    requestAnimationFrame(rAFLoop);
  });
}, 'Check that if an idle callback calls requestIdleCallback the new callback doesn\'t run in the current idle period.');
</script>
<h1>Test of requestIdleCallback idle period behavior</h1>
<p>This test validates that window.requestIdleCallback deals with callbacks during idle periods correctly.</p>
<div id="log"></div>
