content/canvas/test/webgl-conformance/conformance/context/context-lost-restored.html

Thu, 15 Jan 2015 21:03:48 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 21:03:48 +0100
branch
TOR_BUG_9701
changeset 11
deefc01c0e14
permissions
-rw-r--r--

Integrate friendly tips from Tor colleagues to make (or not) 4.5 alpha 3;
This includes removal of overloaded (but unused) methods, and addition of
a overlooked call to DataStruct::SetData(nsISupports, uint32_t, bool.)

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4 <link rel="stylesheet" href="../../resources/js-test-style.css"/>
     5 <script src="../../resources/js-test-pre.js"></script>
     6 <script src="../resources/webgl-test.js"></script>
     7 <script src="../resources/webgl-test-utils.js"></script>
     8 <script>
     9 var wtu = WebGLTestUtils;
    10 var canvas;
    11 var gl;
    12 var shouldGenerateGLError;
    13 var extensionNames = [
    14     "WEBKIT_WEBGL_lose_context",
    15     "MOZ_WEBGL_lose_context",
    16 ];
    17 var extension;
    18 var bufferObjects;
    19 var program;
    20 var texture;
    21 var texColor = [255, 10, 20, 255];
    22 var allowRestore;
    23 var contextLostEventFired;
    24 var contextRestoredEventFired;
    26 function init()
    27 {
    28     if (window.initNonKhronosFramework) {
    29         window.initNonKhronosFramework(true);
    30     }
    32     description("Tests behavior under a restored context.");
    34     shouldGenerateGLError = wtu.shouldGenerateGLError;
    35     testLosingContext();
    36 }
    38 function setupTest()
    39 {
    40     canvas = document.createElement("canvas");
    41     canvas.width = 1;
    42     canvas.height = 1;
    43     gl = wtu.create3DContext(canvas);
    44     for (var ii = 0; ii < extensionNames.length; ++ii) {
    45         extension = gl.getExtension(extensionNames[ii]);
    46         if (extension)
    47             break;
    48     }
    49     if (!extension) {
    50         debug("Could not find lose_context extension under the following names: " + extensionNames.join(" "));
    51         return false;
    52     }
    53     return true;
    54 }
    56 function testLosingContext()
    57 {
    58     if (!setupTest())
    59         finishTest();
    61     debug("Test losing a context and inability to restore it.");
    63     canvas.addEventListener("webglcontextlost", function(e) {
    64        testLostContext(e);
    65        // restore the context after this event has exited.
    66        setTimeout(function() {
    67          // we didn't call prevent default so we should not be able to restore the context
    68          shouldGenerateGLError(gl, gl.INVALID_OPERATION, "extension.restoreContext()");
    69          testLosingAndRestoringContext();
    70        }, 0);
    71     });
    72     canvas.addEventListener("webglcontextrestored", testShouldNotRestoreContext);
    73     allowRestore = false;
    74     contextLostEventFired = false;
    75     contextRestoredEventFired = false;
    77     testOriginalContext();
    78     extension.loseContext();
    79     // The context should be lost immediately.
    80     shouldBeTrue("gl.isContextLost()");
    81     shouldBe("gl.getError()", "gl.CONTEXT_LOST_WEBGL");
    82     shouldBe("gl.getError()", "gl.NO_ERROR");
    83     // gl methods should be no-ops
    84     shouldGenerateGLError(gl, gl.NO_ERROR, "gl.blendFunc(gl.TEXTURE_2D, gl.TEXTURE_CUBE_MAP)");
    85     // but the event should not have been fired.
    86     shouldBeFalse("contextLostEventFired");
    87 }
    89 function testLosingAndRestoringContext()
    90 {
    91     if (!setupTest())
    92         finishTest();
    94     debug("");
    95     debug("Test losing and restoring a context.");
    97     canvas.addEventListener("webglcontextlost", function(e) {
    98       testLostContext(e);
    99       // restore the context after this event has exited.
   100       setTimeout(function() {
   101         shouldGenerateGLError(gl, gl.NO_ERROR, "extension.restoreContext()");
   102         // The context should still be lost. It will not get restored until the 
   103         // webglrestorecontext event is fired.
   104         shouldBeTrue("gl.isContextLost()");
   105         shouldBe("gl.getError()", "gl.NO_ERROR");
   106         // gl methods should still be no-ops
   107         shouldGenerateGLError(gl, gl.NO_ERROR, "gl.blendFunc(gl.TEXTURE_2D, gl.TEXTURE_CUBE_MAP)");
   108       }, 0);
   109     });
   110     canvas.addEventListener("webglcontextrestored", function() {
   111       testRestoredContext();
   112       finishTest();
   113     });
   114     allowRestore = true;
   115     contextLostEventFired = false;
   116     contextRestoredEventFired = false;
   118     testOriginalContext();
   119     extension.loseContext();
   120     // The context should be lost immediately.
   121     shouldBeTrue("gl.isContextLost()");
   122     shouldBe("gl.getError()", "gl.CONTEXT_LOST_WEBGL");
   123     shouldBe("gl.getError()", "gl.NO_ERROR");
   124     // gl methods should be no-ops
   125     shouldGenerateGLError(gl, gl.NO_ERROR, "gl.blendFunc(gl.TEXTURE_2D, gl.TEXTURE_CUBE_MAP)");
   126     // but the event should not have been fired.
   127     shouldBeFalse("contextLostEventFired");
   128 }
   130 function testRendering()
   131 {
   132     gl.clearColor(0, 0, 0, 255);
   133     gl.colorMask(1, 1, 1, 0);
   134     gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
   136     program = wtu.setupSimpleTextureProgram(gl);
   137     bufferObjects = wtu.setupUnitQuad(gl);
   138     texture = wtu.createColoredTexture(gl, canvas.width, canvas.height, texColor);
   140     gl.uniform1i(gl.getUniformLocation(program, "tex"), 0);
   141     wtu.drawQuad(gl, [0, 0, 0, 255]);
   143     var compare = texColor.slice(0, 3);
   144     wtu.checkCanvasRect(gl, 0, 0, canvas.width, canvas.height, compare, "shouldBe " + compare);
   146     shouldBe("gl.getError()", "gl.NO_ERROR");
   147 }
   149 function testOriginalContext()
   150 {
   151     debug("Test valid context");
   152     shouldBeFalse("gl.isContextLost()");
   153     shouldBe("gl.getError()", "gl.NO_ERROR");
   154     testRendering();
   155     debug("");
   156 }
   158 function testLostContext(e)
   159 {
   160     debug("Test lost context");
   161     shouldBeFalse("contextLostEventFired");
   162     contextLostEventFired = true;
   163     shouldBeTrue("gl.isContextLost()");
   164     shouldBe("gl.getError()", "gl.NO_ERROR");
   165     debug("");
   166     if (allowRestore)
   167       e.preventDefault();
   168 }
   170 function testShouldNotRestoreContext(e)
   171 {
   172     testFailed("Should not restore the context unless preventDefault is called on the context lost event");
   173     debug("");
   174 }
   176 function testResources(expected)
   177 {
   178     var tests = [
   179         "gl.bindTexture(gl.TEXTURE_2D, texture)",
   180         "gl.useProgram(program)",
   181         "gl.bindBuffer(gl.ARRAY_BUFFER, bufferObjects[0])",
   182     ];
   184     for (var i = 0; i < tests.length; ++i)
   185         shouldGenerateGLError(gl, expected, tests[i]);
   186 }
   188 function testRestoredContext()
   189 {
   190     debug("Test restored context");
   191     shouldBeFalse("contextRestoredEventFired");
   192     contextRestoredEventFired = true;
   193     shouldBeFalse("gl.isContextLost()");
   194     shouldBe("gl.getError()", "gl.NO_ERROR");
   196     // Validate that using old resources fails.
   197     testResources(gl.INVALID_OPERATION);
   199     testRendering();
   201     // Validate new resources created in testRendering().
   202     testResources(gl.NO_ERROR);
   203     debug("");
   204 }
   207 </script>
   208 </head>
   209 <body onload="init()">
   210 <div id="description"></div>
   211 <div id="console"></div>
   212 </body>
   213 </html>

mercurial