MediaStream-clone.https.html (4362B)
1 <!doctype html> 2 <html> 3 <head> 4 <title>MediaStream and MediaStreamTrack clone()</title> 5 <link rel="help" href="https://w3c.github.io/mediacapture-main/#dom-mediastream-clone"> 6 <link rel="help" href="https://w3c.github.io/mediacapture-main/#dom-mediastreamtrack-clone"> 7 </head> 8 <body> 9 <p class="instructions">When prompted, accept to give permission to use your audio and video devices.</p> 10 <h1 class="instructions">Description</h1> 11 <p class="instructions">This test checks that cloning MediaStreams and MediaStreamTracks works as expected.</p> 12 <script src=/resources/testharness.js></script> 13 <script src=/resources/testharnessreport.js></script> 14 <script src=/resources/testdriver.js></script> 15 <script src=/resources/testdriver-vendor.js></script> 16 <script src=permission-helper.js></script> 17 <script> 18 19 promise_test(async t => { 20 await setMediaPermission(); 21 const stream = await navigator.mediaDevices.getUserMedia({video: true, audio: true}); 22 assert_equals(stream.getAudioTracks().length, 1); 23 assert_equals(stream.getVideoTracks().length, 1); 24 25 const clone1 = stream.clone(); 26 assert_equals(clone1.getAudioTracks().length, 1); 27 assert_equals(clone1.getVideoTracks().length, 1); 28 assert_not_equals(stream.getAudioTracks()[0].id, clone1.getAudioTracks()[0].id); 29 assert_not_equals(stream.getVideoTracks()[0].id, clone1.getVideoTracks()[0].id); 30 31 stream.getTracks().forEach(track => track.stop()); 32 assert_false(stream.active); 33 assert_equals(stream.getAudioTracks()[0].readyState, "ended"); 34 assert_equals(stream.getVideoTracks()[0].readyState, "ended"); 35 assert_true(clone1.active); 36 assert_equals(clone1.getAudioTracks()[0].readyState, "live"); 37 assert_equals(clone1.getVideoTracks()[0].readyState, "live"); 38 39 clone1.getAudioTracks()[0].stop(); 40 assert_true(clone1.active); 41 assert_equals(clone1.getAudioTracks()[0].readyState, "ended"); 42 assert_equals(clone1.getVideoTracks()[0].readyState, "live"); 43 44 const clone2 = clone1.clone(); 45 assert_true(clone2.active); 46 assert_equals(clone2.getAudioTracks()[0].readyState, "ended"); 47 assert_equals(clone2.getVideoTracks()[0].readyState, "live"); 48 49 clone1.getVideoTracks()[0].stop(); 50 clone2.getVideoTracks()[0].stop(); 51 52 const clone3 = clone2.clone(); 53 assert_false(clone3.active); 54 assert_equals(clone3.getAudioTracks()[0].readyState, "ended"); 55 assert_equals(clone3.getVideoTracks()[0].readyState, "ended"); 56 assert_not_equals(clone1.getAudioTracks()[0].id, clone2.getAudioTracks()[0].id); 57 assert_not_equals(clone1.getVideoTracks()[0].id, clone2.getVideoTracks()[0].id); 58 assert_not_equals(clone2.getAudioTracks()[0].id, clone3.getAudioTracks()[0].id); 59 assert_not_equals(clone2.getVideoTracks()[0].id, clone3.getVideoTracks()[0].id); 60 assert_not_equals(clone1.getAudioTracks()[0].id, clone3.getAudioTracks()[0].id); 61 assert_not_equals(clone1.getVideoTracks()[0].id, clone3.getVideoTracks()[0].id); 62 }, "Tests that cloning MediaStream objects works as expected"); 63 64 promise_test(async t => { 65 const stream = await navigator.mediaDevices.getUserMedia({video: true, audio: true}); 66 assert_equals(stream.getAudioTracks().length, 1); 67 assert_equals(stream.getVideoTracks().length, 1); 68 assert_equals(stream.getAudioTracks()[0].readyState, "live"); 69 assert_equals(stream.getVideoTracks()[0].readyState, "live"); 70 assert_true(stream.active); 71 72 const audio_clone = stream.getAudioTracks()[0].clone(); 73 const video_clone = stream.getVideoTracks()[0].clone(); 74 assert_equals(audio_clone.readyState, "live"); 75 assert_equals(video_clone.readyState, "live"); 76 assert_not_equals(stream.getAudioTracks()[0].id, audio_clone.id); 77 assert_not_equals(stream.getVideoTracks()[0].id, video_clone.id); 78 79 stream.getTracks().forEach(track => track.stop()); 80 assert_false(stream.active); 81 assert_equals(stream.getAudioTracks()[0].readyState, "ended"); 82 assert_equals(stream.getVideoTracks()[0].readyState, "ended"); 83 assert_equals(audio_clone.readyState, "live"); 84 assert_equals(video_clone.readyState, "live"); 85 86 stream.addTrack(audio_clone); 87 stream.addTrack(video_clone); 88 assert_true(stream.active); 89 90 stream.getTracks().forEach(track => track.stop()); 91 assert_false(stream.active); 92 assert_equals(audio_clone.readyState, "ended"); 93 assert_equals(video_clone.readyState, "ended"); 94 }, "Tests that cloning MediaStreamTrack objects works as expected"); 95 96 </script> 97 </body> 98 </html>