<!DOCTYPE html>
<html>
<title>Test having multiple video.rVFC callbacks in flight for a single element.</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;
    let firstMetadata;

    video.requestVideoFrameCallback(t.step_func((time, metadata) => {
      firstTime = time;
      firstMetadata = metadata;
    }));

    video.requestVideoFrameCallback(t.step_func((time, metadata) => {
      assert_equals(firstTime, time);
      assert_object_equals(firstMetadata, metadata);
      done();
    }));

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

    return promise;
}, 'Test callbacks get the same information.');

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

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

    let secondCallbackId;

    video.requestVideoFrameCallback(
      t.step_func(_ => { video.cancelVideoFrameCallback(secondCallbackId); })
    );

    secondCallbackId = video.requestVideoFrameCallback(
      t.step_func(_ => {
        assert_unreached("Cancelled callbacks shouldn't be executed")
      })
    );

    // NOTE: This callback should be executed last.
    video.requestVideoFrameCallback(done);

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

    return promise;
}, 'Test we can cancel callbacks from callbacks.');
</script>
</html>
