Supported browsers
Grona’s runtime runs in your visitors’ browsers as modern JavaScript, without transpilation. It works in current evergreen browsers, such as Chrome, Edge, Firefox and Safari, that support the features below. This page lists those features and what happens in a browser that lacks them.
What the runtime needs
Section titled “What the runtime needs”The runtime uses ES2017 syntax and these browser APIs. The syntax in the first row is a hard requirement; the optional APIs are listed under graceful degradation below.
| Feature | Used for |
|---|---|
async and await, const and let, arrow functions, spread in calls |
The runtime’s own syntax. Without them the script does not run at all. |
fetch, including keepalive |
Downloading variation changes and sending events |
URL and URLSearchParams |
Matching pages and reading the address |
TextEncoder |
Assigning visitors to variations |
Object.assign |
Building tracking events |
MutationObserver |
Applying changes to elements that render late |
navigator.sendBeacon |
Sending events when the page is hidden or closed |
crypto.randomUUID |
Creating the visitor id (with a fallback when it is missing) |
Grona does not publish tested minimum browser versions.
Graceful degradation
Section titled “Graceful degradation”Some features are optional. Without them, the runtime still applies changes and skips only the part that needs them:
- Without
MutationObserver, changes to elements that are not in the page yet are not retried. - Without
navigator.sendBeacon, the events normally sent as the page closes are skipped. - Without the Resource Timing API, location is unknown, so location rules do not match.
- Without usable storage, Grona keeps the visitor id in memory for that page only, so the visitor can get a new id and a different variation on every page load.
Internet Explorer 11
Section titled “Internet Explorer 11”Internet Explorer 11 is not supported. Its JavaScript engine cannot parse async functions, so main.js fails as a whole and no change applies. If the anti-flicker script runs, the page stays hidden until its 5-second timeout, then shows your original content.