| Index: chrome/test/data/extensions/api_test/tab_capture/end_to_end.js
|
| diff --git a/chrome/test/data/extensions/api_test/tab_capture/end_to_end.js b/chrome/test/data/extensions/api_test/tab_capture/end_to_end.js
|
| index ba449bdf9dc749b891209f99b379a11a7cbfea99..087eddfc1f2316c104f264f1260b0e24352519be 100644
|
| --- a/chrome/test/data/extensions/api_test/tab_capture/end_to_end.js
|
| +++ b/chrome/test/data/extensions/api_test/tab_capture/end_to_end.js
|
| @@ -5,7 +5,7 @@
|
| // The tests here cover the end-to-end functionality of tab capturing and
|
| // playback as video. The page generates video test patterns that rotate
|
| // cyclicly, and the rendering output of the tab is captured into a
|
| -// LocalMediaStream. This stream is then piped into a video element for
|
| +// local MediaStream. This stream is then piped into a video element for
|
| // playback, and a canvas is used to examine the frames of the video for
|
| // expected content. The stream may be plumbed one of two ways, depending on
|
| // the 'method' query param:
|
| @@ -13,6 +13,12 @@
|
| // local: LocalMediaStream --> DOM Video Element
|
| // webrtc: LocalMediaStream --> PeerConnection (sender)
|
| // --> PeerConnection (receiver) --> DOM Video Element
|
| +//
|
| +// There are two rounds of testing: In each round, video frames are received and
|
| +// monitored, and the round successfully completes once each of the expected
|
| +// patterns is observed. Between the two rounds, the MediaStream is disconnected
|
| +// from its consumer, which places the tab capture "device" into a suspend mode.
|
| +var testRoundNumber = 0;
|
|
|
| // The test pattern cycles as a color fill of red, then green, then blue.
|
| var colors = [ [ 255, 0, 0 ], [ 0, 255, 0 ], [ 0, 0, 255 ] ];
|
| @@ -78,16 +84,19 @@ function renderTestPatternLoop() {
|
| if (curIdx >= colors.length) { // Completed a cycle.
|
| curIdx = 0;
|
| // Increase the wait time between switching test patterns for overloaded
|
| - // bots that aren't capturing all the frames of video.
|
| - this.stepTimeMillis *= 1.25;
|
| + // bots that aren't capturing all the frames of video. Only do this for
|
| + // the first test phase, since increases shouldn't be needed after that.
|
| + if (testRoundNumber == 0) {
|
| + this.stepTimeMillis *= 1.25;
|
| + }
|
| }
|
| this.nextSteppingAt = now + this.stepTimeMillis;
|
| }
|
| }
|
|
|
| function waitForExpectedColors(colorDeviation) {
|
| - // If needed, create the video and canvas elements, but no need to append them
|
| - // to the DOM.
|
| + // At the start of a round of testing, create the video and canvas elements,
|
| + // but no need to append them to the DOM.
|
| if (!this.video) {
|
| this.video = document.createElement("video");
|
| this.video.width = width;
|
| @@ -119,15 +128,39 @@ function waitForExpectedColors(colorDeviation) {
|
| if (Math.abs(pixel[0] - curColor[0]) <= colorDeviation &&
|
| Math.abs(pixel[1] - curColor[1]) <= colorDeviation &&
|
| Math.abs(pixel[2] - curColor[2]) <= colorDeviation) {
|
| - console.debug("Observed expected color RGB(" + curColor +
|
| - ") in the video as RGB(" + pixel + ")");
|
| + console.debug(`${testRoundNumber == 0 ? 'First' : 'Second'} round: ` +
|
| + `Observed expected color RGB(${curColor}) in the video as ` +
|
| + `RGB(${pixel})`);
|
| expectedColors.splice(i, 1);
|
| }
|
| }
|
| }
|
|
|
| if (expectedColors.length == 0) {
|
| - chrome.test.succeed();
|
| + // Successful end of the current test round. If the first round, sleep, then
|
| + // execute the second round. If the second round, then the whole test has
|
| + // succeeded.
|
| + if (testRoundNumber == 0) {
|
| + // Destroy the video, which will disconnect the consumer of the
|
| + // MediaStream.
|
| + this.video.removeEventListener("error", chrome.test.fail);
|
| + this.video.src = '';
|
| + this.video = null;
|
| +
|
| + // Wait one second, then execute the second round of testing. This tests
|
| + // the suspend/resume functionality of tab capture (w.r.t. a MediaStream
|
| + // having no consumers, and then being re-used with a new consumer).
|
| + console.debug('First round succeeded! Now testing suspend/resume...');
|
| + setTimeout(function() {
|
| + ++testRoundNumber;
|
| + for (const color of colors) {
|
| + expectedColors.push(color);
|
| + }
|
| + waitForExpectedColors(colorDeviation);
|
| + }, 1000);
|
| + } else {
|
| + chrome.test.succeed();
|
| + }
|
| } else {
|
| setTimeout(function () { waitForExpectedColors(colorDeviation); },
|
| 1000 / frameRate);
|
|
|