diff --git a/static/coffee/spec/helper.coffee b/static/coffee/spec/helper.coffee index 34e03e9d32..3d9537f872 100644 --- a/static/coffee/spec/helper.coffee +++ b/static/coffee/spec/helper.coffee @@ -11,12 +11,8 @@ jasmine.stubbedMetadata = duration: 300 jasmine.stubbedCaption = - start: [0, 10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000, - 100000, 110000, 120000] - text: ['Caption at 0', 'Caption at 10000', 'Caption at 20000', - 'Caption at 30000', 'Caption at 40000', 'Caption at 50000', 'Caption at 60000', - 'Caption at 70000', 'Caption at 80000', 'Caption at 90000', 'Caption at 100000', - 'Caption at 110000', 'Caption at 120000'] + start: [0, 10000, 20000, 30000] + text: ['Caption at 0', 'Caption at 10000', 'Caption at 20000', 'Caption at 30000'] jasmine.stubRequests = -> spyOn($, 'ajax').andCallFake (settings) -> diff --git a/static/coffee/spec/modules/video/video_caption_spec.coffee b/static/coffee/spec/modules/video/video_caption_spec.coffee index acf900fdcf..e816da593a 100644 --- a/static/coffee/spec/modules/video/video_caption_spec.coffee +++ b/static/coffee/spec/modules/video/video_caption_spec.coffee @@ -9,66 +9,82 @@ describe 'VideoCaption', -> describe 'constructor', -> beforeEach -> spyOn($, 'getWithPrefix').andCallThrough() - @caption = new VideoCaption @player, 'def456' - it 'set the player', -> - expect(@caption.player).toEqual @player + describe 'always', -> + beforeEach -> + @caption = new VideoCaption @player, 'def456' - it 'set the youtube id', -> - expect(@caption.youtubeId).toEqual 'def456' + it 'set the player', -> + expect(@caption.player).toEqual @player - it 'create the caption element', -> - expect($('.video')).toContain 'ol.subtitles' + it 'set the youtube id', -> + expect(@caption.youtubeId).toEqual 'def456' - it 'add caption control to video player', -> - expect($('.video')).toContain 'a.hide-subtitles' + it 'create the caption element', -> + expect($('.video')).toContain 'ol.subtitles' - it 'fetch the caption', -> - expect($.getWithPrefix).toHaveBeenCalledWith @caption.captionURL(), jasmine.any(Function) + it 'add caption control to video player', -> + expect($('.video')).toContain 'a.hide-subtitles' - it 'render the caption', -> - expect($('.subtitles').html()).toMatch new RegExp(''' -
  • Caption at 0
  • -
  • Caption at 10000
  • -
  • Caption at 20000
  • -
  • Caption at 30000
  • -
  • Caption at 40000
  • -
  • Caption at 50000
  • -
  • Caption at 60000
  • -
  • Caption at 70000
  • -
  • Caption at 80000
  • -
  • Caption at 90000
  • -
  • Caption at 100000
  • -
  • Caption at 110000
  • -
  • Caption at 120000
  • - '''.replace(/\n/g, '')) + it 'fetch the caption', -> + expect($.getWithPrefix).toHaveBeenCalledWith @caption.captionURL(), jasmine.any(Function) - it 'add a padding element to caption', -> - expect($('.subtitles li:first')).toBe '.spacing' - expect($('.subtitles li:last')).toBe '.spacing' + it 'bind window resize event', -> + expect($(window)).toHandleWith 'resize', @caption.onWindowResize - it 'bind all the caption link', -> - $('.subtitles li[data-index]').each (index, link) => - expect($(link)).toHandleWith 'click', @caption.seekPlayer + it 'bind player resize event', -> + expect($(@player)).toHandleWith 'resize', @caption.onWindowResize - it 'bind window resize event', -> - expect($(window)).toHandleWith 'resize', @caption.onWindowResize + it 'bind player updatePlayTime event', -> + expect($(@player)).toHandleWith 'updatePlayTime', @caption.onUpdatePlayTime - it 'bind player resize event', -> - expect($(@player)).toHandleWith 'resize', @caption.onWindowResize + it 'bind player play event', -> + expect($(@player)).toHandleWith 'play', @caption.onPlay - it 'bind player updatePlayTime event', -> - expect($(@player)).toHandleWith 'updatePlayTime', @caption.onUpdatePlayTime + it 'bind the hide caption button', -> + expect($('.hide-subtitles')).toHandleWith 'click', @caption.toggle - it 'bind the hide caption button', -> - expect($('.hide-subtitles')).toHandleWith 'click', @caption.toggle + it 'bind the mouse movement', -> + expect($('.subtitles')).toHandleWith 'mouseenter', @caption.onMouseEnter + expect($('.subtitles')).toHandleWith 'mouseleave', @caption.onMouseLeave + expect($('.subtitles')).toHandleWith 'mousemove', @caption.onMovement + expect($('.subtitles')).toHandleWith 'mousewheel', @caption.onMovement + expect($('.subtitles')).toHandleWith 'DOMMouseScroll', @caption.onMovement - it 'bind the mouse movement', -> - expect($('.subtitles')).toHandleWith 'mouseenter', @caption.onMouseEnter - expect($('.subtitles')).toHandleWith 'mouseleave', @caption.onMouseLeave - expect($('.subtitles')).toHandleWith 'mousemove', @caption.onMovement - expect($('.subtitles')).toHandleWith 'mousewheel', @caption.onMovement - expect($('.subtitles')).toHandleWith 'DOMMouseScroll', @caption.onMovement + describe 'when on a non touch-based device', -> + beforeEach -> + spyOn(window, 'onTouchBasedDevice').andReturn false + @caption = new VideoCaption @player, 'def456' + + it 'render the caption', -> + expect($('.subtitles').html()).toMatch new RegExp(''' +
  • Caption at 0
  • +
  • Caption at 10000
  • +
  • Caption at 20000
  • +
  • Caption at 30000
  • + '''.replace(/\n/g, '')) + + it 'add a padding element to caption', -> + expect($('.subtitles li:first')).toBe '.spacing' + expect($('.subtitles li:last')).toBe '.spacing' + + it 'bind all the caption link', -> + $('.subtitles li[data-index]').each (index, link) => + expect($(link)).toHandleWith 'click', @caption.seekPlayer + + it 'set rendered to true', -> + expect(@caption.rendered).toBeTruthy() + + describe 'when on a touch-based device', -> + beforeEach -> + spyOn(window, 'onTouchBasedDevice').andReturn true + @caption = new VideoCaption @player, 'def456' + + it 'show explaination message', -> + expect($('.subtitles li')).toHaveHtml "Caption will be displayed when you start playing the video." + + it 'does not set rendered to true', -> + expect(@caption.rendered).toBeFalsy() describe 'mouse movement', -> beforeEach -> @@ -145,8 +161,34 @@ describe 'VideoCaption', -> expect(@caption.search(9999)).toEqual 0 expect(@caption.search(10000)).toEqual 1 expect(@caption.search(15000)).toEqual 1 - expect(@caption.search(120000)).toEqual 12 - expect(@caption.search(120001)).toEqual 12 + expect(@caption.search(30000)).toEqual 3 + expect(@caption.search(30001)).toEqual 3 + + describe 'onPlay', -> + describe 'when the caption was not rendered', -> + beforeEach -> + spyOn(window, 'onTouchBasedDevice').andReturn true + @caption = new VideoCaption @player, 'def456' + @caption.onPlay() + + it 'render the caption', -> + expect($('.subtitles').html()).toMatch new RegExp(''' +
  • Caption at 0
  • +
  • Caption at 10000
  • +
  • Caption at 20000
  • +
  • Caption at 30000
  • + '''.replace(/\n/g, '')) + + it 'add a padding element to caption', -> + expect($('.subtitles li:first')).toBe '.spacing' + expect($('.subtitles li:last')).toBe '.spacing' + + it 'bind all the caption link', -> + $('.subtitles li[data-index]').each (index, link) => + expect($(link)).toHandleWith 'click', @caption.seekPlayer + + it 'set rendered to true', -> + expect(@caption.rendered).toBeTruthy() describe 'onUpdatePlayTime', -> beforeEach -> diff --git a/static/coffee/spec/modules/video/video_control_spec.coffee b/static/coffee/spec/modules/video/video_control_spec.coffee index a912abb2d0..0c8615b8f7 100644 --- a/static/coffee/spec/modules/video/video_control_spec.coffee +++ b/static/coffee/spec/modules/video/video_control_spec.coffee @@ -1,17 +1,16 @@ describe 'VideoControl', -> beforeEach -> @player = jasmine.stubVideoPlayer @ + $('.video-controls').html '' describe 'constructor', -> - beforeEach -> - @control = new VideoControl @player - it 'render the video controls', -> + new VideoControl @player expect($('.video-controls').html()).toContain '''
    - """ + """ + + unless onTouchBasedDevice() + @$('.video_control').addClass('play').html('Play') onPlay: => @$('.video_control').removeClass('play').addClass('pause').html('Pause') @@ -36,7 +39,8 @@ class @VideoControl togglePlayback: (event) => event.preventDefault() - if @player.isPlaying() - $(@player).trigger('pause') - else - $(@player).trigger('play') + if $('.video_control').hasClass('play') || $('.video_control').hasClass('pause') + if @player.isPlaying() + $(@player).trigger('pause') + else + $(@player).trigger('play') diff --git a/static/coffee/src/modules/video/video_progress_slider.coffee b/static/coffee/src/modules/video/video_progress_slider.coffee index 4dfd558e4c..923f06b0c3 100644 --- a/static/coffee/src/modules/video/video_progress_slider.coffee +++ b/static/coffee/src/modules/video/video_progress_slider.coffee @@ -1,9 +1,9 @@ class @VideoProgressSlider constructor: (@player) -> - @buildSlider() - @buildHandle() + @buildSlider() unless onTouchBasedDevice() $(@player).bind('updatePlayTime', @onUpdatePlayTime) $(@player).bind('ready', @onReady) + $(@player).bind('play', @onPlay) $: (selector) -> @player.$(selector) @@ -14,6 +14,7 @@ class @VideoProgressSlider change: @onChange slide: @onSlide stop: @onStop + @buildHandle() buildHandle: -> @handle = @$('.ui-slider-handle') @@ -30,10 +31,13 @@ class @VideoProgressSlider widget: true onReady: => - @slider.slider('option', 'max', @player.duration()) + @slider.slider('option', 'max', @player.duration()) if @slider + + onPlay: => + @buildSlider() unless @slider onUpdatePlayTime: (event, currentTime) => - if !@frozen + if @slider && !@frozen @slider.slider('option', 'max', @player.duration()) @slider.slider('value', currentTime) diff --git a/static/images/pause-icon.png b/static/images/pause-icon.png deleted file mode 100644 index e3eac51947..0000000000 Binary files a/static/images/pause-icon.png and /dev/null differ diff --git a/static/images/play-icon.png b/static/images/play-icon.png deleted file mode 100644 index 2888b1c271..0000000000 Binary files a/static/images/play-icon.png and /dev/null differ diff --git a/static/images/vcr.png b/static/images/vcr.png new file mode 100644 index 0000000000..aa2ac99e47 Binary files /dev/null and b/static/images/vcr.png differ diff --git a/static/sass/courseware/_video.scss b/static/sass/courseware/_video.scss index 9fc3b4eb3d..7130cc8b7b 100644 --- a/static/sass/courseware/_video.scss +++ b/static/sass/courseware/_video.scss @@ -137,6 +137,7 @@ section.course-content { float: left; margin-bottom: 0; + a { border-bottom: none; border-right: 1px solid #000; @@ -146,11 +147,17 @@ section.course-content { line-height: 46px; padding: 0 lh(.75); text-indent: -9999px; - @include transition(); + @include transition(background-color, opacity); width: 14px; + background: url('../images/vcr.png') 15px 15px no-repeat; + + &:empty { + height: 46px; + background: url('../images/vcr.png') 15px 15px no-repeat; + } &.play { - background: url('../images/play-icon.png') center center no-repeat; + background-position: 17px -114px; &:hover { background-color: #444; @@ -158,7 +165,7 @@ section.course-content { } &.pause { - background: url('../images/pause-icon.png') center center no-repeat; + background-position: 16px -50px; &:hover { background-color: #444; @@ -361,7 +368,6 @@ section.course-content { cursor: pointer; margin-bottom: 8px; padding: 0; - @include transition(all, .5s, ease-in); &.current { color: #333; @@ -386,7 +392,6 @@ section.course-content { } ol.subtitles { - height: 0; width: 0px; } } @@ -408,7 +413,6 @@ section.course-content { &.closed { ol.subtitles { - height: auto; right: -(flex-grid(4)); width: auto; }