1a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// found in the LICENSE file. 4a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 5a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch// This file performs actions on media elements. 6a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch(function() { 7a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch function seekMedia(selector, seekTime, logSeekTime) { 8a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Performs the "Seek" action on media satisfying selector. 9a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch var mediaElements = window.__findMediaElements(selector); 10a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch for (var i = 0; i < mediaElements.length; i++) { 11a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch seek(mediaElements[i], seekTime, logSeekTime); 12a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 13a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 14a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 15a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch function seek(element, seekTime, logSeekTime) { 16a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (element instanceof HTMLMediaElement) 17a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch seekHTML5Element(element, seekTime, logSeekTime); 18a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch else 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) throw new Error('Can not seek non HTML5 media elements.'); 20a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 21a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 22a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch function seekHTML5Element(element, seekTime, logSeekTime) { 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (element.readyState == element.HAVE_NOTHING) { 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) var onLoadedMetaData = function(e) { 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) element.removeEventListener('loadedmetadata', onLoadedMetaData); 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) seekHTML5ElementPostLoad(element, seekTime, logSeekTime); 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }; 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) element.addEventListener('loadedmetadata', onLoadedMetaData); 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) element.load(); 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else { 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) seekHTML5ElementPostLoad(element, seekTime, logSeekTime); 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) function seekHTML5ElementPostLoad(element, seekTime, logSeekTime) { 36a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch var onSeeked = function(e) { 37a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch element[e.type + '_completed'] = true; 38a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch element.removeEventListener('seeked', onSeeked); 39a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch }; 40a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch function onError(e) { 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) throw new Error('Error playing media :' + e.type); 42a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) element['seeked_completed'] = false; 45a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch element.addEventListener('error', onError); 46a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch element.addEventListener('abort', onError); 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) element.addEventListener('seeked', onSeeked); 48a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 49a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (logSeekTime) { 50a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch var willSeekEvent = document.createEvent('Event'); 51a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch willSeekEvent.initEvent('willSeek', false, false); 52a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch willSeekEvent.seekLabel = seekTime; 53a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch element.dispatchEvent(willSeekEvent); 54a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 55a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch try { 56a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch element.currentTime = seekTime; 57a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } catch (err) { 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) throw new Error('Cannot seek in network state: ' + element.networkState); 59a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 60a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 61a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 62a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch window.__seekMedia = seekMedia; 63a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch})(); 64