| <!doctype html> |
| <meta charset=utf-8> |
| <title>RTCPeerConnection Handovers</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="../RTCPeerConnection-helper.js"></script> |
| <script> |
| 'use strict'; |
| |
| promise_test(async t => { |
| const offerPc = new RTCPeerConnection(); |
| const answerPcFirst = new RTCPeerConnection(); |
| const answerPcSecond = new RTCPeerConnection(); |
| t.add_cleanup(() => { |
| offerPc.close(); |
| answerPcFirst.close(); |
| answerPcSecond.close(); |
| }); |
| offerPc.addTransceiver('audio'); |
| // Negotiate connection with PC 1 |
| const offer1 = await offerPc.createOffer(); |
| await offerPc.setLocalDescription(offer1); |
| await answerPcFirst.setRemoteDescription(offer1); |
| const answer1 = await answerPcFirst.createAnswer(); |
| await offerPc.setRemoteDescription(answer1); |
| await answerPcFirst.setLocalDescription(answer1); |
| // Renegotiate with PC 2 |
| const offer2 = await offerPc.createOffer(); |
| await offerPc.setLocalDescription(offer2); |
| await answerPcSecond.setRemoteDescription(offer2); |
| const answer2 = await answerPcSecond.createAnswer(); |
| await offerPc.setRemoteDescription(answer2); |
| await answerPcSecond.setLocalDescription(answer2); |
| }, 'Negotiation of handover initiated at caller works'); |
| |
| promise_test(async t => { |
| const offerPc = new RTCPeerConnection(); |
| const answerPcFirst = new RTCPeerConnection(); |
| const answerPcSecond = new RTCPeerConnection(); |
| t.add_cleanup(() => { |
| offerPc.close(); |
| answerPcFirst.close(); |
| answerPcSecond.close(); |
| }); |
| offerPc.addTransceiver('audio'); |
| // Negotiate connection with PC 1 |
| const offer1 = await offerPc.createOffer(); |
| await offerPc.setLocalDescription(offer1); |
| await answerPcFirst.setRemoteDescription(offer1); |
| const answer1 = await answerPcFirst.createAnswer(); |
| await offerPc.setRemoteDescription(answer1); |
| await answerPcFirst.setLocalDescription(answer1); |
| // Renegotiate with PC 2 |
| // The offer from PC 2 needs to be consistent on at least the following: |
| // - Number, type and order of media sections |
| // - MID values |
| // - Payload type values |
| // Do a "fake" offer/answer using the original offer against PC2 to achieve this. |
| await answerPcSecond.setRemoteDescription(offer1); |
| // Discard the output of this round. |
| await answerPcSecond.setLocalDescription(await answerPcSecond.createAnswer()); |
| |
| // Now we can initiate an offer from the new PC. |
| const offer2 = await answerPcSecond.createOffer(); |
| await answerPcSecond.setLocalDescription(offer2); |
| await offerPc.setRemoteDescription(offer2); |
| const answer2 = await offerPc.createAnswer(); |
| await answerPcSecond.setRemoteDescription(answer2); |
| await offerPc.setLocalDescription(answer2); |
| }, 'Negotiation of handover initiated at callee works'); |
| |
| </script> |