diff options
Diffstat (limited to 'Source/WebCore/Modules/modern-media-controls/media/tracks-support.js')
-rw-r--r-- | Source/WebCore/Modules/modern-media-controls/media/tracks-support.js | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/Source/WebCore/Modules/modern-media-controls/media/tracks-support.js b/Source/WebCore/Modules/modern-media-controls/media/tracks-support.js new file mode 100644 index 000000000..d0bdf4b99 --- /dev/null +++ b/Source/WebCore/Modules/modern-media-controls/media/tracks-support.js @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2016 Apple Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +class TracksSupport extends MediaControllerSupport +{ + + constructor(mediaController) + { + super(mediaController); + + if (!this.control) + return; + + this.mediaController.controls.tracksPanel.dataSource = this; + this.mediaController.controls.tracksPanel.uiDelegate = this; + } + + // Protected + + get control() + { + return this.mediaController.controls.tracksButton; + } + + get mediaEvents() + { + return ["loadedmetadata"]; + } + + get tracksToMonitor() + { + return [this.mediaController.media.audioTracks, this.mediaController.media.textTracks]; + } + + buttonWasPressed(control) + { + this.mediaController.controls.showTracksPanel(); + } + + tracksPanelNumberOfSections() + { + let numberOfSections = 0; + if (this._canPickAudioTracks()) + numberOfSections++; + if (this._canPickTextTracks()) + numberOfSections++; + return numberOfSections; + } + + tracksPanelTitleForSection(sectionIndex) + { + if (sectionIndex == 0 && this._canPickAudioTracks()) + return UIString("Audio"); + return UIString("Subtitles"); + } + + tracksPanelNumberOfTracksInSection(sectionIndex) + { + if (sectionIndex == 0 && this._canPickAudioTracks()) + return this._audioTracks().length; + return this._textTracks().length; + } + + tracksPanelTitleForTrackInSection(trackIndex, sectionIndex) + { + let track; + if (sectionIndex == 0 && this._canPickAudioTracks()) + track = this._audioTracks()[trackIndex]; + else + track = this._textTracks()[trackIndex]; + + if (this.mediaController.host) + return this.mediaController.host.displayNameForTrack(track); + return track.label; + } + + tracksPanelIsTrackInSectionSelected(trackIndex, sectionIndex) + { + if (sectionIndex == 0 && this._canPickAudioTracks()) + return this._audioTracks()[trackIndex].enabled; + return this._textTracks()[trackIndex].mode !== "disabled"; + } + + tracksPanelSelectionDidChange(trackIndex, sectionIndex) + { + if (sectionIndex == 0 && this._canPickAudioTracks()) + this._audioTracks().forEach((audioTrack, index) => audioTrack.enabled = index === trackIndex); + else + this._textTracks().forEach((textTrack, index) => textTrack.mode = index === trackIndex ? "showing" : "disabled"); + + this.mediaController.controls.hideTracksPanel(); + } + + syncControl() + { + this.control.enabled = this._canPickAudioTracks() || this._canPickTextTracks(); + } + + // Private + + _textTracks() + { + return this._sortedTrackList(this.mediaController.media.textTracks); + } + + _audioTracks() + { + return this._sortedTrackList(this.mediaController.media.audioTracks); + } + + _canPickAudioTracks() + { + const audioTracks = this._audioTracks(); + return audioTracks && audioTracks.length > 1; + } + + _canPickTextTracks() + { + const textTracks = this._textTracks(); + return textTracks && textTracks.length > 0; + } + + _sortedTrackList(tracks) + { + return Array.from(this.mediaController.host ? this.mediaController.host.sortedTrackListForMenu(tracks) : tracks); + } + +} |