← Chrome 147 reference

v147 · web api · in developer trial

Gamepad Event-Driven Input API

An extension to the Gamepad API that fires a rawgamepadinputchange event whenever new input data arrives from the device, eliminating the need to poll navigator.getGamepads() on every animation frame. Reduces input latency for games and interactive applications that care about sub-frame responsiveness.

In developer trial This feature is in development and behind a flag in Chrome 147. Enable chrome://flags/#enable-experimental-web-platform-features to test it. The event name and interface shape may change before shipping.

at a glance

Status in Chrome 147In developer trial (behind a flag)
Flagchrome://flags/#enable-experimental-web-platform-features
New eventrawgamepadinputchange on window
Standards positionFirefox: No signal (experimental implementation exists)  ·  Safari: No signal
SpecW3C Gamepad spec (working draft)
Chromium bugcrbug.com/40582297
Demogabrielsanbrito.github.io/gamepad-raw-input-events
ChromeStatus5989275208253440 — Gamepad Event-Driven Input API
Source: chromestatus.com feature 5989275208253440, May 2026.

why it exists

The existing Gamepad API requires polling: you call navigator.getGamepads() inside a requestAnimationFrame loop, which runs at most at the display refresh rate (typically 60 Hz). A gamepad can report input at 1000 Hz or higher. The gap means input events can be 1–16 ms stale before the application sees them — unacceptable in competitive games or precision controllers. An event-driven model fires immediately when the hardware reports new data, independently of the frame rate, enabling applications to respond at the device's native rate.

Source: chromestatus summary and web developer signals referenced in the feature entry, May 2026.

shape of the API

One new event on window that fires for every hardware input report:

rawgamepadinputchange event

Targetwindow
Fires whenThe gamepad hardware reports new button or axis data, at the device's native polling rate — independent of requestAnimationFrame.
event.gamepadA snapshot Gamepad object with the current button and axis state at the time of the report.
event.gamepad.indexIndex matching the existing navigator.getGamepads() array.
event.gamepad.buttonsArray of GamepadButton objects with pressed, touched, and value.
event.gamepad.axesArray of axis values in the range [-1, 1].
event.gamepad.timestampHigh-resolution timestamp of the hardware report.
Source: W3C Gamepad working draft and chromestatus summary, May 2026. Field names may change before ship.

example

Event-driven input loop (replaces polling)

// Previously: polling inside rAF
function pollLoop() {
  const gamepads = navigator.getGamepads();
  if (gamepads[0]) {
    handleInput(gamepads[0]);
  }
  requestAnimationFrame(pollLoop);
}

// With rawgamepadinputchange: fires at device rate, not frame rate
window.addEventListener('rawgamepadinputchange', (event) => {
  handleInput(event.gamepad);
});

Low-latency button handler

window.addEventListener('rawgamepadinputchange', (event) => {
  const { gamepad } = event;

  // A button (index 0) — fire at native device rate
  if (gamepad.buttons[0].pressed) {
    triggerAction(gamepad.index, 'A', gamepad.timestamp);
  }

  // Left stick X axis
  const leftX = gamepad.axes[0];
  if (Math.abs(leftX) > 0.1) {
    moveCharacter(leftX);
  }
});
Source: W3C Gamepad API spec and feature summary, May 2026.

relation to the existing Gamepad API

Polling model (navigator.getGamepads())Still works. Returns snapshot at rAF rate. Good for most games; no changes needed.
rawgamepadinputchange eventsFires at hardware rate. Use when latency or missed inputs at sub-frame granularity matter.
gamepadconnected / gamepaddisconnectedUnchanged. Still the mechanism for detecting connect/disconnect.

browser support

BrowserSupport
Chrome 147In developer trial (behind flag)
Edge 147Tracking Chromium
FirefoxNo signal (experimental internal implementation exists)
SafariNo signal
Source: chromestatus browser views, May 2026.

see also