OLD | NEW |
(Empty) | |
| 1 <!-- |
| 2 |
| 3 /* |
| 4 ** Copyright (c) 2012 The Khronos Group Inc. |
| 5 ** |
| 6 ** Permission is hereby granted, free of charge, to any person obtaining a |
| 7 ** copy of this software and/or associated documentation files (the |
| 8 ** "Materials"), to deal in the Materials without restriction, including |
| 9 ** without limitation the rights to use, copy, modify, merge, publish, |
| 10 ** distribute, sublicense, and/or sell copies of the Materials, and to |
| 11 ** permit persons to whom the Materials are furnished to do so, subject to |
| 12 ** the following conditions: |
| 13 ** |
| 14 ** The above copyright notice and this permission notice shall be included |
| 15 ** in all copies or substantial portions of the Materials. |
| 16 ** |
| 17 ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| 18 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| 19 ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
| 20 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
| 21 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
| 22 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
| 23 ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. |
| 24 */ |
| 25 |
| 26 --> |
| 27 |
| 28 <!DOCTYPE html> |
| 29 <html> |
| 30 <head> |
| 31 <meta charset="utf-8"> |
| 32 <link rel="stylesheet" href="../../resources/js-test-style.css"/> |
| 33 <script src="../../resources/js-test-pre.js"></script> |
| 34 <script src="../resources/webgl-test.js"></script> |
| 35 <script src="../../resources/desktop-gl-constants.js"></script> |
| 36 <script src="../resources/webgl-test-utils.js"></script> |
| 37 </head> |
| 38 <body> |
| 39 <div id="description"></div> |
| 40 <div id="console"></div> |
| 41 |
| 42 <script> |
| 43 "use strict"; |
| 44 description("Test for invalid passed parameters"); |
| 45 |
| 46 var wtu = WebGLTestUtils; |
| 47 var context = wtu.create3DContext(); |
| 48 |
| 49 debug(""); |
| 50 debug("Test createShader()"); |
| 51 shouldGenerateGLError(context, context.NO_ERROR, "context.createShader(context.F
RAGMENT_SHADER)"); |
| 52 shouldGenerateGLError(context, context.NO_ERROR, "context.createShader(context.V
ERTEX_SHADER)"); |
| 53 shouldGenerateGLError(context, context.INVALID_ENUM, "context.createShader(0)"); |
| 54 shouldGenerateGLError(context, context.INVALID_ENUM, "context.createShader(conte
xt.TRIANGLES)"); |
| 55 |
| 56 debug(""); |
| 57 debug("Test clear()"); |
| 58 shouldGenerateGLError(context, context.INVALID_VALUE, "context.clear(desktopGL['
ACCUM_BUFFER_BIT'])"); |
| 59 shouldGenerateGLError(context, context.INVALID_VALUE, "context.clear(desktopGL['
ACCUM_BUFFER_BIT'] | context.COLOR_BUFFER_BIT)"); |
| 60 shouldGenerateGLError(context, context.INVALID_VALUE, "context.clear(desktopGL['
ACCUM_BUFFER_BIT'] | context.COLOR_BUFFER_BIT | context.DEPTH_BUFFER_BIT | conte
xt.STENCIL_BUFFER_BIT)"); |
| 61 shouldGenerateGLError(context, context.NO_ERROR, "context.clear(context.COLOR_BU
FFER_BIT | context.DEPTH_BUFFER_BIT | context.STENCIL_BUFFER_BIT)"); |
| 62 |
| 63 debug(""); |
| 64 debug("Test bufferData()"); |
| 65 var buffer = context.createBuffer(); |
| 66 shouldGenerateGLError(context, context.NO_ERROR, "context.bindBuffer(context.ARR
AY_BUFFER, buffer)"); |
| 67 shouldGenerateGLError(context, context.NO_ERROR, "context.bufferData(context.ARR
AY_BUFFER, 16, context.STREAM_DRAW)"); |
| 68 shouldGenerateGLError(context, context.NO_ERROR, "context.bufferData(context.ARR
AY_BUFFER, 16, context.STATIC_DRAW)"); |
| 69 shouldGenerateGLError(context, context.NO_ERROR, "context.bufferData(context.ARR
AY_BUFFER, 16, context.DYNAMIC_DRAW)"); |
| 70 shouldGenerateGLError(context, context.INVALID_ENUM, "context.bufferData(context
.ARRAY_BUFFER, 16, desktopGL['STREAM_READ'])"); |
| 71 shouldGenerateGLError(context, context.INVALID_ENUM, "context.bufferData(context
.ARRAY_BUFFER, 16, desktopGL['STREAM_COPY'])"); |
| 72 shouldGenerateGLError(context, context.INVALID_ENUM, "context.bufferData(context
.ARRAY_BUFFER, 16, desktopGL['STATIC_READ'])"); |
| 73 shouldGenerateGLError(context, context.INVALID_ENUM, "context.bufferData(context
.ARRAY_BUFFER, 16, desktopGL['STATIC_COPY'])"); |
| 74 shouldGenerateGLError(context, context.INVALID_ENUM, "context.bufferData(context
.ARRAY_BUFFER, 16, desktopGL['DYNAMIC_READ'])"); |
| 75 shouldGenerateGLError(context, context.INVALID_ENUM, "context.bufferData(context
.ARRAY_BUFFER, 16, desktopGL['DYNAMIC_COPY'])"); |
| 76 |
| 77 debug(""); |
| 78 debug("Test {copy}Tex{Sub}Image2D with negative offset/width/height"); |
| 79 var tex = context.createTexture(); |
| 80 var pixels = new Uint8Array(2 * 2 * 4); |
| 81 shouldGenerateGLError(context, context.NO_ERROR, "context.bindTexture(context.TE
XTURE_2D, tex)"); |
| 82 shouldGenerateGLError(context, context.INVALID_VALUE, "context.texImage2D(contex
t.TEXTURE_2D, 0, context.RGBA, -16, -16, 0, context.RGBA, context.UNSIGNED_BYTE,
null)"); |
| 83 shouldGenerateGLError(context, context.NO_ERROR, "context.texImage2D(context.TEX
TURE_2D, 0, context.RGBA, 16, 16, 0, context.RGBA, context.UNSIGNED_BYTE, null)"
); |
| 84 shouldGenerateGLError(context, context.INVALID_VALUE, "context.texSubImage2D(con
text.TEXTURE_2D, 0, -1, -1, 2, 2, context.RGBA, context.UNSIGNED_BYTE, pixels)")
; |
| 85 shouldGenerateGLError(context, context.INVALID_VALUE, "context.texSubImage2D(con
text.TEXTURE_2D, 0, 0, 0, -1, -1, context.RGBA, context.UNSIGNED_BYTE, pixels)")
; |
| 86 shouldGenerateGLError(context, context.NO_ERROR, "context.texSubImage2D(context.
TEXTURE_2D, 0, 0, 0, 2, 2, context.RGBA, context.UNSIGNED_BYTE, pixels)"); |
| 87 shouldGenerateGLError(context, context.INVALID_VALUE, "context.copyTexImage2D(co
ntext.TEXTURE_2D, 0, context.RGBA, 0, 0, -1, -1, 0)"); |
| 88 shouldGenerateGLError(context, context.NO_ERROR, "context.copyTexImage2D(context
.TEXTURE_2D, 0, context.RGBA, 0, 0, 16, 16, 0)"); |
| 89 shouldGenerateGLError(context, context.INVALID_VALUE, "context.copyTexSubImage2D
(context.TEXTURE_2D, 0, -1, -1, 0, 0, 2, 2)"); |
| 90 shouldGenerateGLError(context, context.INVALID_VALUE, "context.copyTexSubImage2D
(context.TEXTURE_2D, 0, 0, 0, 0, 0, -1, -1)"); |
| 91 shouldGenerateGLError(context, context.NO_ERROR, "context.copyTexSubImage2D(cont
ext.TEXTURE_2D, 0, 0, 0, 0, 0, 2, 2)"); |
| 92 |
| 93 debug(""); |
| 94 debug("Test renderbufferStorage() with negative width/height"); |
| 95 var renderbuffer = context.createRenderbuffer(); |
| 96 shouldGenerateGLError(context, context.NO_ERROR, "context.bindRenderbuffer(conte
xt.RENDERBUFFER, renderbuffer)"); |
| 97 shouldGenerateGLError(context, context.INVALID_VALUE, "context.renderbufferStora
ge(context.RENDERBUFFER, context.RGBA4, -2, -2)"); |
| 98 shouldGenerateGLError(context, context.NO_ERROR, "context.renderbufferStorage(co
ntext.RENDERBUFFER, context.RGBA4, 16, 16)"); |
| 99 |
| 100 debug(""); |
| 101 debug("Test scissor() with negative width/height"); |
| 102 shouldGenerateGLError(context, context.INVALID_VALUE, "context.scissor(0, 0, -2,
-2)"); |
| 103 shouldGenerateGLError(context, context.NO_ERROR, "context.scissor(0, 0, 16, 16)"
); |
| 104 |
| 105 debug(""); |
| 106 debug("Test viewport() with negative width/height"); |
| 107 shouldGenerateGLError(context, context.INVALID_VALUE, "context.viewport(0, 0, -2
, -2)"); |
| 108 shouldGenerateGLError(context, context.NO_ERROR, "context.viewport(0, 0, 16, 16)
"); |
| 109 |
| 110 debug(""); |
| 111 debug("Set up a program to test invalid characters"); |
| 112 var invalidSet = ['"', '$', '`', '@', '\\', "'"]; |
| 113 var validUniformName = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_123
4567890"; |
| 114 var validAttribName = "abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ1234
567890"; |
| 115 function generateShaderSource(opt_invalidIdentifierChar, opt_invalidCommentChar)
{ |
| 116 var invalidIdentifierString = ""; |
| 117 var invalidCommentString = ""; |
| 118 if (opt_invalidIdentifierChar != undefined) { |
| 119 invalidIdentifierString += opt_invalidIdentifierChar; |
| 120 } |
| 121 if (opt_invalidCommentChar != undefined) { |
| 122 invalidCommentString += opt_invalidCommentChar; |
| 123 } |
| 124 return "uniform float " + validUniformName + invalidIdentifierString + ";\n" |
| 125 + "varying float " + validAttribName + ";\n" |
| 126 + "void main() {\n" |
| 127 + validAttribName + " = " + validUniformName + ";\n" |
| 128 + "gl_Position = vec4(0.0, 0.0, 0.0, 1.0); }\n"; |
| 129 + "//.+-/*%<>[](){}^|&~=!:;,?# " + invalidCommentStrin
g; |
| 130 } |
| 131 var vShader = context.createShader(context.VERTEX_SHADER); |
| 132 context.shaderSource(vShader, generateShaderSource()); |
| 133 context.compileShader(vShader); |
| 134 shouldBe("context.getError()", "context.NO_ERROR"); |
| 135 var fShader = context.createShader(context.FRAGMENT_SHADER); |
| 136 context.shaderSource(fShader, "precision mediump float;\n" |
| 137 + "varying float " + validAttribName + ";\n" |
| 138 + "void main() {\n" |
| 139 + "gl_FragColor = vec4(" + validAttribName + ", 0.
0, 0.0, 1.0); }"); |
| 140 context.compileShader(fShader); |
| 141 shouldBe("context.getError()", "context.NO_ERROR"); |
| 142 var program = context.createProgram(); |
| 143 context.attachShader(program, vShader); |
| 144 context.attachShader(program, fShader); |
| 145 context.linkProgram(program); |
| 146 var linkStatus = context.getProgramParameter(program, context.LINK_STATUS); |
| 147 shouldBeTrue("linkStatus"); |
| 148 if (!linkStatus) |
| 149 debug(context.getProgramInfoLog(program)); |
| 150 shouldBe("context.getError()", "context.NO_ERROR"); |
| 151 context.bindAttribLocation(program, 1, validAttribName); |
| 152 shouldBe("context.getError()", "context.NO_ERROR"); |
| 153 context.getAttribLocation(program, validAttribName); |
| 154 shouldBe("context.getError()", "context.NO_ERROR"); |
| 155 context.getUniformLocation(program, validUniformName); |
| 156 shouldBe("context.getError()", "context.NO_ERROR"); |
| 157 |
| 158 debug(""); |
| 159 debug("Test shaderSource() with invalid characters"); |
| 160 for (var i = 0; i < invalidSet.length; ++i) { |
| 161 var validShaderSource = generateShaderSource(undefined, invalidSet[i]); |
| 162 context.shaderSource(vShader, validShaderSource); |
| 163 shouldBe("context.getError()", "context.NO_ERROR"); |
| 164 var invalidShaderSource = generateShaderSource(invalidSet[i], undefined); |
| 165 context.shaderSource(vShader, invalidShaderSource); |
| 166 shouldBe("context.getError()", "context.INVALID_VALUE"); |
| 167 } |
| 168 |
| 169 debug(""); |
| 170 debug("Test bindAttribLocation() with invalid characters"); |
| 171 for (var i = 0; i < invalidSet.length; ++i) { |
| 172 var invalidName = validAttribName + invalidSet[i]; |
| 173 context.bindAttribLocation(program, 1, invalidName); |
| 174 shouldBe("context.getError()", "context.INVALID_VALUE"); |
| 175 } |
| 176 |
| 177 debug(""); |
| 178 debug("Test getAttribLocation() with invalid characters"); |
| 179 for (var i = 0; i < invalidSet.length; ++i) { |
| 180 var invalidName = validAttribName + invalidSet[i]; |
| 181 context.getAttribLocation(program, invalidName); |
| 182 shouldBe("context.getError()", "context.INVALID_VALUE"); |
| 183 } |
| 184 |
| 185 debug(""); |
| 186 debug("Test getUniformLocation() with invalid characters"); |
| 187 for (var i = 0; i < invalidSet.length; ++i) { |
| 188 var invalidName = validUniformName + invalidSet[i]; |
| 189 context.getUniformLocation(program, invalidName); |
| 190 shouldBe("context.getError()", "context.INVALID_VALUE"); |
| 191 } |
| 192 |
| 193 debug("") |
| 194 var successfullyParsed = true; |
| 195 </script> |
| 196 |
| 197 <script src="../../resources/js-test-post.js"></script> |
| 198 </body> |
| 199 </html> |
OLD | NEW |