Commit af56a2df by polesye

BLD-518: Fix video volume cookie.

parent 76f4eaf9
......@@ -335,21 +335,23 @@
beforeEach(function () {
initialize();
spyOn(videoPlayer, 'updatePlayTime');
spyOn(videoPlayer, 'log');
spyOn(videoPlayer.player, 'seekTo');
state.videoPlayer.play();
runs(function () {
state.videoPlayer.play();
});
waitsFor(function () {
return videoPlayer.isPlaying();
duration = videoPlayer.duration();
return duration > 0 && videoPlayer.isPlaying();
}, 'video begins playing', WAIT_TIMEOUT);
});
it('Slider event causes log update', function () {
runs(function () {
var currentTime = videoPlayer.currentTime;
spyOn(videoPlayer, 'log');
videoProgressSlider.onSlide(
jQuery.Event('slide'), { value: 2 }
);
......@@ -367,6 +369,7 @@
it('seek the player', function () {
runs(function () {
spyOn(videoPlayer.player, 'seekTo');
videoProgressSlider.onSlide(
jQuery.Event('slide'), { value: 60 }
);
......@@ -378,6 +381,7 @@
it('call updatePlayTime on player', function () {
runs(function () {
spyOn(videoPlayer, 'updatePlayTime');
videoProgressSlider.onSlide(
jQuery.Event('slide'), { value: 60 }
);
......@@ -476,19 +480,38 @@
videoPlayer.onPlay();
expect(videoPlayer.onSpeedChange.calls.length).toEqual(1);
});
it('video has a correct volume', function () {
spyOn(videoPlayer.player, 'setVolume');
state.currentVolume = '0.26';
videoPlayer.onPlay();
expect(videoPlayer.player.setVolume).toHaveBeenCalledWith('0.26');
});
});
});
describe('onVolumeChange', function () {
beforeEach(function () {
initialize();
});
it('set the volume on player', function () {
spyOn(videoPlayer.player, 'setVolume');
videoPlayer.onVolumeChange(60);
expect(videoPlayer.player.setVolume).toHaveBeenCalledWith(60);
});
it('set the volume on player', function () {
expect(videoPlayer.player.setVolume).toHaveBeenCalledWith(60);
describe('when the video is not playing', function () {
beforeEach(function () {
videoPlayer.player.setVolume('1');
});
it('video has a correct volume', function () {
spyOn(videoPlayer.player, 'setVolume');
state.currentVolume = '0.26';
videoPlayer.onPlay();
expect(videoPlayer.player.setVolume).toHaveBeenCalledWith('0.26');
});
});
});
......@@ -922,7 +945,9 @@
});
waitsFor(function () {
return videoPlayer.isPlaying();
duration = videoPlayer.duration();
return duration > 0 && videoPlayer.isPlaying();
},'Video does not play.' , WAIT_TIMEOUT);
runs(function () {
......
......@@ -323,6 +323,7 @@ function (VideoPlayer) {
// element has a CSS class 'fullscreen'.
this.__dfd__ = $.Deferred();
this.isFullScreen = false;
this.currentVolume = 100;
this.isTouch = onTouchBasedDevice() || '';
// The parent element of the video, and the ID.
......
......@@ -193,6 +193,9 @@ function () {
sourceStr[videoType] =
'<source ' +
'src="' + _this.config.videoSources[videoType] +
// Following hack allows to open the same video twice
// https://code.google.com/p/chromium/issues/detail?id=31014
'?' + (new Date()).getTime() +
'" ' + 'type="video/' + videoType + '" ' +
'/> ';
}
......
......@@ -70,6 +70,7 @@ function (HTML5Video, Resizer) {
if (state.currentPlayerMode !== 'flash') {
state.videoPlayer.onSpeedChange(state.speed);
}
state.videoPlayer.player.setVolume(state.currentVolume);
});
if (state.videoType === 'youtube') {
......
......@@ -50,59 +50,68 @@ function () {
// make the created DOM elements available via the 'state' object. Much easier to work this
// way - you don't have to do repeated jQuery element selects.
function _renderElements(state) {
state.videoVolumeControl.el = state.el.find('div.volume');
state.videoVolumeControl.buttonEl = state.videoVolumeControl.el.find('a');
state.videoVolumeControl.volumeSliderEl = state.videoVolumeControl.el.find('.volume-slider');
state.videoControl.secondaryControlsEl.prepend(state.videoVolumeControl.el);
// Figure out what the current volume is. If no information about volume level could be retrieved,
// then we will use the default 100 level (full volume).
state.videoVolumeControl.currentVolume = parseInt($.cookie('video_player_volume_level'), 10);
if (!isFinite(state.videoVolumeControl.currentVolume)) {
state.videoVolumeControl.currentVolume = 100;
var volumeControl = state.videoVolumeControl,
element = state.el.find('div.volume'),
button = element.find('a'),
volumeSlider = element.find('.volume-slider'),
// Figure out what the current volume is. If no information about
// volume level could be retrieved, then we will use the default 100
// level (full volume).
currentVolume = parseInt($.cookie('video_player_volume_level'), 10),
// Set it up so that muting/unmuting works correctly.
previousVolume = 100,
slider, buttonStr, volumeSliderHandleEl;
state.videoControl.secondaryControlsEl.prepend(element);
if (!isFinite(currentVolume)) {
currentVolume = 100;
}
// Set it up so that muting/unmuting works correctly.
state.videoVolumeControl.previousVolume = 100;
state.videoVolumeControl.slider = state.videoVolumeControl.volumeSliderEl.slider({
slider = volumeSlider.slider({
orientation: 'vertical',
range: 'min',
min: 0,
max: 100,
value: state.videoVolumeControl.currentVolume,
change: state.videoVolumeControl.onChange,
slide: state.videoVolumeControl.onChange
value: currentVolume,
change: volumeControl.onChange,
slide: volumeControl.onChange
});
state.videoVolumeControl.el.toggleClass('muted', state.videoVolumeControl.currentVolume === 0);
element.toggleClass('muted', currentVolume === 0);
// ARIA
// Let screen readers know that:
// This anchor behaves as a button named 'Volume'.
var currentVolume = state.videoVolumeControl.currentVolume,
buttonStr = (currentVolume === 0) ? 'Volume muted' : 'Volume';
buttonStr = (currentVolume === 0) ? 'Volume muted' : 'Volume';
// We add the aria-label attribute because the title attribute cannot be
// read.
state.videoVolumeControl.buttonEl.attr('aria-label', gettext(buttonStr));
button.attr('aria-label', gettext(buttonStr));
// Let screen readers know that this anchor, representing the slider
// handle, behaves as a slider named 'volume'.
var volumeSlider = state.videoVolumeControl.slider;
state.videoVolumeControl.volumeSliderHandleEl = state.videoVolumeControl
.volumeSliderEl
.find('.ui-slider-handle');
state.videoVolumeControl.volumeSliderHandleEl.attr({
volumeSliderHandleEl = slider.find('.ui-slider-handle');
volumeSliderHandleEl.attr({
'role': 'slider',
'title': 'volume',
'aria-disabled': false,
'aria-valuemin': volumeSlider.slider('option', 'min'),
'aria-valuemax': volumeSlider.slider('option', 'max'),
'aria-valuenow': volumeSlider.slider('option', 'value'),
'aria-valuetext': getVolumeDescription(volumeSlider.slider('option', 'value'))
'aria-valuemin': slider.slider('option', 'min'),
'aria-valuemax': slider.slider('option', 'max'),
'aria-valuenow': slider.slider('option', 'value'),
'aria-valuetext': getVolumeDescription(slider.slider('option', 'value'))
});
state.currentVolume = currentVolume;
$.extend(state.videoVolumeControl, {
el: element,
buttonEl: button,
volumeSliderEl: volumeSlider,
currentVolume: currentVolume,
previousVolume: previousVolume,
slider: slider,
volumeSliderHandleEl: volumeSliderHandleEl
});
}
......
#pylint: disable=C0111
from lettuce import world, step
from lettuce.django import django_url
from common import i_am_registered_for_the_course, section_location, visit_scenario_item
from django.utils.translation import ugettext as _
......@@ -94,8 +93,10 @@ def video_is_rendered(_step, mode):
@step('all sources are correct$')
def all_sources_are_correct(_step):
sources = world.css_find('.video video source')
assert set(source['src'] for source in sources) == set(HTML5_SOURCES)
elements = world.css_find('.video video source')
sources = [source['src'].split('?')[0] for source in elements]
assert set(sources) == set(HTML5_SOURCES)
@step('error message is shown$')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment