RTCPeerConnection-onsignalingstatechanged.https.html (2561B)
1 <!doctype html> 2 <meta charset=utf-8> 3 <title>RTCPeerConnection onsignalingstatechanged</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 9 promise_test(async t => { 10 const [track] = (await getNoiseStream({video: true})).getTracks(); 11 t.add_cleanup(() => track.stop()); 12 const pc1 = new RTCPeerConnection(); 13 t.add_cleanup(() => pc1.close()); 14 const pc2 = new RTCPeerConnection(); 15 t.add_cleanup(() => pc2.close()); 16 pc1.addTrack(track, new MediaStream()); 17 await pc1.setLocalDescription(await pc1.createOffer()); 18 const events = []; 19 pc2.onsignalingstatechange = t.step_func(e => { 20 const [transceiver] = pc2.getTransceivers(); 21 assert_equals(transceiver.currentDirection, null); 22 events.push(pc2.signalingState); 23 }); 24 await pc2.setRemoteDescription(pc1.localDescription); 25 assert_equals(events.length, 1, "event fired"); 26 assert_equals(events[0], "have-remote-offer"); 27 28 pc2.onsignalingstatechange = t.step_func(e => { 29 const [transceiver] = pc2.getTransceivers(); 30 assert_equals(transceiver.currentDirection, "recvonly"); 31 events.push(pc2.signalingState); 32 }); 33 await pc2.setLocalDescription(await pc2.createAnswer()); 34 assert_equals(events.length, 2, "event fired"); 35 assert_equals(events[1], "stable"); 36 }, 'Negotiation methods fire signalingstatechange events'); 37 38 promise_test(async t => { 39 const pc1 = new RTCPeerConnection(); 40 t.add_cleanup(() => pc1.close()); 41 const pc2 = new RTCPeerConnection(); 42 const stream = await getNoiseStream({ audio: true }); 43 t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); 44 45 stream.getTracks().forEach(track => pc1.addTrack(track, stream)); 46 exchangeIceCandidates(pc1, pc2); 47 exchangeOfferAnswer(pc1, pc2); 48 await listenToIceConnected(pc2); 49 50 pc2.onsignalingstatechange = t.unreached_func(); 51 pc2.close(); 52 assert_equals(pc2.signalingState, 'closed'); 53 await new Promise(r => t.step_timeout(r, 100)); 54 }, 'Closing a PeerConnection should not fire signalingstatechange event'); 55 56 promise_test(async t => { 57 const pc1 = new RTCPeerConnection(); 58 t.add_cleanup(() => pc1.close()); 59 const pc2 = new RTCPeerConnection(); 60 t.add_cleanup(() => pc2.close()); 61 62 pc2.addTransceiver('video'); 63 64 pc1.ontrack = t.unreached_func(); 65 pc1.onsignalingstatechange = t.step_func(e => { 66 pc1.ontrack = null; 67 }); 68 await pc1.setRemoteDescription(await pc2.createOffer()); 69 }, 'signalingstatechange is the first event to fire'); 70 71 </script>