The two-minute check
Work around the pad in a fixed order so nothing gets missed: A, B, X, Y; LB, RB; LT, RT; View and Menu; both stick clicks; all four d-pad directions; the Xbox button. That is 17 inputs — the whole canonical set — plus the Share button on a Series X|S pad. Then push each stick to all four extremes and watch the axis values reach ±1.000, and squeeze each trigger from rest to the stop watching the value sweep from 0.000 to 1.000. Anything that fails to light or fails to reach its extreme is worth a second look while the pad is still returnable.
Two results deserve particular attention because they pass a casual test. A trigger that rests above 0.000 with your hands off the pad has stopped coming home — still below the pressed threshold, so a lights-only tester calls it healthy. And a stick that reaches only 0.94 at full deflection has lost part of its range, which feels like reduced sensitivity rather than a fault. Both are invisible to a tester that only shows lights.
What Chromium reads each Xbox button from
Browsers do not receive an "Xbox controller"; they receive a HID report and remap it onto the canonical layout. Chromium's Windows source contains a dedicated function for Xbox pads over Bluetooth, and the table below is that function's assignments, transcribed from it directly.
| Canonical index | Button on the pad | Read from | Arrives as |
|---|---|---|---|
| buttons[0] | A | buttons[0] | a raw button |
| buttons[1] | B | buttons[1] | a raw button |
| buttons[2] | X | buttons[3] | a raw button |
| buttons[3] | Y | buttons[4] | a raw button |
| buttons[4] | LB | buttons[6] | a raw button |
| buttons[5] | RB | buttons[7] | a raw button |
| buttons[6] | LT | AxisToButton(axes[3]) | an axis, converted |
| buttons[7] | RT | AxisToButton(axes[4]) | an axis, converted |
| buttons[8] | View | buttons[10] | a raw button |
| buttons[9] | Menu | buttons[11] | a raw button |
| buttons[10] | LS (left stick click) | buttons[13] | a raw button |
| buttons[11] | RS (right stick click) | buttons[14] | a raw button |
| buttons[16] | Xbox button | buttons[12] | a raw button |
DpadFromAxis(axes[9]) fills indices 12–15 from a single hat axis.
Two things stand out. First, the triggers — canonical indices buttons[6] and buttons[7] — are not read from raw buttons at all; they are converted from axes. That is the mechanical reason a trigger has a continuous value in the first place, and why it behaves unlike every other entry in the button array. Second, the four face buttons come from raw positions 0, 1, 3, 4 — not 0 to 3 — and across the whole span the mapper touches, raw positions 2, 5, 8, 9 go unread entirely. Gaps like that in a raw report are completely normal, and they are exactly why reading indices straight off a pad that reports no mapping produces such confusing results.
Where the trigger dead zone comes from
Chromium turns a trigger's analog value into a boolean with a single comparison:
pressed is true when the value exceeds 30/255, or
0.117647. The comment on that constant in the browser's
source says "Matches XInput's trigger deadzone", which makes the provenance unusually
clear — the web platform inherited the number from Xbox's own input stack rather than
picking one. If you have ever wondered why a light trigger pull does nothing in a browser
game, that is the number responsible, and it is the same one your Xbox software has been
applying all along.
Splitting a controller fault from everything else
- Change one variable at a time. Wired then wireless, then a different port, then a different machine. An input that fails on all four is the controller; one that fails on one is not.
- Check
mappingbefore believing an index. Over a dongle or an adapter it frequently reports the empty string, and every published table stops applying. - Rule the OS out for the Xbox button. Windows claims it for the Game Bar; a pad that reports everything else is healthy.
- Test the sticks at rest, not just in motion. Full-deflection tests pass on badly drifting sticks — that is what the stick drift test is for.
- Try a different browser. If a pad enumerates in one and not another, the fault is in the browser's device table, and your hardware is fine.
If you also have other pads
The indices are shared but the letters are not, and Nintendo's arrangement is the reverse of Microsoft's — the bottom face button that reads "A" here reads "B" on a Pro Controller. The Switch Pro controller test covers that directly, and the controller button mapping page puts all four label sets in one table so you can see which indices agree.