Roll src/third_party/WebKit d9c6159:8139f33 (svn 201974:201975)
[chromium-blink-merge.git] / chrome / test / data / webrtc / webrtc_test_utilities.js
blob5dbca62837ad9f94869f1ae02825d5a9a656a7f0
1 // Copyright (c) 2015 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.
5 // This file contains duplicated functions in of
6 // content/test/data/media/webrtc_test_utilities.js
7 // TODO(phoglund): Eliminate this copy and rewrite the
8 // WebRtcBrowserTest.TestVgaReturnsTwoSimulcastStreams test to use the browser
9 // tests style instead.
11 // These must match with how the video and canvas tags are declared in html.
12 const VIDEO_TAG_WIDTH = 320;
13 const VIDEO_TAG_HEIGHT = 240;
15 // Number of test events to occur before the test pass. When the test pass,
16 // the function gAllEventsOccured is called.
17 var gNumberOfExpectedEvents = 0;
19 // Number of events that currently have occurred.
20 var gNumberOfEvents = 0;
22 var gAllEventsOccured = function () {};
24 // Use this function to set a function that will be called once all expected
25 // events has occurred.
26 function setAllEventsOccuredHandler(handler) {
27   gAllEventsOccured = handler;
30 // See comments on waitForVideo.
31 function detectVideoIn(videoElementName, callback) {
32   var width = VIDEO_TAG_WIDTH;
33   var height = VIDEO_TAG_HEIGHT;
34   var videoElement = $(videoElementName);
35   var canvas = $(videoElementName + '-canvas');
36   var waitVideo = setInterval(function() {
37     var context = canvas.getContext('2d');
38     context.drawImage(videoElement, 0, 0, width, height);
39     var pixels = context.getImageData(0, 0, width, height).data;
41     if (isVideoPlaying(pixels, width, height)) {
42       clearInterval(waitVideo);
43       callback();
44     }
45   }, 100);
48 /**
49  * Blocks test success until the provided videoElement has playing video.
50  *
51  * @param videoElementName The id of the video element. There must also be a
52  *     canvas somewhere in the DOM tree with the id |videoElementName|-canvas.
53  * @param callback The callback to call.
54  */
55 function waitForVideo(videoElement) {
56   document.title = 'Waiting for video...';
57   addExpectedEvent();
58   detectVideoIn(videoElement, function () { eventOccured(); });
61 /**
62  * Blocks test success until the provided peerconnection reports the signaling
63  * state 'stable'.
64  *
65  * @param peerConnection The peer connection to look at.
66  */
67 function waitForConnectionToStabilize(peerConnection) {
68   addExpectedEvent();
69   var waitForStabilization = setInterval(function() {
70     if (peerConnection.signalingState == 'stable') {
71       clearInterval(waitForStabilization);
72       eventOccured();
73     }
74   }, 100);
77 /**
78  * Adds an expectation for an event to occur at some later point. You may call
79  * this several times per test, which will each add an expected event. Once all
80  * events have occurred, we'll call the "all events occurred" handler which will
81  * generally succeed the test or move the test to the next phase.
82  */
83 function addExpectedEvent() {
84   ++gNumberOfExpectedEvents;
87 // See comment on addExpectedEvent.
88 function eventOccured() {
89   ++gNumberOfEvents;
90   if (gNumberOfEvents == gNumberOfExpectedEvents) {
91     gAllEventsOccured();
92   }
95 // This very basic video verification algorithm will be satisfied if any
96 // pixels are nonzero in a small sample area in the middle. It relies on the
97 // assumption that a video element with null source just presents zeroes.
98 function isVideoPlaying(pixels, width, height) {
99   // Sample somewhere near the middle of the image.
100   var middle = width * height / 2;
101   for (var i = 0; i < 20; i++) {
102     if (pixels[middle + i] > 0) {
103       return true;
104     }
105   }
106   return false;