I think there is a problem here.  Suppose the user seeks to the end with the fast forward button and ends up here. Playback pauses and they remain at the last frame of the video. Now they use the slider to rewind 10 seconds (without using ForwardRewindController) an press play.  When they get the ended event, isSeekedToEnd() will still be true, and they won't go to the start of the video even though this time that is what is actually wanted.

To fix that in a modular way, you'd have to add some kind of ForwardRewindController.clearSeekedToEnd() or something so that you could call it here.  But that seems like it is going overboard with the modularity.

So if it works, I'd say just add a pause() call in the forward rewind controller.  If that doesn't work, define the isSeekdToEnd flag (or maybe call it dontWrapToBeginning?) as a global here in video.js and then use it in both the forward rewind controller and in handleSliderTouchEnd() so that you're handling the two cases of user-requested seeking to the end in the same way.