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