| <!DOCTYPE html> |
| |
| <html> |
| <head> |
| <script src="../../resources/js-test-pre.js"></script> |
| <script src="resources/promise-utils.js"></script> |
| </head> |
| <body> |
| <script> |
| let stream; |
| let track; |
| |
| let sdpMLineIndex = 0; |
| let badSdpMLineIndex; |
| let sdpMid = null; |
| let badSdpMid; |
| const validCandidate = "candidate:1 1 UDP 2013266431 172.17.0.1 44474 typ host"; |
| |
| description("Test behavior of RTCPeerConnection.addIceCandidate"); |
| |
| if (window.testRunner) |
| testRunner.setUserMediaPermission(true); |
| else { |
| debug("This test can not be run without the testRunner"); |
| finishJSTest(); |
| } |
| |
| const pc = new RTCPeerConnection({iceServers:[{urls:'stun:foo.com'}]}); |
| const remotePc = new RTCPeerConnection({iceServers:[{urls:'stun:foo.com'}]}); |
| |
| debug("<br>*** A remote description is needed before a candidate can be added"); |
| shouldBe("pc.remoteDescription", "null"); |
| promiseShouldReject("pc.addIceCandidate(new RTCIceCandidate({candidate: 'foo', sdpMid: 0}))").then(function () { |
| return navigator.mediaDevices.getUserMedia({ "audio": true, "video": true }); |
| }) |
| .then(function (s) { |
| stream = s; |
| track = stream.getTracks()[0]; |
| |
| remotePc.addTrack(track, stream); |
| return remotePc.createOffer(); |
| }) |
| .then(function (remoteOffer) { |
| return pc.setRemoteDescription(remoteOffer); |
| }) |
| .then(function () { |
| testPassed("Remote description set"); |
| |
| debug("<br>*** Define sdpMid, badSdpMid, sdpMLineIndex and badSdpMLineIndex for testing"); |
| badSdpMLineIndex = sdpMLineIndex + pc.getTransceivers().length + 10; |
| shouldNotBe("sdpMLineIndex", "badSdpMLineIndex"); |
| |
| sdpMid = pc.getTransceivers()[0] ? pc.getTransceivers()[0].mid : null; |
| shouldNotBe("sdpMid", "null"); |
| badSdpMid = sdpMid + "_foo"; |
| shouldNotBe("sdpMid", "badSdpMid"); |
| |
| sdpMid = 1; |
| |
| return promiseShouldReject("pc.addIceCandidate(new RTCIceCandidate({candidate: validCandidate, sdpMid: badSdpMid}))"); |
| }) |
| .then(function () { |
| return promiseShouldReject("pc.addIceCandidate(new RTCIceCandidate({candidate: validCandidate, sdpMLineIndex: badSdpMLineIndex}))"); |
| }) |
| .then(function () { |
| debug("*** A (bad) sdpMid takes precedesce over valid sdpMLineIndex"); |
| return promiseShouldReject("pc.addIceCandidate(new RTCIceCandidate({candidate: validCandidate, sdpMid: badSdpMid, sdpMLineIndex: sdpMLineIndex}))"); |
| }) |
| .then(function () { |
| debug("*** Test bad candidate content with valid sdpMid"); |
| return promiseShouldReject("pc.addIceCandidate(new RTCIceCandidate({candidate: 'bad content', sdpMid: sdpMid}))"); |
| }) |
| .then(function () { |
| debug("*** Test bad candidate content with valid sdpMLineIndex"); |
| return promiseShouldReject("pc.addIceCandidate(new RTCIceCandidate({candidate: 'bad content', sdpMLineIndex: sdpMLineIndex}))"); |
| }) |
| .then(function () { |
| debug("*** Test valid candidate with no mid and mlineindex"); |
| return promiseShouldReject("pc.addIceCandidate({candidate: validCandidate})"); |
| }) |
| .then(function () { |
| debug("<br>*** Test some OK input"); |
| // Testing passing a RTCIceCandidateInit |
| return promiseShouldResolve("pc.addIceCandidate({candidate: validCandidate, sdpMid: sdpMid})"); |
| }) |
| .then(function () { |
| return promiseShouldResolve("pc.addIceCandidate({candidate: validCandidate, sdpMLineIndex: sdpMLineIndex})"); |
| }) |
| .then(function () { |
| return promiseShouldResolve("pc.addIceCandidate(undefined)"); |
| }) |
| .then(function () { |
| return promiseShouldResolve("pc.addIceCandidate(null)"); |
| }) |
| .then(function () { |
| // Testing passing a RTCIceCandidate |
| return promiseShouldResolve("pc.addIceCandidate(new RTCIceCandidate({candidate: validCandidate, sdpMLineIndex: sdpMLineIndex}))"); |
| }) |
| .then(function () { |
| debug("*** A valid sdpMid takes precedesce over a bad sdpMLineIndex"); |
| return promiseShouldResolve("pc.addIceCandidate(new RTCIceCandidate({candidate: validCandidate, sdpMid: sdpMid, sdpMLineIndex: badSdpMLineIndex}))"); |
| }) |
| .then(function () { |
| testPassed("End of test promise chain"); |
| finishJSTest(); |
| }) |
| .catch(function (error) { |
| testFailed("Error in promise chain: " + error); |
| finishJSTest(); |
| }); |
| |
| window.jsTestIsAsync = true; |
| window.successfullyParsed = true; |
| |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |
| </body> |
| </html> |