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.
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.
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.
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.
Measurement & Telemetry Classification
Technical distinction between direct hardware reads, client-side algorithms, and educational thresholds.
- 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 "").
- 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.
- 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
How to Test Step-by-Step
- 1Connect your gamepad via USB cable, Bluetooth, or a 2.4GHz wireless receiver.
- 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.
- 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)").
- 4Press each physical button while watching the B0–B17 Button Matrix to check for unresponsive switches, chattering contacts, or stuck states.
- 5Sweep both thumbsticks and triggers to inspect normalized axis floats (-1.000 to +1.000) and proportional trigger values (0.000 to 1.000).
- 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
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.
Explains browser gamepad enumeration, security gesture rules, and state snapshots.
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.