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