JS Test Harness: Insert the stylesheet dynamically
[WebKit-https.git] / LayoutTests / fast / canvas / webgl / context-lost-restored.html
1 <html>
2 <head>
3 <script src="../../js/resources/js-test-pre.js"></script>
4 <script src="resources/webgl-test.js"></script>
5 <script src="resources/webgl-test-utils.js"></script>
6 <script>
7 var wtu = WebGLTestUtils;
8 var canvas;
9 var gl;
10 var shouldGenerateGLError;
11 var extension_name = "WEBKIT_lose_context";
12 var extension;
13 var bufferObjects;
14 var program;
15 var texture;
16 var texColor = [255, 10, 20, 255];
17 var allowRestore;
18
19 function init()
20 {
21     if (window.initNonKhronosFramework) {
22         window.initNonKhronosFramework(true);
23     }
24
25     description("Tests behavior under a restored context.");
26
27     shouldGenerateGLError = wtu.shouldGenerateGLError;
28     runTests();
29 }
30
31 function runTests()
32 {
33     testLosingContext();
34     testLosingAndRestoringContext();
35
36     finish();
37 }
38
39 function setupTest()
40 {
41     canvas = document.createElement("canvas");
42     canvas.width = 1;
43     canvas.height = 1;
44     gl = wtu.create3DContext(canvas);
45     extension = gl.getExtension(extension_name);
46     if (!extension) {
47         debug(extension_name + " extension not found.");
48         return false;
49     }
50     return true;
51 }
52
53 function testLosingContext()
54 {
55     if (!setupTest())
56         return;
57
58     debug("Test losing a context and inability to restore it.");
59
60     canvas.addEventListener("webglcontextlost", testLostContext);
61     canvas.addEventListener("webglcontextrestored", testShouldNotRestoreContext);
62     allowRestore = false;
63
64     testOriginalContext();
65     extension.loseContext();
66     shouldGenerateGLError(gl, gl.INVALID_OPERATION, "extension.restoreContext()");
67     debug("");
68 }
69
70 function testLosingAndRestoringContext()
71 {
72     if (!setupTest())
73         return;
74
75     debug("Test losing and restoring a context.");
76
77     canvas.addEventListener("webglcontextlost", testLostContext);
78     canvas.addEventListener("webglcontextrestored", testRestoredContext);
79     allowRestore = true;
80
81     testOriginalContext();
82     extension.loseContext();
83     shouldGenerateGLError(gl, gl.NO_ERROR, "extension.restoreContext()");
84     debug("");
85 }
86
87 function testRendering()
88 {
89     gl.clearColor(0, 0, 0, 255);
90     gl.colorMask(1, 1, 1, 0);
91     gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
92
93     program = wtu.setupSimpleTextureProgram(gl);
94     bufferObjects = wtu.setupUnitQuad(gl);
95     texture = wtu.createColoredTexture(gl, canvas.width, canvas.height, texColor);
96
97     gl.uniform1i(gl.getUniformLocation(program, "tex"), 0);
98     wtu.drawQuad(gl, [0, 0, 0, 255]);
99
100     var compare = texColor.slice(0, 3);
101     wtu.checkCanvasRect(gl, 0, 0, canvas.width, canvas.height, compare, "shouldBe " + compare);
102
103     shouldBe("gl.getError()", "gl.NO_ERROR");
104 }
105
106 function testOriginalContext()
107 {
108     debug("Test valid context");
109     shouldBeFalse("gl.isContextLost()");
110     shouldBe("gl.getError()", "gl.NO_ERROR");
111     testRendering();
112     debug("");
113 }
114
115 function testLostContext(e)
116 {
117     debug("Test lost context");
118     shouldBeTrue("gl.isContextLost()");
119     shouldBe("gl.getError()", "gl.CONTEXT_LOST_WEBGL");
120     shouldBe("gl.getError()", "gl.NO_ERROR");
121     debug("");
122     if (allowRestore)
123         e.preventDefault();
124 }
125
126 function testShouldNotRestoreContext(e)
127 {
128     testFailed("Should not restore the context unless preventDefault is called on the context lost event");
129     debug("");
130 }
131
132 function testResources(expected)
133 {
134     var tests = [
135         "gl.bindTexture(gl.TEXTURE_2D, texture)",
136         "gl.useProgram(program)",
137         "gl.bindBuffer(gl.ARRAY_BUFFER, bufferObjects[0])",
138     ];
139
140     for (var i = 0; i < tests.length; ++i)
141         shouldGenerateGLError(gl, expected, tests[i]);
142 }
143
144 function testRestoredContext()
145 {
146     debug("Test restored context");
147     shouldBeFalse("gl.isContextLost()");
148     shouldBe("gl.getError()", "gl.NO_ERROR");
149
150     // Validate that using old resources fails.
151     testResources(gl.INVALID_OPERATION);
152
153     testRendering();
154
155     // Validate new resources created in testRendering().
156     testResources(gl.NO_ERROR);
157     debug("");
158 }
159
160 function finish() {
161     successfullyParsed = true;
162     var epilogue = document.createElement("script");
163     epilogue.onload = function() {
164         if (window.nonKhronosFrameworkNotifyDone)
165             window.nonKhronosFrameworkNotifyDone();
166     };
167     epilogue.src = "../../js/resources/js-test-post.js";
168     document.body.appendChild(epilogue);
169 }
170
171 </script>
172 </head>
173 <body onload="init()">
174 <div id="description"></div>
175 <div id="console"></div>
176 </body>
177 </html>