PS5 DualSense test, and what a browser can reach

The tool opens with PlayStation labels, so buttons[0] reads "Cross ✕" rather than an index. The DualSense is the pad where the boundary matters most: several of its headline features never reach a web page at all, and knowing which ones saves you from concluding your controller is broken when the interface simply has no field for the feature.

No controller yetLabels shown for DualSense

Press any button on your controller

A connected pad stays invisible to this page until you use it. That is the specification working as designed, not a fault — see the note below the tool.

Device report

id
waiting for input
mapping
—
index
—
buttons
—
axes
—
vibrationActuator
—

Vibration

Buttons

  • [0] Cross ✕—
  • [1] Circle ○—
  • [2] Square □—
  • [3] Triangle △—
  • [4] L1—
  • [5] R1—
  • [6] L2—
  • [7] R2—
  • [8] Create—
  • [9] Options—
  • [10] L3—
  • [11] R3—
  • [12] D-pad ↑—
  • [13] D-pad ↓—
  • [14] D-pad ←—
  • [15] D-pad →—
  • [16] PS button—

Axes

  • [0] left stick horizontal0.000
  • [1] left stick vertical0.000
  • [2] right stick horizontal0.000
  • [3] right stick vertical0.000

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.

DualSense features against what the Gamepad API exposes.
FeatureWhy no test can reach itWhat 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.

Transcribed from MapperDualSense in Chromium's gamepad_standard_mappings_win.cc. Windows only — Chromium keeps separate mapping files for macOS and Linux, which this table does not cover. Applies to: DualSense, DualSense Edge and one further Sony product id.
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

  1. Face buttons and d-pad. Cross, Circle, Square, Triangle, then all four directions. Eight inputs, all digital, all pass or fail cleanly.
  2. 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.
  3. 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.
  4. Touchpad click. Press the pad until it clicks; index 17 appears in the extras row.
  5. 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.
  6. 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.

Questions people actually ask

Can this test the DualSense adaptive triggers?

It can test that the triggers move and report their full range, which is what most faults look like. It cannot test the resistance mechanism, because the Gamepad API has no way to command force into a trigger — the specification defines haptic effect types for rumble only. If your triggers report 0.000 at rest and 1.000 at the stop and sweep smoothly between them, the analog side is healthy regardless of what the resistance motors are doing.

Why does my DualSense report 18 buttons?

Because the touchpad click has no home in the Standard Gamepad, which stops at index 16. Chromium appends it as DUAL_SENSE_BUTTON_TOUCHPAD immediately afterwards, at index 17, giving 18 buttons in total instead of 17. Press the touchpad down until it clicks and watch that index appear in the extras row of the live panel.

Does the vibration test use the DualSense haptics or the old rumble motors?

It requests the effect the specification calls "dual-rumble", which is described there as a configuration with an eccentric rotating mass motor in each handle. What the DualSense actually does with that request is up to its firmware and the driver. So a successful test tells you the vibration channel works end to end; it does not tell you the fine-grained haptics are functioning as they would in a PS5 title.

The touchpad click works but swiping does nothing. Is the touchpad broken?

Probably not, but this page cannot settle it. The distinction is worth stating precisely, because it is more interesting than "not supported". The Gamepad specification does define a touches array of GamepadTouch entries carrying finger position and surface dimensions, and Chromium does implement a version of it — as touchEvents, annotated [RuntimeEnabled=GamepadMultitouch] in Blink's gamepad.idl, with that flag listed at status "experimental" in runtime_enabled_features.json5. Experimental means off in an ordinary browser, so what reaches this page is the click and nothing else. Swiping producing no reading here is the default configuration behaving as configured, not evidence about your hardware.

Should I connect over USB or Bluetooth for testing?

Test whichever you actually play on, and ideally both, because the browser identifies controllers by product id and can apply different handling to each connection. Compare the id and mapping lines in the device panel between the two — if one connection reports the empty mapping and the other reports "standard", you have found a real difference worth knowing about.

How is the DualSense different from a DualShock 4 here?

Barely at all, which is the interesting part. Across all 17 canonical indices the two pads differ in exactly one printed label: Share on the DualShock 4 became Create on the DualSense, at index 8. The PS4 controller test goes into what that means for anything you write against them.

Keep testing

Test the rest of the desk