84 lines
2.8 KiB
JavaScript
84 lines
2.8 KiB
JavaScript
function printRectangle(canvas)
|
|
{
|
|
var context = canvas.getContext("2d");
|
|
context.fillStyle = canvas.color;
|
|
context.fillRect(0, 0, 100, 100);
|
|
setTimeout(() => printRectangle(canvas), 50);
|
|
}
|
|
|
|
function testCanvas(testName, canvas, isSame, count)
|
|
{
|
|
var array1 = canvas.getContext("2d").getImageData(20, 20, 60, 60).data;
|
|
if (count === undefined)
|
|
count = 0;
|
|
canvas2.getContext("2d").drawImage(video, 0 ,0);
|
|
array2 = canvas2.getContext("2d").getImageData(20, 20, 60, 60).data;
|
|
var isEqual = true;
|
|
for (var index = 0; index < array1.length; ++index) {
|
|
// Rough comparison since we are compressing data.
|
|
// This test still catches errors since we are going from green to blue to red.
|
|
if (Math.abs(array1[index] - array2[index]) > 100) {
|
|
isEqual = false;
|
|
continue;
|
|
}
|
|
}
|
|
if (isEqual === isSame)
|
|
return;
|
|
|
|
if (count === 200)
|
|
return Promise.reject(testName + " failed: tried " + count + " to get " + isSame + " but got " + isEqual);
|
|
|
|
return waitFor(50).then(() => {
|
|
return testCanvas(testName, canvas, isSame, ++count);
|
|
});
|
|
}
|
|
|
|
var canvas0Track;
|
|
var sender;
|
|
function doTest(test, setupOffer)
|
|
{
|
|
canvas0.color = "green";
|
|
printRectangle(canvas0);
|
|
const shouldMatchCanvas1AfterReplaceTrack = true;
|
|
return new Promise((resolve, reject) => {
|
|
createConnections((firstConnection) => {
|
|
var stream = canvas0.captureStream();
|
|
canvas0Track = stream.getVideoTracks()[0];
|
|
sender = firstConnection.addTrack(canvas0Track, stream);
|
|
}, (secondConnection) => {
|
|
secondConnection.ontrack = (trackEvent) => {
|
|
resolve(trackEvent.streams[0]);
|
|
};
|
|
}, { observeOffer : (offer) => {
|
|
offer.sdp = setupOffer(offer.sdp);
|
|
return offer;
|
|
}
|
|
});
|
|
setTimeout(() => reject("Test timed out"), 5000);
|
|
}).then((stream) => {
|
|
video.srcObject = stream;
|
|
return video.play();
|
|
}).then(() => {
|
|
return testCanvas("test1", canvas0, true);
|
|
}).then(() => {
|
|
canvas1.color = "blue";
|
|
printRectangle(canvas1);
|
|
var stream = canvas1.captureStream();
|
|
return sender.replaceTrack(stream.getVideoTracks()[0]);
|
|
}).then(() => {
|
|
return waitFor(200);
|
|
}).then(() => {
|
|
return testCanvas("test2", canvas1, shouldMatchCanvas1AfterReplaceTrack);
|
|
}).then(() => {
|
|
return testCanvas("test3", canvas0, !shouldMatchCanvas1AfterReplaceTrack);
|
|
}).then(() => {
|
|
return sender.replaceTrack(canvas0Track);
|
|
}).then(() => {
|
|
canvas0.color = "red";
|
|
// Let's wait for red color to be printed on canvas0
|
|
return waitFor(200);
|
|
}).then(() => {
|
|
return testCanvas("test4", canvas0, true);
|
|
});
|
|
}
|