Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 var ClientRenderer = (function() { | 5 var ClientRenderer = (function() { |
| 6 var ClientRenderer = function() { | 6 var ClientRenderer = function() { |
| 7 this.playerListElement = document.getElementById('player-list'); | 7 this.playerListElement = document.getElementById('player-list'); |
| 8 this.audioStreamListElement = document.getElementById('audio-stream-list'); | 8 this.audioStreamListElement = document.getElementById('audio-stream-list'); |
| 9 this.propertiesTable = document.getElementById('property-table'); | 9 this.propertiesTable = document.getElementById('property-table'); |
| 10 this.logTable = document.getElementById('log'); | 10 this.logTable = document.getElementById('log'); |
| 11 this.graphElement = document.getElementById('graphs'); | |
| 11 | 12 |
| 12 this.selectedPlayer = null; | 13 this.selectedPlayer = null; |
| 13 this.selectedStream = null; | 14 this.selectedStream = null; |
| 14 | 15 |
| 15 this.selectedPlayerLogIndex = 0; | 16 this.selectedPlayerLogIndex = 0; |
| 17 | |
| 18 this.bufferCanvas = document.createElement('canvas'); | |
| 19 this.bufferCanvas.width = media.BAR_WIDTH; | |
| 20 this.bufferCanvas.height = media.BAR_HEIGHT; | |
| 16 }; | 21 }; |
| 17 | 22 |
| 18 function removeChildren(element) { | 23 function removeChildren(element) { |
| 19 while (element.hasChildNodes()) { | 24 while (element.hasChildNodes()) { |
| 20 element.removeChild(element.lastChild); | 25 element.removeChild(element.lastChild); |
| 21 } | 26 } |
| 22 }; | 27 }; |
| 23 | 28 |
| 24 function createButton(text, select_cb) { | 29 function createButton(text, select_cb) { |
| 25 var button = document.createElement('button'); | 30 var button = document.createElement('button'); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 69 * Called when a property on a player is changed. | 74 * Called when a property on a player is changed. |
| 70 * @param players The entire map of id -> player. | 75 * @param players The entire map of id -> player. |
| 71 * @param player The player that had its property changed. | 76 * @param player The player that had its property changed. |
| 72 * @param key The name of the property that was changed. | 77 * @param key The name of the property that was changed. |
| 73 * @param value The new value of the property. | 78 * @param value The new value of the property. |
| 74 */ | 79 */ |
| 75 playerUpdated: function(players, player, key, value) { | 80 playerUpdated: function(players, player, key, value) { |
| 76 if (player === this.selectedPlayer) { | 81 if (player === this.selectedPlayer) { |
| 77 this.drawProperties_(player.properties); | 82 this.drawProperties_(player.properties); |
| 78 this.drawLog_(); | 83 this.drawLog_(); |
| 84 this.drawGraphs_(); | |
| 79 } | 85 } |
| 80 if (key === 'name' || key === 'url') { | 86 if (key === 'name' || key === 'url') { |
| 81 this.redrawPlayerList_(players); | 87 this.redrawPlayerList_(players); |
| 82 } | 88 } |
| 83 }, | 89 }, |
| 84 | 90 |
| 85 redrawAudioStreamList_: function(streams) { | 91 redrawAudioStreamList_: function(streams) { |
| 86 removeChildren(this.audioStreamListElement); | 92 removeChildren(this.audioStreamListElement); |
| 87 | 93 |
| 88 for (id in streams) { | 94 for (id in streams) { |
| 89 var li = document.createElement('li'); | 95 var li = document.createElement('li'); |
| 90 li.appendChild(createButton( | 96 li.appendChild(createButton( |
| 91 id, this.selectAudioStream_.bind(this, streams[id]))); | 97 id, this.selectAudioStream_.bind(this, streams[id]))); |
| 92 this.audioStreamListElement.appendChild(li); | 98 this.audioStreamListElement.appendChild(li); |
| 93 } | 99 } |
| 94 }, | 100 }, |
| 95 | 101 |
| 96 selectAudioStream_: function(audioStream) { | 102 selectAudioStream_: function(audioStream) { |
| 97 this.selectedStream = audioStream; | 103 this.selectedStream = audioStream; |
| 98 this.selectedPlayer = null; | 104 this.selectedPlayer = null; |
| 99 this.drawProperties_(audioStream); | 105 this.drawProperties_(audioStream); |
| 100 removeChildren(this.logTable.querySelector('tbody')); | 106 removeChildren(this.logTable.querySelector('tbody')); |
| 107 removeChildren(this.graphElement); | |
| 101 }, | 108 }, |
| 102 | 109 |
| 103 redrawPlayerList_: function(players) { | 110 redrawPlayerList_: function(players) { |
| 104 removeChildren(this.playerListElement); | 111 removeChildren(this.playerListElement); |
| 105 | 112 |
| 106 for (id in players) { | 113 for (id in players) { |
| 107 var li = document.createElement('li'); | 114 var li = document.createElement('li'); |
| 108 var player = players[id]; | 115 var player = players[id]; |
| 109 var usableName = player.properties.name || | 116 var usableName = player.properties.name || |
| 110 player.properties.url || | 117 player.properties.url || |
| 111 'player ' + player.id; | 118 'player ' + player.id; |
| 112 | 119 |
| 113 li.appendChild(createButton( | 120 li.appendChild(createButton( |
| 114 usableName, this.selectPlayer_.bind(this, player))); | 121 usableName, this.selectPlayer_.bind(this, player))); |
| 115 this.playerListElement.appendChild(li); | 122 this.playerListElement.appendChild(li); |
| 116 } | 123 } |
| 117 }, | 124 }, |
| 118 | 125 |
| 119 selectPlayer_: function(player) { | 126 selectPlayer_: function(player) { |
| 120 this.selectedPlayer = player; | 127 this.selectedPlayer = player; |
| 121 this.selectedPlayerLogIndex = 0; | 128 this.selectedPlayerLogIndex = 0; |
| 122 this.selectedStream = null; | 129 this.selectedStream = null; |
| 123 this.drawProperties_(player.properties); | 130 this.drawProperties_(player.properties); |
| 124 | 131 |
| 125 removeChildren(this.logTable.querySelector('tbody')); | 132 removeChildren(this.logTable.querySelector('tbody')); |
| 133 removeChildren(this.graphElement); | |
| 126 this.drawLog_(); | 134 this.drawLog_(); |
| 135 this.drawGraphs_(); | |
| 127 }, | 136 }, |
| 128 | 137 |
| 129 drawProperties_: function(propertyMap) { | 138 drawProperties_: function(propertyMap) { |
| 130 removeChildren(this.propertiesTable); | 139 removeChildren(this.propertiesTable); |
| 131 | 140 |
| 132 for (key in propertyMap) { | 141 for (key in propertyMap) { |
| 133 var value = propertyMap[key]; | 142 var value = propertyMap[key]; |
| 143 | |
| 134 var row = this.propertiesTable.insertRow(-1); | 144 var row = this.propertiesTable.insertRow(-1); |
| 135 var keyCell = row.insertCell(-1); | 145 var keyCell = row.insertCell(-1); |
| 136 var valueCell = row.insertCell(-1); | 146 var valueCell = row.insertCell(-1); |
| 137 | 147 |
| 138 keyCell.appendChild(document.createTextNode(key)); | 148 keyCell.appendChild(document.createTextNode(key)); |
| 139 valueCell.appendChild(document.createTextNode(value)); | 149 valueCell.appendChild(document.createTextNode(value)); |
| 140 } | 150 } |
| 141 }, | 151 }, |
| 142 | 152 |
| 143 appendEventToLog_: function(event) { | 153 appendEventToLog_: function(event) { |
| 144 var row = this.logTable.querySelector('tbody').insertRow(-1); | 154 var row = this.logTable.querySelector('tbody').insertRow(-1); |
| 145 | 155 |
| 146 row.insertCell(-1).appendChild(document.createTextNode( | 156 row.insertCell(-1).appendChild(document.createTextNode( |
| 147 util.millisecondsToString(event.time))); | 157 util.millisecondsToString(event.time))); |
| 148 row.insertCell(-1).appendChild(document.createTextNode(event.key)); | 158 row.insertCell(-1).appendChild(document.createTextNode(event.key)); |
| 149 row.insertCell(-1).appendChild(document.createTextNode(event.value)); | 159 row.insertCell(-1).appendChild(document.createTextNode(event.value)); |
| 150 }, | 160 }, |
| 151 | 161 |
| 152 drawLog_: function() { | 162 drawLog_: function() { |
| 153 var toDraw = this.selectedPlayer.allEvents.slice( | 163 var toDraw = this.selectedPlayer.allEvents.slice( |
| 154 this.selectedPlayerLogIndex); | 164 this.selectedPlayerLogIndex); |
| 155 toDraw.forEach(this.appendEventToLog_.bind(this)); | 165 toDraw.forEach(this.appendEventToLog_.bind(this)); |
| 156 this.selectedPlayerLogIndex = this.selectedPlayer.allEvents.length; | 166 this.selectedPlayerLogIndex = this.selectedPlayer.allEvents.length; |
| 167 }, | |
| 168 | |
| 169 drawGraphs_: function() { | |
| 170 removeChildren(this.graphElement); | |
|
scherkus (not reviewing)
2013/09/06 18:16:47
won't this cause line 209 to always evaluate to tr
Ty Overby
2013/09/06 19:56:37
Done.
| |
| 171 | |
| 172 var addToGraphs = (function(name, graph) { | |
|
scherkus (not reviewing)
2013/09/06 18:16:47
considering you're already passing in this. member
Ty Overby
2013/09/06 19:56:37
Done.
| |
| 173 var li = document.createElement('li'); | |
| 174 li.appendChild(graph); | |
| 175 li.appendChild(document.createTextNode(name)); | |
| 176 this.graphElement.appendChild(li); | |
| 177 }).bind(this); | |
| 178 | |
| 179 var url = this.selectedPlayer.properties.url; | |
| 180 if (!url) { | |
| 181 return; | |
| 182 } | |
| 183 | |
| 184 var cache = media.cacheForUrl(url); | |
| 185 | |
| 186 var player = this.selectedPlayer; | |
| 187 var props = player.properties; | |
| 188 | |
| 189 var cacheExists = false, | |
| 190 bufferExists = false; | |
|
scherkus (not reviewing)
2013/09/06 18:16:47
might as well use separate var statement here
Ty Overby
2013/09/06 19:56:37
Done.
| |
| 191 | |
| 192 if (props['buffer_start'] !== undefined && | |
| 193 props['buffer_current'] !== undefined && | |
| 194 props['buffer_end'] !== undefined && | |
| 195 props['total_bytes'] !== undefined) { | |
| 196 this.drawBufferGraph_(props['buffer_start'], | |
| 197 props['buffer_current'], | |
| 198 props['buffer_end'], | |
| 199 props['total_bytes']); | |
| 200 bufferExists = true; | |
| 201 } | |
| 202 | |
| 203 if (cache) { | |
| 204 cache.size = cache.size || +player.properties['total_bytes']; | |
|
scherkus (not reviewing)
2013/09/06 18:16:47
can you rewrite this to avoid type trickery
Ty Overby
2013/09/06 19:56:37
Done.
| |
| 205 cache.generateDetails(); | |
| 206 cacheExists = true; | |
| 207 } | |
| 208 | |
| 209 if (!this.graphElement.hasChildNodes()) { | |
| 210 if (bufferExists) { | |
| 211 addToGraphs('buffer', this.bufferCanvas); | |
| 212 } | |
| 213 if (cacheExists) { | |
| 214 addToGraphs('cache read', cache.readCanvas); | |
| 215 addToGraphs('cache write', cache.writeCanvas); | |
| 216 } | |
| 217 } | |
| 218 }, | |
| 219 | |
| 220 drawBufferGraph_: function(start, current, end, size) { | |
| 221 var ctx = this.bufferCanvas.getContext('2d'); | |
| 222 var width = this.bufferCanvas.width; | |
| 223 var height = this.bufferCanvas.height; | |
| 224 ctx.fillStyle = '#aaa'; | |
| 225 ctx.fillRect(0, 0, width, height); | |
| 226 | |
| 227 var scale_factor = width / size; | |
| 228 var left = start * scale_factor; | |
| 229 var middle = current * scale_factor; | |
| 230 var right = end * scale_factor; | |
| 231 | |
| 232 ctx.fillStyle = '#a0a'; | |
| 233 ctx.fillRect(left, 0, middle - left, height); | |
| 234 ctx.fillStyle = '#aa0'; | |
| 235 ctx.fillRect(middle, 0, right - middle, height); | |
| 157 } | 236 } |
| 158 }; | 237 }; |
| 159 | 238 |
| 160 return ClientRenderer; | 239 return ClientRenderer; |
| 161 })(); | 240 })(); |
| OLD | NEW |