Here is a thing about the HTML5 Gamepad API:
the pure API, without using any framework libraries, is not event/listener based.
The only two events that I can see are “gamepadconnected” and “gamepaddisconnected”, which only trigger in the event a controller is plugged into the system or removed. It could loosely be considered “user input”, since the user has to perform an action to do it, but the controller could also already be plugged in when the page/extension loads, which is why I say “loosely”.
Actually reading the GamePad is done via manually checking values, rather than asynchronous messages being sent. You dont listen for a “DOWN_BUTTON” event to trigger, but instead check the value of the GamePad’s ‘buttons’ array at regular intervals, usually on each run of requestAnimationFrame() to sync the animation/game logic to the users framerate.
I think the GamePad API would need official comment, since the API itself is in this weird gray area of “user input” and “manual checking of values”.