GoogleChrome/lighthouse · error · Error

FCP All Frames not implemented in lantern

Error message

FCP All Frames not implemented in lantern

What it means

Thrown as a plain Error from FirstContentfulPaintAllFrames.computeSimulatedMetric() because the Lantern (simulation-based) estimation path for FCP-all-frames has not been implemented yet. The method has no body logic — it immediately throws. This is a deliberate placeholder (marked with a TODO) indicating a known feature gap, not a runtime bug.

Source

Thrown at core/computed/metrics/first-contentful-paint-all-frames.js:16

/**
 * @license
 * Copyright 2021 Google LLC
 * SPDX-License-Identifier: Apache-2.0
 */

import {makeComputedArtifact} from '../computed-artifact.js';
import {NavigationMetric} from './navigation-metric.js';

class FirstContentfulPaintAllFrames extends NavigationMetric {
  /**
   * @return {Promise<LH.Artifacts.LanternMetric>}
   */
  static computeSimulatedMetric() {
    // TODO: Add support for all frames in lantern.
    throw new Error('FCP All Frames not implemented in lantern');
  }

  /**
   * @param {LH.Artifacts.NavigationMetricComputationData} data
   * @return {Promise<LH.Artifacts.Metric>}
   */
  static async computeObservedMetric(data) {
    const {processedNavigation} = data;

    return {
      timing: processedNavigation.timings.firstContentfulPaintAllFrames,
      timestamp: processedNavigation.timestamps.firstContentfulPaintAllFrames,
    };
  }
}

const FirstContentfulPaintAllFramesComputed = makeComputedArtifact(
  FirstContentfulPaintAllFrames,

View on GitHub (pinned to 9515cd4e58)

Solutions

  1. Use throttlingMethod: 'provided' or 'devtools' (observed mode) instead of 'simulate' when you need FCP All Frames
  2. If using the default Lighthouse config, check whether FCP All Frames is actually needed — standard FCP has full Lantern support
  3. Wait for a future Lighthouse version that implements Lantern support for this metric (track the TODO)

Example fix

// before
const config = {
  settings: { throttlingMethod: 'simulate' },
};

// after
const config = {
  settings: { throttlingMethod: 'devtools' },
};
Defensive patterns

Strategy: validation

Validate before calling

// Check throttling method before requesting FCP All Frames
if (settings.throttlingMethod === 'simulate') {
  // FCP All Frames is not implemented for Lantern simulation
  // Use standard FCP or switch to observed mode
  return undefined;
}
const fcpAllFrames = await FirstContentfulPaintAllFrames.request(data, context);

Try / catch

try {
  const fcp = await FirstContentfulPaintAllFrames.request(data, context);
} catch (e) {
  if (e.message === 'FCP All Frames not implemented in lantern') {
    // Simulation not supported — fall back to standard FCP or use observed mode
    return undefined;
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling FirstContentfulPaintAllFrames.request() with settings.throttlingMethod set to 'simulate'. The makeComputedArtifact wrapper routes to computeSimulatedMetric(), which throws unconditionally. The observed path (computeObservedMetric) works fine, so this only fires under simulated throttling.

Common situations: Configuring Lighthouse with throttlingMethod: 'simulate' and running an audit or consuming the FCP All Frames computed artifact. Programmatic Lighthouse usage where the default settings use simulation. Any pipeline that requests this artifact under simulated mode.

Related errors


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