COMMENT ÇA MARCHE

Comment JoyCheck lit ta manette

JoyCheck est un testeur de manette basé sur le navigateur qui lit ta manette via la W3C Gamepad API, sans installation et sans que rien ne soit envoyé à un serveur. Schéma de flux de données en direct plus exemples de code ci-dessous.

Une manette reliée par câble à un ordinateur portable qui exécute JoyCheck

JoyCheck est un testeur de manette basé sur le navigateur qui lit ta manette via la W3C Gamepad API, sans installation et sans que rien ne soit envoyé à un serveur.

6 types d’entrées · 4 sections · 10 min de lecture

JoyCheck lit ta manette avec la W3C Gamepad API[1], une interface native au navigateur qui expose chaque bouton, chaque axe analogique et chaque gâchette sous forme de valeurs numériques mises à jour 60 fois par seconde. Le navigateur gère la poignée de main USB ou Bluetooth ; JoyCheck interroge navigator.getGamepads() à chaque frame d’animation et affiche l’état en direct sans envoyer de données à aucun serveur.

◆ VÉRIFIÉ

La spécification de la W3C Gamepad API définit les plages analogiques normalisées de -1.0 à +1.0 et expose chaque manette connectée à tout navigateur moderne via navigator.getGamepads()[1]. JoyCheck lit exactement les mêmes données que ton navigateur exposerait à n’importe quelle autre application web, sans installateur, pilote ni couche de télémétrie entre les deux.

Source : Spécification de la W3C Gamepad API

Mis à jour le 2026-05-27 par Taimoor Bamazai, fondateur d’Elites Algorithm Limited (une société de technologie enregistrée à Dublin, en Irlande) et l’ingénieur derrière JoyCheck.

Points clés

  • JoyCheck lit les manettes via la W3C Gamepad API, la même interface native au navigateur qu’utilise chaque jeu moderne.
  • Le navigateur interroge les manettes à la cadence des frames d’animation : 60 Hz sur les écrans standards, 120 à 144 Hz sur ceux à haute fréquence.
  • La Gamepad API exige un geste de l’utilisateur avant d’exposer les manettes, c’est pourquoi il faut appuyer sur un bouton pour réveiller la page.
  • Aucun installateur, pilote ni couche de télémétrie ne s’intercale entre la manette et la page ; les données ne quittent jamais ta machine.
  • La prise en charge des navigateurs est cohérente sur Chrome, Edge, Firefox, Brave et Vivaldi[4] ; Safari est partiel côté haptique.

Données d'entrée de manette circulant à travers la W3C Gamepad API vers JoyCheck, aucune donnée envoyée à un serveur

Le flux de données en direct a trois propriétés qui méritent d’être nommées :

  • Natif au navigateur. W3C Gamepad API standard. Aucun binaire natif, aucune installation de pilote. Fonctionne dans tous les navigateurs Chromium modernes, Firefox et Safari 16+.
  • Interrogation à 60 jusqu’à 144 Hz. JoyCheck lit navigator.getGamepads() à chaque frame d’animation, au même rythme que le navigateur redessine l’écran, en phase avec le Hz de ton affichage.
  • Zéro donnée envoyée. Chaque entrée est traitée dans le processus de ton navigateur. Aucun XHR, aucun fetch, aucune analytique sur le widget. Vérifiable dans DevTools.

Que veut dire « lire » une manette de jeu ?

JoyCheck lit six classes d’entrée depuis ta manette, et chacune correspond à un champ précis de la Gamepad API.

  • Boutons (gamepad.buttons[]). Chaque bouton est un objet GamepadButton qui signale son état pressé et, là où c’est pris en charge, une valeur analogique.
  • Joysticks analogiques (gamepad.axes[0..3]). Le tableau axes est un tableau de flottants à plat. Sous le mapping standard du W3C, il contient les positions X/Y des joysticks gauche et droit.
  • Gâchettes (gamepad.buttons[6,7].value). Les gâchettes vivent dans le tableau buttons et sont traitées comme des boutons dotés d’une valeur analogique sous le mapping standard.
  • Pavé tactile (gamepad.touchEvents[]). Le DualShock 4 et la DualSense exposent les coordonnées du pavé tactile comme une extension de la Gamepad API. La résolution rapportée du pavé est d’environ 1920×1080, et jusqu’à deux points de contact simultanés sont suivis.
  • Gyroscope et IMU (gamepad.imu, proposé). La DualSense, les Joy-Con et le Switch Pro exposent tous des données IMU à six axes.
  • Vibration (gamepad.vibrationActuator.playEffect()). L’interface vibrationActuator sur un objet Gamepad expose une méthode playEffect() qui prend une durée et une intensité pour chaque moteur, sur les manettes standards qui signalent des actionneurs haptiques.

Comment la W3C Gamepad API fonctionne-t-elle réellement ?

La Gamepad API est une interface de navigateur standard du W3C qui expose les manettes de jeu connectées à JavaScript. Elle est présente dans tous les navigateurs modernes depuis Chrome 21 (2012), Firefox 29 (2014), Edge 12 (2015) et Safari 14.1 (2021), voir Can I Use pour la matrice de prise en charge actuelle.[2]

Le navigateur gère la poignée de main USB ou Bluetooth HID sous-jacente. Ton système d’exploitation associe la manette ; le navigateur la voit via les couches de pilotes au niveau du système (XInput sous Windows, IOHIDDevice sous macOS, evdev sous Linux) ; la page appelle navigator.getGamepads() et reçoit un tableau instantané d’objets Gamepad.

Chaque objet Gamepad expose un ensemble de champs :

  • id : un identifiant sous forme de chaîne (par ex. “DualSense Wireless Controller (STANDARD GAMEPAD Vendor: 054c Product: 0ce6)”)
  • axes[] : un tableau de flottants des positions des axes analogiques (joysticks, généralement quatre entrées : X/Y gauche + X/Y droit)
  • buttons[] : un tableau d’objets GamepadButton, chacun avec les propriétés pressed, value et touched
  • timestamp : heure de la dernière mise à jour en millisecondes
  • mapping : “standard” si la manette correspond à la disposition standard du gamepad W3C ; "" sinon
  • vibrationActuator : une interface de retour haptique (là où c’est pris en charge)

L’API exige un geste de l’utilisateur (un appui sur un bouton) avant d’exposer les manettes connectées. C’est l’exigence du geste : une fonctionnalité de confidentialité qui empêche les pages de faire du fingerprinting de ta manette en arrière-plan. JoyCheck affiche « Appuie sur un bouton pour commencer » jusqu’à ce que le geste se déclenche.

Pourquoi JoyCheck interroge au lieu de s’abonner à des événements

La Gamepad API est uniquement en interrogation dans la spécification. Il n’y a pas d’événement onbuttonpress auquel s’abonner : ton code demande navigator.getGamepads() et obtient un instantané de l’état courant. JoyCheck interroge avec requestAnimationFrame[5], qui déclenche le callback à la fréquence de rafraîchissement de l’écran du navigateur (généralement 60 Hz, jusqu’à 240 Hz sur les écrans à haute fréquence).

Interroger à la fréquence de rafraîchissement est la bonne cadence parce que :

  • Le système d’exploitation met à jour l’état de la manette à peu près à ce rythme (l’USB HID interroge à 1 kHz ; le navigateur sous-échantillonne)
  • Le rendu se fait à la fréquence de rafraîchissement, donc toute interrogation supplémentaire produirait des frames dupliqués sans différence visuelle
  • Cela maintient l’usage du CPU au minimum : le callback d’interrogation est un seul appel de fonction par frame

Interroger plus vite (via setInterval ou setTimeout) gaspille le CPU et produit des instantanés dupliqués. Interroger plus lentement (par ex. à 30 Hz) rate les appuis de boutons rapides sur les écrans à haute fréquence. requestAnimationFrame correspond à l’affichage, qui correspond à ce que tu vois réellement.

Pourquoi JoyCheck est-il zéro donnée et comment puis-je le vérifier ?

Nous le disons trois fois parce que c’est important :

  1. JoyCheck ne transmet aucune donnée de manette à aucun serveur, jamais.

  2. La Gamepad API s’exécute entièrement à l’intérieur du processus de ton navigateur. L’état de la manette ne quitte jamais la page.

  3. Affiche la source du widget : chaque appel à l’API se résout en un callback requestAnimationFrame qui met à jour uniquement des nœuds du DOM. Il n’y a pas d’appels fetch(), pas de XMLHttpRequest, pas de WebSocket qui transportent l’état de la manette.

Tu peux le vérifier toi-même en moins d’une minute : ouvre JoyCheck dans n’importe quel navigateur, ouvre DevTools (F12), clique sur l’onglet Réseau, efface le journal et fais fonctionner le widget pendant 30 secondes. L’onglet Réseau reste vide pour les requêtes d’état de la manette. Déclaration complète sur la page de confidentialité.

Pourquoi utiliser un testeur de navigateur plutôt qu’une application de bureau ?

Trois raisons :

Aucune friction d’installation. La Gamepad API est désormais assez fiable pour que demander aux utilisateurs de télécharger et d’exécuter un binaire soit une taxe inutile. Un chargement de page est plus rapide qu’un installateur ; un navigateur est plus universel qu’une distribution .exe réservée à Windows.

Multiplateforme sans surcoût. La même page fonctionne sur Windows, macOS, Linux et ChromeOS sans builds par plateforme. Un testeur de navigateur ne se livre qu’une fois.

Auditable en 30 secondes. L’activité réseau et le stockage d’une page web sont inspectables avec les DevTools du navigateur par n’importe quel utilisateur, à tout moment. L’activité réseau d’une application de bureau nécessite tcpdump, Wireshark ou lsof et des permissions root. L’histoire de l’audit compte.

« Après des années de travail de diagnostic matériel sur des périphériques PC et des manettes de jeu, les testeurs basés sur le navigateur ont détecté environ les deux tiers des défauts qu’un utilitaire de diagnostic de bureau n’aurait jamais fait apparaître. Le navigateur lit ce que la manette signale physiquement, ce qui est une couche de vérité différente de ce que n’importe quel pilote basé sur un installateur expose. »

Taimoor Bamazai, fondateur, Elites Algorithm Limited

Quelles sont les limites connues de JoyCheck ?

Liste honnête, ce que JoyCheck ne fait pas :

  • Aucun accès HID brut. Lire le descripteur USB HID brut nécessiterait WebHID, une spécification W3C distincte à la prise en charge moins cohérente selon les navigateurs (Chrome et Edge uniquement, aujourd’hui).

  • Manettes antérieures à la Gamepad API. Les manettes DirectInput uniquement, d’avant l’existence de XInput, n’apparaissent pas dans le navigateur. Elles auraient besoin de WebHID plus une couche de traduction.

  • La prise en charge de la vibration varie selon le navigateur. Firefox est à la traîne de Chrome sur vibrationActuator ; Safari a une prise en charge limitée. JoyCheck signale la limitation avec élégance.

  • La pression des gâchettes sur les manettes Xbox dépend de la couche pilote. Certains appairages Bluetooth signalent des gâchettes binaires (juste on/off, sans plage analogique). Une connexion USB filaire corrige généralement cela.

Pour les chemins de diagnostic spécifiques à une plateforme au-delà de ce que le navigateur peut voir, le guide dédié couvre les schémas de défaut qui nécessitent une intervention côté matériel.

Pour des guides de diagnostic spécifiques à une manette qui utilisent cette même couche de lecture basée sur le navigateur, le guide d’appairage de la manette Switch Pro, le guide de calibration de la DualSense et le guide de calibration de la manette PS4 couvrent les particularités d’appairage propres à chaque plateforme que la Gamepad API seule ne peut pas résoudre.

Sources et références

  1. Spécification de la W3C Gamepad API. La norme W3C qui définit les plages de valeurs normalisées des joysticks analogiques (-1.0 à +1.0), l’interface d’interrogation et l’exigence du geste utilisateur que tout navigateur moderne implémente pour les manettes connectées.

  2. MDN Web Docs : Gamepad API. La référence développeur de Mozilla couvrant la lecture native des manettes par le navigateur, la cadence d’interrogation par frame d’animation et l’extension Haptic Actuator[3] utilisée pour la prise en charge de la vibration.

  3. Référence de la Gamepad Haptic Actuator API (MDN). Référence MDN pour l’extension Haptic Actuator, la prise en charge par les éditeurs de navigateurs sur les manettes DualSense, Xbox Series X|S et Switch Pro, et la couverture partielle de Safari.

  4. Matrice de prise en charge de la Gamepad API sur caniuse.com. Répartition actuelle de la prise en charge par navigateur sur Chrome, Edge, Firefox, Brave, Vivaldi, Safari et iOS Safari, y compris la version où l’haptique est devenue disponible.

  5. Guide de web.dev sur la Gamepad API. La référence de la plateforme web de Google couvrant les événements de connexion, les schémas d’interrogation et l’intégration recommandée avec requestAnimationFrame que JoyCheck utilise en interne.

Observations sur le taux d’interrogation de JoyCheck (mesuré en 2026-05)

Les navigateurs plafonnent la lecture de la Gamepad API à la cadence de requestAnimationFrame. Dans notre analyse, nous avons mesuré les mêmes manettes dans des conditions d’affichage identiques. Toutes les lectures : session Chrome 120 fraîche, connexion USB sauf indication contraire, fenêtre glissante de 5 secondes.

ManetteInterrogation matérielle nativeObservé par JoyCheck (écran 60 Hz)Notes
PS5 DualSense (USB)250 Hz59, 60 HzPlafonné par rAF
PS5 DualSense (Bluetooth)250 Hz59, 60 HzPlafonné par rAF
Manette Xbox Series (USB)125 Hz59, 60 HzPlafonné par rAF
8BitDo Pro 2 (Bluetooth)125 Hz59, 60 HzPlafonné par rAF
Manette Switch Pro (Bluetooth)200 Hz59, 60 HzPlafonné par rAF
Logitech G29 (USB)100 Hz59, 60 HzPlafonné par rAF

Mesuré par l’échantillonneur intégré au navigateur de JoyCheck. Les écrans 144 Hz relèvent le plafond proportionnellement ; les lectures sont normalisées sur une base de 60 Hz pour une comparaison inter-navigateurs.

Questions fréquentes sur le fonctionnement de JoyCheck

Qu'est-ce que la Gamepad API ?

La W3C Gamepad API est une interface native au navigateur qui permet à JavaScript de lire les manettes USB et Bluetooth connectées. Elle expose chaque bouton comme un état pressé de 0 ou 1, chaque joystick analogique comme des coordonnées X/Y de -1.0 à 1.0, et les gâchettes comme des valeurs de pression analogiques de 0.0 à 1.0. Disponible dans Chrome, Edge, Firefox et Safari 14.1+.

JoyCheck a-t-il besoin d'une autorisation pour lire ma manette ?

Aucune permission au niveau du système n'est requise, mais le navigateur exige un geste de l'utilisateur (un appui sur n'importe quel bouton de la manette) avant d'exposer son état. C'est une fonctionnalité de confidentialité et d'économie d'énergie de la spécification de la Gamepad API, pas une limitation de JoyCheck.

À quelle fréquence JoyCheck lit-il ma manette ?

JoyCheck interroge navigator.getGamepads() à chaque frame d'animation via requestAnimationFrame. Cela correspond au rafraîchissement de ton écran : 60 Hz sur un moniteur standard, 120 ou 144 Hz sur un écran à haute fréquence. Le matériel peut interroger plus vite, mais le navigateur ne peut pas exposer cela à JavaScript.

Pourquoi ma manette n'apparaît-elle qu'après avoir appuyé sur un bouton ?

Par spécification, la Gamepad API masque les manettes connectées jusqu'à ce que l'utilisateur fournisse une entrée. Cela empêche le fingerprinting passif et réduit la charge CPU en arrière-plan. Appuie sur n'importe quel bouton pour réveiller l'API ; la manette devient alors visible pour JoyCheck en un frame d'animation.

JoyCheck peut-il lire mon clavier et ma souris ?

Uniquement via l'onglet Clavier : les entrées clavier passent par l'API standard KeyboardEvent, pas par la Gamepad API. Les entrées de la souris ne font pas partie du champ d'action de JoyCheck.

Est-ce que ça fonctionne sur les Chromebooks ?

Oui. ChromeOS prend en charge la Gamepad API dans Chrome (et dans tout navigateur basé sur Chromium installé via le Play Store).

Pourquoi toutes les manettes ne signalent-elles pas la vibration ?

L'extension Gamepad Haptics dépend du navigateur et de la manette. Chrome/Edge/Firefox la prennent en charge pour la plupart des pads modernes (DualSense, Xbox Series X|S, Switch Pro). La prise en charge de Safari est partielle. Certaines manettes plus anciennes ne signalent aucun actionneur haptique.

Teste ta manette dans le navigateur

Sans installation, sans compte. Tes entrées ne quittent jamais ton appareil.