๐งช WebXR Feature Combinator
Isolated reproducer for the camera-access crash investigation. Pick a
feature combination, tap Start AR , and observe. Checkbox
state persists across reloads so a tab crash does not erase your last
selection. See
2026-04-22-camera-access-reproducer-plan.md.
Required feature (exactly one)
hit-test — matches upstream example
local-floor — matches our app
Optional features
camera-access
dom-overlay (root = document.body)
depth-sensing (cpu-optimized,
luminance-alpha/float32)
Per-frame camera usage (matches the production apps)
Each frame, read the live camera image via
renderer.xr.getCameraTexture(view.camera) — which
internally calls XRWebGLBinding.getCameraImage(). This is
what the production apps do every frame and what the plain reproducer
does not : requesting camera-access alone
never touches the camera image. Enable
camera-access above for this to have an effect. No reload
needed โ it changes the render loop, not the session init.
Workarounds (page reloads on toggle)
Delete XRWebGLBinding.prototype.createProjectionLayer
and XRRenderState.prototype.layers at script init
(forces three.js to XRWebGLLayer). Worked on Chrome
147โ148, but stopped having any effect after Chrome
148.0.7778.12.
Additionally patch XRSession.prototype.updateRenderState
to persist the baseLayer reference (Chrome
148.0.7778.12+ stop-gap until M149). Enable
together with the projection-layer workaround above for the
full fix. May break Quest / projection-layer devices โ opt-in only.
XRSessionInit payload preview
Start AR
Log