- add sources.
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / page / actions / seek.js
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     var onSeeked = function(e) {
36       element[e.type + '_completed'] = true;
37       element.removeEventListener('seeked', onSeeked);
38     };
39     function onError(e) {
40       throw new Error('Error playing media :' + e.type);
41     }
42
43     element['seeked_completed'] = false;
44     element.addEventListener('error', onError);
45     element.addEventListener('abort', onError);
46     element.addEventListener('seeked', onSeeked);
47
48     if (logSeekTime) {
49       var willSeekEvent = document.createEvent('Event');
50       willSeekEvent.initEvent('willSeek', false, false);
51       if (seekLabel)
52         willSeekEvent.seekLabel = seekLabel;
53       else
54         willSeekEvent.seekLabel = seekTime;
55       element.dispatchEvent(willSeekEvent);
56     }
57     try {
58       element.currentTime = seekTime;
59     } catch (err) {
60       throw new Error('Cannot seek in network state: ' + element.networkState);
61     }
62   }
63
64   window.__seekMedia = seekMedia;
65 })();