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

  1. Upgrade Chrome to version 103 or newer (ideally the latest stable)
  2. If using Puppeteer/Playwright, update the browser binary or remove a pinned executablePath
  3. In CI, use a Chrome for Testing or Chrome Headless Shell image that is version 103+
  4. 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

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


AI-assisted analysis of GoogleChrome/lighthouse@9515cd4e58 (2026-08-13). Data as JSON: /api/errors/0bf8a1f4dd0feb91. Report an issue: GitHub.