test_peerConnection_verifyDescriptions.html (6470B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <script type="application/javascript" src="pc.js"></script> 5 </head> 6 <body> 7 <pre id="test"> 8 <script type="application/javascript"> 9 createHTML({ 10 bug: "1264479", 11 title: "PeerConnection verify current and pending descriptions in legacy mode" 12 }); 13 14 // Mostly covered by WPT tests these days, except for in our legacy mode 15 16 const isSimilarDescription = (d1, d2, msg) => { 17 isnot(d1, d2, msg + " — not the same object"); 18 is(d1.type, d2.type, msg + " — but same type"); 19 is(d1.sdp, d2.sdp, msg + " — and same sdp"); 20 } 21 22 const addIce = (pc, can, failed) => can && pc.addIceCandidate(can).catch(failed); 23 24 const tests = [ 25 async function checkLegacyDescriptions() { 26 await withPrefs([["media.peerconnection.description.legacy.enabled", true]], 27 async () => { 28 const pc1 = new RTCPeerConnection(); 29 const pc2 = new RTCPeerConnection(); 30 31 pc1.onicecandidate = e => addIce(pc2, e.candidate, generateErrorCallback()); 32 pc2.onicecandidate = e => addIce(pc1, e.candidate, generateErrorCallback()); 33 34 const v1 = createMediaElement('video', 'v1'); 35 const v2 = createMediaElement('video', 'v2'); 36 37 const stream = await navigator.mediaDevices.getUserMedia({ 38 video: true, audio: true 39 }); 40 v1.srcObject = stream; 41 for (const track of stream.getTracks()) { 42 pc1.addTrack(track, stream); 43 } 44 await pc1.setLocalDescription(); 45 is(pc1.currentLocalDescription, null, "pc1 currentLocalDescription is null"); 46 ok(pc1.pendingLocalDescription, "pc1 pendingLocalDescription is set"); 47 ok(pc1.localDescription, "pc1 localDescription is set"); 48 isSimilarDescription(pc1.pendingLocalDescription, pc1.pendingLocalDescription, "pendingLocalDescription"); 49 isSimilarDescription(pc1.localDescription, pc1.localDescription, "localDescription"); 50 isSimilarDescription(pc1.localDescription, pc1.pendingLocalDescription, "local and pending"); 51 52 await pc2.setRemoteDescription(pc1.localDescription); 53 is(pc2.currentRemoteDescription, null, "pc2 currentRemoteDescription is null"); 54 ok(pc2.pendingRemoteDescription, "pc2 pendingRemoteDescription is set"); 55 ok(pc2.remoteDescription, "pc2 remoteDescription is set"); 56 isSimilarDescription(pc2.pendingRemoteDescription, pc2.pendingRemoteDescription, "pendingRemoteDescription"); 57 isSimilarDescription(pc2.remoteDescription, pc2.remoteDescription, "remoteDescription"); 58 isSimilarDescription(pc2.remoteDescription, pc2.pendingRemoteDescription, "remote and pending"); 59 60 await pc2.setLocalDescription(); 61 ok(pc2.currentLocalDescription, "pc2 currentLocalDescription is set"); 62 is(pc2.pendingLocalDescription, null, "pc2 pendingLocalDescription is null"); 63 ok(pc2.localDescription, "pc2 localDescription is set"); 64 isSimilarDescription(pc2.currentLocalDescription, pc2.currentLocalDescription, "currentLocalDescription"); 65 isSimilarDescription(pc2.localDescription, pc2.localDescription, "localDescription"); 66 isSimilarDescription(pc2.localDescription, pc2.currentLocalDescription, "local and current"); 67 68 await pc1.setRemoteDescription(pc2.localDescription); 69 ok(pc1.currentRemoteDescription, "pc1 currentRemoteDescription is set"); 70 is(pc1.pendingRemoteDescription, null, "pc1 pendingRemoteDescription is null"); 71 ok(pc1.remoteDescription, "pc1 remoteDescription is set"); 72 isSimilarDescription(pc1.currentRemoteDescription, pc1.currentRemoteDescription, "currentRemoteDescription"); 73 isSimilarDescription(pc1.remoteDescription, pc1.remoteDescription, "remoteDescription"); 74 isSimilarDescription(pc1.remoteDescription, pc1.currentRemoteDescription, "remote and current"); 75 } 76 ); 77 }, 78 79 async function checkDuplicateFingerprintQuirk() { 80 await withPrefs([["media.peerconnection.sdp.quirk.duplicate_fingerprint.allowlist", "example.com"]], 81 async () => { 82 const pc1 = new RTCPeerConnection(); 83 const pc2 = new RTCPeerConnection(); 84 85 pc1.onicecandidate = e => addIce(pc2, e.candidate, generateErrorCallback()); 86 pc2.onicecandidate = e => addIce(pc1, e.candidate, generateErrorCallback()); 87 88 const stream = await navigator.mediaDevices.getUserMedia({ 89 video: true, audio: true 90 }); 91 v1.srcObject = stream; 92 for (const track of stream.getTracks()) { 93 pc1.addTrack(track, stream); 94 } 95 96 const fingerprints = ({sdp}) => sdp.match(/a=fingerprint/g).length; 97 98 // with implicit offer and answer 99 await pc1.setLocalDescription(); 100 is(fingerprints(pc1.localDescription), 3, "implicit pc1 local fingerprints"); 101 is(fingerprints(pc1.pendingLocalDescription), 3, "implicit pc1 pending fingerprints"); 102 await pc2.setRemoteDescription(pc1.localDescription); 103 await pc2.setLocalDescription(); 104 is(fingerprints(pc2.localDescription), 3, "implicit pc2 local fingerprints"); 105 is(fingerprints(pc2.currentLocalDescription), 3, "implicit pc2 current fingerprints"); 106 await pc1.setRemoteDescription(pc2.localDescription); 107 108 // with explicit offer and answer 109 const offer = await pc1.createOffer(); 110 is(fingerprints(offer), 3, "offer fingerprints"); 111 await pc1.setLocalDescription(offer); 112 is(fingerprints(pc1.localDescription), 3, "explicit pc1 local fingerprints"); 113 is(fingerprints(pc1.pendingLocalDescription), 3, "explicit pc1 pending fingerprints"); 114 await pc2.setRemoteDescription(pc1.localDescription); 115 const answer = pc2.createAnswer(); 116 is(fingerprints(offer), 3, "answer fingerprints"); 117 await pc2.setLocalDescription(answer); 118 is(fingerprints(pc2.localDescription), 3, "explicit pc2 fingerprints A"); 119 is(fingerprints(pc2.currentLocalDescription), 3, "explicit pc2 fingerprints B"); 120 await pc1.setRemoteDescription(pc2.localDescription); 121 } 122 ); 123 } 124 ]; 125 126 runNetworkTest(async () => { 127 for (const test of tests) { 128 info(`Running test: ${test.name}`); 129 await test(); 130 info(`Done running test: ${test.name}`); 131 } 132 }); 133 </script> 134 </pre> 135 </body> 136 </html>