GoogleChrome/lighthouse · error · LighthouseError
UNSUPPORTED_OLD_CHROME
UNSUPPORTED_OLD_CHROME
Error message
This version of Chrome is too old to support '{featureName}'. Use a newer version to see full results. What it means
Thrown as a LighthouseError with code UNSUPPORTED_OLD_CHROME from Responsiveness.findInteractionEvent() when every EventTiming candidate trace event lacks `args.data.frame`. Chrome before milestone 103 stored the frame ID in `args.frame`; m103+ moved it to `args.data.frame`. Lighthouse no longer provides a fallback for old-format traces, so it cannot reliably correlate responsiveness events to interaction events on pre-m103 Chrome.
Source
Thrown at core/computed/metrics/responsiveness.js:91
* if the closest match is off by more than 4ms.
* TODO: this doesn't try to match inputs to interactions and break ties if more than
* one interaction had this duration by returning the first found.
* @param {ResponsivenessEvent} responsivenessEvent
* @param {LH.Trace} trace
* @return {EventTimingEvent}
*/
static findInteractionEvent(responsivenessEvent, {traceEvents}) {
const candidates = traceEvents.filter(/** @return {evt is EventTimingEvent} */ evt => {
// Examine only beginning/instant EventTiming events.
return evt.name === 'EventTiming' && evt.ph !== 'e';
});
// If trace is from < m103, the timestamps cannot be trusted
// <m103 traces (bad) had a args.frame (we used to provide a fallback trace event, but not
// any more)
// m103+ traces (good) have a args.data.frame (https://crrev.com/c/3632661)
if (candidates.length && candidates.every(candidate => !candidate.args.data?.frame)) {
throw new LighthouseError(
LighthouseError.errors.UNSUPPORTED_OLD_CHROME,
{featureName: 'detailed EventTiming trace events'}
);
}
const {maxDuration, interactionType} = responsivenessEvent.args.data;
let bestMatchEvent;
let minDurationDiff = Number.POSITIVE_INFINITY;
for (const candidate of candidates) {
// Must be from same frame.
if (candidate.args.data.frame !== responsivenessEvent.args.frame) continue;
// TODO(bckenny): must be in same navigation as well.
const {type, duration} = candidate.args.data;
// Discard if type is incompatible with responsiveness interactionType.
const matchingTypes = interactionTypeToType[interactionType];
if (!matchingTypes) {View on GitHub (pinned to 9515cd4e58)
Solutions
- Upgrade Chrome to version 103 or newer (ideally the latest stable)
- If using Puppeteer/Playwright, update the browser binary or remove a pinned executablePath
- In CI, use a Chrome for Testing or Chrome Headless Shell image that is version 103+
- If stuck on old Chrome, accept that the Responsiveness/INP metric will not be available
Example fix
// before (puppeteer pinned to old chrome)
const browser = await puppeteer.launch({
executablePath: '/opt/google/chrome-old/chrome',
});
// after (let puppeteer use bundled/up-to-date chrome)
const browser = await puppeteer.launch(); Defensive patterns
Strategy: validation
Validate before calling
// Check Chrome version before requesting Responsiveness
function getChromeMajorVersion(userAgent) {
const match = /Chrome\/(\d+)/.exec(userAgent);
return match ? parseInt(match[1], 10) : 0;
}
if (getChromeMajorVersion(navigator.userAgent) < 103) {
console.warn('Chrome < 103 does not support detailed EventTiming — Responsiveness unavailable');
} Try / catch
try {
const responsiveness = await Responsiveness.request(data, context);
} catch (e) {
if (e instanceof LighthouseError && e.code === 'UNSUPPORTED_OLD_CHROME') {
// Chrome too old — Responsiveness/INP not available
return { notApplicable: true, reason: 'UNSUPPORTED_OLD_CHROME' };
}
throw e;
} Prevention
- Always use Chrome 103 or newer when collecting traces for Responsiveness/INP
- Keep Puppeteer/Playwright browser binaries updated or unpinned
- In CI, use Chrome for Testing images that track the latest stable version
- Check the Chrome version before requesting the Responsiveness artifact
When it happens
Trigger: The Responsiveness computed artifact is requested (which calls findInteractionEvent), and the trace contains EventTiming events but all of them have `!candidate.args.data?.frame` (i.e., they use the pre-m103 format). The throw includes featureName: 'detailed EventTiming trace events' in the interpolated message.
Common situations: Running Lighthouse with a Chrome binary older than version 103. Using a pinned or legacy Chrome in CI that hasn't been updated. Testing against a Chromium fork that lags behind mainline. Puppeteer/Playwright with a fixed `executablePath` pointing to old Chrome.
Related errors
- Responsiveness currently unsupported by simulated throttling
- NO_SCREENSHOTS
- INVALID_SPEEDLINE
- NO_LCP
- NO_DCL
AI-assisted analysis of GoogleChrome/lighthouse@9515cd4e58 (2026-08-13).
Data as JSON: /api/errors/0bf8a1f4dd0feb91.
Report an issue: GitHub.