webrtc_internals.js revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright// Use of this source code is governed by a BSD-style license that can be 3c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright// found in the LICENSE file. 4c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 5c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright<include src="stats_graph_helper.js"/> 6c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 7c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightvar peerConnectionsListElem = null; 8c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 9c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightfunction initialize() { 10c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright peerConnectionsListElem = $('peer-connections-list'); 11c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright chrome.send('getAllUpdates'); 12c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright startGetStats(); 13c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright} 14c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 15c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright// Polls stats from all PeerConnections every second. 16c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightfunction startGetStats() { 17c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright if (document.getElementsByTagName('li').length) 18c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright chrome.send('getAllStats'); 19c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright window.setTimeout(startGetStats, 1000); 20d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright} 21c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 22c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightfunction getPeerConnectionId(data) { 23c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright return data.pid + '-' + data.lid; 24c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright} 25c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 26d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// Makes sure a LI element representing a PeerConnection is created 27c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright// and appended to peerConnectionListElem. 28d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wrightfunction ensurePeerConnectionElement(id) { 29d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var element = $(id); 30d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright if (!element) { 31d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright element = document.createElement('li'); 32d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright peerConnectionsListElem.appendChild(element); 33d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright element.id = id; 34c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright } 35c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright return element; 36c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright} 37c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 38c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright// Makes sure the table representing the PeerConnection event log is created 39c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright// and appended to peerConnectionElement. 40c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightfunction ensurePeerConnectionLog(peerConnectionElement) { 41c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright var logId = peerConnectionElement.id + '-log'; 42c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright var logElement = $(logId); 43c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright if (!logElement) { 44c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright var container = document.createElement('div'); 45c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright container.className = 'log-container'; 46d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright peerConnectionElement.appendChild(container); 47c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 48c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright logElement = document.createElement('table'); 49c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright logElement.id = logId; 50c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright logElement.className = 'log-table'; 51c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright logElement.border = 1; 52c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright container.appendChild(logElement); 53c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright logElement.innerHTML = '<tr><th>Time</th>' + 54c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright '<th class="log-header-event">Event</th></tr>'; 55c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright } 56c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright return logElement; 57c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright} 58c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 59c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright// Add the update to the log table as a new row. The type of the update is set 60c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright// as the text of the cell; clicking the cell will reveal or hide the details 61d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// as the content of a TextArea element. 62d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wrightfunction addToPeerConnectionLog(logElement, update) { 63c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright var row = document.createElement('tr'); 64c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright logElement.appendChild(row); 65c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 66c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright var expandable = (update.value.length > 0); 67d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright // details.open is true initially so that we can get the real scrollHeight 68d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright // of the textareas. 69d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright row.innerHTML = 70c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright '<td>' + (new Date()).toLocaleString() + '</td>' + 71c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright (expandable ? 72c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright '<td><details open><summary>' + update.type + '</summary>' + 73c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright '</details></td>' : 74c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright '<td>' + update.type + '</td>'); 75c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright if (!expandable) 76c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright return; 77c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 78cde5bb45cc86d181d96ee69da1832e6132162871Michael Wright var valueContainer = document.createElement('textarea'); 79c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright var details = row.cells[1].childNodes[0]; 80c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright details.appendChild(valueContainer); 81c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright valueContainer.value = update.value; 82c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright valueContainer.style.height = valueContainer.scrollHeight + 'px'; 83c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright details.open = false; 84c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright} 85c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 86c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright// Ensure the DIV container for the stats tables is created as a child of 87c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright// |peerConnectionElement|. 88c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightfunction ensureStatsTableContainer(peerConnectionElement) { 89c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright var containerId = peerConnectionElement.id + '-table-container'; 90c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright var container = $(containerId); 91c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright if (!container) { 92c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright container = document.createElement('div'); 93c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright container.id = containerId; 94c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright container.className = 'stats-table-container'; 95c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright peerConnectionElement.appendChild(container); 96c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright } 97c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright return container; 98c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright} 99c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright 100c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright// Ensure the stats table for track |statsId| of PeerConnection 101c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright// |peerConnectionElement| is created as a child of the stats table container. 102c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wrightfunction ensureStatsTable(peerConnectionElement, statsId) { 103c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright var tableId = peerConnectionElement.id + '-table-' + statsId; 104c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright var table = $(tableId); 105d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright if (!table) { 106d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var container = ensureStatsTableContainer(peerConnectionElement); 107d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright table = document.createElement('table'); 108d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright container.appendChild(table); 109d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright table.id = tableId; 110d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright table.border = 1; 111d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright table.innerHTML = '<th>Statistics ' + statsId + '</th>'; 112d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright } 113d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright return table; 114d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright} 115d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright 116d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// Update the value column of the stats row of |rowName| to |value|. 117d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// A new row is created is this is the first report of this stats. 118d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wrightfunction updateStatsTableRow(statsTable, rowName, value) { 119d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var trId = statsTable.id + '-' + rowName; 120d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var trElement = $(trId); 121d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright if (!trElement) { 122d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright trElement = document.createElement('tr'); 123d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright trElement.id = trId; 124d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright statsTable.appendChild(trElement); 125d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright trElement.innerHTML = '<td>' + rowName + '</td><td></td>'; 126d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright } 127d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright trElement.cells[1].textContent = value; 128d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright} 129d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright 130d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// Add |singleReport| to the stats table. 131d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wrightfunction addSingleReportToTable(statsTable, singleReport) { 132d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright if (!singleReport || !singleReport.values || singleReport.values.length == 0) 133d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright return; 134d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright 135d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var date = Date(singleReport.timestamp); 136d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright updateStatsTableRow(statsTable, 'timestamp', date.toLocaleString()); 137d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright for (var i = 0; i < singleReport.values.length - 1; i = i + 2) { 138d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright updateStatsTableRow(statsTable, singleReport.values[i], 139d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright singleReport.values[i + 1]); 140d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright } 141d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright} 142d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright 143d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// 144d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// Browser message handlers. 145d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// 146d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright 147d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// data = {pid:|integer|, lid:|integer|}. 148d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wrightfunction removePeerConnection(data) { 149d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var element = $(getPeerConnectionId(data)); 150d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright if (element) 151d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright peerConnectionsListElem.removeChild(element); 152d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright} 153d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright 154d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// data = {pid:|integer|, lid:|integer|, 155d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// url:|string|, servers:|string|, constraints:|string|}. 156d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wrightfunction addPeerConnection(data) { 157d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var peerConnectionElement = ensurePeerConnectionElement( 158d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright getPeerConnectionId(data)); 159d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright peerConnectionElement.innerHTML = 160d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright '<h3>PeerConnection ' + peerConnectionElement.id + '</h3>' + 161d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright '<div>' + data.url + ' ' + data.servers + ' ' + data.constraints + 162d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright '</div>'; 163d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright return peerConnectionElement; 164d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright} 165d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright 166d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// data = {pid:|integer|, lid:|integer|, type:|string|, value:|string|}. 167d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wrightfunction updatePeerConnection(data) { 168d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var peerConnectionElement = ensurePeerConnectionElement( 169d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright getPeerConnectionId(data)); 170d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var logElement = ensurePeerConnectionLog(peerConnectionElement); 171d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright addToPeerConnectionLog(logElement, data); 172d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright} 173d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright 174d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// data is an array and each entry is 175d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// {pid:|integer|, lid:|integer|, 176d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// url:|string|, servers:|string|, constraints:|string|, log:|array|}, 177d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// each entry of log is {type:|string|, value:|string|}. 178d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wrightfunction updateAllPeerConnections(data) { 179d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright for (var i = 0; i < data.length; ++i) { 180d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var peerConnection = addPeerConnection(data[i]); 181d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var logElement = ensurePeerConnectionLog(peerConnection); 182d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright 183d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var log = data[i].log; 184d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright for (var j = 0; j < log.length; ++j) { 185d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright addToPeerConnectionLog(logElement, log[j]); 186d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright } 187d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright } 188d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright} 189d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright 190d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// data = {pid:|integer|, lid:|integer|, reports:|array|}. 191d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// Each entry of reports = 192d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// {id:|string|, type:|string|, local:|object|, remote:|object|}. 193d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// reports.local or reports.remote = 194d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// {timestamp: |double|, values: |array|}, 195d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// where values is an array of strings, whose even index entry represents 196d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// the name of the stat, and the odd index entry represents the value of 197d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright// the stat. 198d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wrightfunction addStats(data) { 199d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var peerConnectionElement = ensurePeerConnectionElement( 200d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright getPeerConnectionId(data)); 201d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright for (var i = 0; i < data.reports.length; ++i) { 202d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var report = data.reports[i]; 203d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var reportName = report.type + '-' + report.id; 204d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright var statsTable = ensureStatsTable(peerConnectionElement, reportName); 205d86ecd26d78c7bcd7f820b9ef5e3f4c3eb037510Michael Wright 206c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright addSingleReportToTable(statsTable, report.local); 207 drawSingleReport(peerConnectionElement, reportName, report.local); 208 addSingleReportToTable(statsTable, report.remote); 209 drawSingleReport(peerConnectionElement, reportName, report.remote); 210 } 211} 212 213document.addEventListener('DOMContentLoaded', initialize); 214