Index: tools/chrome_proxy/integration_tests/videowrapper.js |
diff --git a/tools/chrome_proxy/integration_tests/videowrapper.js b/tools/chrome_proxy/integration_tests/videowrapper.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..242b77645650b66b63cd527530e83d33a3869f55 |
--- /dev/null |
+++ b/tools/chrome_proxy/integration_tests/videowrapper.js |
@@ -0,0 +1,100 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// This script finds the first video element on a page and collect metrics |
+// for that element. This is based on src/tools/perf/metrics/media.js. |
+ |
+(function() { |
+ // VideoWrapper attaches event listeners to collect metrics. |
+ // The constructor starts playing the video. |
+ function VideoWrapper(element) { |
+ if (!(element instanceof HTMLVideoElement)) |
+ throw new Error('Unrecognized video element type ' + element); |
+ metrics['ready'] = false; |
+ this.element = element; |
+ element.loop = false; |
+ // Set the basic event handlers for this HTML5 video element. |
+ this.element.addEventListener('loadedmetadata', this.onLoaded.bind(this)); |
+ this.element.addEventListener('canplay', this.onCanplay.bind(this)); |
+ this.element.addEventListener('ended', this.onEnded.bind(this)); |
+ this.playbackTimer = new Timer(); |
+ element.play() |
+ } |
+ |
+ VideoWrapper.prototype.onLoaded = function(e) { |
+ if (this.element.readyState == HTMLMediaElement.HAVE_NOTHING) { |
+ return |
+ } |
+ metrics['ready'] = true; |
+ metrics['video_height'] = this.element.videoHeight; |
+ metrics['video_width'] = this.element.videoWidth; |
+ metrics['video_duration'] = this.element.duration; |
+ window.__chromeProxyVideoLoaded = true; |
+ }; |
+ |
+ VideoWrapper.prototype.onCanplay = function(event) { |
+ metrics['time_to_play_ms'] = this.playbackTimer.stop(); |
+ }; |
+ |
+ VideoWrapper.prototype.onEnded = function(event) { |
+ var time_to_end = this.playbackTimer.stop() - metrics['time_to_play_ms']; |
+ metrics['buffering_time_ms'] = time_to_end - this.element.duration * 1000; |
+ metrics['decoded_audio_bytes'] = this.element.webkitAudioDecodedByteCount; |
+ metrics['decoded_video_bytes'] = this.element.webkitVideoDecodedByteCount; |
+ metrics['decoded_frames'] = this.element.webkitDecodedFrameCount; |
+ metrics['dropped_frames'] = this.element.webkitDroppedFrameCount; |
+ window.__chromeProxyVideoEnded = true; |
+ }; |
+ |
+ function MediaMetric(element) { |
+ if (element instanceof HTMLMediaElement) |
+ return new VideoWrapper(element); |
+ throw new Error('Unrecognized media element type.'); |
+ } |
+ |
+ function Timer() { |
+ this.start(); |
+ } |
+ |
+ Timer.prototype = { |
+ start: function() { |
+ this.start_ = getCurrentTime(); |
+ }, |
+ |
+ stop: function() { |
+ // Return delta time since start in millisecs. |
+ return Math.round((getCurrentTime() - this.start_) * 1000) / 1000; |
+ } |
+ }; |
+ |
+ function getCurrentTime() { |
+ if (window.performance) |
+ return (performance.now || |
+ performance.mozNow || |
+ performance.msNow || |
+ performance.oNow || |
+ performance.webkitNow).call(window.performance); |
+ else |
+ return Date.now(); |
+ } |
+ |
+ function createVideoWrappersForDocument() { |
+ var videos = document.querySelectorAll('video'); |
+ switch (videos.length) { |
+ case 0: |
+ throw new Error('Page has no videos.'); |
+ case 1: |
+ break; |
+ default: |
+ throw new Error('Page too many videos: ' + videos.length.toString()); |
+ } |
+ new VideoWrapper(videos[0]) |
+ } |
+ |
+ metrics = {}; |
+ window.__chromeProxyCreateVideoWrappers = createVideoWrappersForDocument; |
+ window.__chromeProxyVideoMetrics = metrics; |
+ window.__chromeProxyVideoLoaded = false; |
+ window.__chromeProxyVideoEnded = false; |
+})(); |