| 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.audioPropertiesTable = | 8 this.audioPropertiesTable = |
| 9 document.getElementById('audio-property-table').querySelector('tbody'); | 9 document.getElementById('audio-property-table').querySelector('tbody'); |
| 10 this.playerPropertiesTable = | 10 this.playerPropertiesTable = |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 }; | 44 }; |
| 45 | 45 |
| 46 /** | 46 /** |
| 47 * CSS classes added / removed in JS to trigger styling changes. | 47 * CSS classes added / removed in JS to trigger styling changes. |
| 48 * @private @enum {string} | 48 * @private @enum {string} |
| 49 */ | 49 */ |
| 50 ClientRenderer.Css_ = { | 50 ClientRenderer.Css_ = { |
| 51 NO_PLAYERS_SELECTED: 'no-players-selected', | 51 NO_PLAYERS_SELECTED: 'no-players-selected', |
| 52 NO_COMPONENTS_SELECTED: 'no-components-selected', | 52 NO_COMPONENTS_SELECTED: 'no-components-selected', |
| 53 SELECTABLE_BUTTON: 'selectable-button', | 53 SELECTABLE_BUTTON: 'selectable-button', |
| 54 DESTRUCTED_PLAYER: 'destructed-player' | 54 DESTRUCTED_PLAYER: 'destructed-player', |
| 55 }; | 55 }; |
| 56 | 56 |
| 57 function removeChildren(element) { | 57 function removeChildren(element) { |
| 58 while (element.hasChildNodes()) { | 58 while (element.hasChildNodes()) { |
| 59 element.removeChild(element.lastChild); | 59 element.removeChild(element.lastChild); |
| 60 } | 60 } |
| 61 }; | 61 }; |
| 62 | 62 |
| 63 function createSelectableButton(id, groupName, text, select_cb, | 63 function createSelectableButton(id, groupName, buttonLabel, select_cb, |
| 64 isDestructed) { | 64 isDestructed) { |
| 65 // For CSS styling. | 65 // For CSS styling. |
| 66 var radioButton = document.createElement('input'); | 66 var radioButton = document.createElement('input'); |
| 67 radioButton.classList.add(ClientRenderer.Css_.SELECTABLE_BUTTON); | 67 radioButton.classList.add(ClientRenderer.Css_.SELECTABLE_BUTTON); |
| 68 radioButton.type = 'radio'; | 68 radioButton.type = 'radio'; |
| 69 radioButton.id = id; | 69 radioButton.id = id; |
| 70 radioButton.name = groupName; | 70 radioButton.name = groupName; |
| 71 | 71 |
| 72 var buttonLabel = document.createElement('label'); | |
| 73 buttonLabel.classList.add(ClientRenderer.Css_.SELECTABLE_BUTTON); | 72 buttonLabel.classList.add(ClientRenderer.Css_.SELECTABLE_BUTTON); |
| 74 if (isDestructed) | 73 if (isDestructed) |
| 75 buttonLabel.classList.add(ClientRenderer.Css_.DESTRUCTED_PLAYER); | 74 buttonLabel.classList.add(ClientRenderer.Css_.DESTRUCTED_PLAYER); |
| 76 buttonLabel.setAttribute('for', radioButton.id); | 75 buttonLabel.setAttribute('for', radioButton.id); |
| 77 buttonLabel.appendChild(document.createTextNode(text)); | |
| 78 | 76 |
| 79 var fragment = document.createDocumentFragment(); | 77 var fragment = document.createDocumentFragment(); |
| 80 fragment.appendChild(radioButton); | 78 fragment.appendChild(radioButton); |
| 81 fragment.appendChild(buttonLabel); | 79 fragment.appendChild(buttonLabel); |
| 82 | 80 |
| 83 // Listen to 'change' rather than 'click' to keep styling in sync with | 81 // Listen to 'change' rather than 'click' to keep styling in sync with |
| 84 // button behavior. | 82 // button behavior. |
| 85 radioButton.addEventListener('change', function() { | 83 radioButton.addEventListener('change', function() { |
| 86 select_cb(); | 84 select_cb(); |
| 87 }); | 85 }); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 * @param players The entire map of id -> player. | 168 * @param players The entire map of id -> player. |
| 171 * @param player The player that had its property changed. | 169 * @param player The player that had its property changed. |
| 172 * @param key The name of the property that was changed. | 170 * @param key The name of the property that was changed. |
| 173 * @param value The new value of the property. | 171 * @param value The new value of the property. |
| 174 */ | 172 */ |
| 175 playerUpdated: function(players, player, key, value) { | 173 playerUpdated: function(players, player, key, value) { |
| 176 if (player === this.selectedPlayer) { | 174 if (player === this.selectedPlayer) { |
| 177 this.drawProperties_(player.properties, this.playerPropertiesTable); | 175 this.drawProperties_(player.properties, this.playerPropertiesTable); |
| 178 this.drawLog_(); | 176 this.drawLog_(); |
| 179 } | 177 } |
| 180 if (key === 'name' || key === 'url') { | 178 if (key === 'event' && value === 'WEBMEDIAPLAYER_DESTROYED') |
| 179 player.destructed = true; |
| 180 if (['url', 'frame_url', 'frame_title', 'audio_codec_name', |
| 181 'video_codec_name', 'width', 'height', 'event'].includes(key)) { |
| 181 this.redrawPlayerList_(players); | 182 this.redrawPlayerList_(players); |
| 182 } | 183 } |
| 183 if (key === 'event' && value === 'WEBMEDIAPLAYER_DESTROYED') { | |
| 184 player.destructed = true; | |
| 185 document.querySelector( | |
| 186 "label.selectable-button[for='" + player.id + "']").classList.add( | |
| 187 ClientRenderer.Css_.DESTRUCTED_PLAYER); | |
| 188 } | |
| 189 }, | 184 }, |
| 190 | 185 |
| 191 createVideoCaptureFormatTable: function(formats) { | 186 createVideoCaptureFormatTable: function(formats) { |
| 192 if (!formats || formats.length == 0) | 187 if (!formats || formats.length == 0) |
| 193 return document.createTextNode('No formats'); | 188 return document.createTextNode('No formats'); |
| 194 | 189 |
| 195 var table = document.createElement('table'); | 190 var table = document.createElement('table'); |
| 196 var thead = document.createElement('thead'); | 191 var thead = document.createElement('thead'); |
| 197 var theadRow = document.createElement('tr'); | 192 var theadRow = document.createElement('tr'); |
| 198 for (var key in formats[0]) { | 193 for (var key in formats[0]) { |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 componentType); | 295 componentType); |
| 301 return; | 296 return; |
| 302 } | 297 } |
| 303 | 298 |
| 304 var fragment = document.createDocumentFragment(); | 299 var fragment = document.createDocumentFragment(); |
| 305 for (var id in components) { | 300 for (var id in components) { |
| 306 var li = document.createElement('li'); | 301 var li = document.createElement('li'); |
| 307 var button_cb = this.selectAudioComponent_.bind( | 302 var button_cb = this.selectAudioComponent_.bind( |
| 308 this, componentType, id, components[id]); | 303 this, componentType, id, components[id]); |
| 309 var friendlyName = this.getAudioComponentName_(componentType, id); | 304 var friendlyName = this.getAudioComponentName_(componentType, id); |
| 305 var label = document.createElement('label'); |
| 306 label.appendChild(document.createTextNode(friendlyName)); |
| 310 li.appendChild(createSelectableButton( | 307 li.appendChild(createSelectableButton( |
| 311 id, buttonGroupName, friendlyName, button_cb)); | 308 id, buttonGroupName, label, button_cb)); |
| 312 fragment.appendChild(li); | 309 fragment.appendChild(li); |
| 313 } | 310 } |
| 314 removeChildren(listElement); | 311 removeChildren(listElement); |
| 315 listElement.appendChild(fragment); | 312 listElement.appendChild(fragment); |
| 316 | 313 |
| 317 if (this.selectedAudioComponentType && | 314 if (this.selectedAudioComponentType && |
| 318 this.selectedAudioComponentType == componentType && | 315 this.selectedAudioComponentType == componentType && |
| 319 this.selectedAudioComponentId in components) { | 316 this.selectedAudioComponentId in components) { |
| 320 // Re-select the selected component since the button was just recreated. | 317 // Re-select the selected component since the button was just recreated. |
| 321 selectSelectableButton(this.selectedAudioComponentId); | 318 selectSelectableButton(this.selectedAudioComponentId); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 341 | 338 |
| 342 // Group name imposes rule that only one component can be selected | 339 // Group name imposes rule that only one component can be selected |
| 343 // (and have its properties displayed) at a time. | 340 // (and have its properties displayed) at a time. |
| 344 var buttonGroupName = 'player-buttons'; | 341 var buttonGroupName = 'player-buttons'; |
| 345 | 342 |
| 346 var hasPlayers = false; | 343 var hasPlayers = false; |
| 347 var fragment = document.createDocumentFragment(); | 344 var fragment = document.createDocumentFragment(); |
| 348 for (var id in players) { | 345 for (var id in players) { |
| 349 hasPlayers = true; | 346 hasPlayers = true; |
| 350 var player = players[id]; | 347 var player = players[id]; |
| 351 var usableName = player.properties.name || | 348 var p = player.properties; |
| 352 player.properties.url || | 349 var label = document.createElement('label'); |
| 353 'Player ' + player.id; | 350 |
| 351 var name_text = p.url || 'Player ' + player.id; |
| 352 var name_node = document.createElement('span'); |
| 353 name_node.appendChild(document.createTextNode(name_text)); |
| 354 name_node.className = 'player-name'; |
| 355 label.appendChild(name_node); |
| 356 |
| 357 var frame = []; |
| 358 if (p.frame_title) |
| 359 frame.push(p.frame_title); |
| 360 if (p.frame_url) |
| 361 frame.push(p.frame_url); |
| 362 var frame_text = frame.join(' - '); |
| 363 if (frame_text) { |
| 364 label.appendChild(document.createElement('br')); |
| 365 var frame_node = document.createElement('span'); |
| 366 frame_node.className = 'player-frame'; |
| 367 frame_node.appendChild(document.createTextNode(frame_text)); |
| 368 label.appendChild(frame_node); |
| 369 } |
| 370 |
| 371 var desc = [] |
| 372 if (p.width && p.height) |
| 373 desc.push(p.width + 'x' + p.height); |
| 374 if (p.video_codec_name) |
| 375 desc.push(p.video_codec_name); |
| 376 if (p.video_codec_name && p.audio_codec_name) |
| 377 desc.push('+'); |
| 378 if (p.audio_codec_name) |
| 379 desc.push(p.audio_codec_name); |
| 380 if (p.event) |
| 381 desc.push('(' + p.event + ')'); |
| 382 var desc_text = desc.join(' '); |
| 383 if (desc_text) { |
| 384 label.appendChild(document.createElement('br')); |
| 385 var desc_node = document.createElement('span'); |
| 386 desc_node.className = 'player-desc'; |
| 387 desc_node.appendChild(document.createTextNode(desc_text)); |
| 388 label.appendChild(desc_node); |
| 389 } |
| 354 | 390 |
| 355 var li = document.createElement('li'); | 391 var li = document.createElement('li'); |
| 356 var button_cb = this.selectPlayer_.bind(this, player); | 392 var button_cb = this.selectPlayer_.bind(this, player); |
| 357 li.appendChild(createSelectableButton( | 393 li.appendChild(createSelectableButton( |
| 358 id, buttonGroupName, usableName, button_cb, player.destructed)); | 394 id, buttonGroupName, label, button_cb, player.destructed)); |
| 359 fragment.appendChild(li); | 395 fragment.appendChild(li); |
| 360 } | 396 } |
| 361 removeChildren(this.playerListElement); | 397 removeChildren(this.playerListElement); |
| 362 this.playerListElement.appendChild(fragment); | 398 this.playerListElement.appendChild(fragment); |
| 363 | 399 |
| 364 if (this.selectedPlayer && this.selectedPlayer.id in players) { | 400 if (this.selectedPlayer && this.selectedPlayer.id in players) { |
| 365 // Re-select the selected player since the button was just recreated. | 401 // Re-select the selected player since the button was just recreated. |
| 366 selectSelectableButton(this.selectedPlayer.id); | 402 selectSelectableButton(this.selectedPlayer.id); |
| 367 } | 403 } |
| 368 | 404 |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 | 515 |
| 480 if (this.selectedPlayer) { | 516 if (this.selectedPlayer) { |
| 481 removeChildren(this.logTable); | 517 removeChildren(this.logTable); |
| 482 this.selectedPlayerLogIndex = 0; | 518 this.selectedPlayerLogIndex = 0; |
| 483 } | 519 } |
| 484 }, | 520 }, |
| 485 }; | 521 }; |
| 486 | 522 |
| 487 return ClientRenderer; | 523 return ClientRenderer; |
| 488 })(); | 524 })(); |
| OLD | NEW |