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