Test looping by:

Play to end with 'loop' set to true.
When 'seeked' event fires, verify that time has jumped back and movie is playing.
Set 'loop' to false and play again.
Verify that 'ended' event fires.
++ Test setting/removing the attribute.
EXPECTED (video.getAttribute('loop') == 'null') OK
EXPECTED (video.loop == 'false') OK
RUN(video.loop = true)
EXPECTED (video.loop == 'true') OK
EXPECTED (video.getAttribute('loop') != 'null') OK
RUN(video.removeAttribute('loop'))
EXPECTED (video.loop == 'false') OK

++ Set 'loop' to true and begin playing.
RUN(video.loop = true)

EVENT(play)

++ seek to near the end, wait for 'seeked' event to announce loop.
EXPECTED (video.paused == 'false') OK
RUN(video.pause())
RUN(video.currentTime = video.duration - 0.4)

EVENT(pause)
EVENT(seeked)

++ first seek completed, beginning playback.
EXPECTED (video.paused == 'true') OK
EXPECTED (video.ended == 'false') OK
RUN(video.play())

EVENT(play)
EVENT(seeked)

++ second seek completed because video looped, toggle 'loop' and seek to near end again.
EXPECTED (video.paused == 'false') OK
EXPECTED (video.ended == 'false') OK
RUN(video.pause())
EXPECTED (mediaElement.currentTime >= '0') OK
EXPECTED (mediaElement.currentTime < 'mediaElement.duration') OK
RUN(video.loop = false)
RUN(video.currentTime = video.duration - 0.4)

EVENT(pause)
EVENT(seeked)

++ third seek completed, beginning playback for the last time.
EXPECTED (video.paused == 'true') OK
EXPECTED (video.ended == 'false') OK
RUN(video.play())

EVENT(play)
EVENT(pause)
EVENT(ended)

++ played to end and stopped.
EXPECTED (video.ended == 'true') OK
EXPECTED (mediaElement.currentTime == 'mediaElement.duration') OK

END OF TEST

