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.
5 // This file performs actions on media elements.
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);
14 throw new Error('Can not seek non HTML5 media elements.');
18 function seekHTML5Element(element, seekTime, logSeekTime, seekLabel) {
19 function readyForSeek() {
20 seekHTML5ElementPostLoad(element, seekTime, logSeekTime, seekLabel);
22 if (element.readyState == element.HAVE_NOTHING) {
23 var onLoadedMetaData = function(e) {
24 element.removeEventListener('loadedmetadata', onLoadedMetaData);
27 element.addEventListener('loadedmetadata', onLoadedMetaData);
34 function seekHTML5ElementPostLoad(element, seekTime, logSeekTime, seekLabel) {
35 var onSeeked = function(e) {
36 element[e.type + '_completed'] = true;
37 element.removeEventListener('seeked', onSeeked);
40 throw new Error('Error playing media :' + e.type);
43 element['seeked_completed'] = false;
44 element.addEventListener('error', onError);
45 element.addEventListener('abort', onError);
46 element.addEventListener('seeked', onSeeked);
49 var willSeekEvent = document.createEvent('Event');
50 willSeekEvent.initEvent('willSeek', false, false);
52 willSeekEvent.seekLabel = seekLabel;
54 willSeekEvent.seekLabel = seekTime;
55 element.dispatchEvent(willSeekEvent);
58 element.currentTime = seekTime;
60 throw new Error('Cannot seek in network state: ' + element.networkState);
64 window.__seekMedia = seekMedia;