summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/video-rvfc/request-video-frame-callback-repeating.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/video-rvfc/request-video-frame-callback-repeating.html')
-rw-r--r--testing/web-platform/tests/video-rvfc/request-video-frame-callback-repeating.html89
1 files changed, 89 insertions, 0 deletions
diff --git a/testing/web-platform/tests/video-rvfc/request-video-frame-callback-repeating.html b/testing/web-platform/tests/video-rvfc/request-video-frame-callback-repeating.html
new file mode 100644
index 0000000000..38e4abafd4
--- /dev/null
+++ b/testing/web-platform/tests/video-rvfc/request-video-frame-callback-repeating.html
@@ -0,0 +1,89 @@
+<!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>