diff options
-rw-r--r-- | components/script/dom/webglbuffer.rs | 7 | ||||
-rw-r--r-- | tests/wpt/mozilla/meta/MANIFEST.json | 10 | ||||
-rw-r--r-- | tests/wpt/mozilla/tests/mozilla/webgl/bindBuffer.html | 32 |
3 files changed, 49 insertions, 0 deletions
diff --git a/components/script/dom/webglbuffer.rs b/components/script/dom/webglbuffer.rs index bcbeecdffb7..8c993d6bd7d 100644 --- a/components/script/dom/webglbuffer.rs +++ b/components/script/dom/webglbuffer.rs @@ -77,6 +77,9 @@ impl WebGLBuffer { // NB: Only valid buffer targets come here pub fn bind(&self, target: u32) -> WebGLResult<()> { + if self.is_deleted() || self.is_pending_delete() { + return Err(WebGLError::InvalidOperation); + } if let Some(previous_target) = self.target.get() { if target != previous_target { return Err(WebGLError::InvalidOperation); @@ -141,6 +144,10 @@ impl WebGLBuffer { self.pending_delete.set(true); } + pub fn is_pending_delete(&self) -> bool { + self.pending_delete.get() + } + pub fn add_vao_reference(&self, id: WebGLVertexArrayId) { let mut vao_refs = self.vao_references.borrow_mut(); if let Some(ref mut vao_refs) = *vao_refs { diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 47eea45772b..99ce5116e01 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -39217,6 +39217,12 @@ {} ] ], + "mozilla/webgl/bindBuffer.html": [ + [ + "/_mozilla/mozilla/webgl/bindBuffer.html", + {} + ] + ], "mozilla/webgl/bufferData.html": [ [ "/_mozilla/mozilla/webgl/bufferData.html", @@ -70856,6 +70862,10 @@ "bc2a964c294e678b3c0e98ba83ce30a59a8bee3f", "testharness" ], + "mozilla/webgl/bindBuffer.html": [ + "659d53041373a6e40b9ab4cbf7e2afad45048377", + "testharness" + ], "mozilla/webgl/bufferData.html": [ "e58b2257043682723fbd17eac6dcbadb32c3ca3e", "testharness" diff --git a/tests/wpt/mozilla/tests/mozilla/webgl/bindBuffer.html b/tests/wpt/mozilla/tests/mozilla/webgl/bindBuffer.html new file mode 100644 index 00000000000..e1a38f57e69 --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/webgl/bindBuffer.html @@ -0,0 +1,32 @@ +<!doctype html> +<meta charset="utf-8"> +<title>bindBuffer checks test (issue #20556)</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> +test(function() { + var gl = document.createElement("canvas").getContext("webgl"); + + // Simple bindings should work + var array_buffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, array_buffer); + assert_equals(gl.NO_ERROR, gl.getError()); + + var element_array_buffer = gl.createBuffer(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, element_array_buffer); + assert_equals(gl.NO_ERROR, gl.getError()); + + // Re-bindings should not work + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, array_buffer); + assert_equals(gl.INVALID_OPERATION, gl.getError()); + + gl.bindBuffer(gl.ARRAY_BUFFER, element_array_buffer); + assert_equals(gl.INVALID_OPERATION, gl.getError()); + + // Binding buffers pending deletion should fail + var buffer = gl.createBuffer(); + gl.deleteBuffer(buffer); + gl.bindBuffer(gl.ARRAY_BUFFER, buffer); + assert_equals(gl.INVALID_OPERATION, gl.getError()); +}); +</script> |