Index: ui/file_manager/video_player/js/media_controls.js |
diff --git a/ui/file_manager/video_player/js/media_controls.js b/ui/file_manager/video_player/js/media_controls.js |
index d89f14f6fbb312235f76fd11528ad6deac9845c9..33745c75cf678e65c5036b96762e535210ce3e6b 100644 |
--- a/ui/file_manager/video_player/js/media_controls.js |
+++ b/ui/file_manager/video_player/js/media_controls.js |
@@ -57,6 +57,17 @@ function MediaControls(containerElement, onMediaError) { |
this.soundButton_ = null; |
/** |
+ * @type {HTMLElement} |
+ * @private |
+ */ |
+ this.subtitlesButton_ = null; |
+ |
+ /** |
+ * @private {TextTrack} |
+ */ |
+ this.subtitlesTrack_ = null; |
+ |
+ /** |
* @type {boolean} |
* @private |
*/ |
@@ -518,6 +529,66 @@ MediaControls.prototype.onVolumeDrag_ = function() { |
} |
}; |
+/** |
+ * Initializes subtitles button. |
+ */ |
+MediaControls.prototype.initSubtitlesButton = function() { |
+ this.subtitlesTrack_ = null; |
+ this.subtitlesButton_ = |
+ this.createButton('subtitles', this.onSubtitlesButtonClicked_.bind(this)); |
+ this.subtitlesButton_.setAttribute('aria-label', |
+ str('VIDEO_PLAYER_SUBTITLES_BUTTON_LABEL')); |
+}; |
+ |
+/** |
+ * @param {Event} event Mouse click event. |
+ * @private |
+ */ |
+MediaControls.prototype.onSubtitlesButtonClicked_ = function(event) { |
+ if (!this.subtitlesTrack_) { |
+ return; |
+ } |
+ this.toggleSubtitlesMode_(this.subtitlesTrack_.mode === 'hidden'); |
+}; |
+ |
+/** |
+ * @param {boolean} on Whether enabled or not. |
+ * @private |
+ */ |
+MediaControls.prototype.toggleSubtitlesMode_ = function(on) { |
+ if (!this.subtitlesTrack_) { |
+ return; |
+ } |
+ if (on) { |
+ this.subtitlesTrack_.mode = 'showing'; |
+ this.subtitlesButton_.setAttribute('showing', ''); |
+ } else { |
+ this.subtitlesTrack_.mode = 'hidden'; |
+ this.subtitlesButton_.removeAttribute('showing'); |
+ } |
+}; |
+ |
+/** |
+ * @param {TextTrack} track Subtitles track |
+ * @private |
+ */ |
+MediaControls.prototype.attachTextTrack_ = function(track) { |
+ this.subtitlesTrack_ = track; |
+ if (this.subtitlesTrack_) { |
+ this.toggleSubtitlesMode_(true); |
+ this.subtitlesButton_.removeAttribute('unavailable'); |
+ } else { |
+ this.subtitlesButton_.setAttribute('unavailable', ''); |
+ } |
+}; |
+ |
+/** |
+ * @private |
+ */ |
+MediaControls.prototype.detachTextTrack_ = function() { |
+ this.subtitlesTrack_ = null; |
+}; |
+ |
/* |
* Media event handlers. |
*/ |
@@ -548,6 +619,11 @@ MediaControls.prototype.attachMedia = function(mediaElement) { |
/* Copy the user selected volume to the new media element. */ |
this.savedVolume_ = this.media_.volume = this.volume_.ratio; |
} |
+ if (this.media_.textTracks.length > 0) { |
+ this.attachTextTrack_(this.media_.textTracks[0]); |
+ } else { |
+ this.attachTextTrack_(null); |
+ } |
}; |
/** |
@@ -564,6 +640,7 @@ MediaControls.prototype.detachMedia = function() { |
this.media_.removeEventListener('error', this.onMediaError_); |
this.media_ = null; |
+ this.detachTextTrack_(); |
}; |
/** |
@@ -743,6 +820,7 @@ function VideoControls( |
this.initPlayButton(); |
this.initTimeControls(); |
this.initVolumeControls(); |
+ this.initSubtitlesButton(); |
// Create the cast button. |
// We need to use <button> since cr.ui.MenuButton.decorate modifies prototype |