Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(427)

Side by Side Diff: content/browser/resources/media/client_renderer.js

Issue 2964713004: media: Add more player details in chrome://media-internals player list (Closed)
Patch Set: Bikeshed. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | content/browser/resources/media/media_internals.css » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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 })();
OLDNEW
« no previous file with comments | « no previous file | content/browser/resources/media/media_internals.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698