diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2018-06-18 12:01:39 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-18 12:01:39 -0400 |
commit | 1f562af4186285e2fe988634677cfecf6d36bdd8 (patch) | |
tree | cf47d8eaa0a546f89a446c33addeaedd336394b8 | |
parent | d843a66300bbb11b10438744cad5ad6f8763ae0b (diff) | |
parent | 08b193c9220d5ff7452e0753ac17b0660051086a (diff) | |
download | servo-1f562af4186285e2fe988634677cfecf6d36bdd8.tar.gz servo-1f562af4186285e2fe988634677cfecf6d36bdd8.zip |
Auto merge of #20699 - simartin:issue_20593, r=nox
Issue #20593: Implement proper checks in WebGLRenderingContext's getFramebufferAttachmentParameter().
Add missing input checks.
---
- [X] `./mach build -d` does not report any errors
- [X] `./mach build-geckolib` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #20593
- [X] There are tests for these changes
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/20699)
<!-- Reviewable:end -->
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 31 | ||||
-rw-r--r-- | tests/wpt/mozilla/meta/MANIFEST.json | 10 | ||||
-rw-r--r-- | tests/wpt/mozilla/tests/mozilla/webgl/getFramebufferAttachmentParameter.html | 114 |
3 files changed, 154 insertions, 1 deletions
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 7beeef9261d..60474753eb3 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -2379,7 +2379,36 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { _ => false }; - if !target_matches || !attachment_matches || !pname_matches { + let bound_attachment_matches = match self.bound_framebuffer.get().unwrap().attachment(attachment) { + Some(attachment_root) => { + match attachment_root { + WebGLFramebufferAttachmentRoot::Renderbuffer(_) => { + match pname { + constants::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE | + constants::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME => true, + _ => false + } + }, + WebGLFramebufferAttachmentRoot::Texture(_) => { + match pname { + constants::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE | + constants::FRAMEBUFFER_ATTACHMENT_OBJECT_NAME | + constants::FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL | + constants::FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE => true, + _ => false + } + } + } + }, + _ => { + match pname { + constants::FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE => true, + _ => false + } + } + }; + + if !target_matches || !attachment_matches || !pname_matches || !bound_attachment_matches { self.webgl_error(InvalidEnum); return NullValue(); } diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 10895d4aa5f..57cddd34edc 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -39282,6 +39282,12 @@ {} ] ], + "mozilla/webgl/getFramebufferAttachmentParameter.html": [ + [ + "/_mozilla/mozilla/webgl/getFramebufferAttachmentParameter.html", + {} + ] + ], "mozilla/webgl/get_supported_extensions.html": [ [ "/_mozilla/mozilla/webgl/get_supported_extensions.html", @@ -70951,6 +70957,10 @@ "a163189d8674be83c9e8c9055da31a1c5ed46be5", "support" ], + "mozilla/webgl/getFramebufferAttachmentParameter.html": [ + "71a8c1829f703ff43a30d1b3fb9b99e59d3db973", + "testharness" + ], "mozilla/webgl/get_supported_extensions.html": [ "719c7c4cb91f3c1b2bbc4cbe35285fc63ce6263f", "testharness" diff --git a/tests/wpt/mozilla/tests/mozilla/webgl/getFramebufferAttachmentParameter.html b/tests/wpt/mozilla/tests/mozilla/webgl/getFramebufferAttachmentParameter.html new file mode 100644 index 00000000000..6a51cbd51d6 --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/webgl/getFramebufferAttachmentParameter.html @@ -0,0 +1,114 @@ +<!doctype html> +<meta charset="utf-8"> +<title>getFramebufferAttachmentParameter input type check (issue #20593)</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(function() { + var gl = document.createElement("canvas").getContext("webgl"); + + // Error if no buffer is bound + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE); + assert_equals(gl.INVALID_OPERATION, gl.getError()); + + // Bind a framebuffer + var framebuffer = gl.createFramebuffer(); + gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); + + // 'target' parameter checks + gl.getFramebufferAttachmentParameter(gl.READ_FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE); + assert_equals(gl.INVALID_ENUM, gl.getError()); + gl.getFramebufferAttachmentParameter(gl.DRAW_FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE); + assert_equals(gl.INVALID_ENUM, gl.getError()); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE); + assert_equals(gl.NO_ERROR, gl.getError()); + + // 'attachment' parameter checks + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.DEPTH_STENCIL_ATTACHMENT, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE); + assert_equals(gl.NO_ERROR, gl.getError()); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE); + assert_equals(gl.NO_ERROR, gl.getError()); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.DEPTH_ATTACHMENT, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE); + assert_equals(gl.NO_ERROR, gl.getError()); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.STENCIL_ATTACHMENT, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE); + assert_equals(gl.NO_ERROR, gl.getError()); + + // 'pname' parameter checks: invalid values + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.STENCIL_ATTACHMENT, + gl.FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE); + assert_equals(gl.INVALID_ENUM, gl.getError()); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.STENCIL_ATTACHMENT, + gl.FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE); + assert_equals(gl.INVALID_ENUM, gl.getError()); + + // 'pname' parameter checks: no attached object at the named attachment point + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.STENCIL_ATTACHMENT, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME); + assert_equals(gl.INVALID_ENUM, gl.getError()); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.STENCIL_ATTACHMENT, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE); + assert_equals(gl.NO_ERROR, gl.getError()); + + // 'pname' parameter checks: the attached object at the named attachment point is GL_RENDERBUFFER + var renderbuffer = gl.createRenderbuffer(); + gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer); + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbuffer); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL); + assert_equals(gl.INVALID_ENUM, gl.getError()); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE); + assert_equals(gl.INVALID_ENUM, gl.getError()); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE); + assert_equals(gl.NO_ERROR, gl.getError()); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME); + assert_equals(gl.NO_ERROR, gl.getError()); + + // 'pname' parameter checks: the attached object at the named attachment point is GL_TEXTURE + var texture = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL); + assert_equals(gl.NO_ERROR, gl.getError()); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE); + assert_equals(gl.NO_ERROR, gl.getError()); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE); + assert_equals(gl.NO_ERROR, gl.getError()); + gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, + gl.COLOR_ATTACHMENT0, + gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME); + assert_equals(gl.NO_ERROR, gl.getError()); +}); +</script> |