๐งช 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