| <!doctype html> |
| <meta charset=utf-8> |
| <title>RTCPeerConnection onsignalingstatechanged</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="RTCPeerConnection-helper.js"></script> |
| <script> |
| |
| promise_test(async t => { |
| const [track] = (await getNoiseStream({video: true})).getTracks(); |
| t.add_cleanup(() => track.stop()); |
| const pc1 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc1.close()); |
| const pc2 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc2.close()); |
| pc1.addTrack(track, new MediaStream()); |
| await pc1.setLocalDescription(await pc1.createOffer()); |
| const events = []; |
| pc2.onsignalingstatechange = t.step_func(e => { |
| const [transceiver] = pc2.getTransceivers(); |
| assert_equals(transceiver.currentDirection, null); |
| events.push(pc2.signalingState); |
| }); |
| await pc2.setRemoteDescription(pc1.localDescription); |
| assert_equals(events.length, 1, "event fired"); |
| assert_equals(events[0], "have-remote-offer"); |
| |
| pc2.onsignalingstatechange = t.step_func(e => { |
| const [transceiver] = pc2.getTransceivers(); |
| assert_equals(transceiver.currentDirection, "recvonly"); |
| events.push(pc2.signalingState); |
| }); |
| await pc2.setLocalDescription(await pc2.createAnswer()); |
| assert_equals(events.length, 2, "event fired"); |
| assert_equals(events[1], "stable"); |
| }, 'Negotiation methods fire signalingstatechange events'); |
| |
| promise_test(async t => { |
| const pc1 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc1.close()); |
| const pc2 = new RTCPeerConnection(); |
| const stream = await getNoiseStream({ audio: true }); |
| t.add_cleanup(() => stream.getTracks().forEach(track => track.stop())); |
| |
| stream.getTracks().forEach(track => pc1.addTrack(track, stream)); |
| exchangeIceCandidates(pc1, pc2); |
| exchangeOfferAnswer(pc1, pc2); |
| await listenToIceConnected(pc2); |
| |
| pc2.onsignalingstatechange = t.unreached_func(); |
| pc2.close(); |
| assert_equals(pc2.signalingState, 'closed'); |
| await new Promise(r => t.step_timeout(r, 100)); |
| }, 'Closing a PeerConnection should not fire signalingstatechange event'); |
| |
| promise_test(async t => { |
| const pc1 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc1.close()); |
| const pc2 = new RTCPeerConnection(); |
| t.add_cleanup(() => pc2.close()); |
| |
| pc2.addTransceiver('video'); |
| |
| pc1.ontrack = t.unreached_func(); |
| pc1.onsignalingstatechange = t.step_func(e => { |
| pc1.ontrack = null; |
| }); |
| await pc1.setRemoteDescription(await pc2.createOffer()); |
| }, 'signalingstatechange is the first event to fire'); |
| |
| </script> |