blob: 83ac7aa9a76545b5e490c80d9241882ce8f9f757 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @typedef {{playerTitle: string, playerID: string, exists: boolean, playing: boolean, titleEdited: boolean}}
*/
Media.PlayerStatus;
/**
* @typedef {{playerStatus: !Media.PlayerStatus, playerTitleElement: ?HTMLElement}}
*/
Media.PlayerStatusMapElement;
Media.PlayerEntryTreeElement = class extends UI.TreeElement {
/**
* @param {!Media.PlayerStatus} playerStatus
* @param {!Media.MainView} displayContainer
*/
constructor(playerStatus, displayContainer) {
super(playerStatus.playerTitle, false);
this.titleFromUrl = true;
this._playerStatus = playerStatus;
this._displayContainer = displayContainer;
this.setLeadingIcons([UI.Icon.create('smallicon-videoplayer-playing', 'media-player')]);
}
/**
* @override
* @return {boolean}
*/
onselect(selectedByUser) {
this._displayContainer.renderMainPanel(this._playerStatus.playerID);
return true;
}
};
Media.PlayerListView = class extends UI.VBox {
/**
* @param {!Media.MainView} mainContainer
*/
constructor(mainContainer) {
super(true);
this._playerStatuses = new Map();
// Container where new panels can be added based on clicks.
this._mainContainer = mainContainer;
// The parent tree for storing sections
this._sidebarTree = new UI.TreeOutlineInShadow();
this.contentElement.appendChild(this._sidebarTree.element);
this._sidebarTree.registerRequiredCSS('media/playerListView.css');
// Audio capture / output devices.
this._audioDevices = this._addListSection(Common.UIString('Audio I/O'));
// Video capture devices.
this._videoDevices = this._addListSection(Common.UIString('Video Capture Devices'));
// Players active in this tab.
this._playerList = this._addListSection(Common.UIString('Players'));
}
/**
* @param {string} title
* @return {!UI.TreeElement}
*/
_addListSection(title) {
const treeElement = new UI.TreeElement(title, true);
treeElement.listItemElement.classList.add('storage-group-list-item');
treeElement.setCollapsible(false);
treeElement.selectable = false;
this._sidebarTree.appendChild(treeElement);
return treeElement;
}
/**
* @param {string} playerID
*/
addMediaElementItem(playerID) {
const playerStatus = {playerTitle: playerID, playerID: playerID, exists: true, playing: false, titleEdited: false};
const playerElement = new Media.PlayerEntryTreeElement(playerStatus, this._mainContainer);
this._playerStatuses.set(playerID, playerElement);
this._playerList.appendChild(playerElement);
}
/**
* @param {string} playerID
* @param {string} newTitle
* @param {boolean} isTitleExtractedFromUrl
*/
setMediaElementPlayerTitle(playerID, newTitle, isTitleExtractedFromUrl) {
if (this._playerStatuses.has(playerID)) {
const sidebarEntry = this._playerStatuses.get(playerID);
if (!isTitleExtractedFromUrl || sidebarEntry.titleFromUrl) {
sidebarEntry.title = newTitle;
sidebarEntry.titleFromUrl = isTitleExtractedFromUrl;
}
}
}
/**
* @param {string} playerID
* @param {string} iconName
*/
setMediaElementPlayerIcon(playerID, iconName) {
if (this._playerStatuses.has(playerID)) {
const sidebarEntry = this._playerStatuses.get(playerID);
sidebarEntry.setLeadingIcons([UI.Icon.create('smallicon-videoplayer-' + iconName, 'media-player')]);
}
}
/**
* @param {string} playerID
* @param {!Array.<!Media.Event>} changes
* @param {string} changeType
*/
renderChanges(playerID, changes, changeType) {
// We only want to try setting the title from the 'frame_title' and 'frame_url' properties.
if (changeType === Media.MediaModel.MediaChangeTypeKeys.Property) {
for (const change of changes) {
// Sometimes frame_title can be an empty string.
if (change.name === 'frame_title' && change.value) {
this.setMediaElementPlayerTitle(playerID, change.value, false);
}
if (change.name === 'frame_url') {
const url_path_component = change.value.substring(change.value.lastIndexOf('/') + 1);
this.setMediaElementPlayerTitle(playerID, url_path_component, true);
}
}
}
if (changeType === Media.MediaModel.MediaChangeTypeKeys.Event) {
let change_to = null;
for (const change of changes) {
if (change.name === 'Event') {
if (change.value === 'PLAY') {
change_to = 'playing';
} else if (change.value === 'PAUSE') {
change_to = 'paused';
} else if (change.value === 'WEBMEDIAPLAYER_DESTROYED') {
change_to = 'destroyed';
}
}
}
if (change_to) {
this.setMediaElementPlayerIcon(playerID, change_to);
}
}
}
};