| <!doctype html> |
| <html> |
| <head> |
| <title>MediaStream and MediaStreamTrack clone()</title> |
| <link rel="help" href="https://w3c.github.io/mediacapture-main/#dom-mediastream-clone"> |
| <link rel="help" href="https://w3c.github.io/mediacapture-main/#dom-mediastreamtrack-clone"> |
| </head> |
| <body> |
| <p class="instructions">When prompted, accept to give permission to use your audio and video devices.</p> |
| <h1 class="instructions">Description</h1> |
| <p class="instructions">This test checks that cloning MediaStreams and MediaStreamTracks works as expected.</p> |
| <script src=/resources/testharness.js></script> |
| <script src=/resources/testharnessreport.js></script> |
| <script> |
| |
| promise_test(async t => { |
| const stream = await navigator.mediaDevices.getUserMedia({video: true, audio: true}); |
| assert_equals(stream.getAudioTracks().length, 1); |
| assert_equals(stream.getVideoTracks().length, 1); |
| |
| const clone1 = stream.clone(); |
| assert_equals(clone1.getAudioTracks().length, 1); |
| assert_equals(clone1.getVideoTracks().length, 1); |
| assert_not_equals(stream.getAudioTracks()[0].id, clone1.getAudioTracks()[0].id); |
| assert_not_equals(stream.getVideoTracks()[0].id, clone1.getVideoTracks()[0].id); |
| |
| stream.getTracks().forEach(track => track.stop()); |
| assert_false(stream.active); |
| assert_equals(stream.getAudioTracks()[0].readyState, "ended"); |
| assert_equals(stream.getVideoTracks()[0].readyState, "ended"); |
| assert_true(clone1.active); |
| assert_equals(clone1.getAudioTracks()[0].readyState, "live"); |
| assert_equals(clone1.getVideoTracks()[0].readyState, "live"); |
| |
| clone1.getAudioTracks()[0].stop(); |
| assert_true(clone1.active); |
| assert_equals(clone1.getAudioTracks()[0].readyState, "ended"); |
| assert_equals(clone1.getVideoTracks()[0].readyState, "live"); |
| |
| const clone2 = clone1.clone(); |
| assert_true(clone2.active); |
| assert_equals(clone2.getAudioTracks()[0].readyState, "ended"); |
| assert_equals(clone2.getVideoTracks()[0].readyState, "live"); |
| |
| clone1.getVideoTracks()[0].stop(); |
| clone2.getVideoTracks()[0].stop(); |
| |
| const clone3 = clone2.clone(); |
| assert_false(clone3.active); |
| assert_equals(clone3.getAudioTracks()[0].readyState, "ended"); |
| assert_equals(clone3.getVideoTracks()[0].readyState, "ended"); |
| assert_not_equals(clone1.getAudioTracks()[0].id, clone2.getAudioTracks()[0].id); |
| assert_not_equals(clone1.getVideoTracks()[0].id, clone2.getVideoTracks()[0].id); |
| assert_not_equals(clone2.getAudioTracks()[0].id, clone3.getAudioTracks()[0].id); |
| assert_not_equals(clone2.getVideoTracks()[0].id, clone3.getVideoTracks()[0].id); |
| assert_not_equals(clone1.getAudioTracks()[0].id, clone3.getAudioTracks()[0].id); |
| assert_not_equals(clone1.getVideoTracks()[0].id, clone3.getVideoTracks()[0].id); |
| }, "Tests that cloning MediaStream objects works as expected"); |
| |
| promise_test(async t => { |
| const stream = await navigator.mediaDevices.getUserMedia({video: true, audio: true}); |
| assert_equals(stream.getAudioTracks().length, 1); |
| assert_equals(stream.getVideoTracks().length, 1); |
| assert_equals(stream.getAudioTracks()[0].readyState, "live"); |
| assert_equals(stream.getVideoTracks()[0].readyState, "live"); |
| assert_true(stream.active); |
| |
| const audio_clone = stream.getAudioTracks()[0].clone(); |
| const video_clone = stream.getVideoTracks()[0].clone(); |
| assert_equals(audio_clone.readyState, "live"); |
| assert_equals(video_clone.readyState, "live"); |
| assert_not_equals(stream.getAudioTracks()[0].id, audio_clone.id); |
| assert_not_equals(stream.getVideoTracks()[0].id, video_clone.id); |
| |
| stream.getTracks().forEach(track => track.stop()); |
| assert_false(stream.active); |
| assert_equals(stream.getAudioTracks()[0].readyState, "ended"); |
| assert_equals(stream.getVideoTracks()[0].readyState, "ended"); |
| assert_equals(audio_clone.readyState, "live"); |
| assert_equals(video_clone.readyState, "live"); |
| |
| stream.addTrack(audio_clone); |
| stream.addTrack(video_clone); |
| assert_true(stream.active); |
| |
| stream.getTracks().forEach(track => track.stop()); |
| assert_false(stream.active); |
| assert_equals(audio_clone.readyState, "ended"); |
| assert_equals(video_clone.readyState, "ended"); |
| }, "Tests that cloning MediaStreamTrack objects works as expected"); |
| |
| </script> |
| </body> |
| </html> |