Skip to content
JoystickTester.com
W3C Gamepad API Inspector

Gamepad Tester Online - Check Controllers & Gamepads

Inspect raw W3C Gamepad API button indices (B0–B17), continuous axis float coordinates (-1.000 to +1.000), slot indices (0–3), and standard vs. raw HID mappings directly in your browser.

Methodology & Scope•100% Client-Side Browser Diagnostics•W3C Gamepad API
No Controller Detected Yet?Try Virtual Simulator

Plug in your controller & press any button, or test using keyboard emulation / auto demo.

No Controller Detected

Connect your controller via USB or Bluetooth to start testing.

Press any button on your controller once plugged in to wake the browser Gamepad API.

Overview & Diagnostic Methodology

Use the primary inspection panel to verify every button index (B0 through B17), check Left and Right stick coordinates (-1.000 to +1.000) with optional 72-sector circularity tracing, and monitor trigger pull and D-pad states. Below the main panel, Step 3 provides an interactive radial deadzone analyzer and dual-rumble haptic tester, while clicking "Show Advanced Lab" in Step 4 reveals the browser frame-sampling cadence meter, a live state-transition event monitor (with Pause and Clear controls), and raw USB Vendor/Product ID metadata.

Controller not connecting? Fix browser Gamepad API sandbox, Steam desktop conflicts, and charge-only USB cables.
Troubleshooting Guide

How the Browser Gamepad API Exposes Buttons, Axes, Slots, and Mappings

Reading navigator.getGamepads() in Real Time: Unlike desktop utilities that install kernel drivers, browser-based diagnostics query the standard W3C Gamepad API (navigator.getGamepads()) inside a client-side requestAnimationFrame loop. On each display frame, the browser returns a snapshot of up to four active controller slots (indices 0 through 3), including each device’s id string, mapping property, buttons array, and axes array.

Standard Mapping ("standard") vs. Non-Standard Raw HID (""): When your operating system and browser recognize a controller’s Vendor and Product ID (such as an Xbox controller via XInput or a DualSense/Switch Pro controller with a built-in browser mapping table), Gamepad.mapping is set to "standard". In standard mode, buttons[0..3] map to the bottom/right/left/top face cluster, buttons[4..5] to bumpers, buttons[6..7] to triggers, buttons[8..9] to select/start, buttons[10..11] to stick clicks, buttons[12..15] to the D-pad, and buttons[16..17] to system/auxiliary buttons. If a generic USB joystick, flight stick, or retro adapter is not in the browser’s mapping table, Gamepad.mapping is an empty string ("")—in that case, our interface switches to safe Raw HID labels so you can inspect raw button indices without misleading console glyph assumptions.

Using the Step 4 Advanced Lab (Event Monitor & Sampling Cadence): Clicking "Show Advanced Lab" at the bottom of the dashboard opens three developer inspection panels: a Browser Input Sampling Rate meter showing the active requestAnimationFrame frequency and frame-delta jitter, a live Event Monitor that records button press/release and axis movement transitions (with Pause and Clear buttons), and a Technical Specs panel that extracts the 4-character hex Vendor ID (VID) and Product ID (PID) when present in the browser’s Gamepad.id string.

Diagnostic Notice: Browser Sandbox Note: For anti-fingerprinting privacy, browsers hide connected gamepads until you click inside the active tab and press a button (or move a stick sufficiently) on the controller. Displayed Hz reflects browser animation-frame sampling cadence, not raw USB hardware interrupt rate.

Measurement & Telemetry Classification

Technical distinction between direct hardware reads, client-side algorithms, and educational thresholds.

Real Measurement
  • Gamepad.buttons[0..17] pressed booleans and 0.000–1.000 value floats read from navigator.getGamepads().
  • Gamepad.axes[0..3] floating-point coordinates (-1.000 to +1.000) for primary horizontal and vertical stick axes.
  • Gamepad.id identification string, Gamepad.index (0–3), and Gamepad.mapping ("standard" or "").
Calculated Metric
  • 2D radial stick deflection magnitude r = sqrt(X² + Y²), polar angle (0°–360°), and optional 72-sector outer boundary trace.
  • Browser input sampling cadence (Hz) and frame-to-frame interval jitter (±ms) measured across requestAnimationFrame ticks.
  • Client-side button and axis state transitions logged in the collapsible Step 4 Event Monitor.
Educational Context
  • W3C "standard" vs. raw "" mapping: why recognized controllers use canonical B0–B17 positions while unmapped HID pads follow raw vendor byte order.
  • Browser render-loop cadence vs. hardware USB polling: why web apps sample inputs at your monitor refresh rate rather than raw 250Hz–1000Hz USB interrupt intervals.
  • User-gesture privacy sandbox: why navigator.getGamepads() remains empty until you interact with the controller in a focused tab.

Key Diagnostic Parameters

Button Array (B0–B17)
Reads Gamepad.buttons[0..17] boolean pressed states and 0.000–1.000 floating-point values on every animation frame.
Axis Coordinates (Axes 0–3)
Displays normalized horizontal and vertical thumbstick floats (-1.000 to +1.000) for Left Stick (Axes 0/1) and Right Stick (Axes 2/3).
Mapping & Slot Metadata
Reports Gamepad.index (0–3), Gamepad.mapping ("standard" or ""), and parsed USB Vendor/Product IDs when exposed by the browser.

How to Test Step-by-Step

  1. 1Connect your gamepad via USB cable, Bluetooth, or a 2.4GHz wireless receiver.
  2. 2Click inside this browser tab and press a button on your gamepad (or move a stick sufficiently) to satisfy the browser Gamepad API user-gesture check.
  3. 3Check the top HUD bar to confirm your controller’s assigned Slot Index (0–3), hardware ID string, and Mapping status ("standard" vs. "raw (non-standard)").
  4. 4Press each physical button while watching the B0–B17 Button Matrix to check for unresponsive switches, chattering contacts, or stuck states.
  5. 5Sweep both thumbsticks and triggers to inspect normalized axis floats (-1.000 to +1.000) and proportional trigger values (0.000 to 1.000).
  6. 6Click "Show Advanced Lab" under Step 4 if you want to inspect the live state-transition Event Monitor, browser frame-sampling cadence (Hz), and parsed Vendor/Product IDs.

What This Test Verifies

Live B0–B17 Button Matrix (Pressed State & 0.000–1.000 Value Readout)
Normalized 4-Axis Thumbstick Scopes (Axes 0–3) with 72-Sector Circularity Toggle
W3C Mapping Mode Detection ("standard" Layout vs. Unmapped Raw HID "")
Hardware Slot Index (0–3) & Multi-Controller Switcher Bar
Integrated Step 3 Radial Deadzone Filter & Dual-Rumble Haptic Controls
Collapsible Step 4 Event Monitor (Pause & Clear) & Browser Sampling Meter
Browser Gamepad Activation & Frame-Sync Polling References

For anti-fingerprinting privacy, browsers hide connected gamepads from navigator.getGamepads() until you press a physical button while the tab is focused. Once active, input states are sampled in lockstep with window.requestAnimationFrame(), meaning displayed Hz reflects browser frame cadence rather than raw USB hardware interrupt rate.

MDN Web Docs: Navigator.getGamepads() & User Gesture Requirement

Explains browser gamepad enumeration, security gesture rules, and state snapshots.

MDN Web Docs: Window.requestAnimationFrame() Display Cadence

Documents why browser-based input loops run at your monitor’s refresh rate (e.g., 60Hz–240Hz).

Frequently Asked Questions

Why does my gamepad not appear until I press a button?

Web browsers enforce a W3C Gamepad API privacy sandbox to prevent background websites from fingerprinting connected USB or Bluetooth devices. You must focus the page and press a controller button (or move an axis sufficiently, depending on the browser) before navigator.getGamepads() exposes the controller.

What is the difference between "standard" mapping and "raw (non-standard)" mapping?

When Gamepad.mapping is "standard", the browser has remapped your controller’s physical inputs into the canonical 17/18-button W3C layout (B0–B17 and Axes 0–3). When Gamepad.mapping is empty (""), the browser passes through the device’s raw USB HID report without remapping, so button numbers follow the manufacturer’s raw wire order and triggers or D-pads may not sit on B6/B7 or B12–B15.

How do I test if a button is sticking or chattering (double-clicking)?

Press and release each button while watching its corresponding slot in the B0–B17 Button Matrix, or open "Show Advanced Lab" in Step 4 to watch the live Event Monitor. If a button tile stays highlighted after you let go, the membrane or switch is sticking; if a single press logs multiple rapid press/release transitions in the Event Monitor, the switch contact is chattering.

Why do button numbers or Vendor/Product ID strings look different between Chrome, Firefox, and Safari?

Each browser engine (Blink in Chrome/Edge, Gecko in Firefox, WebKit in Safari) maintains its own internal controller remapping table and formats the Gamepad.id string differently. On Windows, Chrome often labels XInput pads as "Xbox 360 Controller (XInput STANDARD GAMEPAD)", whereas Firefox or macOS Safari may display the USB HID product name and hex VID/PID.

Where do I find the Event Monitor and USB Vendor/Product ID panel?

Once your controller is connected and active, scroll down to Step 4 ("Advanced Diagnostics") at the bottom of the tester and click the "Show Advanced Lab" button. This expands the live Event Monitor (with Pause and Clear controls), the browser frame-sampling meter, and the Hardware Specs panel.

Explore Other Tools
Full Laboratory