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; |
| 16 }; | 17 }; |
| 17 | 18 |
| 18 function removeChildren(element) { | 19 function removeChildren(element) { |
| 19 while (element.hasChildNodes()) { | 20 while (element.hasChildNodes()) { |
| 20 element.removeChild(element.lastChild); | 21 element.removeChild(element.lastChild); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 69 * Called when a property on a player is changed. | 70 * Called when a property on a player is changed. |
| 70 * @param players The entire map of id -> player. | 71 * @param players The entire map of id -> player. |
| 71 * @param player The player that had its property changed. | 72 * @param player The player that had its property changed. |
| 72 * @param key The name of the property that was changed. | 73 * @param key The name of the property that was changed. |
| 73 * @param value The new value of the property. | 74 * @param value The new value of the property. |
| 74 */ | 75 */ |
| 75 playerUpdated: function(players, player, key, value) { | 76 playerUpdated: function(players, player, key, value) { |
| 76 if (player === this.selectedPlayer) { | 77 if (player === this.selectedPlayer) { |
| 77 this.drawProperties_(player.properties); | 78 this.drawProperties_(player.properties); |
| 78 this.drawLog_(); | 79 this.drawLog_(); |
| 80 this.drawGraphs_(); | |
|
scherkus (not reviewing)
2013/09/04 23:20:53
I noticed you don't call anything on ClientRendere
Ty Overby
2013/09/05 21:01:02
Yeah, buffer_start, buffer_end, buffer_current get
| |
| 79 } | 81 } |
| 80 if (key === 'name' || key === 'url') { | 82 if (key === 'name' || key === 'url') { |
| 81 this.redrawPlayerList_(players); | 83 this.redrawPlayerList_(players); |
| 82 } | 84 } |
| 83 }, | 85 }, |
| 84 | 86 |
| 85 redrawAudioStreamList_: function(streams) { | 87 redrawAudioStreamList_: function(streams) { |
| 86 removeChildren(this.audioStreamListElement); | 88 removeChildren(this.audioStreamListElement); |
| 87 | 89 |
| 88 for (id in streams) { | 90 for (id in streams) { |
| 89 var li = document.createElement('li'); | 91 var li = document.createElement('li'); |
| 90 li.appendChild(createButton( | 92 li.appendChild(createButton( |
| 91 id, this.selectAudioStream_.bind(this, streams[id]))); | 93 id, this.selectAudioStream_.bind(this, streams[id]))); |
| 92 this.audioStreamListElement.appendChild(li); | 94 this.audioStreamListElement.appendChild(li); |
| 93 } | 95 } |
| 94 }, | 96 }, |
| 95 | 97 |
| 96 selectAudioStream_: function(audioStream) { | 98 selectAudioStream_: function(audioStream) { |
| 97 this.selectedStream = audioStream; | 99 this.selectedStream = audioStream; |
| 98 this.selectedPlayer = null; | 100 this.selectedPlayer = null; |
| 99 this.drawProperties_(audioStream); | 101 this.drawProperties_(audioStream); |
| 100 removeChildren(this.logTable.querySelector('tbody')); | 102 removeChildren(this.logTable.querySelector('tbody')); |
| 103 removeChildren(this.graphElement); | |
| 101 }, | 104 }, |
| 102 | 105 |
| 103 redrawPlayerList_: function(players) { | 106 redrawPlayerList_: function(players) { |
| 104 removeChildren(this.playerListElement); | 107 removeChildren(this.playerListElement); |
| 105 | 108 |
| 106 for (id in players) { | 109 for (id in players) { |
| 107 var li = document.createElement('li'); | 110 var li = document.createElement('li'); |
| 108 var player = players[id]; | 111 var player = players[id]; |
| 109 var usableName = player.properties.name || | 112 var usableName = player.properties.name || |
| 110 player.properties.url || | 113 player.properties.url || |
| 111 'player ' + player.id; | 114 'player ' + player.id; |
| 112 | 115 |
| 113 li.appendChild(createButton( | 116 li.appendChild(createButton( |
| 114 usableName, this.selectPlayer_.bind(this, player))); | 117 usableName, this.selectPlayer_.bind(this, player))); |
| 115 this.playerListElement.appendChild(li); | 118 this.playerListElement.appendChild(li); |
| 116 } | 119 } |
| 117 }, | 120 }, |
| 118 | 121 |
| 119 selectPlayer_: function(player) { | 122 selectPlayer_: function(player) { |
| 120 this.selectedPlayer = player; | 123 this.selectedPlayer = player; |
| 121 this.selectedPlayerLogIndex = 0; | 124 this.selectedPlayerLogIndex = 0; |
| 122 this.selectedStream = null; | 125 this.selectedStream = null; |
| 123 this.drawProperties_(player.properties); | 126 this.drawProperties_(player.properties); |
| 124 | 127 |
| 125 removeChildren(this.logTable.querySelector('tbody')); | 128 removeChildren(this.logTable.querySelector('tbody')); |
| 129 removeChildren(this.graphElement); | |
| 126 this.drawLog_(); | 130 this.drawLog_(); |
| 131 this.drawGraphs_(); | |
| 127 }, | 132 }, |
| 128 | 133 |
| 129 drawProperties_: function(propertyMap) { | 134 drawProperties_: function(propertyMap) { |
| 130 removeChildren(this.propertiesTable); | 135 removeChildren(this.propertiesTable); |
| 131 | 136 |
| 132 for (key in propertyMap) { | 137 for (key in propertyMap) { |
| 133 var value = propertyMap[key]; | 138 var value = propertyMap[key]; |
| 139 | |
| 134 var row = this.propertiesTable.insertRow(-1); | 140 var row = this.propertiesTable.insertRow(-1); |
| 135 var keyCell = row.insertCell(-1); | 141 var keyCell = row.insertCell(-1); |
| 136 var valueCell = row.insertCell(-1); | 142 var valueCell = row.insertCell(-1); |
| 137 | 143 |
| 138 keyCell.appendChild(document.createTextNode(key)); | 144 keyCell.appendChild(document.createTextNode(key)); |
| 139 valueCell.appendChild(document.createTextNode(value)); | 145 valueCell.appendChild(document.createTextNode(value)); |
| 140 } | 146 } |
| 141 }, | 147 }, |
| 142 | 148 |
| 143 appendEventToLog_: function(event) { | 149 appendEventToLog_: function(event) { |
| 144 var row = this.logTable.querySelector('tbody').insertRow(-1); | 150 var row = this.logTable.querySelector('tbody').insertRow(-1); |
| 145 | 151 |
| 146 row.insertCell(-1).appendChild(document.createTextNode( | 152 row.insertCell(-1).appendChild(document.createTextNode( |
| 147 util.millisecondsToString(event.time))); | 153 util.millisecondsToString(event.time))); |
| 148 row.insertCell(-1).appendChild(document.createTextNode(event.key)); | 154 row.insertCell(-1).appendChild(document.createTextNode(event.key)); |
| 149 row.insertCell(-1).appendChild(document.createTextNode(event.value)); | 155 row.insertCell(-1).appendChild(document.createTextNode(event.value)); |
| 150 }, | 156 }, |
| 151 | 157 |
| 152 drawLog_: function() { | 158 drawLog_: function() { |
| 153 var toDraw = this.selectedPlayer.allEvents.slice( | 159 var toDraw = this.selectedPlayer.allEvents.slice( |
| 154 this.selectedPlayerLogIndex); | 160 this.selectedPlayerLogIndex); |
| 155 toDraw.forEach(this.appendEventToLog_.bind(this)); | 161 toDraw.forEach(this.appendEventToLog_.bind(this)); |
| 156 this.selectedPlayerLogIndex = this.selectedPlayer.allEvents.length; | 162 this.selectedPlayerLogIndex = this.selectedPlayer.allEvents.length; |
| 157 } | 163 }, |
|
scherkus (not reviewing)
2013/09/04 23:20:53
nit: add blank line after this
Ty Overby
2013/09/05 21:01:02
Done.
| |
| 164 drawGraphs_: function() { | |
| 165 removeChildren(this.graphElement); | |
|
scherkus (not reviewing)
2013/09/04 23:20:53
think we can get away with recreating the graphs D
Ty Overby
2013/09/05 21:01:02
I did it a tad differently, but to the same effect
| |
| 166 | |
| 167 var addToGraphs = (function(name, graph) { | |
| 168 var li = document.createElement('li'); | |
| 169 li.appendChild(graph); | |
| 170 li.appendChild(document.createTextNode(name)); | |
| 171 this.graphElement.appendChild(li); | |
| 172 }).bind(this); | |
| 173 | |
| 174 if (this.selectedPlayer && this.selectedPlayer.properties.url) { | |
|
scherkus (not reviewing)
2013/09/04 23:20:53
it looks like this.selectedPlayer should always be
Ty Overby
2013/09/05 21:01:02
Yep, check can be removed.
Done.
| |
| 175 var url = this.selectedPlayer.properties.url; | |
| 176 var cache = media.cacheForUrl(url); | |
| 177 | |
| 178 var player = this.selectedPlayer; | |
| 179 var props = player.properties; | |
| 180 | |
| 181 if (props['buffer_start'] !== undefined && | |
| 182 props['buffer_current'] !== undefined && | |
| 183 props['buffer_end'] !== undefined && | |
| 184 props['total_bytes'] !== undefined) { | |
| 185 addToGraphs('buffer', | |
| 186 this.drawBufferGraph_(props['buffer_start'], | |
| 187 props['buffer_current'], | |
| 188 props['buffer_end'], | |
| 189 props['total_bytes'])); | |
| 190 } | |
| 191 | |
| 192 if (cache) { | |
| 193 addToGraphs('cache read', cache.readCanvas); | |
| 194 addToGraphs('cache write', cache.writeCanvas); | |
| 195 | |
| 196 cache.size = cache.size || +player.properties['total_bytes']; | |
| 197 cache.generateDetails(); | |
| 198 } | |
| 199 } | |
| 200 }, | |
|
scherkus (not reviewing)
2013/09/04 23:20:53
add blank line after
Ty Overby
2013/09/05 21:01:02
Done.
| |
| 201 drawBufferGraph_: (function() { | |
| 202 // Make a single canvas element for every buffer-graph to be drawn on | |
| 203 // and close over it with a module. | |
|
scherkus (not reviewing)
2013/09/04 23:20:53
any reason not to use a member variable canvas ver
Ty Overby
2013/09/05 21:01:02
Yeah, I agree, I thought it was going to be cleane
| |
| 204 var canvas = document.createElement('canvas'); | |
| 205 canvas.width = media.BAR_WIDTH; | |
| 206 canvas.height = media.BAR_HEIGHT; | |
| 207 | |
| 208 var ctx = canvas.getContext('2d'); | |
| 209 return function(start, current, end, size) { | |
| 210 | |
| 211 ctx.fillStyle = '#aaa'; | |
| 212 ctx.fillRect(0, 0, canvas.width, canvas.height); | |
| 213 | |
| 214 var scale_factor = canvas.width / size; | |
| 215 var left = start * scale_factor; | |
| 216 var middle = current * scale_factor; | |
| 217 var right = end * scale_factor; | |
| 218 | |
| 219 ctx.fillStyle = '#a0a'; | |
| 220 ctx.fillRect(left, 0, middle - left, canvas.height); | |
| 221 ctx.fillStyle = '#aa0'; | |
| 222 ctx.fillRect(middle, 0, right - middle, canvas.height); | |
| 223 | |
| 224 return canvas; | |
| 225 } | |
| 226 })() | |
| 158 }; | 227 }; |
| 159 | 228 |
| 160 return ClientRenderer; | 229 return ClientRenderer; |
| 161 })(); | 230 })(); |
| OLD | NEW |