12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)var USER_MEDIA_TAB_ID = 'user-media-tab-id'; 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)var tabView = null; 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var ssrcInfoManager = null; 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var peerConnectionUpdateTable = null; 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var statsTable = null; 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)var dumpCreator = null; 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)/** A map from peer connection id to the PeerConnectionRecord. */ 1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)var peerConnectionDataStore = {}; 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/** A list of getUserMedia requests. */ 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)var userMediaRequests = []; 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)/** A simple class to store the updates and stats data for a peer connection. */ 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)var PeerConnectionRecord = (function() { 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /** @constructor */ 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) function PeerConnectionRecord() { 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /** @private */ 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this.record_ = { 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) constraints: {}, 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtcConfiguration: [], 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) stats: {}, 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) updateLog: [], 2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) url: '', 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }; 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }; 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) PeerConnectionRecord.prototype = { 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /** @override */ 3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) toJSON: function() { 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return this.record_; 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, 3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /** 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * Adds the initilization info of the peer connection. 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @param {string} url The URL of the web page owning the peer connection. 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * @param {Array} rtcConfiguration 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @param {!Object} constraints Media constraints. 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) */ 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) initialize: function(url, rtcConfiguration, constraints) { 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this.record_.url = url; 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) this.record_.rtcConfiguration = rtcConfiguration; 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this.record_.constraints = constraints; 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /** 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @param {string} dataSeriesId The TimelineDataSeries identifier. 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @return {!TimelineDataSeries} 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) */ 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) getDataSeries: function(dataSeriesId) { 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return this.record_.stats[dataSeriesId]; 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /** 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @param {string} dataSeriesId The TimelineDataSeries identifier. 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @param {!TimelineDataSeries} dataSeries The TimelineDataSeries to set to. 6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) */ 6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) setDataSeries: function(dataSeriesId, dataSeries) { 6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this.record_.stats[dataSeriesId] = dataSeries; 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) /** 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * @param {!Object} update The object contains keys "time", "type", and 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * "value". 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) */ 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch addUpdate: function(update) { 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) var time = new Date(parseFloat(update.time)); 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) this.record_.updateLog.push({ 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch time: time.toLocaleString(), 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch type: update.type, 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch value: update.value, 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }); 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }, 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }; 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return PeerConnectionRecord; 8090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)})(); 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// The maximum number of data points bufferred for each stats. Old data points 83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// will be shifted out when the buffer is full. 84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)var MAX_STATS_DATA_POINT_BUFFER_SIZE = 1000; 85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)<include src="tab_view.js"/> 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)<include src="data_series.js"/> 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)<include src="ssrc_info_manager.js"/> 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)<include src="stats_graph_helper.js"/> 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)<include src="stats_table.js"/> 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)<include src="peer_connection_update_table.js"/> 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)<include src="dump_creator.js"/> 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function initialize() { 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) dumpCreator = new DumpCreator($('content-root')); 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) tabView = new TabView($('content-root')); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssrcInfoManager = new SsrcInfoManager(); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) peerConnectionUpdateTable = new PeerConnectionUpdateTable(); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) statsTable = new StatsTable(ssrcInfoManager); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) chrome.send('finishedDOMLoad'); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Requests stats from all peer connections every second. 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window.setInterval(requestStats, 1000); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)document.addEventListener('DOMContentLoaded', initialize); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/** Sends a request to the browser to get peer connection statistics. */ 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)function requestStats() { 112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (Object.keys(peerConnectionDataStore).length > 0) 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) chrome.send('getAllStats'); 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * A helper function for getting a peer connection element id. 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {!Object.<string, number>} data The object containing the pid and lid 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * of the peer connection. 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @return {string} The peer connection element id. 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function getPeerConnectionId(data) { 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return data.pid + '-' + data.lid; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Extracts ssrc info from a setLocal/setRemoteDescription update. 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {!PeerConnectionUpdateEntry} data The peer connection update data. 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)function extractSsrcInfo(data) { 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (data.type == 'setLocalDescription' || 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) data.type == 'setRemoteDescription') { 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ssrcInfoManager.addSsrcStreamInfo(data.value); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * A helper function for appending a child element to |parent|. 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * @param {!Element} parent The parent element. 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * @param {string} tag The child element tag. 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * @param {string} text The textContent of the new DIV. 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * @return {!Element} the new DIV element. 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) */ 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)function appendChildWithText(parent, tag, text) { 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) var child = document.createElement(tag); 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) child.textContent = text; 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parent.appendChild(child); 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return child; 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/** 15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * Helper for adding a peer connection update. 15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * 16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @param {Element} peerConnectionElement 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * @param {!PeerConnectionUpdateEntry} update The peer connection update data. 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)function addPeerConnectionUpdate(peerConnectionElement, update) { 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) peerConnectionUpdateTable.addPeerConnectionUpdate(peerConnectionElement, 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) update); 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) extractSsrcInfo(update); 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch peerConnectionDataStore[peerConnectionElement.id].addUpdate(update); 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)/** Browser message handlers. */ 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Removes all information about a peer connection. 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {!Object.<string, number>} data The object containing the pid and lid 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * of a peer connection. 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function removePeerConnection(data) { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var element = $(getPeerConnectionId(data)); 18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (element) { 18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delete peerConnectionDataStore[element.id]; 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) tabView.removeTab(element.id); 18590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Adds a peer connection. 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * @param {!Object} data The object containing the pid, lid, url, 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * rtcConfiguration, and constraints of a peer connection. 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function addPeerConnection(data) { 19690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) var id = getPeerConnectionId(data); 19790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (!peerConnectionDataStore[id]) { 19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) peerConnectionDataStore[id] = new PeerConnectionRecord(); 20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) peerConnectionDataStore[id].initialize( 2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) data.url, data.rtcConfiguration, data.constraints); 20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) var peerConnectionElement = $(id); 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!peerConnectionElement) { 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) peerConnectionElement = tabView.addTab(id, data.url + ' [' + id + ']'); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) peerConnectionElement.innerHTML = 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) '<p>' + data.url + ' ' + data.rtcConfiguration + ' ' + data.constraints + 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) '</p>'; 21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return peerConnectionElement; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Adds a peer connection update. 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {!PeerConnectionUpdateEntry} data The peer connection update data. 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function updatePeerConnection(data) { 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var peerConnectionElement = $(getPeerConnectionId(data)); 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) addPeerConnectionUpdate(peerConnectionElement, data); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Adds the information of all peer connections created so far. 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {Array.<!Object>} data An array of the information of all peer 2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * connections. Each array item contains pid, lid, url, rtcConfiguration, 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * constraints, and an array of updates as the log. 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function updateAllPeerConnections(data) { 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var i = 0; i < data.length; ++i) { 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var peerConnection = addPeerConnection(data[i]); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var log = data[i].log; 23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!log) 24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) continue; 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var j = 0; j < log.length; ++j) { 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) addPeerConnectionUpdate(peerConnection, log[j]); 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) requestStats(); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Handles the report of stats. 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * @param {!Object} data The object containing pid, lid, and reports, where 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * reports is an array of stats reports. Each report contains id, type, 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * and stats, where stats is the object containing timestamp and values, 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * which is an array of strings, whose even index entry is the name of the 256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * stat, and the odd index entry is the value. 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function addStats(data) { 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) var peerConnectionElement = $(getPeerConnectionId(data)); 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!peerConnectionElement) 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var i = 0; i < data.reports.length; ++i) { 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var report = data.reports[i]; 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) statsTable.addStatsReport(peerConnectionElement, report); 266b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) drawSingleReport(peerConnectionElement, report); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Adds a getUserMedia request. 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {!Object} data The object containing rid {number}, pid {number}, 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * origin {string}, audio {string}, video {string}. 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)function addGetUserMedia(data) { 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) userMediaRequests.push(data); 2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!$(USER_MEDIA_TAB_ID)) { 2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) tabView.addTab(USER_MEDIA_TAB_ID, 'GetUserMedia Requests'); 2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) var requestDiv = document.createElement('div'); 2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) requestDiv.className = 'user-media-request-div-class'; 2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) requestDiv.rid = data.rid; 2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) $(USER_MEDIA_TAB_ID).appendChild(requestDiv); 2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) appendChildWithText(requestDiv, 'div', 'Caller origin: ' + data.origin); 2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) appendChildWithText(requestDiv, 'div', 'Caller process id: ' + data.pid); 2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) appendChildWithText(requestDiv, 'span', 'Audio Constraints').style.fontWeight 2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) = 'bold'; 2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) appendChildWithText(requestDiv, 'div', data.audio); 2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) appendChildWithText(requestDiv, 'span', 'Video Constraints').style.fontWeight 2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) = 'bold'; 2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) appendChildWithText(requestDiv, 'div', data.video); 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/** 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Removes the getUserMedia requests from the specified |rid|. 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * @param {!Object} data The object containing rid {number}, the render id. 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)function removeGetUserMediaForRenderer(data) { 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (var i = userMediaRequests.length - 1; i >= 0; --i) { 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (userMediaRequests[i].rid == data.rid) 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) userMediaRequests.splice(i, 1); 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) var requests = $(USER_MEDIA_TAB_ID).childNodes; 3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (var i = 0; i < requests.length; ++i) { 3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (requests[i].rid == data.rid) 3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) $(USER_MEDIA_TAB_ID).removeChild(requests[i]); 3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if ($(USER_MEDIA_TAB_ID).childNodes.length == 0) 3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) tabView.removeTab(USER_MEDIA_TAB_ID); 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 323effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch/** 324effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * Notification that the AEC recording file selection dialog was cancelled, 325effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * i.e. AEC has not been enabled. 326effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch */ 327effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochfunction aecRecordingFileSelectionCancelled() { 328effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch dumpCreator.disableAecRecording(); 329effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 330effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 331effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/** 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * Set 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)function enableAecRecording() { 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dumpCreator.enableAecRecording(); 337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 338