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