{"record":{"id":"40606ccd8cffe17a","repo":"a-b-street/abstreet","slug":"unable-to-cast-to-webgl2renderingcontext-error","errorCode":null,"errorMessage":"unable to cast to WebGl2RenderingContext. error: {:?}","messagePattern":"unable to cast to WebGl2RenderingContext\\. error: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"widgetry/src/backend_glow_wasm.rs","lineNumber":90,"sourceCode":"                \"failed to build WebGL 2.0 context with error: \\\"{}\\\". Trying WebGL 1.0 instead...\",\n                err\n            );\n            webgl1_glow_context(&canvas).and_then(|gl| {\n                is_gl2 = false;\n                webgl1_program(gl)\n            })\n        })\n        .unwrap();\n\n    fn webgl2_glow_context(canvas: &web_sys::HtmlCanvasElement) -> Result<glow::Context> {\n        let maybe_context: Option<_> = canvas\n            .get_context(\"webgl2\")\n            .map_err(|err| anyhow!(\"error getting context for WebGL 2.0: {:?}\", err))?;\n        let js_webgl2_context =\n            maybe_context.ok_or(anyhow!(\"Browser doesn't support WebGL 2.0\"))?;\n        let webgl2_context = js_webgl2_context\n            .dyn_into::<web_sys::WebGl2RenderingContext>()\n            .map_err(|err| anyhow!(\"unable to cast to WebGl2RenderingContext. error: {:?}\", err))?;\n        Ok(glow::Context::from_webgl2_context(webgl2_context))\n    }\n\n    fn webgl1_glow_context(canvas: &web_sys::HtmlCanvasElement) -> Result<glow::Context> {\n        let maybe_context: Option<_> = canvas\n            .get_context(\"webgl\")\n            .map_err(|err| anyhow!(\"error getting context for WebGL 1.0: {:?}\", err))?;\n        let js_webgl1_context =\n            maybe_context.ok_or(anyhow!(\"Browser doesn't support WebGL 1.0\"))?;\n        let webgl1_context = js_webgl1_context\n            .dyn_into::<web_sys::WebGlRenderingContext>()\n            .map_err(|err| anyhow!(\"unable to cast to WebGlRenderingContext. error: {:?}\", err))?;\n        Ok(glow::Context::from_webgl1_context(webgl1_context))\n    }\n\n    (\n        PrerenderInnards::new(gl, is_gl2, program, Some(WindowAdapter(winit_window))),\n        event_loop,","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/a-b-street/abstreet/blob/0964f29315820c91b171b585eb51e300164e9197/widgetry/src/backend_glow_wasm.rs#L72-L108","documentation":"After obtaining the WebGL 2 context object, it must be cast via dyn_into::<WebGl2RenderingContext>. If the returned JsValue is not actually a WebGl2RenderingContext (unexpected object type from the bindings), the cast fails and this error is raised. This is a wasm-bindgen type mismatch, rare in practice.","triggerScenarios":"canvas.get_context(\"webgl2\") returns a JsValue that fails dyn_into::<web_sys::WebGl2RenderingContext>() — e.g., a mismatched web-sys version, a context acquired as a different interface, or unusual browser/proxy behavior.","commonSituations":"Version mismatch between web-sys/wasm-bindgen crates and generated bindings; running in environments that shim getContext with non-standard objects; build caches with stale bindings after upgrading dependencies.","solutions":["Update and align web-sys and wasm-bindgen versions (cargo update) and rebuild the wasm target.","Clear stale build artifacts (cargo clean, rm -rf target) to regenerate bindings.","Test in a standard browser to rule out getContext shims or extension interference.","Log the failing JsValue to identify what object was actually returned."],"exampleFix":"// before\n.dyn_into::<web_sys::WebGl2RenderingContext>()\n.map_err(|err| anyhow!(\"unable to cast to WebGl2RenderingContext. error: {:?}\", err))?;\n// after: dependency alignment\n// Cargo.toml: keep web-sys and wasm-bindgen on matching, current versions\n// then: cargo clean && cargo build --target wasm32-unknown-unknown","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"// Retry once after a clean rebuild on cast failure\nmatch webgl2_glow_context(canvas) {\n    Err(e) if e.to_string().contains(\"unable to cast\") => {\n        // usually stale bindings: advise cargo clean + aligned deps, then retry\n        Err(anyhow!(\"stale wasm bindings? run: cargo clean && cargo build --target wasm32-unknown-unknown\"))\n    }\n    other => other,\n}","preventionTips":["Keep web-sys and wasm-bindgen versions aligned and current","Rebuild the wasm target after dependency upgrades (clear caches)","Avoid getContext shims or wrappers around the canvas","Test rendering setup across major browsers in CI"],"tags":["wasm","webgl","web-sys","type-mismatch"],"backgroundTag":"type-mismatch","analyzedSha":"0964f29315820c91b171b585eb51e300164e9197","analyzedAt":"2026-09-13T18:02:03.421Z","contentChangedAt":"2026-09-13T18:02:03.421Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}