lighthouse 10.4.0-dev.20230725 → 10.4.0-dev.20230727

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.
Files changed (74) hide show
  1. package/cli/test/smokehouse/lighthouse-runners/bundle.js +1 -1
  2. package/core/audits/accessibility/aria-allowed-role.d.ts +10 -0
  3. package/core/audits/accessibility/aria-allowed-role.js +46 -0
  4. package/core/audits/accessibility/image-redundant-alt.d.ts +10 -0
  5. package/core/audits/accessibility/image-redundant-alt.js +45 -0
  6. package/core/audits/accessibility/label-content-name-mismatch.d.ts +10 -0
  7. package/core/audits/accessibility/label-content-name-mismatch.js +44 -0
  8. package/core/audits/accessibility/skip-link.d.ts +10 -0
  9. package/core/audits/accessibility/skip-link.js +43 -0
  10. package/core/audits/accessibility/table-duplicate-name.d.ts +10 -0
  11. package/core/audits/accessibility/table-duplicate-name.js +44 -0
  12. package/core/audits/accessibility/target-size.js +1 -1
  13. package/core/audits/metrics/{experimental-interaction-to-next-paint.d.ts → interaction-to-next-paint.d.ts} +3 -3
  14. package/core/audits/metrics/{experimental-interaction-to-next-paint.js → interaction-to-next-paint.js} +3 -3
  15. package/core/audits/work-during-interaction.js +2 -2
  16. package/core/config/default-config.js +49 -39
  17. package/core/config/validation.d.ts +2 -2
  18. package/core/config/validation.js +4 -4
  19. package/core/gather/driver/network-monitor.js +0 -1
  20. package/core/gather/gatherers/accessibility.js +5 -0
  21. package/core/lib/stack-packs.js +4 -0
  22. package/package.json +5 -5
  23. package/readme.md +1 -1
  24. package/shared/localization/locales/ar-XB.json +0 -3
  25. package/shared/localization/locales/ar.json +0 -3
  26. package/shared/localization/locales/bg.json +0 -3
  27. package/shared/localization/locales/ca.json +0 -3
  28. package/shared/localization/locales/cs.json +0 -3
  29. package/shared/localization/locales/da.json +0 -3
  30. package/shared/localization/locales/de.json +0 -3
  31. package/shared/localization/locales/el.json +0 -3
  32. package/shared/localization/locales/en-GB.json +0 -3
  33. package/shared/localization/locales/en-US.json +94 -7
  34. package/shared/localization/locales/en-XA.json +0 -3
  35. package/shared/localization/locales/en-XL.json +94 -7
  36. package/shared/localization/locales/es-419.json +0 -3
  37. package/shared/localization/locales/es.json +0 -3
  38. package/shared/localization/locales/fi.json +0 -3
  39. package/shared/localization/locales/fil.json +0 -3
  40. package/shared/localization/locales/fr.json +0 -3
  41. package/shared/localization/locales/he.json +0 -3
  42. package/shared/localization/locales/hi.json +0 -3
  43. package/shared/localization/locales/hr.json +0 -3
  44. package/shared/localization/locales/hu.json +0 -3
  45. package/shared/localization/locales/id.json +0 -3
  46. package/shared/localization/locales/it.json +0 -3
  47. package/shared/localization/locales/ja.json +0 -3
  48. package/shared/localization/locales/ko.json +0 -3
  49. package/shared/localization/locales/lt.json +0 -3
  50. package/shared/localization/locales/lv.json +0 -3
  51. package/shared/localization/locales/nl.json +0 -3
  52. package/shared/localization/locales/no.json +0 -3
  53. package/shared/localization/locales/pl.json +0 -3
  54. package/shared/localization/locales/pt-PT.json +0 -3
  55. package/shared/localization/locales/pt.json +0 -3
  56. package/shared/localization/locales/ro.json +0 -3
  57. package/shared/localization/locales/ru.json +0 -3
  58. package/shared/localization/locales/sk.json +0 -3
  59. package/shared/localization/locales/sl.json +0 -3
  60. package/shared/localization/locales/sr-Latn.json +0 -3
  61. package/shared/localization/locales/sr.json +0 -3
  62. package/shared/localization/locales/sv.json +0 -3
  63. package/shared/localization/locales/ta.json +0 -3
  64. package/shared/localization/locales/te.json +0 -3
  65. package/shared/localization/locales/th.json +0 -3
  66. package/shared/localization/locales/tr.json +0 -3
  67. package/shared/localization/locales/uk.json +0 -3
  68. package/shared/localization/locales/vi.json +0 -3
  69. package/shared/localization/locales/zh-HK.json +0 -3
  70. package/shared/localization/locales/zh-TW.json +0 -3
  71. package/shared/localization/locales/zh.json +0 -3
  72. package/tsconfig.json +0 -1
  73. package/types/gatherer.d.ts +2 -2
  74. package/types/lhr/settings.d.ts +1 -1
@@ -82,7 +82,7 @@ async function runBundledLighthouse(url, config, testRunnerOptions) {
82
82
  const logLevel = testRunnerOptions.isDebug ? 'verbose' : 'info';
83
83
 
84
84
  // Puppeteer is not included in the bundle, we must create the page here.
85
- const browser = await puppeteer.connect({browserURL: `http://localhost:${port}`});
85
+ const browser = await puppeteer.connect({browserURL: `http://127.0.0.1:${port}`});
86
86
  const page = await browser.newPage();
87
87
  const runnerResult = await lighthouse(url, {port, logLevel}, config, page);
88
88
  if (!runnerResult) throw new Error('No runnerResult');
@@ -0,0 +1,10 @@
1
+ export default ARIAAllowedRole;
2
+ declare class ARIAAllowedRole extends AxeAudit {
3
+ }
4
+ export namespace UIStrings {
5
+ const title: string;
6
+ const failureTitle: string;
7
+ const description: string;
8
+ }
9
+ import AxeAudit from './axe-audit.js';
10
+ //# sourceMappingURL=aria-allowed-role.d.ts.map
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @license Copyright 2023 The Lighthouse Authors. All Rights Reserved.
3
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
+ */
6
+
7
+ /**
8
+ * @fileoverview Ensures ARIA attributes are appropriate for an element's role.
9
+ * See base class in axe-audit.js for audit() implementation.
10
+ */
11
+
12
+ import AxeAudit from './axe-audit.js';
13
+ import * as i18n from '../../lib/i18n/i18n.js';
14
+
15
+ const UIStrings = {
16
+ /** Title of an accesibility audit that evaluates if the ARIA role attributes are valid for the HTML element. This title is descriptive of the successful state and is shown to users when no user action is required. */
17
+ title: 'Values assigned to `role=""` are valid ARIA roles.',
18
+ /** Title of an accesibility audit that evaluates if the ARIA role attributes are valid for the HTML element. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
19
+ failureTitle: 'Values assigned to `role=""` are not valid ARIA roles.',
20
+ /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
21
+ description: 'ARIA `role`s enable assistive technologies to know the role of each element on ' +
22
+ 'the web page. If the `role` values are misspelled, not existing ARIA `role` values, or ' +
23
+ 'abstract roles, then the purpose of the element will not be communicated to users of ' +
24
+ 'assistive technologies. ' +
25
+ '[Learn more about ARIA roles](https://dequeuniversity.com/rules/axe/4.7/aria-allowed-roles).',
26
+ };
27
+
28
+ const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
29
+
30
+ class ARIAAllowedRole extends AxeAudit {
31
+ /**
32
+ * @return {LH.Audit.Meta}
33
+ */
34
+ static get meta() {
35
+ return {
36
+ id: 'aria-allowed-role',
37
+ title: str_(UIStrings.title),
38
+ failureTitle: str_(UIStrings.failureTitle),
39
+ description: str_(UIStrings.description),
40
+ requiredArtifacts: ['Accessibility'],
41
+ };
42
+ }
43
+ }
44
+
45
+ export default ARIAAllowedRole;
46
+ export {UIStrings};
@@ -0,0 +1,10 @@
1
+ export default ImageRedundantAlt;
2
+ declare class ImageRedundantAlt extends AxeAudit {
3
+ }
4
+ export namespace UIStrings {
5
+ const title: string;
6
+ const failureTitle: string;
7
+ const description: string;
8
+ }
9
+ import AxeAudit from './axe-audit.js';
10
+ //# sourceMappingURL=image-redundant-alt.d.ts.map
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @license Copyright 2023 The Lighthouse Authors. All Rights Reserved.
3
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
+ */
6
+
7
+ /**
8
+ * @fileoverview Ensures <img> elements have alternative text that is not repeated text.
9
+ * See base class in axe-audit.js for audit() implementation.
10
+ */
11
+
12
+ import AxeAudit from './axe-audit.js';
13
+ import * as i18n from '../../lib/i18n/i18n.js';
14
+
15
+ const UIStrings = {
16
+ /** Title of an accesibility audit that evaluates if all image elements have the alt HTML attribute that is not redundant. This title is descriptive of the successful state and is shown to users when no user action is required. */
17
+ title: 'Image elements do not have `[alt]` attributes that are redundant text.',
18
+ /** Title of an accesibility audit that evaluates if all image elements have the alt HTML attribute that is not redundant. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
19
+ failureTitle: 'Image elements have `[alt]` attributes that are redundant text.',
20
+ /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
21
+ description: 'Informative elements should aim for short, descriptive alternative text. ' +
22
+ 'Alternative text that is exactly the same as the text adjacent to the link or image is ' +
23
+ 'potentially confusing for screen reader users, because the text will be read twice. ' +
24
+ '[Learn more about the `alt` attribute](https://dequeuniversity.com/rules/axe/4.7/image-redundant-alt).',
25
+ };
26
+
27
+ const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
28
+
29
+ class ImageRedundantAlt extends AxeAudit {
30
+ /**
31
+ * @return {LH.Audit.Meta}
32
+ */
33
+ static get meta() {
34
+ return {
35
+ id: 'image-redundant-alt',
36
+ title: str_(UIStrings.title),
37
+ failureTitle: str_(UIStrings.failureTitle),
38
+ description: str_(UIStrings.description),
39
+ requiredArtifacts: ['Accessibility'],
40
+ };
41
+ }
42
+ }
43
+
44
+ export default ImageRedundantAlt;
45
+ export {UIStrings};
@@ -0,0 +1,10 @@
1
+ export default LabelContentNameMismatch;
2
+ declare class LabelContentNameMismatch extends AxeAudit {
3
+ }
4
+ export namespace UIStrings {
5
+ const title: string;
6
+ const failureTitle: string;
7
+ const description: string;
8
+ }
9
+ import AxeAudit from './axe-audit.js';
10
+ //# sourceMappingURL=label-content-name-mismatch.d.ts.map
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @license Copyright 2023 The Lighthouse Authors. All Rights Reserved.
3
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
+ */
6
+
7
+ /**
8
+ * @fileoverview Ensure that interactive elements labeled with their content have their visible label as part of their accessible name.
9
+ * See base class in axe-audit.js for audit() implementation.
10
+ */
11
+
12
+ import AxeAudit from './axe-audit.js';
13
+ import * as i18n from '../../lib/i18n/i18n.js';
14
+
15
+ const UIStrings = {
16
+ /** Title of an accesibility audit that evaluates if elements labeled through their content have their visible text as part of their accessible name. This title is descriptive of the successful state and is shown to users when no user action is required. */
17
+ title: 'Elements with visible text labels have matching accessible names.',
18
+ /** Title of an accesibility audit that evaluates if elements labeled through their content have their visible text as part of their accessible name. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
19
+ failureTitle: 'Elements with visible text labels do not have matching accessible names.',
20
+ /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
21
+ description: 'Visible text labels that do not match the accessible name can result in a ' +
22
+ 'confusing experience for screen reader users. ' +
23
+ '[Learn more about accessible names](https://dequeuniversity.com/rules/axe/4.7/label-content-name-mismatch).',
24
+ };
25
+
26
+ const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
27
+
28
+ class LabelContentNameMismatch extends AxeAudit {
29
+ /**
30
+ * @return {LH.Audit.Meta}
31
+ */
32
+ static get meta() {
33
+ return {
34
+ id: 'label-content-name-mismatch',
35
+ title: str_(UIStrings.title),
36
+ failureTitle: str_(UIStrings.failureTitle),
37
+ description: str_(UIStrings.description),
38
+ requiredArtifacts: ['Accessibility'],
39
+ };
40
+ }
41
+ }
42
+
43
+ export default LabelContentNameMismatch;
44
+ export {UIStrings};
@@ -0,0 +1,10 @@
1
+ export default SkipLink;
2
+ declare class SkipLink extends AxeAudit {
3
+ }
4
+ export namespace UIStrings {
5
+ const title: string;
6
+ const failureTitle: string;
7
+ const description: string;
8
+ }
9
+ import AxeAudit from './axe-audit.js';
10
+ //# sourceMappingURL=skip-link.d.ts.map
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @license Copyright 2023 The Lighthouse Authors. All Rights Reserved.
3
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
+ */
6
+
7
+ /**
8
+ * @fileoverview Ensures that the skip-link target is focusable.
9
+ * See base class in axe-audit.js for audit() implementation.
10
+ */
11
+
12
+ import AxeAudit from './axe-audit.js';
13
+ import * as i18n from '../../lib/i18n/i18n.js';
14
+
15
+ const UIStrings = {
16
+ /** Title of an accesibility audit that evaluates if the skip link is focusable. This title is descriptive of the successful state and is shown to users when no user action is required. */
17
+ title: 'Skip links are focusable.',
18
+ /** Title of an accesibility audit that evaluates if the skip link is focusable. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
19
+ failureTitle: 'Skip links are not focusable.',
20
+ /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
21
+ description: 'Including a skip link can help users skip to the main content to save time. ' +
22
+ '[Learn more about skip links](https://dequeuniversity.com/rules/axe/4.7/skip-link).',
23
+ };
24
+
25
+ const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
26
+
27
+ class SkipLink extends AxeAudit {
28
+ /**
29
+ * @return {LH.Audit.Meta}
30
+ */
31
+ static get meta() {
32
+ return {
33
+ id: 'skip-link',
34
+ title: str_(UIStrings.title),
35
+ failureTitle: str_(UIStrings.failureTitle),
36
+ description: str_(UIStrings.description),
37
+ requiredArtifacts: ['Accessibility'],
38
+ };
39
+ }
40
+ }
41
+
42
+ export default SkipLink;
43
+ export {UIStrings};
@@ -0,0 +1,10 @@
1
+ export default TableDuplicateName;
2
+ declare class TableDuplicateName extends AxeAudit {
3
+ }
4
+ export namespace UIStrings {
5
+ const title: string;
6
+ const failureTitle: string;
7
+ const description: string;
8
+ }
9
+ import AxeAudit from './axe-audit.js';
10
+ //# sourceMappingURL=table-duplicate-name.d.ts.map
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @license Copyright 2023 The Lighthouse Authors. All Rights Reserved.
3
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
4
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
5
+ */
6
+
7
+ /**
8
+ * @fileoverview Ensure that table summary and caption have different content.
9
+ * See base class in axe-audit.js for audit() implementation.
10
+ */
11
+
12
+ import AxeAudit from './axe-audit.js';
13
+ import * as i18n from '../../lib/i18n/i18n.js';
14
+
15
+ const UIStrings = {
16
+ /** Title of an accesibility audit that evaluates if tables have different content in the summary attribute and caption element. This title is descriptive of the successful state and is shown to users when no user action is required. */
17
+ title: 'Tables have different content in the summary attribute and `<caption>`.',
18
+ /** Title of an accesibility audit that evaluates if tables have different content in the summary attribute and caption element. This title is descriptive of the failing state and is shown to users when there is a failure that needs to be addressed. */
19
+ failureTitle: 'Tables have the same content in the summary attribute and `<caption>.`',
20
+ /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
21
+ description: 'The summary attribute should describe the table structure, while `<caption>` ' +
22
+ 'should have the onscreen title. Accurate table mark-up helps users of screen readers. ' +
23
+ '[Learn more about summary and caption](https://dequeuniversity.com/rules/axe/4.7/table-duplicate-name).',
24
+ };
25
+
26
+ const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
27
+
28
+ class TableDuplicateName extends AxeAudit {
29
+ /**
30
+ * @return {LH.Audit.Meta}
31
+ */
32
+ static get meta() {
33
+ return {
34
+ id: 'table-duplicate-name',
35
+ title: str_(UIStrings.title),
36
+ failureTitle: str_(UIStrings.failureTitle),
37
+ description: str_(UIStrings.description),
38
+ requiredArtifacts: ['Accessibility'],
39
+ };
40
+ }
41
+ }
42
+
43
+ export default TableDuplicateName;
44
+ export {UIStrings};
@@ -19,7 +19,7 @@ const UIStrings = {
19
19
  failureTitle: 'Touch targets do not have sufficient size or spacing.',
20
20
  /** Description of a Lighthouse audit that tells the user *why* they should try to pass. This is displayed after a user expands the section to see more. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
21
21
  description: 'Touch targets with sufficient size and spacing help users who may have ' +
22
- 'difficulty targeting small controls activate the targets. ' +
22
+ 'difficulty targeting small controls to activate the targets. ' +
23
23
  '[Learn more about touch targets](https://dequeuniversity.com/rules/axe/4.7/target-size).',
24
24
  };
25
25
 
@@ -1,8 +1,8 @@
1
- export default ExperimentalInteractionToNextPaint;
1
+ export default InteractionToNextPaint;
2
2
  /**
3
3
  * @fileoverview This metric gives a high-percentile measure of responsiveness to input.
4
4
  */
5
- declare class ExperimentalInteractionToNextPaint extends Audit {
5
+ declare class InteractionToNextPaint extends Audit {
6
6
  /**
7
7
  * @return {LH.Audit.ScoreOptions}
8
8
  */
@@ -18,4 +18,4 @@ export namespace UIStrings {
18
18
  const description: string;
19
19
  }
20
20
  import { Audit } from '../audit.js';
21
- //# sourceMappingURL=experimental-interaction-to-next-paint.d.ts.map
21
+ //# sourceMappingURL=interaction-to-next-paint.d.ts.map
@@ -20,13 +20,13 @@ const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
20
20
  /**
21
21
  * @fileoverview This metric gives a high-percentile measure of responsiveness to input.
22
22
  */
23
- class ExperimentalInteractionToNextPaint extends Audit {
23
+ class InteractionToNextPaint extends Audit {
24
24
  /**
25
25
  * @return {LH.Audit.Meta}
26
26
  */
27
27
  static get meta() {
28
28
  return {
29
- id: 'experimental-interaction-to-next-paint',
29
+ id: 'interaction-to-next-paint',
30
30
  title: str_(i18n.UIStrings.interactionToNextPaint),
31
31
  description: str_(UIStrings.description),
32
32
  scoreDisplayMode: Audit.SCORING_MODES.NUMERIC,
@@ -84,5 +84,5 @@ class ExperimentalInteractionToNextPaint extends Audit {
84
84
  }
85
85
  }
86
86
 
87
- export default ExperimentalInteractionToNextPaint;
87
+ export default InteractionToNextPaint;
88
88
  export {UIStrings};
@@ -13,7 +13,7 @@ import {MainThreadTasks} from '../lib/tracehouse/main-thread-tasks.js';
13
13
  import {taskGroups} from '../lib/tracehouse/task-groups.js';
14
14
  import {TraceProcessor} from '../lib/tracehouse/trace-processor.js';
15
15
  import {getExecutionTimingsByURL} from '../lib/tracehouse/task-summary.js';
16
- import ExperimentalInteractionToNextPaint from './metrics/experimental-interaction-to-next-paint.js';
16
+ import InteractionToNextPaint from './metrics/interaction-to-next-paint.js';
17
17
  import {LighthouseError} from '../lib/lh-error.js';
18
18
 
19
19
  /** @typedef {import('../computed/metrics/responsiveness.js').EventTimingEvent} EventTimingEvent */
@@ -273,7 +273,7 @@ class WorkDuringInteraction extends Audit {
273
273
  const duration = interactionEvent.args.data.duration;
274
274
  const displayValue = str_(UIStrings.displayValue, {timeInMs: duration, interactionType});
275
275
  return {
276
- score: duration < ExperimentalInteractionToNextPaint.defaultOptions.p10 ? 1 : 0,
276
+ score: duration < InteractionToNextPaint.defaultOptions.p10 ? 1 : 0,
277
277
  displayValue,
278
278
  details: {
279
279
  type: 'list',
@@ -186,7 +186,7 @@ const defaultConfig = {
186
186
  'metrics/total-blocking-time',
187
187
  'metrics/max-potential-fid',
188
188
  'metrics/cumulative-layout-shift',
189
- 'metrics/experimental-interaction-to-next-paint',
189
+ 'metrics/interaction-to-next-paint',
190
190
  'errors-in-console',
191
191
  'server-response-time',
192
192
  'metrics/interactive',
@@ -234,6 +234,7 @@ const defaultConfig = {
234
234
  'manual/pwa-each-page-has-url',
235
235
  'accessibility/accesskeys',
236
236
  'accessibility/aria-allowed-attr',
237
+ 'accessibility/aria-allowed-role',
237
238
  'accessibility/aria-command-name',
238
239
  'accessibility/aria-dialog-name',
239
240
  'accessibility/aria-hidden-body',
@@ -268,8 +269,10 @@ const defaultConfig = {
268
269
  'accessibility/html-xml-lang-mismatch',
269
270
  'accessibility/identical-links-same-purpose',
270
271
  'accessibility/image-alt',
272
+ 'accessibility/image-redundant-alt',
271
273
  'accessibility/input-button-name',
272
274
  'accessibility/input-image-alt',
275
+ 'accessibility/label-content-name-mismatch',
273
276
  'accessibility/label',
274
277
  'accessibility/landmark-one-main',
275
278
  'accessibility/link-name',
@@ -280,7 +283,9 @@ const defaultConfig = {
280
283
  'accessibility/meta-viewport',
281
284
  'accessibility/object-alt',
282
285
  'accessibility/select-name',
286
+ 'accessibility/skip-link',
283
287
  'accessibility/tabindex',
288
+ 'accessibility/table-duplicate-name',
284
289
  'accessibility/table-fake-caption',
285
290
  'accessibility/target-size',
286
291
  'accessibility/td-has-header',
@@ -431,7 +436,7 @@ const defaultConfig = {
431
436
  {id: 'total-blocking-time', weight: 30, group: 'metrics', acronym: 'TBT', relevantAudits: metricsToAudits.tbtRelevantAudits},
432
437
  {id: 'cumulative-layout-shift', weight: 25, group: 'metrics', acronym: 'CLS', relevantAudits: metricsToAudits.clsRelevantAudits},
433
438
  {id: 'speed-index', weight: 10, group: 'metrics', acronym: 'SI'},
434
- {id: 'experimental-interaction-to-next-paint', weight: 0, group: 'metrics', acronym: 'INP', relevantAudits: metricsToAudits.inpRelevantAudits},
439
+ {id: 'interaction-to-next-paint', weight: 0, group: 'metrics', acronym: 'INP', relevantAudits: metricsToAudits.inpRelevantAudits},
435
440
 
436
441
  // These are our "invisible" metrics. Not displayed, but still in the LHR.
437
442
  {id: 'interactive', weight: 0, group: 'hidden', acronym: 'TTI'},
@@ -505,60 +510,65 @@ const defaultConfig = {
505
510
  supportedModes: ['navigation', 'snapshot'],
506
511
  // Audit weights are meant to match the aXe scoring system of
507
512
  // minor, moderate, serious, and critical.
508
- // See the audits listed at dequeuniversity.com/rules/axe/4.1.
513
+ // See the audits listed at dequeuniversity.com/rules/axe/4.7.
509
514
  // Click on an audit and check the right hand column to see its severity.
510
515
  auditRefs: [
511
- {id: 'accesskeys', weight: 3, group: 'a11y-navigation'},
516
+ {id: 'accesskeys', weight: 7, group: 'a11y-navigation'},
512
517
  {id: 'aria-allowed-attr', weight: 10, group: 'a11y-aria'},
513
- {id: 'aria-command-name', weight: 3, group: 'a11y-aria'},
514
- {id: 'aria-dialog-name', weight: 3, group: 'a11y-aria'},
518
+ {id: 'aria-allowed-role', weight: 1, group: 'a11y-aria'},
519
+ {id: 'aria-command-name', weight: 7, group: 'a11y-aria'},
520
+ {id: 'aria-dialog-name', weight: 7, group: 'a11y-aria'},
515
521
  {id: 'aria-hidden-body', weight: 10, group: 'a11y-aria'},
516
- {id: 'aria-hidden-focus', weight: 3, group: 'a11y-aria'},
517
- {id: 'aria-input-field-name', weight: 3, group: 'a11y-aria'},
518
- {id: 'aria-meter-name', weight: 3, group: 'a11y-aria'},
519
- {id: 'aria-progressbar-name', weight: 3, group: 'a11y-aria'},
522
+ {id: 'aria-hidden-focus', weight: 7, group: 'a11y-aria'},
523
+ {id: 'aria-input-field-name', weight: 7, group: 'a11y-aria'},
524
+ {id: 'aria-meter-name', weight: 7, group: 'a11y-aria'},
525
+ {id: 'aria-progressbar-name', weight: 7, group: 'a11y-aria'},
520
526
  {id: 'aria-required-attr', weight: 10, group: 'a11y-aria'},
521
527
  {id: 'aria-required-children', weight: 10, group: 'a11y-aria'},
522
528
  {id: 'aria-required-parent', weight: 10, group: 'a11y-aria'},
523
- {id: 'aria-roles', weight: 10, group: 'a11y-aria'},
524
- {id: 'aria-text', weight: 3, group: 'a11y-aria'},
525
- {id: 'aria-toggle-field-name', weight: 3, group: 'a11y-aria'},
526
- {id: 'aria-tooltip-name', weight: 3, group: 'a11y-aria'},
527
- {id: 'aria-treeitem-name', weight: 3, group: 'a11y-aria'},
529
+ {id: 'aria-roles', weight: 7, group: 'a11y-aria'},
530
+ {id: 'aria-text', weight: 7, group: 'a11y-aria'},
531
+ {id: 'aria-toggle-field-name', weight: 7, group: 'a11y-aria'},
532
+ {id: 'aria-tooltip-name', weight: 7, group: 'a11y-aria'},
533
+ {id: 'aria-treeitem-name', weight: 7, group: 'a11y-aria'},
528
534
  {id: 'aria-valid-attr-value', weight: 10, group: 'a11y-aria'},
529
535
  {id: 'aria-valid-attr', weight: 10, group: 'a11y-aria'},
530
536
  {id: 'button-name', weight: 10, group: 'a11y-names-labels'},
531
- {id: 'bypass', weight: 3, group: 'a11y-navigation'},
532
- {id: 'color-contrast', weight: 3, group: 'a11y-color-contrast'},
533
- {id: 'definition-list', weight: 3, group: 'a11y-tables-lists'},
534
- {id: 'dlitem', weight: 3, group: 'a11y-tables-lists'},
535
- {id: 'document-title', weight: 3, group: 'a11y-names-labels'},
536
- {id: 'duplicate-id-active', weight: 3, group: 'a11y-navigation'},
537
+ {id: 'bypass', weight: 7, group: 'a11y-navigation'},
538
+ {id: 'color-contrast', weight: 7, group: 'a11y-color-contrast'},
539
+ {id: 'definition-list', weight: 7, group: 'a11y-tables-lists'},
540
+ {id: 'dlitem', weight: 7, group: 'a11y-tables-lists'},
541
+ {id: 'document-title', weight: 7, group: 'a11y-names-labels'},
542
+ {id: 'duplicate-id-active', weight: 7, group: 'a11y-navigation'},
537
543
  {id: 'duplicate-id-aria', weight: 10, group: 'a11y-aria'},
538
- {id: 'form-field-multiple-labels', weight: 2, group: 'a11y-names-labels'},
539
- {id: 'frame-title', weight: 3, group: 'a11y-names-labels'},
540
- {id: 'heading-order', weight: 2, group: 'a11y-navigation'},
541
- {id: 'html-has-lang', weight: 3, group: 'a11y-language'},
542
- {id: 'html-lang-valid', weight: 3, group: 'a11y-language'},
543
- {id: 'html-xml-lang-mismatch', weight: 2, group: 'a11y-language'},
544
+ {id: 'form-field-multiple-labels', weight: 3, group: 'a11y-names-labels'},
545
+ {id: 'frame-title', weight: 7, group: 'a11y-names-labels'},
546
+ {id: 'heading-order', weight: 3, group: 'a11y-navigation'},
547
+ {id: 'html-has-lang', weight: 7, group: 'a11y-language'},
548
+ {id: 'html-lang-valid', weight: 7, group: 'a11y-language'},
549
+ {id: 'html-xml-lang-mismatch', weight: 3, group: 'a11y-language'},
544
550
  {id: 'image-alt', weight: 10, group: 'a11y-names-labels'},
551
+ {id: 'image-redundant-alt', weight: 1, group: 'a11y-names-labels'},
545
552
  {id: 'input-button-name', weight: 10, group: 'a11y-names-labels'},
546
553
  {id: 'input-image-alt', weight: 10, group: 'a11y-names-labels'},
547
- {id: 'label', weight: 10, group: 'a11y-names-labels'},
548
- {id: 'link-in-text-block', weight: 3, group: 'a11y-color-contrast'},
549
- {id: 'link-name', weight: 3, group: 'a11y-names-labels'},
550
- {id: 'list', weight: 3, group: 'a11y-tables-lists'},
551
- {id: 'listitem', weight: 3, group: 'a11y-tables-lists'},
554
+ {id: 'label-content-name-mismatch', weight: 7, group: 'a11y-names-labels'},
555
+ {id: 'label', weight: 7, group: 'a11y-names-labels'},
556
+ {id: 'link-in-text-block', weight: 7, group: 'a11y-color-contrast'},
557
+ {id: 'link-name', weight: 7, group: 'a11y-names-labels'},
558
+ {id: 'list', weight: 7, group: 'a11y-tables-lists'},
559
+ {id: 'listitem', weight: 7, group: 'a11y-tables-lists'},
552
560
  {id: 'meta-refresh', weight: 10, group: 'a11y-best-practices'},
553
561
  {id: 'meta-viewport', weight: 10, group: 'a11y-best-practices'},
554
- {id: 'object-alt', weight: 3, group: 'a11y-names-labels'},
555
- {id: 'select-name', weight: 3, group: 'a11y-names-labels'},
556
- {id: 'tabindex', weight: 3, group: 'a11y-navigation'},
557
- {id: 'table-fake-caption', weight: 3, group: 'a11y-tables-lists'},
562
+ {id: 'object-alt', weight: 7, group: 'a11y-names-labels'},
563
+ {id: 'select-name', weight: 7, group: 'a11y-names-labels'},
564
+ {id: 'skip-link', weight: 3, group: 'a11y-names-labels'},
565
+ {id: 'tabindex', weight: 7, group: 'a11y-navigation'},
566
+ {id: 'table-duplicate-name', weight: 1, group: 'a11y-tables-lists'},
567
+ {id: 'table-fake-caption', weight: 7, group: 'a11y-tables-lists'},
558
568
  {id: 'td-has-header', weight: 10, group: 'a11y-tables-lists'},
559
- {id: 'td-headers-attr', weight: 3, group: 'a11y-tables-lists'},
560
- {id: 'th-has-data-cells', weight: 3, group: 'a11y-tables-lists'},
561
- {id: 'valid-lang', weight: 3, group: 'a11y-language'},
569
+ {id: 'td-headers-attr', weight: 7, group: 'a11y-tables-lists'},
570
+ {id: 'th-has-data-cells', weight: 7, group: 'a11y-tables-lists'},
571
+ {id: 'valid-lang', weight: 7, group: 'a11y-language'},
562
572
  {id: 'video-caption', weight: 10, group: 'a11y-audio-video'},
563
573
  // Manual audits
564
574
  {id: 'logical-tab-order', weight: 0},
@@ -15,7 +15,7 @@ export function isValidArtifactDependency(dependent: LH.Config.AnyGathererDefn,
15
15
  */
16
16
  export function assertValidPluginName(config: LH.Config, pluginName: string): void;
17
17
  /**
18
- * Throws an error if the provided object does not implement the required Fraggle Rock gatherer interface.
18
+ * Throws an error if the provided object does not implement the required gatherer interface.
19
19
  * @param {LH.Config.AnyArtifactDefn} artifactDefn
20
20
  */
21
21
  export function assertValidArtifact(artifactDefn: LH.Config.AnyArtifactDefn): void;
@@ -24,7 +24,7 @@ export function assertValidArtifact(artifactDefn: LH.Config.AnyArtifactDefn): vo
24
24
  * @param {LH.Config.ResolvedConfig['navigations']} navigationsDefn
25
25
  * @return {{warnings: string[]}}
26
26
  */
27
- export function assertValidFRNavigations(navigationsDefn: LH.Config.ResolvedConfig['navigations']): {
27
+ export function assertValidNavigations(navigationsDefn: LH.Config.ResolvedConfig['navigations']): {
28
28
  warnings: string[];
29
29
  };
30
30
  /**
@@ -46,7 +46,7 @@ function assertValidPluginName(config, pluginName) {
46
46
  }
47
47
 
48
48
  /**
49
- * Throws an error if the provided object does not implement the required Fraggle Rock gatherer interface.
49
+ * Throws an error if the provided object does not implement the required gatherer interface.
50
50
  * @param {LH.Config.AnyArtifactDefn} artifactDefn
51
51
  */
52
52
  function assertValidArtifact(artifactDefn) {
@@ -73,7 +73,7 @@ function assertValidArtifact(artifactDefn) {
73
73
  * @param {LH.Config.ResolvedConfig['navigations']} navigationsDefn
74
74
  * @return {{warnings: string[]}}
75
75
  */
76
- function assertValidFRNavigations(navigationsDefn) {
76
+ function assertValidNavigations(navigationsDefn) {
77
77
  if (!navigationsDefn || !navigationsDefn.length) return {warnings: []};
78
78
 
79
79
  /** @type {string[]} */
@@ -248,7 +248,7 @@ function assertArtifactTopologicalOrder(navigations) {
248
248
  * @return {{warnings: string[]}}
249
249
  */
250
250
  function assertValidConfig(resolvedConfig) {
251
- const {warnings} = assertValidFRNavigations(resolvedConfig.navigations);
251
+ const {warnings} = assertValidNavigations(resolvedConfig.navigations);
252
252
 
253
253
  /** @type {Set<string>} */
254
254
  const artifactIds = new Set();
@@ -303,7 +303,7 @@ export {
303
303
  isValidArtifactDependency,
304
304
  assertValidPluginName,
305
305
  assertValidArtifact,
306
- assertValidFRNavigations,
306
+ assertValidNavigations,
307
307
  assertValidAudit,
308
308
  assertValidCategories,
309
309
  assertValidSettings,
@@ -31,7 +31,6 @@ class NetworkMonitor extends NetworkMonitorEventEmitter {
31
31
  /** @type {Array<LH.Crdp.Page.Frame>} */
32
32
  _frameNavigations = [];
33
33
 
34
- // TODO(FR-COMPAT): switch to real TargetManager when legacy removed.
35
34
  /** @param {LH.Gatherer.Driver['targetManager']} targetManager */
36
35
  constructor(targetManager) {
37
36
  super();
@@ -41,6 +41,7 @@ async function runA11yChecks() {
41
41
  // Consider http://go/prcpg for expert review of the aXe rules.
42
42
  'accesskeys': {enabled: true},
43
43
  'area-alt': {enabled: false},
44
+ 'aria-allowed-role': {enabled: true},
44
45
  'aria-dialog-name': {enabled: true},
45
46
  'aria-roledescription': {enabled: false},
46
47
  'aria-treeitem-name': {enabled: true},
@@ -54,7 +55,9 @@ async function runA11yChecks() {
54
55
  'heading-order': {enabled: true},
55
56
  'html-xml-lang-mismatch': {enabled: true},
56
57
  'identical-links-same-purpose': {enabled: true},
58
+ 'image-redundant-alt': {enabled: true},
57
59
  'input-button-name': {enabled: true},
60
+ 'label-content-name-mismatch': {enabled: true},
58
61
  'landmark-one-main': {enabled: true},
59
62
  'link-in-text-block': {enabled: true},
60
63
  'marquee': {enabled: false},
@@ -66,8 +69,10 @@ async function runA11yChecks() {
66
69
  'scrollable-region-focusable': {enabled: false},
67
70
  'select-name': {enabled: true},
68
71
  'server-side-image-map': {enabled: false},
72
+ 'skip-link': {enabled: true},
69
73
  'svg-img-alt': {enabled: false},
70
74
  'tabindex': {enabled: true},
75
+ 'table-duplicate-name': {enabled: true},
71
76
  'table-fake-caption': {enabled: true},
72
77
  'target-size': {enabled: true},
73
78
  'td-has-header': {enabled: true},
@@ -39,6 +39,10 @@ const stackPacksToInclude = [
39
39
  packId: 'drupal',
40
40
  requiredStacks: ['js:drupal'],
41
41
  },
42
+ {
43
+ packId: 'nitropack',
44
+ requiredStacks: ['js:nitropack'],
45
+ },
42
46
  {
43
47
  packId: 'amp',
44
48
  requiredStacks: ['js:amp'],