Home | History | Annotate | Download | only in actions
      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