144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org/** 244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org * 444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org * Use of this source code is governed by a BSD-style license 544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org * that can be found in the LICENSE file in the root of the source 644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org * tree. An additional intellectual property rights grant can be found 744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org * in the file PATENTS. All contributing project authors may 844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org * be found in the AUTHORS file in the root of the source tree. 944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org */ 1044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 1144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org// This file is cloned from samples/js/base/adapter.js 1244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org// Modify the original and do new copy instead of doing changes here. 1344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 1444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.orgvar RTCPeerConnection = null; 1544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.orgvar getUserMedia = null; 1644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.orgvar attachMediaStream = null; 1744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.orgvar reattachMediaStream = null; 1844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.orgvar webrtcDetectedBrowser = null; 1944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.orgvar webrtcDetectedVersion = null; 2044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 2144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.orgfunction trace(text) { 2244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // This function is used for logging. 2344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (text[text.length - 1] == '\n') { 2444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org text = text.substring(0, text.length - 1); 2544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 2644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org console.log((performance.now() / 1000).toFixed(3) + ": " + text); 2744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org} 2844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.orgfunction maybeFixConfiguration(pcConfig) { 2944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (pcConfig == null) { 3044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org return; 3144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 3244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org for (var i = 0; i < pcConfig.iceServers.length; i++) { 3344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (pcConfig.iceServers[i].hasOwnProperty('urls')){ 3444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org pcConfig.iceServers[i]['url'] = pcConfig.iceServers[i]['urls']; 3544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org delete pcConfig.iceServers[i]['urls']; 3644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 3744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 3844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org} 3944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 4044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.orgif (navigator.mozGetUserMedia) { 4144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org console.log("This appears to be Firefox"); 4244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 4344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org webrtcDetectedBrowser = "firefox"; 4444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 4544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org webrtcDetectedVersion = 4644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org parseInt(navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1], 10); 4744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 4844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // The RTCPeerConnection object. 4944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org var RTCPeerConnection = function(pcConfig, pcConstraints) { 5044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // .urls is not supported in FF yet. 5144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org maybeFixConfiguration(pcConfig); 5244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org return new mozRTCPeerConnection(pcConfig, pcConstraints); 5344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 5444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 5544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // The RTCSessionDescription object. 5644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org RTCSessionDescription = mozRTCSessionDescription; 5744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 5844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // The RTCIceCandidate object. 5944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org RTCIceCandidate = mozRTCIceCandidate; 6044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 6144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Get UserMedia (only difference is the prefix). 6244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Code from Adam Barth. 6344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org getUserMedia = navigator.mozGetUserMedia.bind(navigator); 6444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org navigator.getUserMedia = getUserMedia; 6544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 6644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Creates iceServer from the url for FF. 6744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org createIceServer = function(url, username, password) { 6844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org var iceServer = null; 6944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org var url_parts = url.split(':'); 7044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (url_parts[0].indexOf('stun') === 0) { 7144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Create iceServer with stun url. 7244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org iceServer = { 'url': url }; 7344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } else if (url_parts[0].indexOf('turn') === 0) { 7444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (webrtcDetectedVersion < 27) { 7544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Create iceServer with turn url. 7644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Ignore the transport parameter from TURN url for FF version <=27. 7744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org var turn_url_parts = url.split("?"); 7844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Return null for createIceServer if transport=tcp. 7944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (turn_url_parts.length === 1 || 8044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org turn_url_parts[1].indexOf('transport=udp') === 0) { 8144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org iceServer = {'url': turn_url_parts[0], 8244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 'credential': password, 8344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 'username': username}; 8444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 8544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } else { 8644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // FF 27 and above supports transport parameters in TURN url, 8744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // So passing in the full url to create iceServer. 8844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org iceServer = {'url': url, 8944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 'credential': password, 9044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 'username': username}; 9144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 9244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 9344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org return iceServer; 9444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org }; 9544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 9644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org createIceServers = function(urls, username, password) { 9744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org var iceServers = []; 9844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Use .url for FireFox. 9944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org for (i = 0; i < urls.length; i++) { 10044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org var iceServer = createIceServer(urls[i], 10144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org username, 10244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org password); 10344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (iceServer !== null) { 10444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org iceServers.push(iceServer); 10544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 10644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 10744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org return iceServers; 10844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 10944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 11044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Attach a media stream to an element. 11144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org attachMediaStream = function(element, stream) { 11244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org console.log("Attaching media stream"); 11344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org element.mozSrcObject = stream; 11444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org element.play(); 11544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org }; 11644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 11744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org reattachMediaStream = function(to, from) { 11844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org console.log("Reattaching media stream"); 11944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org to.mozSrcObject = from.mozSrcObject; 12044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org to.play(); 12144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org }; 12244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 12344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Fake get{Video,Audio}Tracks 12444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (!MediaStream.prototype.getVideoTracks) { 12544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org MediaStream.prototype.getVideoTracks = function() { 12644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org return []; 12744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org }; 12844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 12944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 13044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (!MediaStream.prototype.getAudioTracks) { 13144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org MediaStream.prototype.getAudioTracks = function() { 13244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org return []; 13344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org }; 13444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 13544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org} else if (navigator.webkitGetUserMedia) { 13644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org console.log("This appears to be Chrome"); 13744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 13844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org webrtcDetectedBrowser = "chrome"; 13944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org webrtcDetectedVersion = 14044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2], 10); 14144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 14244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Creates iceServer from the url for Chrome M33 and earlier. 14344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org createIceServer = function(url, username, password) { 14444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org var iceServer = null; 14544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org var url_parts = url.split(':'); 14644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (url_parts[0].indexOf('stun') === 0) { 14744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Create iceServer with stun url. 14844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org iceServer = { 'url': url }; 14944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } else if (url_parts[0].indexOf('turn') === 0) { 15044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Chrome M28 & above uses below TURN format. 15144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org iceServer = {'url': url, 15244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 'credential': password, 15344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 'username': username}; 15444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 15544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org return iceServer; 15644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org }; 15744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 15844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Creates iceServers from the urls for Chrome M34 and above. 15944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org createIceServers = function(urls, username, password) { 16044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org var iceServers = []; 16144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (webrtcDetectedVersion >= 34) { 16244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // .urls is supported since Chrome M34. 16344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org iceServers = {'urls': urls, 16444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 'credential': password, 16544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 'username': username }; 16644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } else { 16744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org for (i = 0; i < urls.length; i++) { 16844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org var iceServer = createIceServer(urls[i], 16944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org username, 17044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org password); 17144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (iceServer !== null) { 17244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org iceServers.push(iceServer); 17344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 17444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 17544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 17644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org return iceServers; 17744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org }; 17844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 17944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // The RTCPeerConnection object. 18044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org var RTCPeerConnection = function(pcConfig, pcConstraints) { 18144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // .urls is supported since Chrome M34. 18244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (webrtcDetectedVersion < 34) { 18344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org maybeFixConfiguration(pcConfig); 18444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 18544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org return new webkitRTCPeerConnection(pcConfig, pcConstraints); 18644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 18744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 18844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Get UserMedia (only difference is the prefix). 18944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Code from Adam Barth. 19044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org getUserMedia = navigator.webkitGetUserMedia.bind(navigator); 19144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org navigator.getUserMedia = getUserMedia; 19244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 19344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org // Attach a media stream to an element. 19444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org attachMediaStream = function(element, stream) { 19544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org if (typeof element.srcObject !== 'undefined') { 19644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org element.srcObject = stream; 19744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } else if (typeof element.mozSrcObject !== 'undefined') { 19844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org element.mozSrcObject = stream; 19944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } else if (typeof element.src !== 'undefined') { 20044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org element.src = URL.createObjectURL(stream); 20144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } else { 20244eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org console.log('Error attaching stream to element.'); 20344eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org } 20444eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org }; 20544eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org 20644eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org reattachMediaStream = function(to, from) { 20744eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org to.src = from.src; 20844eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org }; 20944eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org} else { 21044eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org console.log("Browser does not appear to be WebRTC-capable"); 21144eb87e6dd3ddf9711d480521e006ce9084fdbd6andresp@webrtc.org} 212