|  | <!doctype html> | 
|  | <meta charset=utf-8> | 
|  | <title>RTCRtpTransceiver.prototype.stop</title> | 
|  | <script src="/resources/testharness.js"></script> | 
|  | <script src="/resources/testharnessreport.js"></script> | 
|  | <script src="RTCPeerConnection-helper.js"></script> | 
|  | <script> | 
|  | // FIXME: Add a test adding a transceiver, stopping it and trying to create an empty offer. | 
|  |  | 
|  | promise_test(async (t)=> { | 
|  | const pc1 = new RTCPeerConnection(); | 
|  | t.add_cleanup(() => pc1.close()); | 
|  |  | 
|  | pc1.addTransceiver("audio", { direction: "sendonly" }); | 
|  | pc1.addTransceiver("video"); | 
|  | pc1.getTransceivers()[0].stop(); | 
|  |  | 
|  | const offer = await pc1.createOffer(); | 
|  |  | 
|  | assert_false(offer.sdp.includes("m=audio"), "offer should not contain an audio m-section"); | 
|  | assert_true(offer.sdp.includes("m=video"), "offer should contain a video m-section"); | 
|  | }, "A transceiver added and stopped before the initial offer generation should not trigger an offer m-section generation"); | 
|  |  | 
|  | promise_test(async (t)=> { | 
|  | const pc1 = new RTCPeerConnection(); | 
|  | const pc2 = new RTCPeerConnection(); | 
|  | t.add_cleanup(() => pc1.close()); | 
|  | t.add_cleanup(() => pc2.close()); | 
|  |  | 
|  | pc1.addTransceiver("audio"); | 
|  |  | 
|  | await exchangeOfferAnswer(pc1, pc2); | 
|  |  | 
|  | pc1.addTransceiver("video"); | 
|  |  | 
|  | pc1.getTransceivers()[0].stop(); | 
|  | pc1.getTransceivers()[1].stop(); | 
|  |  | 
|  | const offer = await pc1.createOffer(); | 
|  |  | 
|  | assert_true(offer.sdp.includes("m=audio"), "offer should contain an audio m-section"); | 
|  | assert_true(offer.sdp.includes("m=audio 0"), "The audio m-section should be rejected"); | 
|  |  | 
|  | assert_false(offer.sdp.includes("m=video"), "offer should not contain a video m-section"); | 
|  | }, "During renegotiation, adding and stopping a transceiver should not trigger a renegotiated offer m-section generation"); | 
|  |  | 
|  | promise_test(async (t)=> { | 
|  | const pc1 = new RTCPeerConnection(); | 
|  | const pc2 = new RTCPeerConnection(); | 
|  | t.add_cleanup(() => pc1.close()); | 
|  | t.add_cleanup(() => pc2.close()); | 
|  |  | 
|  | pc1.addTransceiver("audio"); | 
|  |  | 
|  | await exchangeOfferAnswer(pc1, pc2); | 
|  |  | 
|  | pc1.getTransceivers()[0].direction = "sendonly"; | 
|  | pc1.getTransceivers()[0].stop(); | 
|  |  | 
|  | const offer = await pc1.createOffer(); | 
|  |  | 
|  | assert_true(offer.sdp.includes("a=sendonly"), "The audio m-section should be sendonly"); | 
|  | }, "A stopped sendonly transceiver should generate a sendonly m-section in the offer"); | 
|  |  | 
|  | promise_test(async (t)=> { | 
|  | const pc1 = new RTCPeerConnection(); | 
|  | const pc2 = new RTCPeerConnection(); | 
|  | t.add_cleanup(() => pc1.close()); | 
|  | t.add_cleanup(() => pc2.close()); | 
|  |  | 
|  | pc1.addTransceiver("audio"); | 
|  |  | 
|  | await exchangeOfferAnswer(pc1, pc2); | 
|  |  | 
|  | pc1.getTransceivers()[0].direction = "inactive"; | 
|  | pc1.getTransceivers()[0].stop(); | 
|  |  | 
|  | const offer = await pc1.createOffer(); | 
|  |  | 
|  | assert_true(offer.sdp.includes("a=inactive"), "The audio m-section should be inactive"); | 
|  | }, "A stopped inactive transceiver should generate an inactive m-section in the offer"); | 
|  | </script> |