This is an implementation report for the [[vibration]] specification, produced in response to the W3C Council recommendation ( Vibration API Council Report, August 2025) that the Working Group document what implementation experience the API currently has.
The Vibration API is implemented in a single browser engine (Blink). Firefox (Gecko) removed support in version 129 (August 6, 2024). WebKit has never shipped the API and formally opposes it.
This document was produced in response to the W3C Council recommendation that the Working Group document the implementation experience of the [[vibration]] specification.
The following table lists browser engines, not individual browsers. Chromium-based browsers (Chrome, Edge, Opera, Samsung Internet, WebView Android, etc.) all share the Blink engine and are counted as a single implementation.
| Engine | Browsers | Status | Notes |
|---|---|---|---|
| Blink | Chrome, Edge, Opera, Samsung Internet, Chrome for Android, WebView Android, and other Chromium-based browsers | Implemented | Cross-origin iframe restrictions added in Chrome 55. User gesture requirement added in Chrome 60. See Chrome Status. |
| Gecko | Firefox | Removed |
Firefox Desktop: support removed in version 129 (August 6, 2024),
Bug
1900037.
Firefox for Android: from version 79, the API is present but
vibration is disabled — navigator.vibrate() returns
true when the window is visible but produces no
haptic feedback (see
MDN compatibility data,
Bug
1653318).
Mozilla standards position: open, no position assigned,
issue #907.
|
| WebKit | Safari (macOS, iOS, iPadOS), all iOS/iPadOS browsers | Not implemented | Never shipped in Safari or any current WebKit-based browser. Code was present for the discontinued EFL port (2012–2017, see Historical implementation experience), then removed (changeset 216696, Bug 171766). WebKit formal standards position: Oppose, issue #267 (closed 2023-11-14). Concerns: device independence, unclear use cases, portability, annoyance/abuse potential, power consumption, integration infeasibility on Apple platforms. |
In addition to the current implementation experience above, the Vibration API has a history of implementation in engines that no longer support it.
Samsung engineer Kihong Kwon landed initial Vibration API support in
WebKit in 2012 for the EFL port, which was used on Samsung Tizen
devices. The EFL port enabled the feature
(ENABLE_VIBRATION PUBLIC ON in
Source/cmake/OptionsEfl.cmake) and received bug fixes
through 2015.
The EFL port was removed from the WebKit mainline in February 2017. In May 2017, the Vibration API code itself was removed (Bug 171766, changeset 216696). The removal bug states: "Not enabled by any ports. Tests are skipped by all ports. Unmaintained code."
A separate fork, ewebkit/webkit, retains the Vibration API code but has not been updated since July 3, 2017. The Tizen devices that used EFL WebKit are no longer in production.
No Web Platform Test results exist for any EFL WebKit-based browser.
The following was verified by searching and reading the source code
of each engine. To reproduce, clone each repository and search for
the files and identifiers listed below (e.g., using grep
-r or your editor's search).
VibrationController is implemented in
third_party/blink/renderer/modules/vibration/vibration_controller.cc.
The vibrate() method requires sticky user activation
(HasStickyUserActivation()) and blocks calls from
cross-origin iframes
(IsCrossOriginToNearestMainFrame()) and fenced
frames. The WebIDL is in
third_party/blink/renderer/modules/vibration/navigator_vibration.idl.
vibrate() WebIDL binding is in
dom/webidl/Navigator.webidl, gated on the
dom.vibrator.enabled preference. That preference
defaults to false in
modules/libpref/init/StaticPrefList.yaml.
No platform-specific override exists in
mobile/android/app/geckoview-prefs.yaml or
elsewhere. The HAL implementation remains in
hal/android/AndroidHal.cpp (Vibrate())
and hal/fallback/FallbackVibration.cpp (no-op
stub for desktop), but is unreachable with the preference
disabled.
vibrate() method in any IDL file. No
VibrationController,
NavigatorVibration, or ENABLE_VIBRATION
flag anywhere in the source tree. The API is entirely absent.
Firefox supported the Vibration API from version 16 (October 2012)
through version 128 (desktop). On Android, vibration was disabled
starting in version 79 (July 2020): the API remained present and
navigator.vibrate() returned true when the
window was visible, but no haptic feedback was produced
(Bug
1653318). The feature was not re-enabled due to abuse concerns.
Firefox Desktop removed the API entirely in version 129 (August 6, 2024, Bug 1900037).
The following tests verify conformance to [[vibration]].
For the latest automated test results, visit wpt.fyi/results/vibration.
Results from wpt.fyi, last verified April 9, 2026. Since Firefox 129 (August 2024), the API is no longer exposed on any Firefox platform (see Historical implementation experience).
| Test | Blink (Chrome 149) | Gecko (Firefox 151) | WebKit (Safari 240 preview) |
|---|---|---|---|
| api-is-present.html | PASS (1/1) | FAIL (0/1) | FAIL (0/1) |
| idlharness.window.js | PASS (16/16) | FAIL (13/16) | FAIL (13/16) |
| invalid-values.html | PASS (8/8) | FAIL (0/8) | FAIL (0/8) |
| silent-ignore.html | PASS (1/1) | FAIL (0/1) | FAIL (0/1) |
Manual tests verify that the vibration mechanism is actually triggered on the device. These tests cannot be automated. Tests were conducted on 2024-06-08 (see w3c/vibration#33) against the following browser versions:
| Test | Blink (Chrome for Android 125) | Gecko (Firefox for Android 126) | WebKit (Safari iOS 17.4.1) |
|---|---|---|---|
| cancel-when-hidden-manual.html | PASS | FAIL | FAIL |
| cancel-with-0-manual.html | PASS | FAIL | FAIL |
| cancel-with-array-0-manual.html | PASS | FAIL | FAIL |
| cancel-with-empty-array-manual.html | PASS | FAIL | FAIL |
| cancel-with-new-manual.html | PASS | FAIL | FAIL |
| pattern-array-extra-manual.html | PASS | FAIL | FAIL |
| pattern-array-manual.html | PASS | FAIL | FAIL |
| pattern-array-with-0-manual.html | PASS | FAIL | FAIL |
| simple-array-manual.html | PASS | FAIL | FAIL |
| simple-scalar-manual.html | PASS | FAIL | FAIL |
All features of [[vibration]] are implemented in the Blink engine (Chrome for Android, Chrome desktop, Edge, and other Chromium-based browsers). This is demonstrated through the automated and manual WPT results above. No other engine provides a functional implementation.
No. Only one browser engine (Blink) provides a functional implementation. Firefox removed support in version 129 (August 6, 2024); the API is now disabled on all Firefox platforms, including Android (see Historical implementation experience). WebKit has never shipped the API and formally opposes it.
The Chromium-based implementations (Chrome, Edge, Opera, Samsung Internet, etc.) share the same Blink engine codebase and are not independent of each other. They represent a single implementation.
Yes, in Chromium-based browsers. Not in Firefox (removed) or Safari (never shipped).
Yes. Chrome introduced cross-origin iframe restrictions (v55) and user
gesture requirements (v60) in response to widespread abuse of the API.
A manual review
of sites calling navigator.vibrate() found usage
dominated by notification emulation, ad-related scripts, and patterns
now blocked by Chrome's mitigations.
Chrome
use counter data shows approximately 0.05–0.13% of page loads
invoke the API (2022–2026). Firefox disabled the API on Android
citing abuse concerns before removing it entirely from Firefox Desktop
in v129
(Bug
1900037). WebKit's opposition cites device independence, unclear
use cases, power consumption, annoyance/abuse potential, portability,
and infeasibility of integration on Apple platforms
(
WebKit standards position #267).