<!DOCTYPE html>
<html>
<title>Test repeatedly chaining video.rVFC() callbacks.</title>
<body></body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/media.js"></script>
<script>

promise_test(async function(t) {
    let done;
    const promise = new Promise(resolve => done = resolve);

    let video = document.createElement('video');
    document.body.appendChild(video);

    let firstTime;
    video.requestVideoFrameCallback(t.step_func((time) => {
      firstTime = time;

      // Queue up a callback and make sure it's not immediately executed.
      let secondTime;
      video.requestVideoFrameCallback(t.step_func((time) => {
        secondTime = time;
        assert_greater_than(secondTime, firstTime, "Callbacks should be executed on the next frame");
      }))

      // Queue up a second callback, and make sure it's called at the same time
      // as the one we just queued up.
      video.requestVideoFrameCallback(t.step_func((time) => {
        assert_equals(time, secondTime, "Callbacks queued together should be called at the same time");
        done();
      }))

    }));

    video.src = getVideoURI('/media/movie_5');
    await video.play();

    return promise;
}, 'Test new callbacks are only called on the next frame.');

promise_test(async function(t) {
    let done;
    const promise = new Promise(resolve => done = resolve);

    let video = document.createElement('video');
    document.body.appendChild(video);

    let maxNumberOfCalls = 10;
    let currentCallNumber = 0;
    let lastMetadata;

    function verifyMetadata(last, current) {
      assert_greater_than(current.presentedFrames, last.presentedFrames, "presentedFrames should be monotonically increasing");
      assert_greater_than(current.presentationTime, last.presentationTime, "presentationTime should be monotonically increasing");
      assert_greater_than(current.expectedDisplayTime, last.expectedDisplayTime, "expectedDisplayTime should be monotonically increasing");

      // We aren't seeking through the file, so this should be increasing from frame to frame.
      assert_greater_than(current.mediaTime, last.mediaTime, "mediaTime should be increasing");

      // The test video's size doesn't change.
      assert_equals(current.width, last.width, "width should remain constant");
      assert_equals(current.height, last.height, "height should remain constant");
    }

    function repeatingCallback(time, metadata) {
      // Skip the first call to verifyMetadata.
      if (currentCallNumber)
        verifyMetadata(lastMetadata, metadata)

      lastMetadata = metadata;

      if (++currentCallNumber > maxNumberOfCalls) {
        done()
      } else {
        video.requestVideoFrameCallback(t.step_func(repeatingCallback));
      }
    }

    video.requestVideoFrameCallback(t.step_func(repeatingCallback));

    video.src = getVideoURI('/media/movie_5');
    await video.play();

    return promise;
}, 'Test chaining calls to video.rVFC, and verify the required parameters.');
</script>
</html>
