| Index: content/test/data/media/getusermedia.html
|
| diff --git a/content/test/data/media/getusermedia.html b/content/test/data/media/getusermedia.html
|
| index 4ef41543ad42091a75ad644dec5ce4d2c53b87e3..f42ce720fd43c84433d85478fd675b7c56903838 100644
|
| --- a/content/test/data/media/getusermedia.html
|
| +++ b/content/test/data/media/getusermedia.html
|
| @@ -6,10 +6,7 @@
|
| return document.getElementById(id);
|
| };
|
|
|
| - var gLocalStream = null;
|
| -
|
| setAllEventsOccuredHandler(function() {
|
| - gLocalStream.stop();
|
| reportTestSuccess();
|
| });
|
|
|
| @@ -26,7 +23,12 @@
|
| console.log('Calling getUserMediaAndStop.');
|
| navigator.webkitGetUserMedia(
|
| constraints,
|
| - function(stream) { displayAndDetectVideo(stream, stopVideoTrack); },
|
| + function(stream) {
|
| + detectVideoInLocalView1(stream, function() {
|
| + stream.getVideoTracks()[0].stop();
|
| + waitForVideoToStop('local-view-1');
|
| + });
|
| + },
|
| failedCallback);
|
| }
|
|
|
| @@ -45,13 +47,13 @@
|
| navigator.webkitGetUserMedia(
|
| constraints,
|
| function(stream) {
|
| - var s = stream.clone();
|
| + var duplicate = stream.clone();
|
| assertEquals(stream.getVideoTracks().length, 1);
|
| - assertEquals(s.getVideoTracks().length, 1);
|
| + assertEquals(duplicate.getVideoTracks().length, 1);
|
| assertNotEquals(stream.getVideoTracks()[0].id,
|
| - s.getVideoTracks()[0].id);
|
| - displayAndDetectVideo(
|
| - s,
|
| + duplicate.getVideoTracks()[0].id);
|
| + detectVideoInLocalView1(
|
| + stream,
|
| function() {
|
| reportTestSuccess();
|
| });
|
| @@ -64,13 +66,13 @@
|
| navigator.webkitGetUserMedia(
|
| constraints,
|
| function(stream) {
|
| - s = new webkitMediaStream(stream);
|
| + var duplicate = new webkitMediaStream(stream);
|
| assertEquals(stream.getVideoTracks().length, 1);
|
| - assertEquals(s.getVideoTracks().length, 1);
|
| + assertEquals(duplicate.getVideoTracks().length, 1);
|
| assertEquals(stream.getVideoTracks()[0].id,
|
| - s.getVideoTracks()[0].id);
|
| - displayAndDetectVideo(
|
| - s,
|
| + duplicate.getVideoTracks()[0].id);
|
| + detectVideoInLocalView1(
|
| + duplicate,
|
| function() {
|
| reportTestSuccess();
|
| });
|
| @@ -83,13 +85,14 @@
|
| navigator.webkitGetUserMedia(
|
| constraints,
|
| function(stream) {
|
| - s = new webkitMediaStream();
|
| - s.addTrack(stream.getVideoTracks()[0]);
|
| - assertEquals(s.getVideoTracks().length, 1);
|
| - assertEquals(s.getVideoTracks().length, 1);
|
| - assertEquals(stream.getVideoTracks()[0].id, s.getVideoTracks()[0].id);
|
| - displayAndDetectVideo(
|
| - s,
|
| + var duplicate = new webkitMediaStream();
|
| + duplicate.addTrack(stream.getVideoTracks()[0]);
|
| + assertEquals(duplicate.getVideoTracks().length, 1);
|
| + assertEquals(duplicate.getVideoTracks().length, 1);
|
| + assertEquals(stream.getVideoTracks()[0].id,
|
| + duplicate.getVideoTracks()[0].id);
|
| + detectVideoInLocalView1(
|
| + duplicate,
|
| function() {
|
| reportTestSuccess();
|
| });
|
| @@ -102,14 +105,14 @@
|
| navigator.webkitGetUserMedia(
|
| constraints,
|
| function(stream) {
|
| - s = new webkitMediaStream();
|
| - s.addTrack(stream.getVideoTracks()[0].clone());
|
| - assertEquals(s.getVideoTracks().length, 1);
|
| - assertEquals(s.getVideoTracks().length, 1);
|
| + var duplicate = new webkitMediaStream();
|
| + duplicate.addTrack(stream.getVideoTracks()[0].clone());
|
| + assertEquals(duplicate.getVideoTracks().length, 1);
|
| + assertEquals(duplicate.getVideoTracks().length, 1);
|
| assertNotEquals(stream.getVideoTracks()[0].id,
|
| - s.getVideoTracks()[0].id)
|
| - displayAndDetectVideo(
|
| - s,
|
| + duplicate.getVideoTracks()[0].id)
|
| + detectVideoInLocalView1(
|
| + duplicate,
|
| function() {
|
| reportTestSuccess();
|
| });
|
| @@ -118,13 +121,15 @@
|
| }
|
|
|
| // Creates a MediaStream and renders it locally. When the video is detected to
|
| - // be rolling we return ok-stream-running through the automation controller.
|
| - function getUserMediaAndGetStreamUp(constraints, waitTimeInSeconds) {
|
| + // be rolling we report success. The acquired stream is stored in window
|
| + // under the name |streamName|.
|
| + function getUserMediaAndGetStreamUp(constraints, streamName) {
|
| console.log('Calling getUserMediaAndGetStreamUp.');
|
| navigator.webkitGetUserMedia(
|
| constraints,
|
| function(stream) {
|
| - displayAndDetectVideo(
|
| + window[streamName] = stream;
|
| + detectVideoInLocalView1(
|
| stream,
|
| function() {
|
| reportTestSuccess();
|
| @@ -160,37 +165,47 @@
|
| // streams are detected to be rolling, we stop the local video tracks one at
|
| // the time.
|
| function twoGetUserMediaAndStop(constraints) {
|
| - console.log('Calling Two GetUserMedia');
|
| + // TODO(phoglund): make gUM requests in parallel; this test is too slow
|
| + // and flakes on slow bots (http://crbug.com/417756). The current cycle of
|
| + // detect - gum - detect - gum - stop - detect - stop - detect contains too
|
| + // many detection phases. On bots with GPU emulation this looks to be really
|
| + // slow, so I was thinking we could at least get video up for both streams
|
| + // simultaneously and thereby run the first two detects in parallel.
|
| + var stream1 = null;
|
| + var stream2 = null;
|
| navigator.webkitGetUserMedia(
|
| constraints,
|
| function(stream) {
|
| - displayAndDetectVideo(stream, requestSecondGetUserMedia);
|
| + stream1 = stream;
|
| + detectVideoInLocalView1(stream, requestSecondGetUserMedia);
|
| },
|
| failedCallback);
|
| var requestSecondGetUserMedia = function() {
|
| navigator.webkitGetUserMedia(
|
| constraints,
|
| function(stream) {
|
| - displayIntoVideoElement(stream,
|
| - function() {
|
| - stopBothVideoTracksAndVerify(stream);
|
| - },
|
| - 'local-view-2');
|
| + stream2 = stream;
|
| + attachMediaStream(stream, 'local-view-2');
|
| + detectVideoPlaying('local-view-2', stopBothVideoTracksAndVerify);
|
| },
|
| failedCallback);
|
| };
|
|
|
| - var stopBothVideoTracksAndVerify = function(streamPlayingInLocalView2) {
|
| - streamPlayingInLocalView2.getVideoTracks()[0].stop();
|
| + var stopBothVideoTracksAndVerify = function() {
|
| + // Stop track 2, ensure that stops track 2 but not track 1, then stop
|
| + // track 1.
|
| + stream2.getVideoTracks()[0].stop();
|
| + waitForVideoToStop('local-view-1');
|
| waitForVideoToStop('local-view-2');
|
| - // Make sure the video track in gLocalStream is still playing in
|
| - // 'local-view1' and then stop it.
|
| - displayAndDetectVideo(gLocalStream, stopVideoTrack);
|
| + detectVideoInLocalView1(stream1, function() {
|
| + stream1.getVideoTracks()[0].stop();
|
| + });
|
| };
|
| }
|
|
|
| function twoGetUserMedia(constraints1,
|
| constraints2) {
|
| + // TODO(phoglund): see TODO on twoGetUserMediaAndStop.
|
| var result="";
|
| navigator.webkitGetUserMedia(
|
| constraints1,
|
| @@ -201,7 +216,7 @@
|
| result = aspectRatio;
|
| requestSecondGetUserMedia();
|
| },
|
| - 'local-view');
|
| + 'local-view-1');
|
| },
|
| failedCallback);
|
| var requestSecondGetUserMedia = function() {
|
| @@ -226,6 +241,7 @@
|
| constraints2,
|
| expected_frame_rate1,
|
| expected_frame_rate2) {
|
| + // TODO(phoglund): see TODO on twoGetUserMediaAndStop.
|
| addExpectedEvent();
|
| addExpectedEvent();
|
| var validateFrameRateCallback = function (success) {
|
| @@ -238,10 +254,10 @@
|
| constraints1,
|
| function(stream) {
|
| requestSecondGetUserMedia();
|
| - plugStreamIntoVideoElement(stream, 'local-view');
|
| - detectVideoPlaying('local-view',
|
| + attachMediaStream(stream, 'local-view-1');
|
| + detectVideoPlaying('local-view-1',
|
| function() {
|
| - validateFrameRate('local-view', expected_frame_rate1,
|
| + validateFrameRate('local-view-1', expected_frame_rate1,
|
| validateFrameRateCallback);
|
| });
|
| },
|
| @@ -250,7 +266,7 @@
|
| navigator.webkitGetUserMedia(
|
| constraints2,
|
| function(stream) {
|
| - plugStreamIntoVideoElement(stream, 'local-view-2');
|
| + attachMediaStream(stream, 'local-view-2');
|
| detectVideoPlaying('local-view-2',
|
| function() {
|
| validateFrameRate('local-view-2', expected_frame_rate2,
|
| @@ -265,19 +281,14 @@
|
| failTest('GetUserMedia call failed with code ' + error.code);
|
| }
|
|
|
| - function plugStreamIntoVideoElement(stream, videoElement) {
|
| - gLocalStream = stream;
|
| + function attachMediaStream(stream, videoElement) {
|
| var localStreamUrl = URL.createObjectURL(stream);
|
| $(videoElement).src = localStreamUrl;
|
| }
|
|
|
| - function displayIntoVideoElement(stream, callback, videoElement) {
|
| - plugStreamIntoVideoElement(stream, videoElement);
|
| - detectVideoPlaying(videoElement, callback);
|
| - }
|
| -
|
| - function displayAndDetectVideo(stream, callback) {
|
| - displayIntoVideoElement(stream, callback, 'local-view');
|
| + function detectVideoInLocalView1(stream, callback) {
|
| + attachMediaStream(stream, 'local-view-1');
|
| + detectVideoPlaying('local-view-1', callback);
|
| }
|
|
|
| function displayDetectAndAnalyzeVideo(stream) {
|
| @@ -285,41 +296,37 @@
|
| function(aspectRatio) {
|
| sendValueToTest(aspectRatio);
|
| },
|
| - 'local-view');
|
| + 'local-view-1');
|
| }
|
|
|
| function displayDetectAndAnalyzeVideoInElement(
|
| stream, callback, videoElement) {
|
| - plugStreamIntoVideoElement(stream, videoElement);
|
| + attachMediaStream(stream, videoElement);
|
| detectAspectRatio(callback, videoElement);
|
| }
|
|
|
| function createAndRenderClone(stream) {
|
| - gLocalStream = stream;
|
| // TODO(perkj): --use-fake-device-for-media-stream do not currently
|
| // work with audio devices and not all bots has a microphone.
|
| - new_stream = new webkitMediaStream();
|
| - new_stream.addTrack(stream.getVideoTracks()[0]);
|
| - assertEquals(new_stream.getVideoTracks().length, 1);
|
| + newStream = new webkitMediaStream();
|
| + newStream.addTrack(stream.getVideoTracks()[0]);
|
| + assertEquals(newStream.getVideoTracks().length, 1);
|
| if (stream.getAudioTracks().length > 0) {
|
| - new_stream.addTrack(stream.getAudioTracks()[0]);
|
| - assertEquals(new_stream.getAudioTracks().length, 1);
|
| - new_stream.removeTrack(new_stream.getAudioTracks()[0]);
|
| - assertEquals(new_stream.getAudioTracks().length, 0);
|
| + newStream.addTrack(stream.getAudioTracks()[0]);
|
| + assertEquals(newStream.getAudioTracks().length, 1);
|
| + newStream.removeTrack(newStream.getAudioTracks()[0]);
|
| + assertEquals(newStream.getAudioTracks().length, 0);
|
| }
|
|
|
| - var newStreamUrl = URL.createObjectURL(new_stream);
|
| - $('local-view').src = newStreamUrl;
|
| - waitForVideo('local-view');
|
| - }
|
| -
|
| - function stopVideoTrack() {
|
| - gLocalStream.getVideoTracks()[0].stop();
|
| - waitForVideoToStop('local-view');
|
| + detectVideoInLocalView1(newStream, reportTestSuccess);
|
| }
|
|
|
| - function waitAndStopVideoTrack(waitTimeInSeconds) {
|
| - setTimeout(stopVideoTrack, waitTimeInSeconds * 1000);
|
| + // Calls stop on |stream|'s video track after a delay and reports success.
|
| + function waitAndStopVideoTrack(stream, waitTimeInSeconds) {
|
| + setTimeout(function() {
|
| + stream.getVideoTracks()[0].stop();
|
| + reportTestSuccess();
|
| + }, waitTimeInSeconds * 1000);
|
| }
|
|
|
| // This test make sure multiple video renderers can be created for the same
|
| @@ -448,17 +455,17 @@
|
| </head>
|
| <body>
|
| <table border="0">
|
| + <!-- Canvases are named after their corresponding video elements. -->
|
| <tr>
|
| - <td><video width="320" height="240" id="local-view"
|
| - autoplay="autoplay" style="display:none"></video></td>
|
| - <td><canvas id="local-view-canvas"
|
| + <td><video id="local-view-1" width="320" height="240" autoplay
|
| + style="display:none"></video></td>
|
| + <td><canvas id="local-view-1-canvas" width="320" height="240"
|
| style="display:none"></canvas></td>
|
| </tr>
|
| <tr>
|
| - <td><video width="320" height="240" id="local-view-2"
|
| - autoplay style="display:none"></video></td>
|
| - <!-- Canvases are named after their corresponding video elements. -->
|
| - <td><canvas width="320" height="240" id="local-view-2-canvas"
|
| + <td><video id="local-view-2" width="320" height="240" autoplay
|
| + style="display:none"></video></td>
|
| + <td><canvas id="local-view-2-canvas" width="320" height="240"
|
| style="display:none"></canvas></td>
|
| </tr>
|
| </table>
|
|
|