diff --git a/components/script/dom/webglprogram.rs b/components/script/dom/webglprogram.rs
index 6cc122cf459..504a13ec339 100644
--- a/components/script/dom/webglprogram.rs
+++ b/components/script/dom/webglprogram.rs
@@ -68,6 +68,14 @@ impl WebGLProgram {
if !self.is_deleted.get() {
self.is_deleted.set(true);
let _ = self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DeleteProgram(self.id)));
+
+ if let Some(shader) = self.fragment_shader.get() {
+ shader.decrement_attached_counter();
+ }
+
+ if let Some(shader) = self.vertex_shader.get() {
+ shader.decrement_attached_counter();
+ }
}
}
@@ -118,6 +126,7 @@ impl WebGLProgram {
}
shader_slot.set(Some(shader));
+ shader.increment_attached_counter();
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::AttachShader(self.id, shader.id()))).unwrap();
@@ -144,6 +153,7 @@ impl WebGLProgram {
}
shader_slot.set(None);
+ shader.decrement_attached_counter();
self.renderer.send(CanvasMsg::WebGL(WebGLCommand::DetachShader(self.id, shader.id()))).unwrap();
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index 36a8a4bb3b2..70b98ce06cd 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -1157,6 +1157,16 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
.unwrap()
}
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
+ fn IsShader(&self, shader: Option<&WebGLShader>) -> bool {
+ shader.map_or(false, |s| !s.is_deleted() || s.is_attached())
+ }
+
+ // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8
+ fn IsTexture(&self, texture: Option<&WebGLTexture>) -> bool {
+ texture.map_or(false, |tex| tex.target().is_some() && !tex.is_deleted())
+ }
+
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.3
fn LineWidth(&self, width: f32) {
if width.is_nan() || width <= 0f32 {
diff --git a/components/script/dom/webglshader.rs b/components/script/dom/webglshader.rs
index eb930a69f13..c166fbcf46d 100644
--- a/components/script/dom/webglshader.rs
+++ b/components/script/dom/webglshader.rs
@@ -32,6 +32,7 @@ pub struct WebGLShader {
source: DOMRefCell