| <!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; |
| }, '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); |
| // Need to wait for the initial unmute event before renegotiating, otherwise |
| // there will be no transition from unmuted->muted. |
| const muteWatcher = new EventWatcher(t, e.track, ['mute', 'unmute']); |
| const unmutePromise = muteWatcher.wait_for('unmute'); |
| await exchangeAnswer(pc1, pc2); |
| await unmutePromise; |
| |
| 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); |
| // Need to wait for the initial unmute event before closing, otherwise |
| // there will be no transition from unmuted->muted. |
| const muteWatcher = new EventWatcher(t, e.track, ['mute', 'unmute']); |
| const unmutePromise = muteWatcher.wait_for('unmute'); |
| await exchangeAnswer(pc1, pc2); |
| await unmutePromise; |
| |
| const mutePromise = muteWatcher.wait_for('mute'); |
| pc2.close(); |
| await mutePromise; |
| }, 'pc.close() mutes remote tracks'); |
| |
| </script> |