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