aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/webglbuffer.rs7
-rw-r--r--tests/wpt/mozilla/meta/MANIFEST.json10
-rw-r--r--tests/wpt/mozilla/tests/mozilla/webgl/bindBuffer.html32
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>