lighthouse 13.2.0 → 13.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/cli-flags.d.ts +8 -9
- package/cli/cli-flags.js +2 -2
- package/cli/test/smokehouse/config/exclusions.js +2 -0
- package/cli/test/smokehouse/lighthouse-runners/bundle.js +7 -3
- package/cli/test/smokehouse/lighthouse-runners/cli.js +5 -1
- package/cli/test/smokehouse/lighthouse-runners/devtools-mcp.js +7 -3
- package/cli/test/smokehouse/lighthouse-runners/devtools.js +4 -1
- package/cli/test/smokehouse/smokehouse.js +7 -2
- package/cli/test/smokehouse/version-check.d.ts +1 -1
- package/core/audits/accessibility/accesskeys.js +1 -1
- package/core/audits/accessibility/aria-allowed-attr.js +1 -1
- package/core/audits/accessibility/aria-allowed-role.js +1 -1
- package/core/audits/accessibility/aria-command-name.js +1 -1
- package/core/audits/accessibility/aria-conditional-attr.js +1 -1
- package/core/audits/accessibility/aria-deprecated-role.js +1 -1
- package/core/audits/accessibility/aria-dialog-name.js +1 -1
- package/core/audits/accessibility/aria-hidden-body.js +1 -1
- package/core/audits/accessibility/aria-hidden-focus.js +1 -1
- package/core/audits/accessibility/aria-input-field-name.js +1 -1
- package/core/audits/accessibility/aria-meter-name.js +1 -1
- package/core/audits/accessibility/aria-progressbar-name.js +1 -1
- package/core/audits/accessibility/aria-prohibited-attr.js +1 -1
- package/core/audits/accessibility/aria-required-attr.js +1 -1
- package/core/audits/accessibility/aria-required-children.js +1 -1
- package/core/audits/accessibility/aria-required-parent.js +1 -1
- package/core/audits/accessibility/aria-roles.js +1 -1
- package/core/audits/accessibility/aria-text.js +1 -1
- package/core/audits/accessibility/aria-toggle-field-name.js +1 -1
- package/core/audits/accessibility/aria-tooltip-name.js +1 -1
- package/core/audits/accessibility/aria-treeitem-name.js +1 -1
- package/core/audits/accessibility/aria-valid-attr-value.js +1 -1
- package/core/audits/accessibility/aria-valid-attr.js +1 -1
- package/core/audits/accessibility/autocomplete-valid.js +1 -1
- package/core/audits/accessibility/button-name.js +1 -1
- package/core/audits/accessibility/bypass.js +1 -1
- package/core/audits/accessibility/color-contrast.js +1 -1
- package/core/audits/accessibility/definition-list.js +1 -1
- package/core/audits/accessibility/dlitem.js +1 -1
- package/core/audits/accessibility/document-title.js +1 -1
- package/core/audits/accessibility/duplicate-id-aria.js +1 -1
- package/core/audits/accessibility/empty-heading.js +1 -1
- package/core/audits/accessibility/form-field-multiple-labels.js +1 -1
- package/core/audits/accessibility/frame-title.js +1 -1
- package/core/audits/accessibility/heading-order.js +1 -1
- package/core/audits/accessibility/html-has-lang.js +1 -1
- package/core/audits/accessibility/html-lang-valid.js +1 -1
- package/core/audits/accessibility/html-xml-lang-mismatch.js +1 -1
- package/core/audits/accessibility/identical-links-same-purpose.js +1 -1
- package/core/audits/accessibility/image-alt.js +1 -1
- package/core/audits/accessibility/image-redundant-alt.js +1 -1
- package/core/audits/accessibility/input-button-name.js +1 -1
- package/core/audits/accessibility/input-image-alt.js +1 -1
- package/core/audits/accessibility/label-content-name-mismatch.js +1 -1
- package/core/audits/accessibility/label.js +1 -1
- package/core/audits/accessibility/landmark-one-main.js +1 -1
- package/core/audits/accessibility/link-in-text-block.js +1 -1
- package/core/audits/accessibility/link-name.js +1 -1
- package/core/audits/accessibility/list.js +1 -1
- package/core/audits/accessibility/listitem.js +1 -1
- package/core/audits/accessibility/meta-refresh.js +1 -1
- package/core/audits/accessibility/meta-viewport.js +1 -1
- package/core/audits/accessibility/object-alt.js +1 -1
- package/core/audits/accessibility/presentation-role-conflict.js +1 -1
- package/core/audits/accessibility/select-name.js +1 -1
- package/core/audits/accessibility/skip-link.js +1 -1
- package/core/audits/accessibility/svg-img-alt.js +1 -1
- package/core/audits/accessibility/tabindex.js +1 -1
- package/core/audits/accessibility/table-duplicate-name.js +1 -1
- package/core/audits/accessibility/table-fake-caption.js +1 -1
- package/core/audits/accessibility/target-size.js +1 -1
- package/core/audits/accessibility/td-has-header.js +1 -1
- package/core/audits/accessibility/td-headers-attr.js +1 -1
- package/core/audits/accessibility/th-has-data-cells.js +1 -1
- package/core/audits/accessibility/valid-lang.js +1 -1
- package/core/audits/accessibility/video-caption.js +1 -1
- package/core/audits/agentic/agent-accessibility-tree.js +1 -1
- package/core/audits/agentic/llms-txt.js +10 -10
- package/core/audits/baseline.js +10 -12
- package/core/audits/dobetterweb/geolocation-on-start.js +2 -1
- package/core/audits/network-requests.js +2 -0
- package/core/audits/seo/canonical.js +19 -7
- package/core/audits/webmcp-form-coverage.js +2 -2
- package/core/audits/webmcp-registered-tools.js +1 -1
- package/core/audits/webmcp-schema-validity.js +1 -1
- package/core/computed/js-bundles.d.ts +1 -1
- package/core/computed/load-simulator.d.ts +1 -1
- package/core/computed/metrics/first-contentful-paint-all-frames.d.ts +1 -1
- package/core/computed/metrics/first-contentful-paint.d.ts +1 -1
- package/core/computed/metrics/interactive.d.ts +1 -1
- package/core/computed/metrics/lantern-metric.d.ts +6 -6
- package/core/computed/metrics/largest-contentful-paint-all-frames.d.ts +1 -1
- package/core/computed/metrics/largest-contentful-paint.d.ts +1 -1
- package/core/computed/metrics/max-potential-fid.d.ts +1 -1
- package/core/computed/metrics/speed-index.d.ts +1 -1
- package/core/computed/metrics/time-to-first-byte.d.ts +1 -1
- package/core/computed/metrics/total-blocking-time.d.ts +1 -1
- package/core/computed/module-duplication.d.ts +1 -1
- package/core/computed/page-dependency-graph.d.ts +1 -1
- package/core/computed/unused-css.d.ts +1 -1
- package/core/config/agentic-browsing-config.d.ts +1 -0
- package/core/config/agentic-browsing-config.js +3 -2
- package/core/config/config-helpers.d.ts +1 -0
- package/core/config/config-helpers.js +1 -1
- package/core/config/config-plugin.d.ts +1 -0
- package/core/config/config-plugin.js +1 -0
- package/core/config/config.d.ts +1 -0
- package/core/config/config.js +1 -0
- package/core/config/constants.d.ts +1 -0
- package/core/config/constants.js +1 -0
- package/core/config/default-config.js +45 -0
- package/core/config/experimental-config.d.ts +1 -9
- package/core/config/experimental-config.js +2 -0
- package/core/config/filters.d.ts +1 -0
- package/core/config/filters.js +1 -0
- package/core/config/full-config.d.ts +1 -5
- package/core/config/full-config.js +2 -0
- package/core/config/lr-desktop-config.d.ts +1 -0
- package/core/config/lr-desktop-config.js +1 -0
- package/core/config/lr-mobile-config.d.ts +1 -5
- package/core/config/lr-mobile-config.js +2 -0
- package/core/config/perf-config.d.ts +1 -5
- package/core/config/perf-config.js +2 -0
- package/core/config/validation.d.ts +1 -0
- package/core/config/validation.js +1 -0
- package/core/gather/driver/execution-context.d.ts +23 -0
- package/core/gather/driver/execution-context.js +86 -1
- package/core/gather/driver/storage.js +13 -0
- package/core/gather/driver.d.ts +1 -1
- package/core/gather/gatherers/accessibility.js +1 -0
- package/core/gather/gatherers/trace-elements.d.ts +4 -1
- package/core/gather/gatherers/trace-elements.js +24 -28
- package/core/gather/gatherers/webmcp-schema.js +9 -16
- package/core/gather/gatherers/webmcp.d.ts +5 -0
- package/core/gather/gatherers/webmcp.js +34 -27
- package/core/index.d.ts +0 -1
- package/core/index.js +0 -1
- package/core/lib/baseline/web-features-data.json +1177 -0
- package/core/lib/baseline/web-features-metadata.json +1 -1
- package/core/lib/deprecations-strings.d.ts +45 -23
- package/core/lib/deprecations-strings.js +23 -0
- package/core/lib/script-helpers.js +13 -1
- package/core/scoring.d.ts +58 -58
- package/dist/report/bundle.esm.js +4 -7
- package/dist/report/flow.js +6 -9
- package/dist/report/standalone.js +20 -12
- package/flow-report/types/flow-report.d.ts +2 -2
- package/package.json +23 -26
- package/report/assets/styles.css +1 -4
- package/report/renderer/components.js +1 -1
- package/report/renderer/details-renderer.d.ts +6 -1
- package/report/renderer/details-renderer.js +11 -3
- package/report/renderer/explodey-gauge.js +9 -7
- package/report/renderer/i18n-formatter.d.ts +1 -1
- package/report/renderer/logger.js +18 -4
- package/report/renderer/text-encoding.js +1 -1
- package/report/types/html-renderer.d.ts +2 -2
- package/shared/localization/locales/ar-XB.json +290 -65
- package/shared/localization/locales/ar.json +290 -65
- package/shared/localization/locales/bg.json +290 -65
- package/shared/localization/locales/ca.json +295 -70
- package/shared/localization/locales/cs.json +290 -65
- package/shared/localization/locales/da.json +294 -69
- package/shared/localization/locales/de.json +295 -70
- package/shared/localization/locales/el.json +290 -65
- package/shared/localization/locales/en-GB.json +290 -65
- package/shared/localization/locales/en-US.json +105 -75
- package/shared/localization/locales/en-XA.json +253 -64
- package/shared/localization/locales/en-XL.json +105 -75
- package/shared/localization/locales/es-419.json +290 -65
- package/shared/localization/locales/es.json +298 -73
- package/shared/localization/locales/fi.json +290 -65
- package/shared/localization/locales/fil.json +290 -65
- package/shared/localization/locales/fr.json +294 -69
- package/shared/localization/locales/he.json +293 -68
- package/shared/localization/locales/hi.json +291 -66
- package/shared/localization/locales/hr.json +290 -65
- package/shared/localization/locales/hu.json +290 -65
- package/shared/localization/locales/id.json +290 -65
- package/shared/localization/locales/it.json +294 -69
- package/shared/localization/locales/ja.json +290 -65
- package/shared/localization/locales/ko.json +290 -65
- package/shared/localization/locales/lt.json +290 -65
- package/shared/localization/locales/lv.json +290 -65
- package/shared/localization/locales/nl.json +290 -65
- package/shared/localization/locales/no.json +290 -65
- package/shared/localization/locales/pl.json +290 -65
- package/shared/localization/locales/pt-PT.json +291 -66
- package/shared/localization/locales/pt.json +290 -65
- package/shared/localization/locales/ro.json +290 -65
- package/shared/localization/locales/ru.json +301 -76
- package/shared/localization/locales/sk.json +291 -66
- package/shared/localization/locales/sl.json +290 -65
- package/shared/localization/locales/sr-Latn.json +290 -65
- package/shared/localization/locales/sr.json +290 -65
- package/shared/localization/locales/sv.json +297 -72
- package/shared/localization/locales/ta.json +291 -66
- package/shared/localization/locales/te.json +293 -68
- package/shared/localization/locales/th.json +291 -66
- package/shared/localization/locales/tr.json +290 -65
- package/shared/localization/locales/uk.json +290 -65
- package/shared/localization/locales/vi.json +291 -66
- package/shared/localization/locales/zh-HK.json +292 -67
- package/shared/localization/locales/zh-TW.json +291 -66
- package/shared/localization/locales/zh.json +291 -66
- package/shared/types/shared.d.ts +1 -1
- package/tsconfig-base.json +2 -1
- package/tsconfig.json +2 -0
- package/types/artifacts.d.ts +1 -1
- package/types/internal/rxjs.d.ts +1 -1
- package/types/internal/smokehouse.d.ts +8 -2
- package/types.d.ts +2 -0
- package/types.js +11 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { LargestContentfulPaintAllFramesComputed as LargestContentfulPaintAllFrames };
|
|
2
2
|
declare const LargestContentfulPaintAllFramesComputed: typeof LargestContentfulPaintAllFrames & {
|
|
3
|
-
request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.
|
|
3
|
+
request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.LanternMetric | import("../../index.js").Artifacts.Metric>;
|
|
4
4
|
};
|
|
5
5
|
declare class LargestContentfulPaintAllFrames extends NavigationMetric {
|
|
6
6
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { LargestContentfulPaintComputed as LargestContentfulPaint };
|
|
2
2
|
declare const LargestContentfulPaintComputed: typeof LargestContentfulPaint & {
|
|
3
|
-
request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.
|
|
3
|
+
request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.LanternMetric | import("../../index.js").Artifacts.Metric>;
|
|
4
4
|
};
|
|
5
5
|
declare class LargestContentfulPaint extends NavigationMetric {
|
|
6
6
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { MaxPotentialFIDComputed as MaxPotentialFID };
|
|
2
2
|
declare const MaxPotentialFIDComputed: typeof MaxPotentialFID & {
|
|
3
|
-
request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.
|
|
3
|
+
request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.LanternMetric | import("../../index.js").Artifacts.Metric>;
|
|
4
4
|
};
|
|
5
5
|
declare class MaxPotentialFID extends NavigationMetric {
|
|
6
6
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { SpeedIndexComputed as SpeedIndex };
|
|
2
2
|
declare const SpeedIndexComputed: typeof SpeedIndex & {
|
|
3
|
-
request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.
|
|
3
|
+
request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.LanternMetric | import("../../index.js").Artifacts.Metric>;
|
|
4
4
|
};
|
|
5
5
|
declare class SpeedIndex extends NavigationMetric {
|
|
6
6
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { TimeToFirstByteComputed as TimeToFirstByte };
|
|
2
2
|
declare const TimeToFirstByteComputed: typeof TimeToFirstByte & {
|
|
3
|
-
request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.
|
|
3
|
+
request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.LanternMetric | import("../../index.js").Artifacts.Metric>;
|
|
4
4
|
};
|
|
5
5
|
declare class TimeToFirstByte extends NavigationMetric {
|
|
6
6
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { TotalBlockingTimeComputed as TotalBlockingTime };
|
|
2
2
|
declare const TotalBlockingTimeComputed: typeof TotalBlockingTime & {
|
|
3
|
-
request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.
|
|
3
|
+
request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext) => Promise<import("../../index.js").Artifacts.LanternMetric | import("../../index.js").Artifacts.Metric>;
|
|
4
4
|
};
|
|
5
5
|
/**
|
|
6
6
|
* @fileoverview This audit determines Total Blocking Time.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { ModuleDuplicationComputed as ModuleDuplication };
|
|
2
2
|
declare const ModuleDuplicationComputed: typeof ModuleDuplication & {
|
|
3
|
-
request: (dependencies: Pick<import("../index.js").Artifacts, "
|
|
3
|
+
request: (dependencies: Pick<import("../index.js").Artifacts, "SourceMaps" | "Scripts">, context: LH.Artifacts.ComputedContext) => Promise<Map<string, {
|
|
4
4
|
scriptId: string;
|
|
5
5
|
scriptUrl: string;
|
|
6
6
|
resourceSize: number;
|
|
@@ -8,7 +8,7 @@ declare const PageDependencyGraphComputed: typeof PageDependencyGraph & {
|
|
|
8
8
|
SourceMaps: LH.Artifacts["SourceMaps"];
|
|
9
9
|
HostDPR: LH.Artifacts["HostDPR"];
|
|
10
10
|
fromTrace: boolean;
|
|
11
|
-
}, context: LH.Artifacts.ComputedContext) => Promise<import("../../types
|
|
11
|
+
}, context: LH.Artifacts.ComputedContext) => Promise<import("../../types.js").Gatherer.Simulation.GraphNode>;
|
|
12
12
|
};
|
|
13
13
|
declare class PageDependencyGraph {
|
|
14
14
|
/**
|
|
@@ -8,7 +8,7 @@ declare const UnusedCSSComputed: typeof UnusedCSS & {
|
|
|
8
8
|
Stylesheets: LH.Artifacts["Stylesheets"];
|
|
9
9
|
CSSUsage: LH.Artifacts["CSSUsage"];
|
|
10
10
|
devtoolsLog: LH.DevtoolsLog;
|
|
11
|
-
}, context: LH.Artifacts.ComputedContext) => Promise<import("../../types
|
|
11
|
+
}, context: LH.Artifacts.ComputedContext) => Promise<import("../../types.js").Audit.ByteEfficiencyItem[]>;
|
|
12
12
|
};
|
|
13
13
|
/** @typedef {LH.Artifacts.CSSStyleSheetInfo & {networkRecord: LH.Artifacts.NetworkRequest, usedRules: Array<LH.Crdp.CSS.RuleUsage>}} StyleSheetInfo */
|
|
14
14
|
declare class UnusedCSS {
|
|
@@ -4,14 +4,15 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import * as LH from '../../types/lh.js';
|
|
7
8
|
import * as i18n from '../lib/i18n/i18n.js';
|
|
8
9
|
|
|
9
10
|
const UIStrings = {
|
|
10
11
|
/** Title of the Agentic Browsing category of audits. */
|
|
11
12
|
agenticBrowsingCategoryTitle: 'Agentic Browsing',
|
|
12
13
|
/** Description of the Agentic Browsing category. */
|
|
13
|
-
agenticBrowsingCategoryDescription: 'These checks ensure high-quality, browsable ' +
|
|
14
|
-
'
|
|
14
|
+
agenticBrowsingCategoryDescription: 'These checks ensure high-quality, [browsable websites for AI agents](https://goo.gle/lighthouse-agentic-web) ' +
|
|
15
|
+
'and validate the correctness of WebMCP integrations. ' +
|
|
15
16
|
'This category is still under development and subject to change.',
|
|
16
17
|
/** Title of the WebMCP group of audits. */
|
|
17
18
|
webmcpGroupTitle: 'WebMCP',
|
|
@@ -91,4 +91,5 @@ export function resolveModulePath(moduleIdentifier: string, configDir?: string |
|
|
|
91
91
|
* @return {LH.Config.Settings}
|
|
92
92
|
*/
|
|
93
93
|
export function resolveSettings(settingsJson?: LH.SharedFlagsSettings, overrides?: LH.Flags | undefined): LH.Config.Settings;
|
|
94
|
+
import * as LH from '../../types/lh.js';
|
|
94
95
|
//# sourceMappingURL=config-helpers.d.ts.map
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
* Copyright 2019 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
6
|
import path from 'path';
|
|
8
7
|
import {createRequire} from 'module';
|
|
9
8
|
import url from 'url';
|
|
10
9
|
|
|
11
10
|
import {isEqual} from 'lodash-es';
|
|
12
11
|
|
|
12
|
+
import * as LH from '../../types/lh.js';
|
|
13
13
|
import * as constants from './constants.js';
|
|
14
14
|
import ConfigPlugin from './config-plugin.js';
|
|
15
15
|
import {Runner} from '../runner.js';
|
package/core/config/config.d.ts
CHANGED
|
@@ -24,4 +24,5 @@ export function initializeConfig(gatherMode: LH.Gatherer.GatherMode, config?: LH
|
|
|
24
24
|
* @return {string}
|
|
25
25
|
*/
|
|
26
26
|
export function getConfigDisplayString(resolvedConfig: LH.Config.ResolvedConfig): string;
|
|
27
|
+
import * as LH from '../../types/lh.js';
|
|
27
28
|
//# sourceMappingURL=config.d.ts.map
|
package/core/config/config.js
CHANGED
|
@@ -8,6 +8,7 @@ import path from 'path';
|
|
|
8
8
|
|
|
9
9
|
import log from 'lighthouse-logger';
|
|
10
10
|
|
|
11
|
+
import * as LH from '../../types/lh.js';
|
|
11
12
|
import {Runner} from '../runner.js';
|
|
12
13
|
import defaultConfig from './default-config.js';
|
|
13
14
|
import {nonSimulatedSettingsOverrides} from './constants.js';
|
|
@@ -53,5 +53,6 @@ declare const MOTOGPOWER_EMULATION_METRICS: Required<LH.SharedFlagsSettings["scr
|
|
|
53
53
|
declare const DESKTOP_EMULATION_METRICS: Required<LH.SharedFlagsSettings["screenEmulation"]>;
|
|
54
54
|
declare const MOTOG4_USERAGENT: "Mozilla/5.0 (Linux; Android 11; moto g power (2022)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Mobile Safari/537.36";
|
|
55
55
|
declare const DESKTOP_USERAGENT: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36";
|
|
56
|
+
import * as LH from '../../types/lh.js';
|
|
56
57
|
export {};
|
|
57
58
|
//# sourceMappingURL=constants.d.ts.map
|
package/core/config/constants.js
CHANGED
|
@@ -100,6 +100,21 @@ const UIStrings = {
|
|
|
100
100
|
bestPracticesBrowserCompatGroupTitle: 'Browser Compatibility',
|
|
101
101
|
/** Title of the General group of the Best Practices category. Within this section are the audits that don't belong to a specific group but are of general interest. */
|
|
102
102
|
bestPracticesGeneralGroupTitle: 'General',
|
|
103
|
+
/** Title of the Agentic Browsing category of audits. */
|
|
104
|
+
agenticBrowsingCategoryTitle: 'Agentic Browsing',
|
|
105
|
+
/** Description of the Agentic Browsing category. */
|
|
106
|
+
agenticBrowsingCategoryDescription: 'These checks ensure high-quality, [browsable websites for AI agents](https://goo.gle/lighthouse-agentic-web) ' +
|
|
107
|
+
'and validate the correctness of WebMCP integrations. ' +
|
|
108
|
+
'This category is still under development and subject to change.',
|
|
109
|
+
/** Title of the WebMCP group of audits. */
|
|
110
|
+
webmcpGroupTitle: 'WebMCP',
|
|
111
|
+
/** Description of the WebMCP group. */
|
|
112
|
+
webmcpGroupDescription: 'Audits validating WebMCP integration.',
|
|
113
|
+
/** Title of the Agent Accessibility group of audits. */
|
|
114
|
+
agentAccessibilityGroupTitle: 'Agent Accessibility',
|
|
115
|
+
/** Description of the Agent Accessibility group of audits. */
|
|
116
|
+
agentAccessibilityGroupDescription: 'These audits highlight best practices for improving the ' +
|
|
117
|
+
'accessibility of the website for AI agents.',
|
|
103
118
|
};
|
|
104
119
|
|
|
105
120
|
const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
|
|
@@ -108,6 +123,9 @@ const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
|
|
|
108
123
|
const defaultConfig = {
|
|
109
124
|
settings: constants.defaultSettings,
|
|
110
125
|
artifacts: [
|
|
126
|
+
{id: 'WebMCP', gatherer: 'webmcp'},
|
|
127
|
+
{id: 'WebMcpSchemaIssues', gatherer: 'webmcp-schema'},
|
|
128
|
+
{id: 'LlmsTxt', gatherer: 'agentic/llms-txt'},
|
|
111
129
|
// Artifacts which can be depended on come first.
|
|
112
130
|
{id: 'DevtoolsLog', gatherer: 'devtools-log'},
|
|
113
131
|
{id: 'Trace', gatherer: 'trace'},
|
|
@@ -279,6 +297,11 @@ const defaultConfig = {
|
|
|
279
297
|
'seo/hreflang',
|
|
280
298
|
'seo/canonical',
|
|
281
299
|
'seo/manual/structured-data',
|
|
300
|
+
'agentic/agent-accessibility-tree',
|
|
301
|
+
'webmcp-registered-tools',
|
|
302
|
+
'webmcp-form-coverage',
|
|
303
|
+
'webmcp-schema-validity',
|
|
304
|
+
'agentic/llms-txt',
|
|
282
305
|
'bf-cache',
|
|
283
306
|
'insights/cache-insight',
|
|
284
307
|
'insights/cls-culprits-insight',
|
|
@@ -366,6 +389,14 @@ const defaultConfig = {
|
|
|
366
389
|
'best-practices-general': {
|
|
367
390
|
title: str_(UIStrings.bestPracticesGeneralGroupTitle),
|
|
368
391
|
},
|
|
392
|
+
'webmcp': {
|
|
393
|
+
title: str_(UIStrings.webmcpGroupTitle),
|
|
394
|
+
description: str_(UIStrings.webmcpGroupDescription),
|
|
395
|
+
},
|
|
396
|
+
'agent-accessibility': {
|
|
397
|
+
title: str_(UIStrings.agentAccessibilityGroupTitle),
|
|
398
|
+
description: str_(UIStrings.agentAccessibilityGroupDescription),
|
|
399
|
+
},
|
|
369
400
|
// Group for audits that should not be displayed.
|
|
370
401
|
'hidden': {title: ''},
|
|
371
402
|
},
|
|
@@ -601,6 +632,20 @@ const defaultConfig = {
|
|
|
601
632
|
{id: 'structured-data', weight: 0},
|
|
602
633
|
],
|
|
603
634
|
},
|
|
635
|
+
'agentic-browsing': {
|
|
636
|
+
title: str_(UIStrings.agenticBrowsingCategoryTitle),
|
|
637
|
+
description: str_(UIStrings.agenticBrowsingCategoryDescription),
|
|
638
|
+
supportedModes: ['navigation', 'snapshot'],
|
|
639
|
+
categoryScoreDisplayMode: 'fraction',
|
|
640
|
+
auditRefs: [
|
|
641
|
+
{id: 'agent-accessibility-tree', weight: 1, group: 'agent-accessibility'},
|
|
642
|
+
{id: 'webmcp-form-coverage', weight: 1, group: 'webmcp'},
|
|
643
|
+
{id: 'webmcp-registered-tools', weight: 1, group: 'webmcp'},
|
|
644
|
+
{id: 'webmcp-schema-validity', weight: 1, group: 'webmcp'},
|
|
645
|
+
{id: 'cumulative-layout-shift', weight: 1, acronym: 'CLS'},
|
|
646
|
+
{id: 'llms-txt', weight: 1, group: 'agent-accessibility'},
|
|
647
|
+
],
|
|
648
|
+
},
|
|
604
649
|
},
|
|
605
650
|
};
|
|
606
651
|
|
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
export default config;
|
|
2
|
-
/**
|
|
3
|
-
* @license
|
|
4
|
-
* Copyright 2020 Google LLC
|
|
5
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* @fileoverview Config for new audits that aren't quite ready for
|
|
9
|
-
* being enabled by default.
|
|
10
|
-
*/
|
|
11
2
|
/** @type {LH.Config} */
|
|
12
3
|
declare const config: LH.Config;
|
|
4
|
+
import * as LH from '../../types/lh.js';
|
|
13
5
|
//# sourceMappingURL=experimental-config.d.ts.map
|
package/core/config/filters.d.ts
CHANGED
|
@@ -72,4 +72,5 @@ export function filterCategoriesByExplicitFilters(categories: LH.Config.Resolved
|
|
|
72
72
|
* @return {LH.Config.ResolvedConfig['categories']}
|
|
73
73
|
*/
|
|
74
74
|
export function filterCategoriesByGatherMode(categories: LH.Config.ResolvedConfig["categories"], mode: LH.Gatherer.GatherMode): LH.Config.ResolvedConfig["categories"];
|
|
75
|
+
import * as LH from '../../types/lh.js';
|
|
75
76
|
//# sourceMappingURL=filters.d.ts.map
|
package/core/config/filters.js
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
export default fullConfig;
|
|
2
|
-
/**
|
|
3
|
-
* @license
|
|
4
|
-
* Copyright 2017 Google LLC
|
|
5
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
-
*/
|
|
7
2
|
/** @type {LH.Config} */
|
|
8
3
|
declare const fullConfig: LH.Config;
|
|
4
|
+
import * as LH from '../../types/lh.js';
|
|
9
5
|
//# sourceMappingURL=full-config.d.ts.map
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
export default config;
|
|
2
|
-
/**
|
|
3
|
-
* @license
|
|
4
|
-
* Copyright 2018 Google LLC
|
|
5
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
-
*/
|
|
7
2
|
/** @type {LH.Config} */
|
|
8
3
|
declare const config: LH.Config;
|
|
4
|
+
import * as LH from '../../types/lh.js';
|
|
9
5
|
//# sourceMappingURL=lr-mobile-config.d.ts.map
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
export default perfConfig;
|
|
2
|
-
/**
|
|
3
|
-
* @license
|
|
4
|
-
* Copyright 2018 Google LLC
|
|
5
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
-
*/
|
|
7
2
|
/** @type {LH.Config} */
|
|
8
3
|
declare const perfConfig: LH.Config;
|
|
4
|
+
import * as LH from '../../types/lh.js';
|
|
9
5
|
//# sourceMappingURL=perf-config.d.ts.map
|
|
@@ -58,4 +58,5 @@ export function throwInvalidDependencyOrder(artifactId: string, dependencyKey: s
|
|
|
58
58
|
* @return {never}
|
|
59
59
|
*/
|
|
60
60
|
export function throwInvalidArtifactDependency(artifactId: string, dependencyKey: string): never;
|
|
61
|
+
import * as LH from '../../types/lh.js';
|
|
61
62
|
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -102,6 +102,29 @@ export class ExecutionContext {
|
|
|
102
102
|
args: T;
|
|
103
103
|
deps?: Array<Function | string>;
|
|
104
104
|
}): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Call a function on the given object.
|
|
107
|
+
* Returns a promise that resolves on a value of `mainFn`'s return type.
|
|
108
|
+
* @template {unknown[]} T, R
|
|
109
|
+
* @param {((thisArg: any, ...args: T) => R)} mainFn The main function to call.
|
|
110
|
+
* @param {{args: T, objectId: string, deps?: Array<Function|string>}} options `args` should
|
|
111
|
+
* match the args of `mainFn`, and can be any serializable value. `deps` are functions that must be
|
|
112
|
+
* defined for `mainFn` to work.
|
|
113
|
+
* @return {Promise<Awaited<R>>}
|
|
114
|
+
*/
|
|
115
|
+
evaluateOnObject<T extends unknown[], R>(mainFn: ((thisArg: any, ...args: T) => R), options: {
|
|
116
|
+
args: T;
|
|
117
|
+
objectId: string;
|
|
118
|
+
deps?: Array<Function | string>;
|
|
119
|
+
}): Promise<Awaited<R>>;
|
|
120
|
+
/**
|
|
121
|
+
* @param {string} functionDeclaration
|
|
122
|
+
* @param {{objectId: string}} options
|
|
123
|
+
* @return {Promise<*>}
|
|
124
|
+
*/
|
|
125
|
+
_callFunctionOn(functionDeclaration: string, options: {
|
|
126
|
+
objectId: string;
|
|
127
|
+
}): Promise<any>;
|
|
105
128
|
/**
|
|
106
129
|
* Cache native functions/objects inside window so we are sure polyfills do not overwrite the
|
|
107
130
|
* native implementations when the page loads.
|
|
@@ -223,6 +223,7 @@ class ExecutionContext {
|
|
|
223
223
|
|
|
224
224
|
const expression = `(() => {
|
|
225
225
|
${ExecutionContext._cachedNativesPreamble};
|
|
226
|
+
${pageFunctions.esbuildFunctionWrapperString}
|
|
226
227
|
${depsSerialized};
|
|
227
228
|
(${mainFn})(${argsSerialized});
|
|
228
229
|
})()
|
|
@@ -231,6 +232,87 @@ class ExecutionContext {
|
|
|
231
232
|
await this._session.sendCommand('Page.addScriptToEvaluateOnNewDocument', {source: expression});
|
|
232
233
|
}
|
|
233
234
|
|
|
235
|
+
/**
|
|
236
|
+
* Call a function on the given object.
|
|
237
|
+
* Returns a promise that resolves on a value of `mainFn`'s return type.
|
|
238
|
+
* @template {unknown[]} T, R
|
|
239
|
+
* @param {((thisArg: any, ...args: T) => R)} mainFn The main function to call.
|
|
240
|
+
* @param {{args: T, objectId: string, deps?: Array<Function|string>}} options `args` should
|
|
241
|
+
* match the args of `mainFn`, and can be any serializable value. `deps` are functions that must be
|
|
242
|
+
* defined for `mainFn` to work.
|
|
243
|
+
* @return {Promise<Awaited<R>>}
|
|
244
|
+
*/
|
|
245
|
+
evaluateOnObject(mainFn, options) {
|
|
246
|
+
const argsSerialized = ExecutionContext.serializeArguments(options.args);
|
|
247
|
+
const depsSerialized = ExecutionContext.serializeDeps(options.deps);
|
|
248
|
+
|
|
249
|
+
const argsString = argsSerialized ? `this, ${argsSerialized}` : 'this';
|
|
250
|
+
const functionDeclaration = `function() {
|
|
251
|
+
${depsSerialized}
|
|
252
|
+
return (${mainFn})(${argsString});
|
|
253
|
+
}`;
|
|
254
|
+
return this._callFunctionOn(functionDeclaration, options);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* @param {string} functionDeclaration
|
|
259
|
+
* @param {{objectId: string}} options
|
|
260
|
+
* @return {Promise<*>}
|
|
261
|
+
*/
|
|
262
|
+
async _callFunctionOn(functionDeclaration, options) {
|
|
263
|
+
const timeout = this._session.hasNextProtocolTimeout() ?
|
|
264
|
+
this._session.getNextProtocolTimeout() :
|
|
265
|
+
60000;
|
|
266
|
+
|
|
267
|
+
const evaluationParams = {
|
|
268
|
+
functionDeclaration: `function wrapInNativePromise() {
|
|
269
|
+
${ExecutionContext._cachedNativesPreamble};
|
|
270
|
+
${pageFunctions.esbuildFunctionWrapperString}
|
|
271
|
+
const self = this;
|
|
272
|
+
const args = arguments;
|
|
273
|
+
return new Promise(function (resolve) {
|
|
274
|
+
return Promise.resolve()
|
|
275
|
+
.then(_ => (${functionDeclaration}).apply(self, args))
|
|
276
|
+
.catch(${pageFunctions.wrapRuntimeEvalErrorInBrowser})
|
|
277
|
+
.then(resolve);
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
//# sourceURL=_lighthouse-eval.js
|
|
281
|
+
`,
|
|
282
|
+
objectId: options.objectId,
|
|
283
|
+
returnByValue: true,
|
|
284
|
+
awaitPromise: true,
|
|
285
|
+
timeout,
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
this._session.setNextProtocolTimeout(timeout);
|
|
289
|
+
const response = await this._session.sendCommand('Runtime.callFunctionOn', evaluationParams);
|
|
290
|
+
|
|
291
|
+
const ex = response.exceptionDetails;
|
|
292
|
+
if (ex) {
|
|
293
|
+
const elidedExpression = functionDeclaration.replace(/\s+/g, ' ').substring(0, 100);
|
|
294
|
+
const messageLines = [
|
|
295
|
+
'Runtime.callFunctionOn exception',
|
|
296
|
+
`Expression: ${elidedExpression}\n---- (elided)`,
|
|
297
|
+
!ex.stackTrace ? `Parse error at: ${ex.lineNumber + 1}:${ex.columnNumber + 1}` : null,
|
|
298
|
+
ex.exception?.description || ex.text,
|
|
299
|
+
].filter(Boolean);
|
|
300
|
+
const evaluationError = new Error(messageLines.join('\n'));
|
|
301
|
+
return Promise.reject(evaluationError);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
if (response.result === undefined) {
|
|
305
|
+
return Promise.reject(
|
|
306
|
+
new Error('Runtime.callFunctionOn response did not contain a "result" object'));
|
|
307
|
+
}
|
|
308
|
+
const value = response.result.value;
|
|
309
|
+
if (value?.__failedInBrowser) {
|
|
310
|
+
return Promise.reject(Object.assign(new Error(), value));
|
|
311
|
+
} else {
|
|
312
|
+
return value;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
234
316
|
/**
|
|
235
317
|
* Cache native functions/objects inside window so we are sure polyfills do not overwrite the
|
|
236
318
|
* native implementations when the page loads.
|
|
@@ -279,7 +361,10 @@ class ExecutionContext {
|
|
|
279
361
|
* @return {string}
|
|
280
362
|
*/
|
|
281
363
|
static serializeDeps(deps) {
|
|
282
|
-
|
|
364
|
+
if (!deps) {
|
|
365
|
+
return '';
|
|
366
|
+
}
|
|
367
|
+
|
|
283
368
|
return deps.map(dep => {
|
|
284
369
|
if (typeof dep === 'function') {
|
|
285
370
|
// esbuild will change the actual function name (ie. function actualName() {})
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import log from 'lighthouse-logger';
|
|
8
8
|
|
|
9
9
|
import * as i18n from '../../lib/i18n/i18n.js';
|
|
10
|
+
import {Sentry} from '../../lib/sentry.js';
|
|
10
11
|
|
|
11
12
|
/* eslint-disable max-len */
|
|
12
13
|
const UIStrings = {
|
|
@@ -81,6 +82,18 @@ async function getImportantStorageWarning(session, url) {
|
|
|
81
82
|
const usageData = await session.sendCommand('Storage.getUsageAndQuota', {
|
|
82
83
|
origin: url,
|
|
83
84
|
});
|
|
85
|
+
|
|
86
|
+
// According to the types, this should never happen. But we've gotten an error
|
|
87
|
+
// report that it does.
|
|
88
|
+
// https://github.com/GoogleChrome/lighthouse/issues/17011
|
|
89
|
+
if (!usageData || !usageData.usageBreakdown) {
|
|
90
|
+
const err = new Error(`missing usageData: ${JSON.stringify(usageData)}`);
|
|
91
|
+
Sentry.captureException(err, {
|
|
92
|
+
level: 'error',
|
|
93
|
+
});
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
|
|
84
97
|
/** @type {Record<string, string>} */
|
|
85
98
|
const storageTypeNames = {
|
|
86
99
|
local_storage: 'Local Storage',
|
package/core/gather/driver.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export class Driver implements LH.Gatherer.Driver {
|
|
|
13
13
|
_executionContext: ExecutionContext | undefined;
|
|
14
14
|
/** @type {Fetcher|undefined} */
|
|
15
15
|
_fetcher: Fetcher | undefined;
|
|
16
|
-
defaultSession: import("../../types
|
|
16
|
+
defaultSession: import("../../types.js").Gatherer.ProtocolSession;
|
|
17
17
|
/** @return {LH.Gatherer.Driver['executionContext']} */
|
|
18
18
|
get executionContext(): LH.Gatherer.Driver["executionContext"];
|
|
19
19
|
get fetcher(): any;
|
|
@@ -67,9 +67,12 @@ declare class TraceElements extends BaseGatherer {
|
|
|
67
67
|
stopInstrumentation(context: LH.Gatherer.Context): Promise<void>;
|
|
68
68
|
/**
|
|
69
69
|
* @param {LH.Gatherer.ProtocolSession} session
|
|
70
|
+
* @param {LH.Gatherer.Driver['executionContext']} executionContext
|
|
70
71
|
* @param {number} backendNodeId
|
|
71
72
|
*/
|
|
72
|
-
getNodeDetails(session: LH.Gatherer.ProtocolSession, backendNodeId: number): Promise<
|
|
73
|
+
getNodeDetails(session: LH.Gatherer.ProtocolSession, executionContext: LH.Gatherer.Driver["executionContext"], backendNodeId: number): Promise<{
|
|
74
|
+
node: any;
|
|
75
|
+
} | null | undefined>;
|
|
73
76
|
/**
|
|
74
77
|
* @param {LH.Gatherer.Context<'Trace'|'SourceMaps'>} context
|
|
75
78
|
* @return {Promise<LH.Artifacts.TraceElement[]>}
|