Original title: PerformanceObserver.observe(): compatibility table is misleading — does not distinguish Level 1 (entryTypes) vs Level 2 (type+buffered) syntax, caused production breakage
MDN URL
https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver/observe
What specific section or headline is this issue about?
Code example and Browser compatibility table
What information was incorrect, unhelpful, or incomplete?
The code example uses the Level 2 syntax ({ type, buffered }) without any warning:
observer.observe({ type: "resource", buffered: true });
This throws a runtime TypeError on older browsers (e.g. Android 9 WebView, iOS 12 Safari) that only support the Level 1 syntax ({ entryTypes: [...] }).
Additionally, the Browser Compatibility table shows observe() is supported from Safari 11 / iOS 11, but this only reflects support for the Level 1 signature. The Level 2 signature ({ type, buffered }) has a narrower support range that is not separately represented in the table.
The combination of a Level 2 example and a table that appears to show broad support is misleading.
What did you expect to see?
Either:
- The example uses the safer Level 1 syntax (entryTypes), or shows both syntaxes with a feature-detect fallback
- A compatibility warning noting that { type, buffered } requires Level 2 support (not available in Safari < 14, Chrome WebView < ~73)
- Separate BCD entries for the type and buffered options so developers can see the real support range
Do you have any supporting links, references, or citations?
Do you have anything more you want to share?
Reproduction steps (verified on Android 9):
- Start an Android 9 emulator (API 28) via Android Studio AVD Manager
- Open https://7fznjs.csb.app/ in the browser
- Inspect via chrome://inspect on desktop Chrome
- Error in Console: "Uncaught TypeError: Failed to execute 'observe' on 'PerformanceObserver': required member entryTypes is undefined."
Environment: Android 9 (PSR1.210301.009.B1), WebView Chrome 66.0.3359.158
iOS 12 was also affected — confirmed at the time via a real enterprise device — but cannot be re-verified now as iOS 12 simulators require Xcode 13 (incompatible with newer macOS), and cloud platforms like BrowserStack no longer support iOS 12.
This issue caused a production white screen in an enterprise app. The misleading compatibility table was the primary reason the bug went unnoticed during development.
Original title: PerformanceObserver.observe(): compatibility table is misleading — does not distinguish Level 1 (entryTypes) vs Level 2 (type+buffered) syntax, caused production breakage
MDN URL
https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver/observe
What specific section or headline is this issue about?
Code example and Browser compatibility table
What information was incorrect, unhelpful, or incomplete?
The code example uses the Level 2 syntax ({ type, buffered }) without any warning:
This throws a runtime TypeError on older browsers (e.g. Android 9 WebView, iOS 12 Safari) that only support the Level 1 syntax ({ entryTypes: [...] }).
Additionally, the Browser Compatibility table shows observe() is supported from Safari 11 / iOS 11, but this only reflects support for the Level 1 signature. The Level 2 signature ({ type, buffered }) has a narrower support range that is not separately represented in the table.
The combination of a Level 2 example and a table that appears to show broad support is misleading.
What did you expect to see?
Either:
Do you have any supporting links, references, or citations?
Do you have anything more you want to share?
Reproduction steps (verified on Android 9):
Environment: Android 9 (PSR1.210301.009.B1), WebView Chrome 66.0.3359.158
iOS 12 was also affected — confirmed at the time via a real enterprise device — but cannot be re-verified now as iOS 12 simulators require Xcode 13 (incompatible with newer macOS), and cloud platforms like BrowserStack no longer support iOS 12.
This issue caused a production white screen in an enterprise app. The misleading compatibility table was the primary reason the bug went unnoticed during development.