1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// This file performs actions on media elements.
6(function() {
7  function loopMedia(selector, loopCount) {
8    // Loops media playback `loopCount` times.
9    var mediaElements = window.__findMediaElements(selector);
10    for (var i = 0; i < mediaElements.length; i++) {
11      loop(mediaElements[i], loopCount);
12    }
13  }
14
15  function loop(element, loopCount) {
16    if (element instanceof HTMLMediaElement)
17      loopHTML5Element(element, loopCount);
18    else
19      throw new Error('Can not play non HTML5 media elements.');
20  }
21
22  function loopHTML5Element(element, loopCount) {
23    window.__registerHTML5ErrorEvents(element);
24    element['loop_completed'] = false;
25    var currentLoop = 0;
26    var onLoop = function(e) {
27      ++currentLoop;
28      if (currentLoop == loopCount) {
29        element.pause();
30        element.removeEventListener('seeked', onLoop);
31        element['loop_completed'] = true;
32        // Dispatch endLoopEvent to mark end of looping.
33        var endLoopEvent = document.createEvent('Event');
34        endLoopEvent.initEvent('endLoop', false, false);
35        element.dispatchEvent(endLoopEvent);
36      }
37    };
38
39    element.addEventListener('seeked', onLoop);
40    element.loop = true;
41
42    // Dispatch willLoopEvent to measure loop time.
43    var willLoopEvent = document.createEvent('Event');
44    willLoopEvent.initEvent('willLoop', false, false);
45    willLoopEvent.loopCount = loopCount;
46    element.dispatchEvent(willLoopEvent);
47    // Reset HTML5 player to start playback from beginning.
48    element.load();
49    element.play();
50  }
51
52  window.__loopMedia = loopMedia;
53})();
54