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