| Index: content/test/data/media/getusermedia_and_stop.html
|
| diff --git a/content/test/data/media/getusermedia_and_stop.html b/content/test/data/media/getusermedia_and_stop.html
|
| index f1c43bef012ea30a1bfd607e34e4b080ea8b2e17..ba562f11b7210d5699a9a3d60ca11acb0d44564c 100644
|
| --- a/content/test/data/media/getusermedia_and_stop.html
|
| +++ b/content/test/data/media/getusermedia_and_stop.html
|
| @@ -1,6 +1,30 @@
|
| <html>
|
| <head>
|
| <script type="text/javascript">
|
| + $ = function(id) {
|
| + return document.getElementById(id);
|
| + };
|
| +
|
| + // These must match with how the video and canvas tags are declared in html.
|
| + const VIDEO_TAG_WIDTH = 320;
|
| + const VIDEO_TAG_HEIGHT = 240;
|
| +
|
| + // Number of test events to occur before the test pass. When the test pass,
|
| + // the document title change to OK.
|
| + var gNumberOfExpectedEvents = 0;
|
| +
|
| + // Number of events that currently have occurred.
|
| + var gNumberOfEvents = 0;
|
| +
|
| + var gLocalStream = null;
|
| +
|
| + // This test that a MediaStream can be cloned and that the clone can
|
| + // be rendered.
|
| + function createCloneStream() {
|
| + navigator.webkitGetUserMedia({video: true, audio: true},
|
| + createAndRenderClone, failedCallback);
|
| + }
|
| +
|
| function getUserMedia(constraints) {
|
| navigator.webkitGetUserMedia(constraints, okCallback, failedCallback);
|
| }
|
| @@ -10,9 +34,101 @@
|
| }
|
|
|
| function okCallback(stream) {
|
| - stream.stop();
|
| - document.title = 'OK';
|
| + gLocalStream = stream;
|
| + waitForVideo('local-view');
|
| + var localStreamUrl = webkitURL.createObjectURL(stream);
|
| + $('local-view').src = localStreamUrl;
|
| + }
|
| +
|
| + function createAndRenderClone(stream) {
|
| + gLocalStream = stream;
|
| + waitForVideo('local-view');
|
| +
|
| + var new_stream = new webkitMediaStream(stream.getAudioTracks());
|
| + expectEquals(new_stream.getAudioTracks().length, 1);
|
| + new_stream.addTrack(stream.getVideoTracks()[0]);
|
| + expectEquals(new_stream.getVideoTracks().length, 1);
|
| + new_stream.removeTrack(new_stream.getAudioTracks()[0]);
|
| + expectEquals(new_stream.getAudioTracks().length, 0);
|
| +
|
| + var newStreamUrl = webkitURL.createObjectURL(new_stream);
|
| + $('local-view').src = newStreamUrl;
|
| + }
|
| +
|
| +
|
| + function detectVideoIn(videoElementName, callback) {
|
| + var width = VIDEO_TAG_WIDTH;
|
| + var height = VIDEO_TAG_HEIGHT;
|
| + var videoElement = $(videoElementName);
|
| + var canvas = $(videoElementName + '-canvas');
|
| + var waitVideo = setInterval(function() {
|
| + var context = canvas.getContext('2d');
|
| + context.drawImage(videoElement, 0, 0, width, height);
|
| + var pixels = context.getImageData(0, 0, width, height).data;
|
| +
|
| + if (isVideoPlaying(pixels, width, height)) {
|
| + clearInterval(waitVideo);
|
| + callback();
|
| + }
|
| + }, 100);
|
| + }
|
| +
|
| + function waitForVideo(videoElement) {
|
| + document.title = 'Waiting for video...';
|
| + addExpectedEvent();
|
| + detectVideoIn(videoElement, function () { eventOccured(); });
|
| + }
|
| +
|
| + function addExpectedEvent() {
|
| + ++gNumberOfExpectedEvents;
|
| + }
|
| +
|
| + function eventOccured() {
|
| + ++gNumberOfEvents;
|
| + if (gNumberOfEvents == gNumberOfExpectedEvents) {
|
| + gLocalStream.stop();
|
| + document.title = 'OK';
|
| + }
|
| + }
|
| +
|
| + // This very basic video verification algorithm will be satisfied if any
|
| + // pixels are nonzero in a small sample area in the middle. It relies on the
|
| + // assumption that a video element with null source just presents zeroes.
|
| + function isVideoPlaying(pixels, width, height) {
|
| + // Sample somewhere near the middle of the image.
|
| + var middle = width * height / 2;
|
| + for (var i = 0; i < 20; i++) {
|
| + if (pixels[middle + i] > 0) {
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + // This function matches |left| and |right| and throws an exception if the
|
| + // values don't match.
|
| + function expectEquals(left, right) {
|
| + if (left != right) {
|
| + var s = "expectEquals failed left: " + left + " right: " + right;
|
| + document.title = s;
|
| + throw s;
|
| + }
|
| }
|
| - </script>
|
| +
|
| + </script>
|
| </head>
|
| +<body>
|
| + <table border="0">
|
| + <tr>
|
| + <td>Local Preview</td>
|
| + </tr>
|
| + <tr>
|
| + <td><video width="320" height="240" id="local-view"
|
| + autoplay="autoplay"></video></td>
|
| + <!-- Canvases are named after their corresponding video elements. -->
|
| + <td><canvas width="320" height="240" id="local-view-canvas"
|
| + style="display:none"></canvas></td>
|
| + </tr>
|
| + </table>
|
| +</body>
|
| </html>
|
|
|