Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Quest WebXR: tracked-controls reports false controller disconnects when a Touch source moves to trackedSources

Open
#5,856 1 comment 0 reactions 0 assignees View on GitHub

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
Domain
ar-vr-xr, web-dev

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

  1. Run an immersive A-Frame scene on a Meta Quest 3 in Meta Quest Browser, requesting hand-tracking and tracked-sources.
  2. Attach meta-touch-controls or tracked-controls for a Touch controller hand.
  3. Switch between hand and controller tracking until the runtime moves the controller representation from inputSources to trackedSources.
  4. Observe controllerdisconnected and a frozen A-Frame controller model while raw WebXR still reports a moving pose and gamepad. Observe reconnection when the controller returns to inputSources.

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

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from aframevr/aframe

All issues in aframevr/aframe

Similar issues

More JavaScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.