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