invalid-passed-params.html (8629B)
1 <!-- 2 Copyright (c) 2019 The Khronos Group Inc. 3 Use of this source code is governed by an MIT-style license that can be 4 found in the LICENSE.txt file. 5 --> 6 7 <!DOCTYPE html> 8 <html> 9 <head> 10 <meta charset="utf-8"> 11 <link rel="stylesheet" href="../../resources/js-test-style.css"/> 12 <script src="../../js/js-test-pre.js"></script> 13 <script src="../../js/desktop-gl-constants.js"></script> 14 <script src="../../js/webgl-test-utils.js"></script> 15 </head> 16 <body> 17 <div id="description"></div> 18 <div id="console"></div> 19 20 <script> 21 "use strict"; 22 description("Test for invalid passed parameters"); 23 24 var wtu = WebGLTestUtils; 25 var context = wtu.create3DContext(); 26 var contextVersion = wtu.getDefault3DContextVersion(); 27 28 debug(""); 29 debug("Test createShader()"); 30 wtu.shouldGenerateGLError(context, context.NO_ERROR, "context.createShader(context.FRAGMENT_SHADER)"); 31 wtu.shouldGenerateGLError(context, context.NO_ERROR, "context.createShader(context.VERTEX_SHADER)"); 32 wtu.shouldGenerateGLError(context, context.INVALID_ENUM, "context.createShader(0)"); 33 wtu.shouldGenerateGLError(context, context.INVALID_ENUM, "context.createShader(context.TRIANGLES)"); 34 35 debug(""); 36 debug("Test clear()"); 37 wtu.shouldGenerateGLError(context, context.INVALID_VALUE, "context.clear(desktopGL['ACCUM_BUFFER_BIT'])"); 38 wtu.shouldGenerateGLError(context, context.INVALID_VALUE, "context.clear(desktopGL['ACCUM_BUFFER_BIT'] | context.COLOR_BUFFER_BIT)"); 39 wtu.shouldGenerateGLError(context, context.INVALID_VALUE, "context.clear(desktopGL['ACCUM_BUFFER_BIT'] | context.COLOR_BUFFER_BIT | context.DEPTH_BUFFER_BIT | context.STENCIL_BUFFER_BIT)"); 40 wtu.shouldGenerateGLError(context, context.NO_ERROR, "context.clear(context.COLOR_BUFFER_BIT | context.DEPTH_BUFFER_BIT | context.STENCIL_BUFFER_BIT)"); 41 42 debug(""); 43 debug("Test {copy}Tex{Sub}Image2D with negative offset/width/height"); 44 var tex = context.createTexture(); 45 var pixels = new Uint8Array(2 * 2 * 4); 46 wtu.shouldGenerateGLError(context, context.NO_ERROR, "context.bindTexture(context.TEXTURE_2D, tex)"); 47 wtu.shouldGenerateGLError(context, context.INVALID_VALUE, "context.texImage2D(context.TEXTURE_2D, 0, context.RGBA, -16, -16, 0, context.RGBA, context.UNSIGNED_BYTE, null)"); 48 wtu.shouldGenerateGLError(context, context.NO_ERROR, "context.texImage2D(context.TEXTURE_2D, 0, context.RGBA, 16, 16, 0, context.RGBA, context.UNSIGNED_BYTE, null)"); 49 wtu.shouldGenerateGLError(context, context.INVALID_VALUE, "context.texSubImage2D(context.TEXTURE_2D, 0, -1, -1, 2, 2, context.RGBA, context.UNSIGNED_BYTE, pixels)"); 50 wtu.shouldGenerateGLError(context, context.INVALID_VALUE, "context.texSubImage2D(context.TEXTURE_2D, 0, 0, 0, -1, -1, context.RGBA, context.UNSIGNED_BYTE, pixels)"); 51 wtu.shouldGenerateGLError(context, context.NO_ERROR, "context.texSubImage2D(context.TEXTURE_2D, 0, 0, 0, 2, 2, context.RGBA, context.UNSIGNED_BYTE, pixels)"); 52 wtu.shouldGenerateGLError(context, context.INVALID_VALUE, "context.copyTexImage2D(context.TEXTURE_2D, 0, context.RGBA, 0, 0, -1, -1, 0)"); 53 wtu.shouldGenerateGLError(context, context.NO_ERROR, "context.copyTexImage2D(context.TEXTURE_2D, 0, context.RGBA, 0, 0, 16, 16, 0)"); 54 wtu.shouldGenerateGLError(context, context.INVALID_VALUE, "context.copyTexSubImage2D(context.TEXTURE_2D, 0, -1, -1, 0, 0, 2, 2)"); 55 wtu.shouldGenerateGLError(context, context.INVALID_VALUE, "context.copyTexSubImage2D(context.TEXTURE_2D, 0, 0, 0, 0, 0, -1, -1)"); 56 wtu.shouldGenerateGLError(context, context.NO_ERROR, "context.copyTexSubImage2D(context.TEXTURE_2D, 0, 0, 0, 0, 0, 2, 2)"); 57 58 debug(""); 59 debug("Test renderbufferStorage() with negative width/height"); 60 var renderbuffer = context.createRenderbuffer(); 61 wtu.shouldGenerateGLError(context, context.NO_ERROR, "context.bindRenderbuffer(context.RENDERBUFFER, renderbuffer)"); 62 wtu.shouldGenerateGLError(context, context.INVALID_VALUE, "context.renderbufferStorage(context.RENDERBUFFER, context.RGBA4, -2, -2)"); 63 wtu.shouldGenerateGLError(context, context.NO_ERROR, "context.renderbufferStorage(context.RENDERBUFFER, context.RGBA4, 16, 16)"); 64 65 debug(""); 66 debug("Test scissor() with negative width/height"); 67 wtu.shouldGenerateGLError(context, context.INVALID_VALUE, "context.scissor(0, 0, -2, -2)"); 68 wtu.shouldGenerateGLError(context, context.NO_ERROR, "context.scissor(0, 0, 16, 16)"); 69 70 debug(""); 71 debug("Test viewport() with negative width/height"); 72 wtu.shouldGenerateGLError(context, context.INVALID_VALUE, "context.viewport(0, 0, -2, -2)"); 73 wtu.shouldGenerateGLError(context, context.NO_ERROR, "context.viewport(0, 0, 16, 16)"); 74 75 debug(""); 76 debug("Set up a program to test invalid characters"); 77 var invalidSet = ['"', '$', '`', '@', '\\', "'"]; 78 var validUniformName = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_1234567890"; 79 var validAttribName = "abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 80 function generateShaderSource(opt_invalidIdentifierChar, opt_invalidCommentChar) { 81 var invalidIdentifierString = ""; 82 var invalidCommentString = ""; 83 if (opt_invalidIdentifierChar != undefined) { 84 invalidIdentifierString += opt_invalidIdentifierChar; 85 } 86 if (opt_invalidCommentChar != undefined) { 87 invalidCommentString += opt_invalidCommentChar; 88 } 89 return "uniform float " + validUniformName + invalidIdentifierString + ";\n" 90 + "varying float " + validAttribName + ";\n" 91 + "void main() {\n" 92 + validAttribName + " = " + validUniformName + ";\n" 93 + "gl_Position = vec4(0.0, 0.0, 0.0, 1.0); }\n" 94 + "//.+-/*%<>[](){}^|&~=!:;,?# " + invalidCommentString; 95 } 96 var vShader = context.createShader(context.VERTEX_SHADER); 97 context.shaderSource(vShader, generateShaderSource()); 98 context.compileShader(vShader); 99 shouldBe("context.getError()", "context.NO_ERROR"); 100 var fShader = context.createShader(context.FRAGMENT_SHADER); 101 context.shaderSource(fShader, "precision mediump float;\n" 102 + "varying float " + validAttribName + ";\n" 103 + "void main() {\n" 104 + "gl_FragColor = vec4(" + validAttribName + ", 0.0, 0.0, 1.0); }"); 105 context.compileShader(fShader); 106 shouldBe("context.getError()", "context.NO_ERROR"); 107 var program = context.createProgram(); 108 context.attachShader(program, vShader); 109 context.attachShader(program, fShader); 110 context.linkProgram(program); 111 var linkStatus = context.getProgramParameter(program, context.LINK_STATUS); 112 shouldBeTrue("linkStatus"); 113 if (!linkStatus) 114 debug(context.getProgramInfoLog(program)); 115 shouldBe("context.getError()", "context.NO_ERROR"); 116 context.bindAttribLocation(program, 1, validAttribName); 117 shouldBe("context.getError()", "context.NO_ERROR"); 118 context.getAttribLocation(program, validAttribName); 119 shouldBe("context.getError()", "context.NO_ERROR"); 120 context.getUniformLocation(program, validUniformName); 121 shouldBe("context.getError()", "context.NO_ERROR"); 122 123 debug(""); 124 debug("Test shaderSource() with invalid characters"); 125 for (var i = 0; i < invalidSet.length; ++i) { 126 // Backslash as line-continuation is allowed in WebGL 2.0. 127 if (contextVersion > 1 && invalidSet[i] == '\\') 128 continue; 129 // With recent specification changes from 130 // https://github.com/KhronosGroup/WebGL/pull/3206 , shaderSource no 131 // longer generates INVALID_VALUE. 132 var validShaderSource = generateShaderSource(undefined, invalidSet[i]); 133 context.shaderSource(vShader, validShaderSource); 134 shouldBe("context.getError()", "context.NO_ERROR"); 135 var invalidShaderSource = generateShaderSource(invalidSet[i], undefined); 136 context.shaderSource(vShader, invalidShaderSource); 137 shouldBe("context.getError()", "context.NO_ERROR"); 138 } 139 140 debug(""); 141 debug("Test bindAttribLocation() with invalid characters"); 142 for (var i = 0; i < invalidSet.length; ++i) { 143 var invalidName = validAttribName + invalidSet[i]; 144 context.bindAttribLocation(program, 1, invalidName); 145 shouldBe("context.getError()", "context.INVALID_VALUE"); 146 } 147 148 debug(""); 149 debug("Test getAttribLocation() with invalid characters"); 150 for (var i = 0; i < invalidSet.length; ++i) { 151 var invalidName = validAttribName + invalidSet[i]; 152 context.getAttribLocation(program, invalidName); 153 shouldBe("context.getError()", "context.INVALID_VALUE"); 154 } 155 156 debug(""); 157 debug("Test getUniformLocation() with invalid characters"); 158 for (var i = 0; i < invalidSet.length; ++i) { 159 var invalidName = validUniformName + invalidSet[i]; 160 context.getUniformLocation(program, invalidName); 161 shouldBe("context.getError()", "context.INVALID_VALUE"); 162 } 163 164 debug("") 165 var successfullyParsed = true; 166 </script> 167 168 <script src="../../js/js-test-post.js"></script> 169 </body> 170 </html>