Files
sousa-gecko/testing/web-platform/tests/webrtc-encoded-transform/RTCRtpScriptTransform-encoded-transform.https.html
T
Daniel Holbert 548fe69086 Bug 2008793 [wpt PR 57018] - Annotate that a WebRTC test needs a long harness timeout., a=testonly
Automatic update from web-platform-tests
Annotate that a WebRTC test needs a long harness timeout. (#57018)

The testcase RTCRtpScriptTransform-encoded-transform.https.html has been
observed on wpt.fyi to take more than 10 seconds in at least Firefox and Chrome
(and 2-3 seconds on Safari, which is close enough to 10 that it might overshoot
in rare cases under system load).

So, let's annotate it to avoid imposing a strict 10-second time limit.

Fixes https://github.com/web-platform-tests/interop/issues/1240
--

wpt-commits: fda9be08aa3d6b4a31a2d5995eb780feab5ce4e0
wpt-pr: 57018
2026-01-09 23:28:07 +00:00

184 lines
7.6 KiB
HTML

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src=/resources/testdriver.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script src='../mediacapture-streams/permission-helper.js'></script>
<script src ="routines.js"></script>
</head>
<body>
<video id="video" autoplay controls playsinline></video>
<script>
promise_test(async (test) => {
const worker = new Worker('RTCRtpScriptTransform-encoded-transform-worker.js');
let sender, receiver;
const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'});
const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
const pc = new RTCPeerConnection();
const transceiver1 = pc.addTransceiver("audio");
const transceiver2 = pc.addTransceiver("audio");
transceiver1.sender.transform = senderTransform;
transceiver1.receiver.transform = receiverTransform;
transceiver1.sender.transform = senderTransform;
transceiver1.receiver.transform = receiverTransform;
assert_throws_dom("InvalidStateError", () => transceiver2.sender.transform = senderTransform, "set a used transform 1");
assert_throws_dom("InvalidStateError", () => transceiver2.receiver.transform = receiverTransform, "set a used transform 2");
transceiver1.sender.transform = null;
transceiver1.receiver.transform = null;
assert_throws_dom("InvalidStateError", () => transceiver2.sender.transform = senderTransform, "set a used transform 3");
assert_throws_dom("InvalidStateError", () => transceiver2.receiver.transform = receiverTransform, "set a used transform 4");
}, "Once a transform has been attached, it cannot be reused elsewhere.");
promise_test(async (test) => {
const worker = new Worker('RTCRtpScriptTransform-encoded-transform-worker.js');
const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
assert_equals(data, "registered");
await setMediaPermission("granted", ["camera"]);
const localStream = await navigator.mediaDevices.getUserMedia({video: true});
let sender, receiver;
const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'});
const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
const stream = await new Promise((resolve, reject) => {
createConnections(test, (firstConnection) => {
sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
sender.transform = senderTransform;
}, (secondConnection) => {
secondConnection.ontrack = (trackEvent) => {
receiver = trackEvent.receiver;
receiver.transform = receiverTransform;
resolve(trackEvent.streams[0]);
};
});
});
video.srcObject = stream;
const playingPromise = new Promise(r => video.onplaying = r);
await video.play();
const updatePromise = new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
assert_equals(await updatePromise, "got expected");
await playingPromise;
}, "Receiver and sender read, modifiy and write video frames.");
promise_test(async (test) => {
const worker = new Worker('RTCRtpScriptTransform-encoded-transform-worker.js');
const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
assert_equals(data, "registered");
await setMediaPermission("granted", ["microphone"]);
const localStream = await navigator.mediaDevices.getUserMedia({audio: true});
let sender, receiver;
const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'});
const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
const stream = await new Promise((resolve, reject) => {
createConnections(test, (firstConnection) => {
sender = firstConnection.addTrack(localStream.getAudioTracks()[0], localStream);
sender.transform = senderTransform;
}, (secondConnection) => {
secondConnection.ontrack = (trackEvent) => {
receiver = trackEvent.receiver;
receiver.transform = receiverTransform;
resolve(trackEvent.streams[0]);
};
});
});
video.srcObject = stream;
const playingPromise = new Promise(r => video.onplaying = r);
await video.play();
const updatePromise = new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
assert_equals(await updatePromise, "got expected");
await playingPromise;
}, "Receiver and sender read, modifiy and write audio frames.");
promise_test(async (test) => {
const worker = new Worker('RTCRtpScriptTransform-encoded-transform-no-write-worker.js');
const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
assert_equals(data, "registered");
await setMediaPermission("granted", ["camera"]);
const localStream = await navigator.mediaDevices.getUserMedia({video: true});
let sender, receiver;
const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'});
const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
const stream = await new Promise((resolve, reject) => {
createConnections(test, (firstConnection) => {
sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
sender.transform = senderTransform;
}, (secondConnection) => {
secondConnection.ontrack = (trackEvent) => {
receiver = trackEvent.receiver;
receiver.transform = receiverTransform;
resolve(trackEvent.streams[0]);
};
});
});
video.srcObject = stream;
// As the receiver doesn't get any frames, it won't post a success
// message back and it will cause an expected timeout.
return new Promise((resolve, reject) => {
worker.onmessage = (event) => {reject()};
test.step_timeout(resolve, 500);
});
}, "Sender reads frames but doesn't write them back. Receiver doesn't receive any frames.");
promise_test(async (test) => {
const worker = new Worker('RTCRtpScriptTransform-encoded-transform-drop-frames-worker.js');
const data = await new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
assert_equals(data, "registered");
await setMediaPermission("granted", ["camera"]);
const localStream = await navigator.mediaDevices.getUserMedia({video: true});
let sender, receiver;
const senderTransform = new RTCRtpScriptTransform(worker, {name:'sender'});
const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
const stream = await new Promise((resolve, reject) => {
createConnections(test, (firstConnection) => {
sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
sender.transform = senderTransform;
}, (secondConnection) => {
secondConnection.ontrack = (trackEvent) => {
receiver = trackEvent.receiver;
receiver.transform = receiverTransform;
resolve(trackEvent.streams[0]);
};
});
});
video.srcObject = stream;
const updatePromise = new Promise(resolve => worker.onmessage = (event) => resolve(event.data));
assert_equals(await updatePromise, "got expected");
}, "Sender skips some frames and only writes one back. Receiver only receives that frame.");
</script>
</body>
</html>