158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This file performs actions on media elements.
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)(function() {
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  function loopMedia(selector, loopCount) {
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Loops media playback `loopCount` times.
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    var mediaElements = window.__findMediaElements(selector);
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (var i = 0; i < mediaElements.length; i++) {
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      loop(mediaElements[i], loopCount);
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  function loop(element, loopCount) {
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (element instanceof HTMLMediaElement)
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      loopHTML5Element(element, loopCount);
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    else
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      throw new Error('Can not play non HTML5 media elements.');
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  function loopHTML5Element(element, loopCount) {
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    window.__registerHTML5ErrorEvents(element);
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    element['loop_completed'] = false;
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    var currentLoop = 0;
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    var onLoop = function(e) {
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ++currentLoop;
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (currentLoop == loopCount) {
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        element.pause();
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        element.removeEventListener('seeked', onLoop);
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        element['loop_completed'] = true;
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        // Dispatch endLoopEvent to mark end of looping.
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        var endLoopEvent = document.createEvent('Event');
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        endLoopEvent.initEvent('endLoop', false, false);
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        element.dispatchEvent(endLoopEvent);
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      }
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    };
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    element.addEventListener('seeked', onLoop);
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    element.loop = true;
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Dispatch willLoopEvent to measure loop time.
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    var willLoopEvent = document.createEvent('Event');
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    willLoopEvent.initEvent('willLoop', false, false);
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    willLoopEvent.loopCount = loopCount;
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    element.dispatchEvent(willLoopEvent);
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Reset HTML5 player to start playback from beginning.
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    element.load();
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    element.play();
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  window.__loopMedia = loopMedia;
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)})();
54