Quest WebXR: tracked-controls reports false controller disconnects when a Touch source moves to trackedSources
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 65/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- javascript, threejs
Research direction
The issue is in src/systems/tracked-controls.js, specifically the onInputSourcesChange function. Start by reading the WebXR API documentation on inputSources and trackedSources. Examine how the system currently builds its controller list and where it listens for changes. 'Done' means tracked-controls correctly accounts for sources in both collections, preventing false disconnects during migration.
Written by the indexing model from the issue text.
Description
Description
On Meta Quest 3 in Meta Quest Browser, during an immersive WebXR session requesting hand-tracking and tracked-sources, a Touch controller can move from XRSession.inputSources to XRSession.trackedSources while remaining physically present and continuing to provide valid raw pose and gamepad data. A-Frame then drops it from the tracked-controls controller list. The controller component emits controllerdisconnected, and the model/pose freezes until the source returns to inputSources.
Current A-Frame master still has this lifecycle gap: tracked-controls.js, onInputSourcesChange listens only to inputsourceschange and assigns this.controllers = xrSession.inputSources (line 43).
Steps to reproduce
- Run an immersive A-Frame scene on a Meta Quest 3 in Meta Quest Browser, requesting hand-tracking and tracked-sources.
- Attach
meta-touch-controlsortracked-controlsfor a Touch controller hand. - Switch between hand and controller tracking until the runtime moves the controller representation from
inputSourcestotrackedSources. - Observe
controllerdisconnectedand a frozen A-Frame controller model while raw WebXR still reports a moving pose and gamepad. Observe reconnection when the controller returns toinputSources.
Expected behavior
A logical Touch controller should not disconnect solely because the runtime reclassifies its source between inputSources and trackedSources. When trackedSources is available, tracked-controls should account for both collections for presence, preferring an eligible inputSources candidate when both collections contain candidates. Hand-only or hybrid entries should not become controller button/ray authority unless they provide the expected controller capabilities.
Actual behavior
During migration, tracked-controls' list no longer contains the controller, so controller components emit controllerdisconnected and the model freezes. Raw WebXR instrumentation continued to receive pose/gamepad updates during the same interval. Representative observed sequence: source changed from in to tr, A-Frame disconnected, a raw sample showed about 36 mm of movement with a gamepad present and source location tr, then the source changed from tr to in. A later occurrence showed about 72 mm of raw movement during the apparent disconnect.
Environment
- Meta Quest 3; Meta Quest Browser (version not captured in the supplied diagnostics)
- Immersive WebXR; hand-tracking and tracked-sources
- A-Frame 1.5.0 in the application where first diagnosed
- Current master inspected 2026-09-23; the cited system remains
inputSources-only
Related issue
This is distinct from #5584, which describes a controller not appearing when oculus-touch-controls and hand-tracking-controls are combined. That closed issue does not describe a live source migration followed by a false disconnect while raw tracking remains active.
- Dominant language
- JavaScript
- Stars
- 17.7k
- Forks
- 4.4k
- PR merge metrics
- No merged PRs in 30d
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from aframevr/aframe
-
Removing grabbable does not remove obb-colliderPossibly taken @mrxz claimed this 26 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
-
Uncaught TypeError: Cannot read properties of null (reading 'cancelAnimationFrame') on session endOpen
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
Difficulty 3/5 Half a day Newbie friendliness 45/100
-
TypeError: session.requestAnimationFrame is not a function when re-entering XR session after exitOpen
Difficulty 4/5 3-5 days Newbie friendliness 55/100
-
tracked-controls-webxr does not update entity position when referenceSpaceType is bounded-floorOpen
Difficulty 4/5 3-5 days Newbie friendliness 55/100
Similar issues
-
⚠ needs intervention document not found
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
OpenTermsArchive/contrib-declarations#4151 ·
Maintainers usually reply within 1 day
-
correction via-web
Difficulty 2/5 1-3 hours Newbie friendliness 67/100
ch-bas/cctv-camera-database#416 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
jeremysball/taskferry#622 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
coollabsio/openclaw#114 · 1 comment · 1 reaction ·
Maintainers usually reply within 1 day
-
bug effort:medium model:light tests
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 1 day