blob: 3db731bd193575114a1f3a1ccb2c49ef3416676b [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="resources/webgl_test_files/resources/js-test-style.css"/>
<script src="resources/webgl_test_files/js/js-test-pre.js"></script>
<script src="resources/webgl_test_files/js/webgl-test-utils.js"></script>
</head>
<body onload="test()">
<div id="description"></div>
<div id="console"></div>
<script>
"use strict";
description("Test that WEBGL_lose_context functions do not crash after context has been lost.");
var wtu = WebGLTestUtils;
var gl;
async function waitForWebGLContextLost(canvas)
{
return new Promise((resolve, reject) => {
setTimeout(reject, 2000);
canvas.addEventListener("webglcontextlost", resolve, { once: true });
});
}
function testDescription(subcase) {
return Object.keys(subcase).map((k) => `${k}: ${typeof subcase[k] === "function" ? subcase[k].name : subcase[k]}`).join(", ");
}
async function runTest(subcase)
{
debug(`Running test: ${testDescription(subcase)}`);
const canvas = document.createElement("canvas");
canvas.width = 1;
canvas.height = 1;
gl = wtu.create3DContext(canvas);
const WEBGL_lose_context = wtu.getExtensionWithKnownPrefixes(gl, "WEBGL_lose_context");
if (!WEBGL_lose_context) {
debug("Could not find WEBGL_lose_context extension");
return false;
}
const webglcontextlost = waitForWebGLContextLost(canvas);
if (subcase.loseMethod == "loseContext")
WEBGL_lose_context.loseContext();
else if (subcase.loseMethod == "gpuStatusFailure") {
internals.simulateEventForWebGLContext("GPUStatusFailure", gl);
gl.clear(gl.COLOR_BUFFER_BIT);
} else if (subcase.loseMethod == "manyContexts") {
// This causes the older contexts to be lost, including the first one we created
// for testing.
for (let i = 0; i < 50; ++i)
document.createElement("canvas").getContext("webgl");
}
try {
await webglcontextlost;
testPassed("Got webglcontextlost.");
} catch (e) {
testFailed("Timed out waiting webglcontextlost.");
}
shouldBeTrue("gl.isContextLost()");
shouldBe("gl.getError()", "gl.CONTEXT_LOST_WEBGL");
shouldBe("gl.getError()", "gl.NO_ERROR");
if (subcase.testedMethod == "loseContext")
WEBGL_lose_context.loseContext();
else if (subcase.testedMethod == "restoreContext")
WEBGL_lose_context.restoreContext();
testPassed(`Did not crash on tested method ${subcase.testedMethod}.`);
}
const loseMethods = ["loseContext", "manyContexts"];
if (window.internals)
loseMethods.push("gpuStatusFailure");
const testedMethods = ["loseContext", "restoreContext"];
const subcases = [];
for (const loseMethod of loseMethods)
for (const testedMethod of testedMethods)
subcases.push({loseMethod, testedMethod});
async function test()
{
for (let subcase of subcases)
await runTest(subcase);
finishTest();
}
</script>
</body>
</html>