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 seekMedia(selector, seekTime, logSeekTime, seekLabel) { 8 // Performs the "Seek" action on media satisfying selector. 9 var mediaElements = window.__findMediaElements(selector); 10 for (var i = 0; i < mediaElements.length; i++) { 11 if (mediaElements[i] instanceof HTMLMediaElement) 12 seekHTML5Element(mediaElements[i], seekTime, logSeekTime, seekLabel); 13 else 14 throw new Error('Can not seek non HTML5 media elements.'); 15 } 16 } 17 18 function seekHTML5Element(element, seekTime, logSeekTime, seekLabel) { 19 function readyForSeek() { 20 seekHTML5ElementPostLoad(element, seekTime, logSeekTime, seekLabel); 21 } 22 if (element.readyState == element.HAVE_NOTHING) { 23 var onLoadedMetaData = function(e) { 24 element.removeEventListener('loadedmetadata', onLoadedMetaData); 25 readyForSeek(); 26 }; 27 element.addEventListener('loadedmetadata', onLoadedMetaData); 28 element.load(); 29 } else { 30 readyForSeek(); 31 } 32 } 33 34 function seekHTML5ElementPostLoad(element, seekTime, logSeekTime, seekLabel) { 35 // Reset seek completion since multiple seeks can run on same media element. 36 element['seeked_completed'] = false; 37 window.__registerHTML5ErrorEvents(element); 38 window.__registerHTML5EventCompleted(element, 'seeked'); 39 40 if (logSeekTime) { 41 var willSeekEvent = document.createEvent('Event'); 42 willSeekEvent.initEvent('willSeek', false, false); 43 if (seekLabel) 44 willSeekEvent.seekLabel = seekLabel; 45 else 46 willSeekEvent.seekLabel = seekTime; 47 element.dispatchEvent(willSeekEvent); 48 } 49 try { 50 element.currentTime = seekTime; 51 } catch (err) { 52 throw new Error('Cannot seek in network state: ' + element.networkState); 53 } 54 } 55 56 window.__seekMedia = seekMedia; 57})(); 58