From 1b8964453ed6830eb2f60a196d62ea686f81afba Mon Sep 17 00:00:00 2001 From: Youenn Fablet Date: Thu, 5 Mar 2026 11:38:38 +0100 Subject: [PATCH 1/3] Safari does not allow video elements without renderer to autoplay To workaround this difference, we make the test explictly call play on the video element. --- webrtc/RTCRtpSender-replaceTrack.https.html | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/webrtc/RTCRtpSender-replaceTrack.https.html b/webrtc/RTCRtpSender-replaceTrack.https.html index 2f632e9fb4e6d7..29bb2606249d2e 100644 --- a/webrtc/RTCRtpSender-replaceTrack.https.html +++ b/webrtc/RTCRtpSender-replaceTrack.https.html @@ -298,14 +298,15 @@ pc2.ontrack = (e) => { v.srcObject = new MediaStream([e.track]); }; - const metadataToBeLoaded = new Promise((resolve) => { - v.addEventListener('loadedmetadata', () => { + const metadataToBeLoadedAndPlaying = new Promise((resolve) => { + v.addEventListener('loadedmetadata', async () => { + await v.play(); resolve(); }); }); exchangeIceCandidates(pc1, pc2); exchangeOfferAnswer(pc1, pc2); - await metadataToBeLoaded; + await metadataToBeLoadedAndPlaying; await detectSignal(t, v, 20); await sender.replaceTrack(track2); await detectSignal(t, v, 250); @@ -328,14 +329,15 @@ pc2.ontrack = (e) => { v.srcObject = new MediaStream([e.track]); }; - const metadataToBeLoaded = new Promise((resolve) => { - v.addEventListener('loadedmetadata', () => { + const metadataToBeLoadedAndPlaying = new Promise((resolve) => { + v.addEventListener('loadedmetadata', async () => { + await v.play(); resolve(); }); }); exchangeIceCandidates(pc1, pc2); exchangeOfferAnswer(pc1, pc2); - await metadataToBeLoaded; + await metadataToBeLoadedAndPlaying; await detectSignal(t, v, 20); await sender.replaceTrack(null); await sender.replaceTrack(track2); From b90486bc6550cdd9e8eb84f6d6d0aef0c33c5b6f Mon Sep 17 00:00:00 2001 From: youennf Date: Thu, 5 Mar 2026 14:36:48 +0100 Subject: [PATCH 2/3] Update webrtc/RTCRtpSender-replaceTrack.https.html Co-authored-by: Harald Alvestrand --- webrtc/RTCRtpSender-replaceTrack.https.html | 1 + 1 file changed, 1 insertion(+) diff --git a/webrtc/RTCRtpSender-replaceTrack.https.html b/webrtc/RTCRtpSender-replaceTrack.https.html index 29bb2606249d2e..c2ba4f76f6e8e0 100644 --- a/webrtc/RTCRtpSender-replaceTrack.https.html +++ b/webrtc/RTCRtpSender-replaceTrack.https.html @@ -301,6 +301,7 @@ const metadataToBeLoadedAndPlaying = new Promise((resolve) => { v.addEventListener('loadedmetadata', async () => { await v.play(); + // note: calling v.play() is required in some browsers, not all. resolve(); }); }); From 20dae3a1eae10127671cf6d805e0b95969547174 Mon Sep 17 00:00:00 2001 From: youennf Date: Thu, 5 Mar 2026 14:37:14 +0100 Subject: [PATCH 3/3] Apply suggestions from code review --- webrtc/RTCRtpSender-replaceTrack.https.html | 1 + 1 file changed, 1 insertion(+) diff --git a/webrtc/RTCRtpSender-replaceTrack.https.html b/webrtc/RTCRtpSender-replaceTrack.https.html index c2ba4f76f6e8e0..a4b5548caaa67b 100644 --- a/webrtc/RTCRtpSender-replaceTrack.https.html +++ b/webrtc/RTCRtpSender-replaceTrack.https.html @@ -333,6 +333,7 @@ const metadataToBeLoadedAndPlaying = new Promise((resolve) => { v.addEventListener('loadedmetadata', async () => { await v.play(); + // note: calling v.play() is required in some browsers, not all. resolve(); }); });