OLD | NEW |
| (Empty) |
1 <html> | |
2 <head> | |
3 <script src="../../../http/tests/inspector/inspector-test.js"></script> | |
4 <script src="../canvas-profiler-test.js"></script> | |
5 <script> | |
6 if (window.internals) | |
7 window.internals.settings.setWebGLErrorsToConsoleEnabled(false); | |
8 | |
9 /** | |
10 * @constructor | |
11 */ | |
12 function Cache() | |
13 { | |
14 this.reset(); | |
15 } | |
16 | |
17 Cache.prototype = { | |
18 /** | |
19 * @return {number} | |
20 */ | |
21 size: function() | |
22 { | |
23 return this._size; | |
24 }, | |
25 | |
26 reset: function() | |
27 { | |
28 /** @type {!Object.<number, Object>} */ | |
29 this._items = Object.create(null); | |
30 /** @type {number} */ | |
31 this._size = 0; | |
32 }, | |
33 | |
34 /** | |
35 * @param {number} key | |
36 * @return {boolean} | |
37 */ | |
38 has: function(key) | |
39 { | |
40 return key in this._items; | |
41 }, | |
42 | |
43 /** | |
44 * @param {number} key | |
45 * @return {Object} | |
46 */ | |
47 get: function(key) | |
48 { | |
49 return this._items[key]; | |
50 }, | |
51 | |
52 /** | |
53 * @param {number} key | |
54 * @param {Object} item | |
55 */ | |
56 put: function(key, item) | |
57 { | |
58 if (!this.has(key)) | |
59 ++this._size; | |
60 this._items[key] = item; | |
61 } | |
62 } | |
63 | |
64 var gl; | |
65 var rawGL; | |
66 var glResource; | |
67 | |
68 function assertNoErrors(gl) | |
69 { | |
70 console.assert(gl.getError() === gl.NO_ERROR, "No GL error was expected at t
his time"); | |
71 } | |
72 | |
73 function assertEqualArrays(a, b) | |
74 { | |
75 console.assert(a.length === b.length, "assertEqualArrays: a.length=" + a.len
gth + ", b.length=" + b.length); | |
76 a = a.slice(); | |
77 b = b.slice(); | |
78 a.sort(); | |
79 b.sort(); | |
80 a.forEach(function(element, index) { | |
81 console.assert(a[index] === b[index], "assertEqualArrays: different valu
es at index " + index); | |
82 }); | |
83 } | |
84 | |
85 function generateWebGLError(gl, error) | |
86 { | |
87 switch (error) { | |
88 case gl.INVALID_ENUM: | |
89 gl.pixelStorei(123, 234); | |
90 break; | |
91 case gl.INVALID_VALUE: | |
92 gl.pixelStorei(gl.PACK_ALIGNMENT, 234); | |
93 break; | |
94 case gl.INVALID_OPERATION: | |
95 default: | |
96 gl.generateMipmap(gl.TEXTURE_CUBE_MAP); | |
97 break; | |
98 } | |
99 } | |
100 | |
101 function getAllErrors(gl) | |
102 { | |
103 var errors = []; | |
104 while (true) { | |
105 var error = gl.getError(); | |
106 if (error === gl.NO_ERROR) | |
107 break; | |
108 console.assert(typeof error === "number", "getError() should return a nu
mber instead of a " + (typeof error)); | |
109 errors.push(error); | |
110 } | |
111 return errors; | |
112 } | |
113 | |
114 function createAndRunWebGLProgram() | |
115 { | |
116 gl = createWebGLContext(); | |
117 console.assert(gl, "Failed to create WebGL context"); | |
118 | |
119 glResource = gl["__resourceObject"]; | |
120 console.assert(glResource, "WebGL context is not wrapped"); | |
121 | |
122 rawGL = glResource.wrappedObject(); | |
123 console.assert(rawGL, "No raw WebGL context found"); | |
124 console.assert(gl !== rawGL, "Proxy and RAW contexts should not be the same"
); | |
125 | |
126 assertNoErrors(gl); | |
127 assertNoErrors(rawGL); | |
128 | |
129 // 1) Generate errors directly on the RAW context | |
130 // 2) Pick them via proxy. | |
131 var errors = [rawGL.INVALID_ENUM, rawGL.INVALID_VALUE, rawGL.INVALID_OPERATI
ON]; | |
132 errors.forEach(generateWebGLError.bind(this, rawGL)); | |
133 assertEqualArrays(errors, getAllErrors(gl)); | |
134 assertNoErrors(gl); | |
135 assertNoErrors(rawGL); | |
136 | |
137 // 1) Generate errors on RAW context | |
138 // 2) Convert Resource to a Replayable => this should clean up the RAW conte
xt and save the errors in proxy | |
139 // 3) Check that RAW context no longer have errors | |
140 // 4) Check that proxy still has the original errors saved | |
141 var errors = [rawGL.INVALID_ENUM, rawGL.INVALID_VALUE, rawGL.INVALID_OPERATI
ON]; | |
142 errors.forEach(generateWebGLError.bind(this, rawGL)); | |
143 glResource.toReplayable(new Cache()); | |
144 assertNoErrors(rawGL); | |
145 assertEqualArrays(errors, getAllErrors(gl)); | |
146 assertNoErrors(gl); | |
147 | |
148 // 1) Repeat 1-3 steps from the above | |
149 // 2) Check proxy and RAW errors interleaved | |
150 var errors = [rawGL.INVALID_ENUM, rawGL.INVALID_VALUE, rawGL.INVALID_OPERATI
ON]; | |
151 errors.forEach(generateWebGLError.bind(this, rawGL)); | |
152 glResource.toReplayable(new Cache()); | |
153 assertNoErrors(rawGL); | |
154 | |
155 var value = gl.getError(); | |
156 console.assert(typeof value === "number", "getError() should return a number
instead of a " + (typeof value)); | |
157 console.assert(value !== gl.NO_ERROR, "An error was expected"); | |
158 errors.forEach(generateWebGLError.bind(this, rawGL)); // Generate again in t
he RAW context. | |
159 // Now we "have" 2 errors left in the proxy and 3 new errors in the RAW cont
ext => should return 3 errors from the proxy. | |
160 assertEqualArrays(errors, getAllErrors(gl)); | |
161 assertNoErrors(gl); | |
162 assertNoErrors(rawGL); | |
163 | |
164 return "SUCCESS"; | |
165 } | |
166 | |
167 function test() | |
168 { | |
169 InspectorTest.enableCanvasAgent(step1); | |
170 function step1() | |
171 { | |
172 InspectorTest.evaluateInPage("createAndRunWebGLProgram()", step2); | |
173 } | |
174 function step2(error) | |
175 { | |
176 InspectorTest.assertEquals("SUCCESS", error.description); | |
177 InspectorTest.completeTest(); | |
178 } | |
179 } | |
180 | |
181 </script> | |
182 </head> | |
183 <body onload="runTest()"> | |
184 <p> | |
185 Tests WebGL getError() status. | |
186 </p> | |
187 <a href="https://bugs.webkit.org/show_bug.cgi?id=95443">Bug 95443</a> | |
188 </body> | |
189 </html> | |
OLD | NEW |