diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 96eb0ae98df9..7814296c38a7 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -79,6 +79,20 @@ macro_rules! handle_object_deletion { }; } +macro_rules! object_binding_to_js_or_null { + ($cx: expr, $binding:expr) => { + { + rooted!(in($cx) let mut rval = NullValue()); + if let Some(bound_object) = $binding.get() { + unsafe { + bound_object.to_jsval($cx, rval.handle_mut()); + } + } + rval.get() + } + }; +} + /// Set of bitflags for texture unpacking (texImage2d, etc...) bitflags! { #[derive(HeapSizeOf, JSTraceable)] @@ -101,6 +115,7 @@ pub struct WebGLRenderingContext { last_error: Cell>, texture_unpacking_settings: Cell, bound_framebuffer: MutNullableHeap>, + bound_renderbuffer: MutNullableHeap>, bound_texture_2d: MutNullableHeap>, bound_texture_cube_map: MutNullableHeap>, bound_buffer_array: MutNullableHeap>, @@ -135,6 +150,7 @@ impl WebGLRenderingContext { bound_texture_cube_map: MutNullableHeap::new(None), bound_buffer_array: MutNullableHeap::new(None), bound_buffer_element_array: MutNullableHeap::new(None), + bound_renderbuffer: MutNullableHeap::new(None), current_program: MutNullableHeap::new(None), current_vertex_attrib_0: Cell::new((0f32, 0f32, 0f32, 1f32)), } @@ -531,19 +547,22 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { #[allow(unsafe_code)] // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3 fn GetParameter(&self, cx: *mut JSContext, parameter: u32) -> JSVal { - // Handle the GL_FRAMEBUFFER_BINDING without going all the way + // Handle the GL_*_BINDING without going all the way // to the GL, since we would just need to map back from GL's - // returned ID to the WebGLFramebuffer we're tracking. + // returned ID to the WebGL* object we're tracking. match parameter { - constants::FRAMEBUFFER_BINDING => { - rooted!(in(cx) let mut rval = NullValue()); - if let Some(bound_fb) = self.bound_framebuffer.get() { - unsafe { - bound_fb.to_jsval(cx, rval.handle_mut()); - } - } - return rval.get() - } + constants::ARRAY_BUFFER_BINDING => + return object_binding_to_js_or_null!(cx, &self.bound_buffer_array), + constants::ELEMENT_ARRAY_BUFFER_BINDING => + return object_binding_to_js_or_null!(cx, &self.bound_buffer_element_array), + constants::FRAMEBUFFER_BINDING => + return object_binding_to_js_or_null!(cx, &self.bound_framebuffer), + constants::RENDERBUFFER_BINDING => + return object_binding_to_js_or_null!(cx, &self.bound_renderbuffer), + constants::TEXTURE_BINDING_2D => + return object_binding_to_js_or_null!(cx, &self.bound_texture_2d), + constants::TEXTURE_BINDING_CUBE_MAP => + return object_binding_to_js_or_null!(cx, &self.bound_texture_cube_map), _ => {} } @@ -1136,6 +1155,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.7 fn DeleteRenderbuffer(&self, renderbuffer: Option<&WebGLRenderbuffer>) { if let Some(renderbuffer) = renderbuffer { + handle_object_deletion!(self.bound_renderbuffer, renderbuffer); renderbuffer.delete() } } diff --git a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/misc/object-deletion-behaviour.html.ini b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/misc/object-deletion-behaviour.html.ini index 04cdda159027..4e4a3963ca9e 100644 --- a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/misc/object-deletion-behaviour.html.ini +++ b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/misc/object-deletion-behaviour.html.ini @@ -23,9 +23,6 @@ [WebGL test #21: gl.isShader(fragmentShader) should be false. Threw exception TypeError: gl.isShader is not a function] expected: FAIL - [WebGL test #28: gl.getParameter(gl.TEXTURE_BINDING_2D) should be [object WebGLTexture\]. Was null.] - expected: FAIL - [WebGL test #29: gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0) threw exception TypeError: gl.framebufferTexture2D is not a function] expected: FAIL @@ -35,9 +32,6 @@ [WebGL test #31: gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) should be 5890. Threw exception TypeError: gl.getFramebufferAttachmentParameter is not a function] expected: FAIL - [WebGL test #32: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.deleteTexture(tex)] - expected: FAIL - [WebGL test #33: gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) should be 0. Threw exception TypeError: gl.getFramebufferAttachmentParameter is not a function] expected: FAIL @@ -47,43 +41,13 @@ [WebGL test #35: gl.isTexture(tex) should be false. Threw exception TypeError: gl.isTexture is not a function] expected: FAIL - [WebGL test #37: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.bindTexture(gl.TEXTURE_2D, tex)] - expected: FAIL - - [WebGL test #40: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.bindTexture(gl.TEXTURE_CUBE_MAP, texCubeMap)] - expected: FAIL - - [WebGL test #41: gl.getParameter(gl.TEXTURE_BINDING_CUBE_MAP) should be [object WebGLTexture\]. Was null.] - expected: FAIL - - [WebGL test #42: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.deleteTexture(texCubeMap)] + [WebGL test #37: getError expected: NO_ERROR. Was INVALID_OPERATION : after evaluating: gl.bindTexture(gl.TEXTURE_2D, tex)] expected: FAIL [WebGL test #43: gl.isTexture(texCubeMap) should be false. Threw exception TypeError: gl.isTexture is not a function] expected: FAIL - [WebGL test #45: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.bindTexture(gl.TEXTURE_CUBE_MAP, texCubeMap)] - expected: FAIL - - [WebGL test #48: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.bindTexture(gl.TEXTURE_2D, t)] - expected: FAIL - - [WebGL test #56: gl.getParameter(gl.TEXTURE_BINDING_2D) should be [object WebGLTexture\]. Was null.] - expected: FAIL - - [WebGL test #57: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.activeTexture(gl.TEXTURE1)] - expected: FAIL - - [WebGL test #59: gl.getParameter(gl.TEXTURE_BINDING_2D) should be [object WebGLTexture\]. Was null.] - expected: FAIL - - [WebGL test #60: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.deleteTexture(t2)] - expected: FAIL - - [WebGL test #62: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.activeTexture(gl.TEXTURE0)] - expected: FAIL - - [WebGL test #67: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)] + [WebGL test #45: getError expected: NO_ERROR. Was INVALID_OPERATION : after evaluating: gl.bindTexture(gl.TEXTURE_CUBE_MAP, texCubeMap)] expected: FAIL [WebGL test #68: gl.getParameter(gl.RENDERBUFFER_BINDING) should be [object WebGLRenderbuffer\]. Was null.] @@ -95,9 +59,6 @@ [WebGL test #70: gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME) should be [object WebGLRenderbuffer\]. Threw exception TypeError: gl.getFramebufferAttachmentParameter is not a function] expected: FAIL - [WebGL test #71: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.deleteRenderbuffer(rbo)] - expected: FAIL - [WebGL test #72: gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE) should be 0. Threw exception TypeError: gl.getFramebufferAttachmentParameter is not a function] expected: FAIL @@ -107,24 +68,12 @@ [WebGL test #74: gl.isRenderbuffer(rbo) should be false. Threw exception TypeError: gl.isRenderbuffer is not a function] expected: FAIL - [WebGL test #76: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)] - expected: FAIL - - [WebGL test #78: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.bindRenderbuffer(gl.RENDERBUFFER, rbo2)] - expected: FAIL - [WebGL test #79: gl.getParameter(gl.RENDERBUFFER_BINDING) should be [object WebGLRenderbuffer\]. Was null.] expected: FAIL - [WebGL test #80: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.deleteRenderbuffer(rbo3)] - expected: FAIL - [WebGL test #81: gl.getParameter(gl.RENDERBUFFER_BINDING) should be [object WebGLRenderbuffer\]. Was null.] expected: FAIL - [WebGL test #82: getError expected: NO_ERROR. Was INVALID_ENUM : after evaluating: gl.bindRenderbuffer(gl.RENDERBUFFER, rbo)] - expected: FAIL - [WebGL test #83: gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 16, 16) threw exception TypeError: gl.renderbufferStorage is not a function] expected: FAIL