Commit 3f7dc688 by Prem Sichanugrist

Lazily build video slider when on iOS device

This will fix the problem when user trying to click the seek button on
the iOS, as the video need to be started first before it can be
seekable.
parent 382dc621
...@@ -3,34 +3,51 @@ describe 'VideoProgressSlider', -> ...@@ -3,34 +3,51 @@ describe 'VideoProgressSlider', ->
@player = jasmine.stubVideoPlayer @ @player = jasmine.stubVideoPlayer @
describe 'constructor', -> describe 'constructor', ->
beforeEach -> describe 'on a non-touch based device', ->
spyOn($.fn, 'slider').andCallThrough() beforeEach ->
@slider = new VideoProgressSlider @player spyOn($.fn, 'slider').andCallThrough()
spyOn(window, 'onTouchBasedDevice').andReturn false
@slider = new VideoProgressSlider @player
it 'build the slider', ->
expect(@slider.slider).toBe '.slider'
expect($.fn.slider).toHaveBeenCalledWith
range: 'min'
change: @slider.onChange
slide: @slider.onSlide
stop: @slider.onStop
it 'build the seek handle', ->
expect(@slider.handle).toBe '.ui-slider-handle'
expect($.fn.qtip).toHaveBeenCalledWith
content: "0:00"
position:
my: 'bottom center'
at: 'top center'
container: @slider.handle
hide:
delay: 700
style:
classes: 'ui-tooltip-slider'
widget: true
it 'bind player events', ->
expect($(@player)).toHandleWith 'updatePlayTime', @slider.onUpdatePlayTime
expect($(@player)).toHandleWith 'ready', @slider.onReady
expect($(@player)).toHandleWith 'play', @slider.onPlay
describe 'on a touch-based device', ->
beforeEach ->
spyOn($.fn, 'slider').andCallThrough()
spyOn(window, 'onTouchBasedDevice').andReturn true
@slider = new VideoProgressSlider @player
it 'does not build the slider', ->
expect(@slider.slider).toBeUndefined
expect($.fn.slider).not.toHaveBeenCalled()
it 'build the slider', -> it 'bind player events', ->
expect(@slider.slider).toBe '.slider' expect($(@player)).toHandleWith 'updatePlayTime', @slider.onUpdatePlayTime
expect($.fn.slider).toHaveBeenCalledWith
range: 'min'
change: @slider.onChange
slide: @slider.onSlide
stop: @slider.onStop
it 'build the seek handle', ->
expect(@slider.handle).toBe '.ui-slider-handle'
expect($.fn.qtip).toHaveBeenCalledWith
content: "0:00"
position:
my: 'bottom center'
at: 'top center'
container: @slider.handle
hide:
delay: 700
style:
classes: 'ui-tooltip-slider'
widget: true
it 'bind player events', ->
expect($(@player)).toHandleWith 'updatePlayTime', @slider.onUpdatePlayTime
describe 'onReady', -> describe 'onReady', ->
beforeEach -> beforeEach ->
...@@ -41,6 +58,45 @@ describe 'VideoProgressSlider', -> ...@@ -41,6 +58,45 @@ describe 'VideoProgressSlider', ->
it 'set the max value to the length of video', -> it 'set the max value to the length of video', ->
expect(@slider.slider.slider('option', 'max')).toEqual 120 expect(@slider.slider.slider('option', 'max')).toEqual 120
describe 'onPlay', ->
beforeEach ->
@slider = new VideoProgressSlider @player
spyOn($.fn, 'slider').andCallThrough()
describe 'when the slider was already built', ->
beforeEach ->
@slider.onPlay()
it 'does not build the slider', ->
expect($.fn.slider).not.toHaveBeenCalled
describe 'when the slider was not already built', ->
beforeEach ->
@slider.slider = null
@slider.onPlay()
it 'build the slider', ->
expect(@slider.slider).toBe '.slider'
expect($.fn.slider).toHaveBeenCalledWith
range: 'min'
change: @slider.onChange
slide: @slider.onSlide
stop: @slider.onStop
it 'build the seek handle', ->
expect(@slider.handle).toBe '.ui-slider-handle'
expect($.fn.qtip).toHaveBeenCalledWith
content: "0:00"
position:
my: 'bottom center'
at: 'top center'
container: @slider.handle
hide:
delay: 700
style:
classes: 'ui-tooltip-slider'
widget: true
describe 'onUpdatePlayTime', -> describe 'onUpdatePlayTime', ->
beforeEach -> beforeEach ->
@slider = new VideoProgressSlider @player @slider = new VideoProgressSlider @player
......
class @VideoProgressSlider class @VideoProgressSlider
constructor: (@player) -> constructor: (@player) ->
@buildSlider() @buildSlider() unless onTouchBasedDevice()
@buildHandle()
$(@player).bind('updatePlayTime', @onUpdatePlayTime) $(@player).bind('updatePlayTime', @onUpdatePlayTime)
$(@player).bind('ready', @onReady) $(@player).bind('ready', @onReady)
$(@player).bind('play', @onPlay)
$: (selector) -> $: (selector) ->
@player.$(selector) @player.$(selector)
...@@ -14,6 +14,7 @@ class @VideoProgressSlider ...@@ -14,6 +14,7 @@ class @VideoProgressSlider
change: @onChange change: @onChange
slide: @onSlide slide: @onSlide
stop: @onStop stop: @onStop
@buildHandle()
buildHandle: -> buildHandle: ->
@handle = @$('.ui-slider-handle') @handle = @$('.ui-slider-handle')
...@@ -30,10 +31,13 @@ class @VideoProgressSlider ...@@ -30,10 +31,13 @@ class @VideoProgressSlider
widget: true widget: true
onReady: => onReady: =>
@slider.slider('option', 'max', @player.duration()) @slider.slider('option', 'max', @player.duration()) if @slider
onPlay: =>
@buildSlider() unless @slider
onUpdatePlayTime: (event, currentTime) => onUpdatePlayTime: (event, currentTime) =>
if !@frozen if @slider && !@frozen
@slider.slider('option', 'max', @player.duration()) @slider.slider('option', 'max', @player.duration())
@slider.slider('value', currentTime) @slider.slider('value', currentTime)
......
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