Index: ui/file_manager/audio_player/elements/control_panel.js |
diff --git a/ui/file_manager/audio_player/elements/control_panel.js b/ui/file_manager/audio_player/elements/control_panel.js |
index ca7ea24079b16b6f448a595c9eff3c7533358ed9..452b881d073b7746fbf0d703bed18d41029122d2 100644 |
--- a/ui/file_manager/audio_player/elements/control_panel.js |
+++ b/ui/file_manager/audio_player/elements/control_panel.js |
@@ -36,7 +36,9 @@ |
playing: { |
type: Boolean, |
value: false, |
- notify: true |
+ notify: true, |
+ reflectToAttribute: true, |
+ observer: 'playingChanged_' |
}, |
/** |
@@ -99,6 +101,23 @@ |
value: false, |
observer: 'volumeSliderShownChanged', |
notify: true |
+ }, |
+ |
+ /** |
+ * Whether the knob of time slider is being dragged. |
+ */ |
+ dragging: { |
+ type: Boolean, |
+ value: false, |
+ notify: true |
+ }, |
+ |
+ /** |
+ * Dictionary which contains aria-labels for each controls. |
+ */ |
+ ariaLabels: { |
+ type: Object, |
+ observer: 'ariaLabelsChanged_' |
} |
}, |
@@ -112,17 +131,14 @@ |
this.$.volumeSlider.addEventListener('focusout', onFocusoutBound); |
this.$.volumeButton.addEventListener('focusout', onFocusoutBound); |
- // Prevent the time slider from being moved by arrow keys. |
- this.$.timeInput.addEventListener('keydown', function(event) { |
- switch (event.keyCode) { |
- case 37: // Left arrow |
- case 38: // Up arrow |
- case 39: // Right arrow |
- case 40: // Down arrow |
- event.preventDefault(); |
- break; |
- }; |
- }); |
+ this.$.timeSlider.addEventListener('value-change', function() { |
+ if (this.dragging) |
+ this.dragging = false; |
+ }.bind(this)); |
+ this.$.timeSlider.addEventListener('immediate-value-change', function() { |
+ if (!this.dragging) |
+ this.dragging = true; |
+ }.bind(this)); |
}, |
/** |
@@ -194,19 +210,45 @@ |
}, |
/** |
- * Computes state for play button based on 'playing' property. |
- * @return {string} |
+ * Converts the time and duration into human friendly string. |
+ * @param {number} time Time to be converted. |
+ * @param {number} duration Duration to be converted. |
+ * @return {string} String representation of the given time |
+ */ |
+ computeTimeString_: function(time, duration) { |
+ return this.time2string_(time) + ' / ' + this.time2string_(duration); |
+ }, |
+ |
+ /** |
+ * Invoked when the playing property is changed. |
+ * @param {boolean} playing |
+ * @private |
*/ |
- computePlayState_: function(playing) { |
- return playing ? "playing" : "ended"; |
+ playingChanged_: function(playing) { |
+ if (this.ariaLabels) { |
+ this.$.play.setAttribute('aria-label', |
+ playing ? this.ariaLabels.pause : this.ariaLabels.play); |
+ } |
}, |
/** |
- * Computes style for '.filled' element of progress bar. |
- * @return {string} |
+ * Invoked when the ariaLabels property is changed. |
+ * @param {Object} ariaLabels |
+ * @private |
*/ |
- computeProgressBarStyle_: function(time, duration) { |
- return 'width: ' + (time / duration * 100) + '%;'; |
+ ariaLabelsChanged_: function(ariaLabels) { |
+ assert(ariaLabels); |
+ // TODO(fukino): Use data bindings. |
+ this.$.volumeSlider.setAttribute('aria-label', ariaLabels.volumeSlider); |
+ this.$.shuffle.setAttribute('aria-label', ariaLabels.shuffle); |
+ this.$.repeat.setAttribute('aria-label', ariaLabels.repeat); |
+ this.$.previous.setAttribute('aria-label', ariaLabels.previous); |
+ this.$.play.setAttribute('aria-label', |
+ this.playing ? ariaLabels.pause : ariaLabels.play); |
+ this.$.next.setAttribute('aria-label', ariaLabels.next); |
+ this.$.volumeButton.setAttribute('aria-label', ariaLabels.volume); |
+ this.$.playList.setAttribute('aria-label', ariaLabels.playList); |
+ this.$.timeSlider.setAttribute('aria-label', ariaLabels.seekSlider); |
} |
}); |
})(); // Anonymous closure |