mirror of
https://github.com/servo/servo.git
synced 2025-08-14 18:05:36 +01:00
Update web-platform-tests to revision c2b30ef30749b6a8f2cc832761dfe011e63d5e94
This commit is contained in:
parent
987e376ca7
commit
eda9b9b73a
142 changed files with 3513 additions and 851 deletions
|
@ -463,11 +463,13 @@ function getUserMediaTracksAndStreams(count, type = 'audio') {
|
|||
});
|
||||
}
|
||||
|
||||
// Performs an offer exchange caller -> callee.
|
||||
async function exchangeOffer(caller, callee) {
|
||||
const offer = await caller.createOffer();
|
||||
await caller.setLocalDescription(offer);
|
||||
return callee.setRemoteDescription(offer);
|
||||
}
|
||||
// Performs an answer exchange caller -> callee.
|
||||
async function exchangeAnswer(caller, callee) {
|
||||
const answer = await callee.createAnswer();
|
||||
await callee.setLocalDescription(answer);
|
||||
|
@ -477,7 +479,18 @@ async function exchangeOfferAnswer(caller, callee) {
|
|||
await exchangeOffer(caller, callee);
|
||||
return exchangeAnswer(caller, callee);
|
||||
}
|
||||
|
||||
// The returned promise is resolved with caller's ontrack event.
|
||||
async function exchangeAnswerAndListenToOntrack(t, caller, callee) {
|
||||
const ontrackPromise = addEventListenerPromise(t, caller, 'track');
|
||||
await exchangeAnswer(caller, callee);
|
||||
return ontrackPromise;
|
||||
}
|
||||
// The returned promise is resolved with callee's ontrack event.
|
||||
async function exchangeOfferAndListenToOntrack(t, caller, callee) {
|
||||
const ontrackPromise = addEventListenerPromise(t, callee, 'track');
|
||||
await exchangeOffer(caller, callee);
|
||||
return ontrackPromise;
|
||||
}
|
||||
|
||||
// The resolver has a |promise| that can be resolved or rejected using |resolve|
|
||||
// or |reject|.
|
||||
|
@ -503,3 +516,27 @@ function addEventListenerPromise(t, target, type, listener) {
|
|||
}));
|
||||
});
|
||||
}
|
||||
|
||||
function createPeerConnectionWithCleanup(t) {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return pc;
|
||||
}
|
||||
|
||||
async function createTrackAndStreamWithCleanup(t, kind = 'audio') {
|
||||
let constraints = {};
|
||||
constraints[kind] = true;
|
||||
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
||||
const [track] = stream.getTracks();
|
||||
t.add_cleanup(() => track.stop());
|
||||
return [track, stream];
|
||||
}
|
||||
|
||||
function findTransceiverForSender(pc, sender) {
|
||||
const transceivers = pc.getTransceivers();
|
||||
for (let i = 0; i < transceivers.length; ++i) {
|
||||
if (transceivers[i].sender == sender)
|
||||
return transceivers[i];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,98 @@
|
|||
<!doctype html>
|
||||
<meta charset=utf-8>
|
||||
<title>RTCPeerConnection-transceivers.https.html</title>
|
||||
<script src="/resources/testharness.js"></script>
|
||||
<script src="/resources/testharnessreport.js"></script>
|
||||
<script src="RTCPeerConnection-helper.js"></script>
|
||||
<script>
|
||||
'use strict';
|
||||
|
||||
// The following helper functions are called from RTCPeerConnection-helper.js:
|
||||
// exchangeOffer
|
||||
// exchangeOfferAndListenToOntrack
|
||||
// exchangeAnswer
|
||||
// exchangeAnswerAndListenToOntrack
|
||||
// addEventListenerPromise
|
||||
// createPeerConnectionWithCleanup
|
||||
// createTrackAndStreamWithCleanup
|
||||
// findTransceiverForSender
|
||||
|
||||
promise_test(async t => {
|
||||
const pc1 = createPeerConnectionWithCleanup(t);
|
||||
pc1.addTrack(... await createTrackAndStreamWithCleanup(t));
|
||||
const pc2 = createPeerConnectionWithCleanup(t);
|
||||
exchangeIceCandidates(pc1, pc2);
|
||||
|
||||
const unmuteResolver = new Resolver();
|
||||
let remoteTrack = null;
|
||||
// The unmuting it timing sensitive so we hook up to the event directly
|
||||
// instead of wrapping it in an EventWatcher which uses promises.
|
||||
pc2.ontrack = t.step_func(e => {
|
||||
remoteTrack = e.track;
|
||||
assert_true(remoteTrack.muted, 'track is muted in ontrack');
|
||||
remoteTrack.onunmute = t.step_func(e => {
|
||||
assert_false(remoteTrack.muted, 'track is unmuted in onunmute');
|
||||
unmuteResolver.resolve();
|
||||
});
|
||||
pc2.ontrack = t.step_func(e => {
|
||||
assert_unreached('ontrack fired unexpectedly');
|
||||
});
|
||||
});
|
||||
await exchangeOfferAnswer(pc1, pc2);
|
||||
await unmuteResolver.promise;
|
||||
}, 'ontrack: track goes from muted to unmuted');
|
||||
|
||||
promise_test(async t => {
|
||||
const pc1 = createPeerConnectionWithCleanup(t);
|
||||
const pc1Sender = pc1.addTrack(... await createTrackAndStreamWithCleanup(t));
|
||||
const localTransceiver = findTransceiverForSender(pc1, pc1Sender);
|
||||
const pc2 = createPeerConnectionWithCleanup(t);
|
||||
exchangeIceCandidates(pc1, pc2);
|
||||
|
||||
const e = await exchangeOfferAndListenToOntrack(t, pc1, pc2);
|
||||
await exchangeAnswer(pc1, pc2);
|
||||
|
||||
const muteWatcher = new EventWatcher(t, e.track, ['mute']);
|
||||
const mutePromise = muteWatcher.wait_for('mute');
|
||||
localTransceiver.direction = 'inactive';
|
||||
await exchangeOfferAnswer(pc1, pc2);
|
||||
|
||||
await mutePromise;
|
||||
}, 'Changing transceiver direction to \'inactive\' mutes the remote track');
|
||||
|
||||
promise_test(async t => {
|
||||
const pc1 = createPeerConnectionWithCleanup(t);
|
||||
const pc1Sender = pc1.addTrack(... await createTrackAndStreamWithCleanup(t));
|
||||
const localTransceiver = findTransceiverForSender(pc1, pc1Sender);
|
||||
const pc2 = createPeerConnectionWithCleanup(t);
|
||||
exchangeIceCandidates(pc1, pc2);
|
||||
|
||||
const e = await exchangeOfferAndListenToOntrack(t, pc1, pc2);
|
||||
await exchangeAnswer(pc1, pc2);
|
||||
localTransceiver.direction = 'inactive';
|
||||
await exchangeOfferAnswer(pc1, pc2);
|
||||
|
||||
const unmuteWatcher = new EventWatcher(t, e.track, ['unmute']);
|
||||
const unmutePromise = unmuteWatcher.wait_for('unmute');
|
||||
localTransceiver.direction = 'sendrecv';
|
||||
await exchangeOfferAnswer(pc1, pc2);
|
||||
|
||||
await unmutePromise;
|
||||
}, 'Changing transceiver direction to \'sendrecv\' unmutes the remote track');
|
||||
|
||||
promise_test(async t => {
|
||||
const pc1 = createPeerConnectionWithCleanup(t);
|
||||
const pc1Sender = pc1.addTrack(... await createTrackAndStreamWithCleanup(t));
|
||||
const localTransceiver = findTransceiverForSender(pc1, pc1Sender);
|
||||
const pc2 = createPeerConnectionWithCleanup(t);
|
||||
exchangeIceCandidates(pc1, pc2);
|
||||
|
||||
const e = await exchangeOfferAndListenToOntrack(t, pc1, pc2);
|
||||
await exchangeAnswer(pc1, pc2);
|
||||
const muteWatcher = new EventWatcher(t, e.track, ['mute']);
|
||||
const mutePromise = muteWatcher.wait_for('mute');
|
||||
pc2.close();
|
||||
await mutePromise;
|
||||
}, 'pc.close() mutes remote tracks');
|
||||
|
||||
</script>
|
|
@ -8,59 +8,14 @@
|
|||
'use strict';
|
||||
|
||||
// The following helper functions are called from RTCPeerConnection-helper.js:
|
||||
// exchangeOffer
|
||||
// exchangeOfferAndListenToOntrack
|
||||
// exchangeAnswer
|
||||
// exchangeAnswerAndListenToOntrack
|
||||
// addEventListenerPromise
|
||||
|
||||
function createPeerConnectionWithCleanup(t) {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
return pc;
|
||||
}
|
||||
|
||||
async function createTrackAndStreamWithCleanup(t, kind = 'audio') {
|
||||
let constraints = {};
|
||||
constraints[kind] = true;
|
||||
const stream = await navigator.mediaDevices.getUserMedia(constraints);
|
||||
const [track] = stream.getTracks();
|
||||
t.add_cleanup(() => track.stop());
|
||||
return [track, stream];
|
||||
}
|
||||
|
||||
function findTransceiverForSender(pc, sender) {
|
||||
const transceivers = pc.getTransceivers();
|
||||
for (let i = 0; i < transceivers.length; ++i) {
|
||||
if (transceivers[i].sender == sender)
|
||||
return transceivers[i];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Performs an offer exchange pc1 -> pc2.
|
||||
async function exchangeOffer(pc1, pc2) {
|
||||
const offer = await pc1.createOffer();
|
||||
await pc1.setLocalDescription(offer);
|
||||
await pc2.setRemoteDescription(offer);
|
||||
}
|
||||
|
||||
// The returned promise is resolved with pc2's ontrack event.
|
||||
async function exchangeOfferAndListenToOntrack(t, pc1, pc2) {
|
||||
const ontrackPromise = addEventListenerPromise(t, pc2, 'track');
|
||||
await exchangeOffer(pc1, pc2);
|
||||
return ontrackPromise;
|
||||
}
|
||||
|
||||
// Performs an answer exchange pc2 -> pc1.
|
||||
async function exchangeAnswer(pc1, pc2) {
|
||||
const answer = await pc2.createAnswer();
|
||||
await pc2.setLocalDescription(answer);
|
||||
await pc1.setRemoteDescription(answer);
|
||||
}
|
||||
|
||||
// The returned promise is resolved with pc1's ontrack event.
|
||||
async function exchangeAnswerAndListenToOntrack(t, pc1, pc2) {
|
||||
const ontrackPromise = addEventListenerPromise(t, pc1, 'track');
|
||||
await exchangeAnswer(pc1, pc2);
|
||||
return ontrackPromise;
|
||||
}
|
||||
// createPeerConnectionWithCleanup
|
||||
// createTrackAndStreamWithCleanup
|
||||
// findTransceiverForSender
|
||||
|
||||
promise_test(async t => {
|
||||
const pc = createPeerConnectionWithCleanup(t);
|
||||
|
@ -493,4 +448,20 @@ promise_test(async t => {
|
|||
assert_true(transceiver.stopped);
|
||||
}, 'Closing the PC stops the transceivers');
|
||||
|
||||
promise_test(async t => {
|
||||
const pc1 = createPeerConnectionWithCleanup(t);
|
||||
const pc1Sender = pc1.addTrack(... await createTrackAndStreamWithCleanup(t));
|
||||
const localTransceiver = findTransceiverForSender(pc1, pc1Sender);
|
||||
const pc2 = createPeerConnectionWithCleanup(t);
|
||||
exchangeIceCandidates(pc1, pc2);
|
||||
|
||||
const e = await exchangeOfferAndListenToOntrack(t, pc1, pc2);
|
||||
await exchangeAnswer(pc1, pc2);
|
||||
localTransceiver.direction = 'inactive';
|
||||
await exchangeOfferAnswer(pc1, pc2);
|
||||
|
||||
localTransceiver.direction = 'sendrecv';
|
||||
await exchangeOfferAndListenToOntrack(t, pc1, pc2);
|
||||
}, 'Changing transceiver direction to \'sendrecv\' makes ontrack fire');
|
||||
|
||||
</script>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue