| <!doctype html> |
| <html> |
| <head> |
| <meta charset="utf-8"> |
| <title>Testing video rotation</title> |
| </head> |
| <body> |
| <video style="z-index: 1; position: absolute; top: 0px; left: 0px;" id="video" autoplay playsInline></video> |
| <div style="z-index: 2; position: absolute; top: 5px; left: 0px; background-color:green; width:200px; height:390px"></div> |
| <image id='image'></image> |
| <canvas id='canvas'></canvas> |
| <div style="z-index: 3" id="log"></div> |
| <script> |
| |
| function getPixel(x, y, canvas, data) |
| { |
| const position = 4 * (x * canvas.width + y); |
| return {r: data[position], g: data[position+1], b: data[position+2]}; |
| } |
| |
| function isPixelGreen(x, y, canvas, data) |
| { |
| const pixel = getPixel(x, y, canvas, data); |
| return pixel.r === 0 && pixel.g === 128 && pixel.b === 0; |
| } |
| |
| function isPixelWhite(x, y, canvas, data) |
| { |
| const pixel = getPixel(x, y, canvas, data); |
| return pixel.r === 255 && pixel.g === 255 && pixel.b === 255; |
| } |
| |
| async function validateSnapshot() |
| { |
| const dataURL = await new Promise(resolve => testRunner.takeViewPortSnapshot(resolve)); |
| |
| const loadPromise = new Promise((resolve, reject) => { |
| image.onload = resolve; |
| image.onerror = reject; |
| setTimeout(() => reject("image load timed out"), 2000); |
| }); |
| image.src = dataURL; |
| await loadPromise; |
| |
| canvas.width = image.width; |
| canvas.height = image.height; |
| canvas.getContext('2d').drawImage(image, 0, 0); |
| const data = canvas.getContext('2d').getImageData(0, 0, canvas.width, canvas.height).data; |
| |
| // We expect to have a green horizontal line until getting some white. |
| let j = 100; |
| if (!isPixelGreen(100, j, canvas, data)) |
| return Promise.reject("first pixel is not green"); |
| |
| while (isPixelGreen(100, ++j, canvas, data)) { }; |
| |
| // We then expect a vertical line until the end of the canvas. |
| j = j + 5; |
| if (!isPixelWhite(100, j, canvas, data)) |
| return Promise.reject("did not find white pixel"); |
| |
| let i = 100; |
| while (++i < canvas.height && isPixelWhite(i, j, canvas, data)) { }; |
| |
| return i === canvas.height; |
| } |
| |
| async function waitFor(element, type) { |
| return new Promise(resolve => { |
| element.addEventListener(type, event => { |
| resolve(event); |
| }, { once: true }); |
| }); |
| } |
| |
| onload = async () => { |
| try { |
| video.srcObject = await navigator.mediaDevices.getUserMedia({video: {width: 400, height: 200} }); |
| await video.play(); |
| |
| if (!window.testRunner) |
| return; |
| |
| testRunner.setMockCameraOrientation(90); |
| let counter = 0; |
| while (video.videoWidth !== 200 && ++counter < 100) |
| await new Promise(resolve => setTimeout(resolve, 50)); |
| |
| await waitFor(video, 'timeupdate'); |
| counter = 0; |
| let isValidSnapshot = false; |
| do { |
| await new Promise(resolve => setTimeout(resolve, 50)); |
| try { |
| isValidSnapshot = await validateSnapshot(); |
| } catch (e) { } |
| } while (++counter < 100 && !isValidSnapshot) |
| |
| log.innerHTML = counter < 100 ? "PASS" : "FAIL"; |
| |
| if (counter < 100) |
| document.body.removeChild(image); |
| } catch (e) { |
| console.log(e); |
| } |
| |
| if (window.testRunner) |
| testRunner.notifyDone(); |
| } |
| if (window.testRunner) { |
| testRunner.dumpAsText(true); |
| testRunner.waitUntilDone(); |
| } |
| </script> |
| </body> |
| </html> |