blob: d7073cfa15f3ade99dacc76d18c6e60c23a2f8fb [file] [log] [blame]
<!doctype html><!-- webkit-test-runner [ RequestVideoFrameCallbackEnabled=true ] -->
<html>
<head>
<meta charset="utf-8">
<title>Testing rvfc on getUserMedia stream</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
</head>
<body>
<video id="video" autoplay=""></video>
<script>
async function grabNextMetadata(video)
{
return new Promise((resolve, reject) => {
const identifier = video.requestVideoFrameCallback((now, metadata) => {
resolve(metadata);
});
setTimeout(() => {
reject("no metadata for " + identifier);
video.cancelVideoFrameCallback(identifier);
}, 5000);
});
}
promise_test(async (test) => {
const localStream = await navigator.mediaDevices.getUserMedia({video: { width: 640, height: 480 } });
video.srcObject = localStream;
await video.play();
let resolve;
let promise = new Promise(r => resolve = r);
const id1 = video.requestVideoFrameCallback((now, metadata) => {
video.cancelVideoFrameCallback(id1);
video.cancelVideoFrameCallback(id2);
const id3 = video.requestVideoFrameCallback((now, metadata) => { assert_not_reached(); });
video.cancelVideoFrameCallback(id3);
setTimeout(resolve, 100);
});
const id2 = video.requestVideoFrameCallback((now, metadata) => {
assert_not_reached();
});
return promise;
}, "Validate callbacks can be updated within a callback");
promise_test(async (test) => {
const localStream = await navigator.mediaDevices.getUserMedia({video: { width: 640, height: 480 } });
video.srcObject = localStream;
await video.play();
let metadata = await grabNextMetadata(video);
assert_equals(metadata.width, 640);
assert_equals(metadata.height, 480);
assert_greater_than(metadata.presentedFrames, 0);
const presentedFrames = metadata.presentedFrames;
await localStream.getVideoTracks()[0].applyConstraints({width: 320, height: 240});
let counter = 0;
while (++counter < 100 && metadata.width !== 320) {
await new Promise(resolve => setTimeout(resolve, 50));
metadata = await grabNextMetadata(video);
}
assert_equals(metadata.width, 320);
assert_greater_than(metadata.presentedFrames, presentedFrames);
}, "Validate callbacks and metadata for getUserMedia");
promise_test(async (test) => {
const localStream = await navigator.mediaDevices.getUserMedia({video: { width: 640, height: 480 } });
video.srcObject = localStream;
await video.play();
let counter = 0;
let resolve;
const promise = new Promise(r => resolve = r);
video.requestVideoFrameCallback(() => {
++counter;
resolve();
});
await promise;
await new Promise(resolve => video.requestVideoFrameCallback(resolve));
assert_equals(counter, 1);
}, "Validate callbacks are called only once");
</script>
</body>
</html>