133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck// Copyright 2013 The Chromium Authors. All rights reserved.
233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck// Use of this source code is governed by a BSD-style license that can be
333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck// found in the LICENSE file.
433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck// This file performs actions on media elements.
633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck(function() {
733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  function loopMedia(selector, loopCount) {
833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    // Loops media playback `loopCount` times.
933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    var mediaElements = window.__findMediaElements(selector);
1033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    for (var i = 0; i < mediaElements.length; i++) {
1133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      loop(mediaElements[i], loopCount);
1233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    }
1333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  }
1433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
1533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  function loop(element, loopCount) {
1633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    if (element instanceof HTMLMediaElement)
1733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      loopHTML5Element(element, loopCount);
1833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    else
1933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      throw new Error('Can not play non HTML5 media elements.');
2033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  }
2133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
2233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  function loopHTML5Element(element, loopCount) {
2333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    window.__registerHTML5ErrorEvents(element);
2433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    element['loop_completed'] = false;
2533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    var currentLoop = 0;
2633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    var onLoop = function(e) {
2733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      ++currentLoop;
2833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      if (currentLoop == loopCount) {
2933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        element.pause();
3033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        element.removeEventListener('seeked', onLoop);
3133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        element['loop_completed'] = true;
3233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        // Dispatch endLoopEvent to mark end of looping.
3333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        var endLoopEvent = document.createEvent('Event');
3433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        endLoopEvent.initEvent('endLoop', false, false);
3533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        element.dispatchEvent(endLoopEvent);
3633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck      }
3733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    };
3833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
3933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    element.addEventListener('seeked', onLoop);
4033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    element.loop = true;
4133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
4233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    // Dispatch willLoopEvent to measure loop time.
4333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    var willLoopEvent = document.createEvent('Event');
4433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    willLoopEvent.initEvent('willLoop', false, false);
4533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    willLoopEvent.loopCount = loopCount;
4633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    element.dispatchEvent(willLoopEvent);
4733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    // Reset HTML5 player to start playback from beginning.
4833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    element.load();
4933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    element.play();
5033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  }
5133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
5233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck  window.__loopMedia = loopMedia;
5333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck})();
54