From b95cc5b96af24097c8e518792477b83a3c798910 Mon Sep 17 00:00:00 2001 From: Yuval Keidar <48407737+Yuvalke@users.noreply.github.com> Date: Wed, 28 Oct 2020 16:13:39 +0200 Subject: [PATCH] fix(FEC-10427): remove cues for native external subtitles (#495) * fix(FEC-10427): remove cues from external track Issue: safari keeps the cues from extarnal text tracks that was active and keeps playing it on the next media. Solution: remove the cues from external text tracks. * set prefix instead cues removal * Update external-captions-handler.js * Update external-captions-handler.js * Update external-captions-handler.js * remove cues as well * Update external-captions-handler.js * Update external-captions-handler.js --- src/player.js | 3 ++- src/track/external-captions-handler.js | 21 ++++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/player.js b/src/player.js index 5b033febb..b6fe665f1 100644 --- a/src/player.js +++ b/src/player.js @@ -574,7 +574,8 @@ export default class Player extends FakeEventTarget { if (this._reset) return; this.pause(); //make sure all services are reset before engine and engine attributes are reset - this._externalCaptionsHandler.reset(); + // $FlowFixMe + this._externalCaptionsHandler.reset(this._tracks.filter(track => track.external)); this._posterManager.reset(); this._stateManager.reset(); this._config.sources = {}; diff --git a/src/track/external-captions-handler.js b/src/track/external-captions-handler.js index f441f8bed..0ed7f6a0a 100644 --- a/src/track/external-captions-handler.js +++ b/src/track/external-captions-handler.js @@ -232,11 +232,13 @@ class ExternalCaptionsHandler extends FakeEventTarget { /** * resets the handler + * @param {Array} externalTracks - external tracks * @returns {void} */ - reset(): void { + reset(externalTracks: Array): void { this._resetCurrentTrack(); this._textTrackModel = {}; + this._resetExternalNativeTextTrack(externalTracks); this._eventManager.removeAll(); } @@ -456,6 +458,23 @@ class ExternalCaptionsHandler extends FakeEventTarget { return false; } + /** + * delete cues on reset to avoid usage of the text track on the next media + * @param {Array} externalTracks - external tracks + * @return {void} + */ + _resetExternalNativeTextTrack(externalTracks: Array): void { + const videoElement = this._player.getVideoElement(); + if (videoElement) { + externalTracks.forEach(externalTrack => { + const track = Array.from(videoElement.textTracks).find(track => track && track.language === externalTrack.language); + if (track && track.cues) { + Object.values(track.cues).forEach(cue => track.removeCue(cue)); + } + }); + } + } + /** * adding cues to an existing text element in a video tag * @param {TextTrack} textTrack - adding cues to an exiting text track element