RTCPeerConnection-setRemoteDescription-replaceTrack.https.html (4206B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <title>RTCPeerConnection.prototype.setRemoteDescription - replaceTrack</title> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src="RTCPeerConnection-helper.js"></script> 7 <script> 8 'use strict'; 9 10 // The following helper functions are called from RTCPeerConnection-helper.js: 11 // getUserMediaTracksAndStreams 12 13 async_test(t => { 14 const caller = new RTCPeerConnection(); 15 t.add_cleanup(() => caller.close()); 16 getUserMediaTracksAndStreams(2) 17 .then(t.step_func(([tracks, streams]) => { 18 const sender = caller.addTrack(tracks[0], streams[0]); 19 return sender.replaceTrack(tracks[1]) 20 .then(t.step_func(() => { 21 assert_equals(sender.track, tracks[1]); 22 t.done(); 23 })); 24 })) 25 .catch(t.step_func(reason => { 26 assert_unreached(reason); 27 })); 28 }, 'replaceTrack() sets the track attribute to a new track.'); 29 30 async_test(t => { 31 const caller = new RTCPeerConnection(); 32 t.add_cleanup(() => caller.close()); 33 getUserMediaTracksAndStreams(1) 34 .then(t.step_func(([tracks, streams]) => { 35 const sender = caller.addTrack(tracks[0], streams[0]); 36 return sender.replaceTrack(null) 37 .then(t.step_func(() => { 38 assert_equals(sender.track, null); 39 t.done(); 40 })); 41 })) 42 .catch(t.step_func(reason => { 43 assert_unreached(reason); 44 })); 45 }, 'replaceTrack() sets the track attribute to null.'); 46 47 async_test(t => { 48 const caller = new RTCPeerConnection(); 49 t.add_cleanup(() => caller.close()); 50 getUserMediaTracksAndStreams(2) 51 .then(t.step_func(([tracks, streams]) => { 52 const sender = caller.addTrack(tracks[0], streams[0]); 53 assert_equals(sender.track, tracks[0]); 54 sender.replaceTrack(tracks[1]); 55 // replaceTrack() is asynchronous, there should be no synchronously 56 // observable effects. 57 assert_equals(sender.track, tracks[0]); 58 t.done(); 59 })) 60 .catch(t.step_func(reason => { 61 assert_unreached(reason); 62 })); 63 }, 'replaceTrack() does not set the track synchronously.'); 64 65 async_test(t => { 66 const expectedException = 'InvalidStateError'; 67 const caller = new RTCPeerConnection(); 68 t.add_cleanup(() => caller.close()); 69 getUserMediaTracksAndStreams(2) 70 .then(t.step_func(([tracks, streams]) => { 71 const sender = caller.addTrack(tracks[0], streams[0]); 72 caller.close(); 73 return sender.replaceTrack(tracks[1]) 74 .then(t.step_func(() => { 75 assert_unreached('Expected replaceTrack() to be rejected with ' + 76 expectedException + ' but the promise was resolved.'); 77 }), 78 t.step_func(e => { 79 assert_equals(e.name, expectedException); 80 t.done(); 81 })); 82 })) 83 .catch(t.step_func(reason => { 84 assert_unreached(reason); 85 })); 86 }, 'replaceTrack() rejects when the peer connection is closed.'); 87 88 promise_test(async t => { 89 const caller = new RTCPeerConnection(); 90 t.add_cleanup(() => caller.close()); 91 const [tracks, streams] = await getUserMediaTracksAndStreams(2); 92 const sender = caller.addTrack(tracks[0], streams[0]); 93 caller.removeTrack(sender); 94 await sender.replaceTrack(tracks[1]); 95 assert_equals(sender.track, tracks[1], "Make sure track gets updated"); 96 }, 'replaceTrack() does not reject when invoked after removeTrack().'); 97 98 99 promise_test(async t => { 100 const caller = new RTCPeerConnection(); 101 t.add_cleanup(() => caller.close()); 102 const [tracks, streams] = await getUserMediaTracksAndStreams(2); 103 const sender = caller.addTrack(tracks[0], streams[0]); 104 let p = sender.replaceTrack(tracks[1]) 105 caller.removeTrack(sender); 106 await p; 107 assert_equals(sender.track, tracks[1], "Make sure track gets updated"); 108 }, 'replaceTrack() does not reject after a subsequent removeTrack().'); 109 110 // TODO(hbos): Verify that replaceTrack() changes what media is received on 111 // the remote end of two connected peer connections. For video tracks, this 112 // requires Chromium's video tag to update on receiving frames when running 113 // content_shell. https://crbug.com/793808 114 115 </script>