| Index: chrome/test/data/webrtc/jsep01_call.js | 
| diff --git a/chrome/test/data/webrtc/jsep01_call.js b/chrome/test/data/webrtc/jsep01_call.js | 
| index f21be1d3b4456d7614b1a6fb81ea65de1f0841f2..89370653f5378602895a568d388a8c8980e9ae09 100644 | 
| --- a/chrome/test/data/webrtc/jsep01_call.js | 
| +++ b/chrome/test/data/webrtc/jsep01_call.js | 
| @@ -4,188 +4,66 @@ | 
| * found in the LICENSE file. | 
| */ | 
|  | 
| -/** @private */ | 
| -var gTransformOutgoingSdp = function(sdp) { return sdp; }; | 
| - | 
| -/** @private */ | 
| -var gCreateAnswerConstraints = {}; | 
| - | 
| -/** @private */ | 
| -var gCreateOfferConstraints = {}; | 
| - | 
| -/** @private */ | 
| -var gDataChannel = null; | 
| - | 
| -/** @private */ | 
| -var gDataStatusCallback = function(status) {}; | 
| - | 
| -/** @private */ | 
| -var gDataCallback = function(data) {}; | 
| - | 
| -/** @private */ | 
| -var gDtmfSender = null; | 
| - | 
| -/** @private */ | 
| -var gDtmfOnToneChange = function(tone) {}; | 
| +// TODO(phoglund): merge into message_handling.js. | 
|  | 
| /** @private */ | 
| var gHasSeenCryptoInSdp = 'no-crypto-seen'; | 
|  | 
| -/** | 
| - * Sets the transform to apply just before setting the local description and | 
| - * sending to the peer. | 
| - * @param {function} transformFunction A function which takes one SDP string as | 
| - *     argument and returns the modified SDP string. | 
| - */ | 
| -function setOutgoingSdpTransform(transformFunction) { | 
| -  gTransformOutgoingSdp = transformFunction; | 
| -} | 
| - | 
| -/** | 
| - * Sets the MediaConstraints to be used for PeerConnection createAnswer() calls. | 
| - * @param {string} mediaConstraints The constraints, as defined in the | 
| - *     PeerConnection JS API spec. | 
| - */ | 
| -function setCreateAnswerConstraints(mediaConstraints) { | 
| -  gCreateAnswerConstraints = mediaConstraints; | 
| -} | 
| - | 
| -/** | 
| - * Sets the MediaConstraints to be used for PeerConnection createOffer() calls. | 
| - * @param {string} mediaConstraints The constraints, as defined in the | 
| - *     PeerConnection JS API spec. | 
| - */ | 
| -function setCreateOfferConstraints(mediaConstraints) { | 
| -  gCreateOfferConstraints = mediaConstraints; | 
| -} | 
| - | 
| -/** | 
| - * Sets the callback functions that will receive DataChannel readyState updates | 
| - * and received data. | 
| - * @param {function} status_callback The function that will receive a string | 
| - * with | 
| - *     the current DataChannel readyState. | 
| - * @param {function} data_callback The function that will a string with data | 
| - *     received from the remote peer. | 
| - */ | 
| -function setDataCallbacks(status_callback, data_callback) { | 
| -  gDataStatusCallback = status_callback; | 
| -  gDataCallback = data_callback; | 
| -} | 
| - | 
| -/** | 
| - * Sends data on an active DataChannel. | 
| - * @param {string} data The string that will be sent to the remote peer. | 
| - */ | 
| -function sendDataOnChannel(data) { | 
| -  if (gDataChannel == null) | 
| -    throw failTest('Trying to send data, but there is no DataChannel.'); | 
| -  gDataChannel.send(data); | 
| -} | 
| - | 
| -/** | 
| - * Sets the callback function that will receive DTMF sender ontonechange events. | 
| - * @param {function} ontonechange The function that will receive a string with | 
| - *     the tone that has just begun playout. | 
| - */ | 
| -function setOnToneChange(ontonechange) { | 
| -  gDtmfOnToneChange = ontonechange; | 
| -} | 
| - | 
| -/** | 
| - * Inserts DTMF tones on an active DTMF sender. | 
| - * @param {string} data The string that will be sent to the remote peer. | 
| - */ | 
| -function insertDtmf(tones, duration, interToneGap) { | 
| -  if (gDtmfSender == null) | 
| -    throw failTest('Trying to send DTMF, but there is no DTMF sender.'); | 
| -  gDtmfSender.insertDTMF(tones, duration, interToneGap); | 
| -} | 
| - | 
| // Public interface towards the other javascript files, such as | 
| // message_handling.js. The contract for these functions is described in | 
| // message_handling.js. | 
|  | 
| -function handleMessage(peerConnection, message) { | 
| -  var parsed_msg = JSON.parse(message); | 
| -  if (parsed_msg.type) { | 
| -    var session_description = new RTCSessionDescription(parsed_msg); | 
| -    peerConnection.setRemoteDescription( | 
| -        session_description, | 
| -        function() { success_('setRemoteDescription'); }, | 
| -        function() { failure_('setRemoteDescription'); }); | 
| -    if (session_description.type == 'offer') { | 
| -      debug('createAnswer with constraints: ' + | 
| -            JSON.stringify(gCreateAnswerConstraints, null, ' ')); | 
| -      peerConnection.createAnswer( | 
| -        setLocalAndSendMessage_, | 
| -        function() { failure_('createAnswer'); }, | 
| -        gCreateAnswerConstraints); | 
| -    } | 
| -    return; | 
| -  } else if (parsed_msg.candidate) { | 
| -    var candidate = new RTCIceCandidate(parsed_msg); | 
| -    peerConnection.addIceCandidate(candidate); | 
| -    return; | 
| -  } | 
| -  throw failTest('unknown message received'); | 
| +function receiveOffer(peerConnection, offer, constraints, callback) { | 
| +  var sessionDescription = new RTCSessionDescription(offer); | 
| +  peerConnection.setRemoteDescription( | 
| +      sessionDescription, | 
| +      function() { success_('setRemoteDescription'); }, | 
| +      function() { failure_('setRemoteDescription'); }); | 
| + | 
| +  peerConnection.createAnswer( | 
| +      function(answer) { | 
| +        success_('createAnswer'); | 
| +        setLocalDescription(peerConnection, answer); | 
| +        callback(answer); | 
| +      }, | 
| +      function() { failure_('createAnswer'); }, | 
| +      constraints); | 
| +} | 
| + | 
| +function receiveAnswer(peerConnection, answer, callback) { | 
| +  var sessionDescription = new RTCSessionDescription(answer); | 
| +  peerConnection.setRemoteDescription( | 
| +      sessionDescription, | 
| +      function() { | 
| +        success_('setRemoteDescription'); | 
| +        callback(); | 
| +      }, | 
| +      function() { failure_('setRemoteDescription'); }); | 
| } | 
|  | 
| function createPeerConnection(stun_server, useRtpDataChannels) { | 
| servers = {iceServers: [{url: 'stun:' + stun_server}]}; | 
| try { | 
| var constraints = { optional: [{ RtpDataChannels: useRtpDataChannels }]}; | 
| -    peerConnection = new webkitRTCPeerConnection(servers, constraints); | 
| +    peerConnection = new RTCPeerConnection(servers, constraints); | 
| } catch (exception) { | 
| throw failTest('Failed to create peer connection: ' + exception); | 
| } | 
| peerConnection.onaddstream = addStreamCallback_; | 
| peerConnection.onremovestream = removeStreamCallback_; | 
| peerConnection.onicecandidate = iceCallback_; | 
| -  peerConnection.ondatachannel = onCreateDataChannelCallback_; | 
| return peerConnection; | 
| } | 
|  | 
| -function setupCall(peerConnection) { | 
| -  debug('createOffer with constraints: ' + | 
| -        JSON.stringify(gCreateOfferConstraints, null, ' ')); | 
| +function createOffer(peerConnection, constraints, callback) { | 
| peerConnection.createOffer( | 
| -      setLocalAndSendMessage_, | 
| +      function(localDescription) { | 
| +        success_('createOffer'); | 
| +        setLocalDescription(peerConnection, localDescription); | 
| +        callback(localDescription); | 
| +      }, | 
| function() { failure_('createOffer'); }, | 
| -      gCreateOfferConstraints); | 
| -} | 
| - | 
| -function answerCall(peerConnection, message) { | 
| -  handleMessage(peerConnection, message); | 
| -} | 
| - | 
| -function createDataChannel(peerConnection, label) { | 
| -  if (gDataChannel != null && gDataChannel.readyState != 'closed') { | 
| -    throw failTest('Creating DataChannel, but we already have one.'); | 
| -  } | 
| - | 
| -  gDataChannel = peerConnection.createDataChannel(label, { reliable: false }); | 
| -  debug('DataChannel with label ' + gDataChannel.label + ' initiated locally.'); | 
| -  hookupDataChannelEvents(); | 
| -} | 
| - | 
| -function closeDataChannel(peerConnection) { | 
| -  if (gDataChannel == null) | 
| -    throw failTest('Closing DataChannel, but none exists.'); | 
| -  debug('DataChannel with label ' + gDataChannel.label + ' is beeing closed.'); | 
| -  gDataChannel.close(); | 
| -} | 
| - | 
| -function createDtmfSender(peerConnection) { | 
| -  if (gDtmfSender != null) | 
| -    throw failTest('Creating DTMF sender, but we already have one.'); | 
| - | 
| -  var localStream = getLocalStream(); | 
| -  if (localStream == null) | 
| -    throw failTest('Creating DTMF sender but local stream is null.'); | 
| -  local_audio_track = localStream.getAudioTracks()[0]; | 
| -  gDtmfSender = peerConnection.createDTMFSender(local_audio_track); | 
| -  gDtmfSender.ontonechange = gDtmfOnToneChange; | 
| +      constraints); | 
| } | 
|  | 
| function hasSeenCryptoInSdp() { | 
| @@ -206,21 +84,19 @@ function failure_(method, error) { | 
| /** @private */ | 
| function iceCallback_(event) { | 
| if (event.candidate) | 
| -    sendToPeer(gRemotePeerId, JSON.stringify(event.candidate)); | 
| +    sendIceCandidate(event.candidate); | 
| } | 
|  | 
| /** @private */ | 
| -function setLocalAndSendMessage_(session_description) { | 
| -  session_description.sdp = gTransformOutgoingSdp(session_description.sdp); | 
| -  if (session_description.sdp.search('a=crypto') != -1 || | 
| -      session_description.sdp.search('a=fingerprint') != -1) | 
| +function setLocalDescription(peerConnection, sessionDescription) { | 
| +  if (sessionDescription.sdp.search('a=crypto') != -1 || | 
| +      sessionDescription.sdp.search('a=fingerprint') != -1) | 
| gHasSeenCryptoInSdp = 'crypto-seen'; | 
| + | 
| peerConnection.setLocalDescription( | 
| -    session_description, | 
| +    sessionDescription, | 
| function() { success_('setLocalDescription'); }, | 
| function() { failure_('setLocalDescription'); }); | 
| -  debug('Sending SDP message:\n' + session_description.sdp); | 
| -  sendToPeer(gRemotePeerId, JSON.stringify(session_description)); | 
| } | 
|  | 
| /** @private */ | 
| @@ -235,32 +111,3 @@ function removeStreamCallback_(event) { | 
| debug('Call ended.'); | 
| document.getElementById('remote-view').src = ''; | 
| } | 
| - | 
| -/** @private */ | 
| -function onCreateDataChannelCallback_(event) { | 
| -  if (gDataChannel != null && gDataChannel.readyState != 'closed') { | 
| -    throw failTest('Received DataChannel, but we already have one.'); | 
| -  } | 
| - | 
| -  gDataChannel = event.channel; | 
| -  debug('DataChannel with label ' + gDataChannel.label + | 
| -      ' initiated by remote peer.'); | 
| -  hookupDataChannelEvents(); | 
| -} | 
| - | 
| -/** @private */ | 
| -function hookupDataChannelEvents() { | 
| -  gDataChannel.onmessage = gDataCallback; | 
| -  gDataChannel.onopen = onDataChannelReadyStateChange_; | 
| -  gDataChannel.onclose = onDataChannelReadyStateChange_; | 
| -  // Trigger gDataStatusCallback so an application is notified | 
| -  // about the created data channel. | 
| -  onDataChannelReadyStateChange_(); | 
| -} | 
| - | 
| -/** @private */ | 
| -function onDataChannelReadyStateChange_() { | 
| -  var readyState = gDataChannel.readyState; | 
| -  debug('DataChannel state:' + readyState); | 
| -  gDataStatusCallback(readyState); | 
| -} | 
|  |