{"record":{"id":"0bf8a1f4dd0feb91","repo":"GoogleChrome/lighthouse","slug":"unsupported-old-chrome","errorCode":"UNSUPPORTED_OLD_CHROME","errorMessage":"This version of Chrome is too old to support '{featureName}'. Use a newer version to see full results.","messagePattern":"This version of Chrome is too old to support '(.+?)'\\. Use a newer version to see full results\\.","errorType":"exception","errorClass":"LighthouseError","httpStatus":null,"severity":"error","filePath":"core/computed/metrics/responsiveness.js","lineNumber":91,"sourceCode":"   * if the closest match is off by more than 4ms.\n   * TODO: this doesn't try to match inputs to interactions and break ties if more than\n   * one interaction had this duration by returning the first found.\n   * @param {ResponsivenessEvent} responsivenessEvent\n   * @param {LH.Trace} trace\n   * @return {EventTimingEvent}\n   */\n  static findInteractionEvent(responsivenessEvent, {traceEvents}) {\n    const candidates = traceEvents.filter(/** @return {evt is EventTimingEvent} */ evt => {\n      // Examine only beginning/instant EventTiming events.\n      return evt.name === 'EventTiming' && evt.ph !== 'e';\n    });\n\n    // If trace is from < m103, the timestamps cannot be trusted\n    // <m103 traces (bad) had a   args.frame (we used to provide a fallback trace event, but not\n    //                                        any more)\n    // m103+ traces (good) have a args.data.frame (https://crrev.com/c/3632661)\n    if (candidates.length && candidates.every(candidate => !candidate.args.data?.frame)) {\n      throw new LighthouseError(\n        LighthouseError.errors.UNSUPPORTED_OLD_CHROME,\n        {featureName: 'detailed EventTiming trace events'}\n      );\n    }\n\n    const {maxDuration, interactionType} = responsivenessEvent.args.data;\n    let bestMatchEvent;\n    let minDurationDiff = Number.POSITIVE_INFINITY;\n    for (const candidate of candidates) {\n      // Must be from same frame.\n      if (candidate.args.data.frame !== responsivenessEvent.args.frame) continue;\n\n      // TODO(bckenny): must be in same navigation as well.\n\n      const {type, duration} = candidate.args.data;\n      // Discard if type is incompatible with responsiveness interactionType.\n      const matchingTypes = interactionTypeToType[interactionType];\n      if (!matchingTypes) {","sourceCodeStart":73,"sourceCodeEnd":109,"githubUrl":"https://github.com/GoogleChrome/lighthouse/blob/9515cd4e58ebed69f78742d932b501c2cab8ad8f/core/computed/metrics/responsiveness.js#L73-L109","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before (puppeteer pinned to old chrome)\nconst browser = await puppeteer.launch({\n  executablePath: '/opt/google/chrome-old/chrome',\n});\n\n// after (let puppeteer use bundled/up-to-date chrome)\nconst browser = await puppeteer.launch();","handlingStrategy":"validation","validationCode":"// Check Chrome version before requesting Responsiveness\nfunction getChromeMajorVersion(userAgent) {\n  const match = /Chrome\\/(\\d+)/.exec(userAgent);\n  return match ? parseInt(match[1], 10) : 0;\n}\nif (getChromeMajorVersion(navigator.userAgent) < 103) {\n  console.warn('Chrome < 103 does not support detailed EventTiming — Responsiveness unavailable');\n}","typeGuard":null,"tryCatchPattern":"try {\n  const responsiveness = await Responsiveness.request(data, context);\n} catch (e) {\n  if (e instanceof LighthouseError && e.code === 'UNSUPPORTED_OLD_CHROME') {\n    // Chrome too old — Responsiveness/INP not available\n    return { notApplicable: true, reason: 'UNSUPPORTED_OLD_CHROME' };\n  }\n  throw e;\n}","preventionTips":["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"],"tags":["responsiveness","inp","chrome-version","compatibility","trace"],"backgroundTag":null,"analyzedSha":"9515cd4e58ebed69f78742d932b501c2cab8ad8f","analyzedAt":"2026-08-13T06:28:10.346Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}