61 lines
2.4 KiB
HTML
61 lines
2.4 KiB
HTML
<!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();
|
|
});
|
|
const offerDatachannel1 = offerPc.createDataChannel('initial');
|
|
exchangeIceCandidates(offerPc, answerPcFirst);
|
|
|
|
// 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);
|
|
const datachannelAtAnswerPcFirst = await new Promise(
|
|
r => answerPcFirst.ondatachannel = ({channel}) => r(channel));
|
|
const iceTransport = offerPc.sctp.transport;
|
|
// Check that messages get through.
|
|
datachannelAtAnswerPcFirst.send('hello');
|
|
const message1 = await awaitMessage(offerDatachannel1);
|
|
assert_equals(message1, 'hello');
|
|
|
|
// Renegotiate with PC 2
|
|
// Note - ICE candidates will also be sent to answerPc1, but that shouldn't matter.
|
|
exchangeIceCandidates(offerPc, answerPcSecond);
|
|
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);
|
|
|
|
// Kill the first PC. This should not affect anything, but leaving it may cause untoward events.
|
|
answerPcFirst.close();
|
|
|
|
const answerDataChannel2 = answerPcSecond.createDataChannel('second back');
|
|
|
|
const datachannelAtOfferPcSecond = await new Promise(r => offerPc.ondatachannel = ({channel}) => r(channel));
|
|
|
|
await new Promise(r => datachannelAtOfferPcSecond.onopen = r);
|
|
|
|
datachannelAtOfferPcSecond.send('hello again');
|
|
const message2 = await awaitMessage(answerDataChannel2);
|
|
assert_equals(message2, 'hello again');
|
|
}, 'Handover with datachannel reinitiated from new callee completes');
|
|
|
|
</script>
|