What a browser cannot see on a DualSense
This is the table to read first, because it prevents the most common false alarm. The DualSense is a far richer device than the Gamepad API describes, and several of its headline features have no representation in the interface at all. None of the rows below indicate a fault; they indicate a boundary.
| Feature | Why no test can reach it | What you can check instead |
|---|---|---|
| Adaptive trigger resistance | The specification defines haptic effect types for rumble; it has no effect type that applies force to a trigger. | Triggers still report their position continuously as buttons[6] and buttons[7], so you can test movement and range — just not resistance. |
| Touchpad surface coordinates | The specification does define a touch array, but Chromium keeps it behind the experimental GamepadMultitouch runtime flag, so an ordinary browser session sees only the touchpad CLICK. | The click appears at buttons[17]. Finger position is not readable with default browser settings. |
| Gyroscope and accelerometer | The Gamepad API exposes buttons and axes; motion sensors are outside its interface. | Nothing in this test covers motion. A pad with a dead gyro will pass everything here. |
| Light bar colour | There is no output channel for LEDs in the specification. | The vibration actuator is the only output this page can drive. |
| Microphone and its mute button | Audio devices are handled by an entirely separate part of the platform. | Test the headset microphone with a dedicated mic tester instead. |
The adaptive triggers row is the one that catches people out. A trigger whose resistance motor has failed still reports its position perfectly, so it passes every browser test ever written. Conversely a trigger that no longer returns to 0.000 at rest has a genuine, measurable fault that this page will show you immediately — see the analog trigger test for the detail.
What Chromium reads each DualSense button from
Chromium ships a mapper written specifically for this pad. These are its assignments, transcribed straight out of the function.
| Canonical index | Button on the pad | Read from | Arrives as |
|---|---|---|---|
| buttons[0] | Cross ✕ | buttons[1] | a raw button |
| buttons[1] | Circle ○ | buttons[2] | a raw button |
| buttons[2] | Square □ | buttons[0] | a raw button |
| buttons[3] | Triangle △ | buttons[3] | a raw button |
| buttons[4] | L1 | buttons[4] | a raw button |
| buttons[5] | R1 | buttons[5] | a raw button |
| buttons[6] | L2 | AxisToButton(axes[3]) | an axis, converted |
| buttons[7] | R2 | AxisToButton(axes[4]) | an axis, converted |
| buttons[8] | Create | buttons[8] | a raw button |
| buttons[9] | Options | buttons[9] | a raw button |
| buttons[10] | L3 | buttons[10] | a raw button |
| buttons[11] | R3 | buttons[11] | a raw button |
| buttons[16] | PS button | buttons[12] | a raw button |
| buttons[17] | beyond the Standard Gamepad | buttons[13] | Tagged GamepadButtonType::kTrackpad — the touchpad click, not the touch surface. |
DpadFromAxis(axes[9]) fills indices 12–15 from a single hat axis.
Notice the face buttons do not pass straight through — they are deliberately reordered:
canonical index 2 comes from raw position 0, while canonical index 0 comes from raw
position 1. That reshuffle is the entire job of a mapper — the raw device reports its
buttons in Sony's order and the browser rearranges them into the canonical geometric
order so that buttons[0] means the same physical place it means on every
other pad. Notice too that the touchpad click is tagged with a distinct button type in the
source, so the browser never treats it as an ordinary button.
A thorough pass in about three minutes
- Face buttons and d-pad. Cross, Circle, Square, Triangle, then all four directions. Eight inputs, all digital, all pass or fail cleanly.
- Shoulders and triggers. L1 and R1 are digital. L2 and R2 must sweep from 0.000 to 1.000 — watch the value, not the bar, and confirm both reach exactly 1.000.
- Stick clicks and centre cluster. L3, R3, Create, Options and the PS button. On some systems the PS button is claimed by the OS before the browser sees it, which is not a controller fault.
- Touchpad click. Press the pad until it clicks; index 17 appears in the extras row.
- Sticks at rest. Hands off, then run the drift meter for a minute. This is the check that finds the fault everyone buys a second-hand pad and then discovers.
- Vibration. One button in the device panel; if the effect resolves, the channel works end to end.
What a clean pass settles — and what it doesn't
A clean pass means every button, both sticks and both triggers deliver input through the browser, which is enough to settle a second-hand purchase or a warranty conversation. It settles nothing about the adaptive triggers, the gyro, the touchpad surface, the light bar or the microphone: if a listing claims those work, no browser-based tool can confirm it, and a page that says otherwise is worth distrusting.