зеркало из https://github.com/mozilla/gecko-dev.git
149 строки
4.0 KiB
HTML
149 строки
4.0 KiB
HTML
<!DOCTYPE HTML>
|
|
<html>
|
|
<!--
|
|
https://bugzilla.mozilla.org/show_bug.cgi?id=1041393
|
|
-->
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>ImageCapture tests</title>
|
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
|
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
<script type="text/javascript" src="gUM_support.js"></script>
|
|
</head>
|
|
<body>
|
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1041393">ImageCapture tests</a>
|
|
<script type="application/javascript">
|
|
|
|
let repeat = 100;
|
|
let count;
|
|
|
|
// Check if the callback returns even no JS reference on it.
|
|
function gcTest(track) {
|
|
return new Promise(function(resolve, reject) {
|
|
count = 0;
|
|
let i;
|
|
let imageCapture;
|
|
for(i = 0; i < repeat; i++) {
|
|
imageCapture = new ImageCapture(track);
|
|
imageCapture.onphoto = function(blob) {
|
|
count++;
|
|
if (count == repeat) {
|
|
ok(true, "pass gc testing");
|
|
resolve(track);
|
|
}
|
|
};
|
|
imageCapture.onerror = function(error) {
|
|
ok(false, "takePhoto failure in gc testing");
|
|
reject();
|
|
};
|
|
|
|
imageCapture.takePhoto();
|
|
}
|
|
info("Call gc ");
|
|
SpecialPowers.gc();
|
|
});
|
|
}
|
|
|
|
// Continue calling takePhoto() in rapid succession.
|
|
function rapidTest(track) {
|
|
return new Promise(function(resolve, reject) {
|
|
let imageCapture = new ImageCapture(track);
|
|
imageCapture.onphoto = function(blob) {
|
|
count++;
|
|
if (count == repeat) {
|
|
ok(true, "pass raipd takePhoto() testing");
|
|
resolve(track);
|
|
}
|
|
};
|
|
imageCapture.onerror = function(error) {
|
|
ok(false, "takePhoto() failure in rapid testing");
|
|
reject();
|
|
};
|
|
|
|
count = 0;
|
|
let i;
|
|
for(i = 0; i < repeat; i++) {
|
|
imageCapture.takePhoto();
|
|
}
|
|
});
|
|
}
|
|
|
|
// Check if the blob is decodable.
|
|
function blobTest(track) {
|
|
return new Promise(function(resolve, reject) {
|
|
let imageCapture = new ImageCapture(track);
|
|
imageCapture.onphoto = function(blob) {
|
|
let img = new Image();
|
|
img.onerror = function() {
|
|
ok(false, "fail to decode blob");
|
|
reject();
|
|
};
|
|
img.onload = function() {
|
|
ok(true, "decode blob success");
|
|
resolve(track);
|
|
};
|
|
img.src = URL.createObjectURL(blob.data);
|
|
};
|
|
imageCapture.onerror = function(error) {
|
|
ok(false, "fail to capture image");
|
|
};
|
|
|
|
imageCapture.takePhoto();
|
|
});
|
|
}
|
|
|
|
// It should return an error event after disabling video track.
|
|
function trackTest(track) {
|
|
return new Promise(function(resolve, reject) {
|
|
let imageCapture = new ImageCapture(track);
|
|
imageCapture.onphoto = function(blob) {
|
|
ok(false, "expect error when video track is disable");
|
|
reject();
|
|
};
|
|
imageCapture.onerror = function(error) {
|
|
ok(error.imageCaptureError.code == error.imageCaptureError.PHOTO_ERROR, "error code is PHOTO_ERROR")
|
|
track.enabled = true;
|
|
resolve(track);
|
|
};
|
|
|
|
track.enabled = false;
|
|
imageCapture.takePhoto();
|
|
});
|
|
}
|
|
|
|
async function init() {
|
|
// use loopback camera if available, otherwise fake, MediaStreamGraph will be the backend of ImageCapture.
|
|
await setupGetUserMediaTestPrefs();
|
|
let stream = await navigator.mediaDevices.getUserMedia({video: true});
|
|
return stream.getVideoTracks()[0];
|
|
}
|
|
|
|
async function start() {
|
|
try {
|
|
let track = await init();
|
|
info("ImageCapture track disable test.");
|
|
track = await trackTest(track);
|
|
info("ImageCapture blob test.");
|
|
track = await blobTest(track);
|
|
info("ImageCapture rapid takePhoto() test.");
|
|
track = await rapidTest(track);
|
|
info("ImageCapture multiple instances test.");
|
|
await gcTest(track);
|
|
} catch (e) {
|
|
ok(false, "Unexpected error during test: " + e);
|
|
} finally {
|
|
SimpleTest.finish();
|
|
}
|
|
}
|
|
|
|
SimpleTest.requestCompleteLog();
|
|
SimpleTest.waitForExplicitFinish();
|
|
|
|
SpecialPowers.pushPrefEnv({"set": [["dom.imagecapture.enabled", true],
|
|
["media.navigator.permission.disabled", true]
|
|
]}, start);
|
|
</script>
|
|
</pre>
|
|
</body>
|
|
</html>
|