9e21d37e3d422d8c91d1b7ec53bfe87e4cd3abaf
[WebKit-https.git] / LayoutTests / fast / mediastream / MediaStream-video-element-video-tracks-disabled-then-enabled.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4     <script src="../../resources/js-test-pre.js"></script>
5     <script src="./resources/getUserMedia-helper.js"></script>
6 </head>
7 <body onload="start()">
8 <p id="description"></p>
9 <div id="console"></div>
10 <video controls width="680" height="360"></video>
11 <canvas width="680" height="360"></canvas>
12 <script>
13     let canvas;
14     let context;
15     let mediaStream;
16     let video;
17     let havePlayed = false;
18     
19     let buffer;
20
21     function isPixelBlack(pixel)
22     {
23         return pixel[0] === 0 && pixel[1] === 0 && pixel[2] === 0 && pixel[3] === 255;
24     }
25
26     function isPixelTransparent(pixel)
27     {
28         return pixel[0] === 0 && pixel[1] === 0 && pixel[2] === 0 && pixel[3] === 0;
29     }
30
31     function isPixelWhite(pixel)
32     {
33         return pixel[0] === 255 && pixel[1] === 255 && pixel[2] === 255 && pixel[3] === 255;
34     }
35
36     function canvasShouldBeBlack()
37     {
38         return !(mediaStream.getVideoTracks()[0].enabled && havePlayed);
39     }
40     
41     function attempt(numberOfTries, call, callback)
42     {
43         if (numberOfTries <= 0) {
44             testFailed('Pixel check did not succeed after multiple tries.');
45             return;
46         }
47
48         let attemptSucceeded = call();
49         if (attemptSucceeded) {
50             testPassed(canvasShouldBeBlack() ? 'pixel was black.' : 'pixel was white.');
51             callback();
52
53             return;
54         }
55         
56         setTimeout(() => { attempt(--numberOfTries, call, callback); }, 50);
57     }
58
59     function repeatWithVideoPlayingAndFinishTest()
60     {
61         if (video.paused) {
62             debug('<br> ===== play video =====');
63             evalAndLog('video.play()');
64             havePlayed = true;
65             beginTestRound();
66         } else {
67             debug('');
68             video.pause();
69             finishJSTest();
70         }
71     }
72
73     function reenableTrack()
74     {
75         mediaStream.getVideoTracks()[0].enabled = true;
76         debug(`<br> === video track reenabled, should${havePlayed ? "" : " NOT"} render current frame ===`);
77
78         // The video is not guaranteed to render non-black frames before the canvas is drawn to and the pixels are checked.
79         // A timeout is used to ensure that the pixel check is done after the video renders non-black frames.
80         attempt(10, checkPixels, repeatWithVideoPlayingAndFinishTest);
81     }
82
83     function checkPixels()
84     {
85         context.clearRect(0, 0, canvas.width, canvas.height);
86         buffer = context.getImageData(30, 242, 1, 1).data;
87         if (!isPixelTransparent(buffer))
88             testFailed('pixel was not transparent after clearing canvas.');
89
90         context.drawImage(video, 0, 0, canvas.width, canvas.height);
91         buffer = context.getImageData(30, 242, 1, 1).data;
92
93         if (!canvasShouldBeBlack())
94             return isPixelWhite(buffer);
95         else
96             return isPixelBlack(buffer);
97     }
98
99     function disableAllTracks()
100     {
101         mediaStream.getVideoTracks()[0].enabled = false;
102         debug('<br> === all video tracks disabled ===');
103         
104         // The video is not guaranteed to render black frames before the canvas is drawn to and the pixels are checked.
105         // A timeout is used to ensure that the pixel check is done after the video renders black frames.
106         attempt(10, checkPixels, reenableTrack);
107     }
108
109     function beginTestRound()
110     {
111         debug('<br> === beginning round of pixel tests ===');
112         attempt(10, checkPixels, disableAllTracks);
113     }
114
115     function canplay()
116     {
117         canvas = document.querySelector('canvas');
118         context = canvas.getContext('2d');
119
120         beginTestRound();
121     }
122
123     function start()
124     {
125         description("Tests that re-enabling a video MediaStreamTrack when all tracks were previously disabled causes captured media to display.");
126
127         video = document.querySelector('video');
128         video.addEventListener('canplay', canplay);
129
130         getUserMedia("allow", {video:true}, setupVideoElementWithStream);
131     }
132
133     window.jsTestIsAsync = true;
134 </script>
135 <script src="../../resources/js-test-post.js"></script>
136 </body>
137 </html>