/**
* @file text-track-menu-item.js
* /
importar MenuItem desde '../../menu/menu-item.js';
importar componente desde '../../component.js';
importar ventana desde 'global/window';
importar documento desde 'global/document';
/**
* El tipo de elemento de menú específico para seleccionar un idioma dentro de un tipo de pista de texto
*
* @extiende elemento de menú
* /
clase TextTrackMenuItem extiende MenuItem {
/**
* Crea una instancia de esta clase.
*
* @param {Jugador} jugador
* El `Jugador` al que se debe adjuntar esta clase.
*
* @param {Objeto} [opciones]
* El almacén de clave/valor de las opciones del jugador.
* /
constructor(jugador, opciones) {
const pista = opciones.pista;
const pistas = player.textTracks();
// Modificar las opciones para el inicio de la clase principal MenuItem.
opciones.etiqueta = pista.etiqueta || pista.idioma || 'Desconocido';
options.selected = track.mode === 'mostrando';
super(jugador, opciones);
esta.pista = pista;
// Determinar el(los) tipo(s) de pista(s) relevante(s) para este componente y filtrar
// sacar tipos vacíos.
este.tipos = (opciones.tipos || [opciones.tipo || este.pista.tipo]).filter(Boolean);
const changeHandler = (... argumentos) => {
this.handleTracksChange.apply(this, args);
};
const seleccionadoLanguageChangeHandler = (... argumentos) => {
this.handleSelectedLanguageChange.apply(this, args);
};
player.on(['loadstart', 'texttrackchange'], changeHandler);
pistas.addEventListener('cambio', changeHandler);
tracks.addEventListener('cambio de idioma seleccionado', manejador de cambio de idioma seleccionado);
this.on('dispose', function() {
player.off(['loadstart', 'texttrackchange'], changeHandler);
pistas.removeEventListener('cambio', changeHandler);
tracks.removeEventListener('cambio de idioma seleccionado', manejador de cambio de idioma seleccionado);
});
// iOS7 no envía eventos de cambio a TextTrackLists cuando un
// cambia el modo de la pista asociada. sin algo como
// Object.observe() (tampoco presente en iOS7), no es
// posible detectar cambios en el atributo mode y polyfill
// el evento de cambio. Como un mal sustituto, despachamos manualmente
// cambia los eventos cada vez que los controles modifican el modo.
if (tracks.onchange === indefinido) {
dejar evento;
this.on(['tocar', 'hacer clic'], function() {
if (tipo de ventana.Evento !== 'objeto') {
// Android 2.3 arroja un error de constructor ilegal para window.Event
intentar {
evento = nueva ventana.Evento('cambio');
} catch (err) {
// continuar independientemente del error
}
}
si (!evento) {
evento = documento.createEvent('Evento');
event.initEvent('cambiar', verdadero, verdadero);
}
pistas.dispatchEvent(evento);
});
}
// establece el estado predeterminado basado en las pistas actuales
this.handleTracksChange();
}
/**
* Esto se llama cuando se "hace clic" en `TextTrackMenuItem`. Ver
* {@link ClickableComponent} para obtener información más detallada sobre lo que puede ser un clic.
*
* @param {EventTarget~Evento} evento
* El evento `keydown`, `top` o `click` que hizo que esta función se desactivara
* llamado.
*
* @escucha toca
* @escucha clic
* /
handleClick(evento) {
const referenciaPista = esta.pista;
const pistas = this.player_.textTracks();
super.handleClick(evento);
si (!pistas) {
devolver;
}
para (sea i = 0; i < pistas.longitud; i++) {
const pista = pistas[i];
// Si la pista de la lista de pistas de texto no es del tipo correcto,
// Saltarlo. No queremos afectar pistas de tipo(s) incompatible(s).
if (this.kinds.indexOf(track.kind) === -1) {
continuar;
}
// Si esta pista de texto es la pista del componente y no se muestra,
// configurarlo para que se muestre.
if (pista === pista de referencia) {
if (track.mode !== 'mostrando') {
track.mode = 'mostrando';
}
// Si esta pista de texto no es la pista del componente y no lo es
// deshabilitado, configúrelo como deshabilitado.
} else if (track.mode !== 'deshabilitado') {
track.mode = 'deshabilitado';
}
}
}
/**
* Manejar el cambio de la lista de pistas de texto
*
* @param {EventTarget~Evento} evento
* El evento `cambio` que provocó que se llamara a esta función.
*
* @escucha TextTrackList#cambio
* /
handleTracksChange(evento) {
const shouldBeSelected = this.track.mode === 'mostrando';
// Evita llamadas redundantes a selected() porque pueden causar
// lectores de pantalla para leer el texto de control adjunto innecesariamente
if (deberíaSeleccionado !== this.isSelected_) {
this.selected(deberíaSerSeleccionado);
}
}
handleSelectedLanguageChange(evento) {
if (this.track.mode === 'mostrando') {
const idiomaSeleccionado = this.player_.cache_.selectedLanguage;
// No reemplaces el tipo de pista en el mismo idioma
if (Idioma seleccionado && idioma seleccionado.habilitado &&
idioma seleccionado.idioma === este.pista.idioma &&
idioma.seleccionado.tipo !== este.pista.tipo) {
devolver;
}
this.player_.cache_.selectedLanguage = {
habilitado: verdadero,
idioma: este.pista.idioma,
tipo: este.pista.tipo
};
}
}
disponer () {
// eliminar la referencia al objeto de seguimiento al desechar
esta.pista = nulo;
super.dispose();
}
}
Component.registerComponent('TextTrackMenuItem', TextTrackMenuItem);
exportar TextTrackMenuItem predeterminado;