aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2018-06-18 12:01:39 -0400
committerGitHub <noreply@github.com>2018-06-18 12:01:39 -0400
commit1f562af4186285e2fe988634677cfecf6d36bdd8 (patch)
treecf47d8eaa0a546f89a446c33addeaedd336394b8
parentd843a66300bbb11b10438744cad5ad6f8763ae0b (diff)
parent08b193c9220d5ff7452e0753ac17b0660051086a (diff)
downloadservo-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.rs31
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json10
-rw-r--r--tests/wpt/mozilla/tests/mozilla/webgl/getFramebufferAttachmentParameter.html114
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>