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 |