| Index: third_party/WebKit/LayoutTests/fast/canvas/webgl/offscreenCanvas-context-lost-restored-worker.html
|
| diff --git a/third_party/WebKit/LayoutTests/fast/canvas/webgl/offscreenCanvas-context-lost-restored-worker.html b/third_party/WebKit/LayoutTests/fast/canvas/webgl/offscreenCanvas-context-lost-restored-worker.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..871a306f870907fb40d49e648e1338f92a040bab
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/fast/canvas/webgl/offscreenCanvas-context-lost-restored-worker.html
|
| @@ -0,0 +1,127 @@
|
| +<!DOCTYPE html>
|
| +<html>
|
| +<head>
|
| +<script src="../../../resources/testharness.js"></script>
|
| +<script src="../../../resources/testharnessreport.js"></script>
|
| +<script src="./resources/webgl-test-utils-full.js"></script>
|
| +</head>
|
| +
|
| +<script id="myWorker" type="text/worker">
|
| +var canvas;
|
| +var gl;
|
| +var WEBGL_lose_context;
|
| +var allowRestore;
|
| +var contextLostEventFired;
|
| +var contextRestoredEventFired;
|
| +// Make everything in results true for easy testing
|
| +var results = [];
|
| +
|
| +function setupTest()
|
| +{
|
| + canvas = new OffscreenCanvas(10, 10);
|
| + gl = canvas.getContext('webgl');
|
| + WEBGL_lose_context = gl.getExtension("WEBGL_lose_context");
|
| +}
|
| +
|
| +function testOriginalContext()
|
| +{
|
| + results.push(!gl.isContextLost());
|
| + results.push(gl.getError() == gl.NO_ERROR);
|
| +}
|
| +
|
| +function testLostContext(e)
|
| +{
|
| + results.push(!contextLostEventFired);
|
| + contextLostEventFired = true;
|
| + results.push(gl.isContextLost());
|
| + results.push(gl.getError() == gl.NO_ERROR);
|
| + if (allowRestore)
|
| + e.preventDefault();
|
| +}
|
| +
|
| +function testShouldNotRestoreContext(e)
|
| +{
|
| + // Should not restore the context unless preventDefault is called on the context lost event
|
| + results.push(false);
|
| +}
|
| +
|
| +function compareGLError(glError, evalStr) {
|
| + var exception;
|
| + try {
|
| + eval(evalStr);
|
| + } catch(e) {
|
| + exception = e;
|
| + }
|
| + if (exception) {
|
| + return false;
|
| + } else {
|
| + if (gl.getError() == glError)
|
| + return true;
|
| + return false;
|
| + }
|
| +}
|
| +
|
| +function testRestoredContext() {
|
| + results.push(!contextRestoredEventFired);
|
| + contextRestoredEventFired = true;
|
| + results.push(!gl.isContextLost());
|
| + results.push(gl.getError() == gl.NO_ERROR);
|
| +}
|
| +
|
| +self.onmessage = function(e) {
|
| + setupTest();
|
| + testOriginalContext();
|
| +
|
| + canvas.addEventListener("webglcontextrestored", testShouldNotRestoreContext);
|
| + canvas.addEventListener("webglcontextlost", function(e) {
|
| + testLostContext(e);
|
| + // restore the context after this event has exited.
|
| + setTimeout(function() {
|
| + // we didn't call prevent default so we should not be able to restore the context
|
| + results.push(compareGLError(gl.INVALID_OPERATION, "WEBGL_lose_context.restoreContext()"));
|
| + results.push(gl.isContextLost());
|
| + results.push(gl.getError() == gl.NO_ERROR);
|
| + // gl methods should still be no-ops
|
| + results.push(compareGLError(gl.NO_ERROR, "gl.blendFunc(gl.TEXTURE_2D, gl.TEXTURE_CUBE_MAP)"));
|
| + results.push(false);
|
| + setTimeout(function() {
|
| + testRestoredContext();
|
| + self.postMessage(results);
|
| + }, 0);
|
| + }, 0);
|
| + });
|
| + allowRestore = false;
|
| + contextLostEventFired = false;
|
| + contextRestoredEventFired = false;
|
| +
|
| + WEBGL_lose_context.loseContext();
|
| + // The context should be lost immediately.
|
| + results.push(gl.isContextLost());
|
| + results.push(gl.getError() == gl.CONTEXT_LOST_WEBGL);
|
| + results.push(gl.getError() == gl.NO_ERROR);
|
| + // gl methods should be no-ops
|
| + results.push(compareGLError(gl.NO_ERROR, "gl.blendFunc(gl.TEXTURE_2D, gl.TEXTURE_CUBE_MAP)"));
|
| + // but the event should not have been fired.
|
| + results.push(!contextLostEventFired);
|
| +};
|
| +
|
| +</script>
|
| +
|
| +<script>
|
| +function makeWorker(script)
|
| +{
|
| + var blob = new Blob([script]);
|
| + return new Worker(URL.createObjectURL(blob));
|
| +}
|
| +
|
| +var t = async_test('Test that WebGL context restore event can be handled with OffscreenCanvas in a worker');
|
| +var worker = makeWorker(document.getElementById("myWorker").textContent);
|
| +worker.addEventListener('message', t.step_func(function(msg) {
|
| + assert_equals(msg.data.length, 18);
|
| + for (var i = 0; i < msg.data.length; ++i)
|
| + assert_true(msg.data[i]);
|
| + t.done();
|
| +}));
|
| +worker.postMessage('start');
|
| +</script>
|
| +</html>
|
|
|