lighthouse 11.7.1 → 12.0.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.
Files changed (272) hide show
  1. package/CONTRIBUTING.md +2 -2
  2. package/cli/bin.js +0 -7
  3. package/cli/cli-flags.d.ts +1 -5
  4. package/cli/cli-flags.js +4 -8
  5. package/cli/test/smokehouse/__snapshots__/report-assert-test.js.snap +14 -14
  6. package/cli/test/smokehouse/config/exclusions.js +3 -0
  7. package/cli/test/smokehouse/core-tests.js +6 -20
  8. package/cli/test/smokehouse/frontends/smokehouse-bin.js +2 -2
  9. package/core/audits/accessibility/aria-conditional-attr.d.ts +10 -0
  10. package/core/audits/accessibility/aria-conditional-attr.js +43 -0
  11. package/core/audits/accessibility/{duplicate-id-active.d.ts → aria-deprecated-role.d.ts} +3 -3
  12. package/core/audits/accessibility/aria-deprecated-role.js +43 -0
  13. package/core/audits/accessibility/aria-prohibited-attr.d.ts +10 -0
  14. package/core/audits/accessibility/aria-prohibited-attr.js +44 -0
  15. package/core/audits/accessibility/target-size.js +0 -1
  16. package/core/audits/byte-efficiency/byte-efficiency-audit.d.ts +0 -16
  17. package/core/audits/byte-efficiency/byte-efficiency-audit.js +1 -38
  18. package/core/audits/byte-efficiency/offscreen-images.d.ts +0 -11
  19. package/core/audits/byte-efficiency/offscreen-images.js +0 -15
  20. package/core/audits/byte-efficiency/render-blocking-resources.js +27 -26
  21. package/core/audits/byte-efficiency/unminified-css.js +2 -2
  22. package/core/audits/byte-efficiency/unused-css-rules.js +3 -1
  23. package/core/audits/dobetterweb/uses-http2.d.ts +0 -13
  24. package/core/audits/dobetterweb/uses-http2.js +4 -38
  25. package/core/audits/font-display.js +2 -2
  26. package/core/audits/layout-shifts.js +1 -1
  27. package/core/audits/preload-fonts.d.ts +1 -5
  28. package/core/audits/preload-fonts.js +1 -10
  29. package/core/audits/prioritize-lcp-image.js +2 -2
  30. package/core/audits/redirects-http.d.ts +19 -0
  31. package/core/audits/redirects-http.js +75 -0
  32. package/core/audits/resource-summary.d.ts +2 -0
  33. package/core/audits/resource-summary.js +5 -4
  34. package/core/audits/seo/is-crawlable.d.ts +2 -1
  35. package/core/audits/seo/link-text.js +12 -0
  36. package/core/audits/uses-rel-preload.d.ts +1 -5
  37. package/core/audits/uses-rel-preload.js +5 -15
  38. package/core/audits/work-during-interaction.d.ts +2 -2
  39. package/core/audits/work-during-interaction.js +2 -2
  40. package/core/computed/js-bundles.d.ts +1 -1
  41. package/core/computed/metrics/lantern-first-contentful-paint.d.ts +13 -82
  42. package/core/computed/metrics/lantern-first-contentful-paint.js +16 -178
  43. package/core/computed/metrics/lantern-first-meaningful-paint.d.ts +13 -12
  44. package/core/computed/metrics/lantern-first-meaningful-paint.js +11 -49
  45. package/core/computed/metrics/lantern-interactive.d.ts +13 -21
  46. package/core/computed/metrics/lantern-interactive.js +12 -84
  47. package/core/computed/metrics/lantern-largest-contentful-paint.d.ts +13 -25
  48. package/core/computed/metrics/lantern-largest-contentful-paint.js +13 -80
  49. package/core/computed/metrics/lantern-max-potential-fid.d.ts +13 -24
  50. package/core/computed/metrics/lantern-max-potential-fid.js +12 -64
  51. package/core/computed/metrics/lantern-metric.d.ts +14 -18
  52. package/core/computed/metrics/lantern-metric.js +34 -30
  53. package/core/computed/metrics/lantern-speed-index.d.ts +13 -32
  54. package/core/computed/metrics/lantern-speed-index.js +13 -116
  55. package/core/computed/metrics/lantern-total-blocking-time.d.ts +13 -25
  56. package/core/computed/metrics/lantern-total-blocking-time.js +10 -94
  57. package/core/computed/metrics/metric.js +1 -3
  58. package/core/computed/module-duplication.d.ts +1 -1
  59. package/core/computed/navigation-insights.d.ts +36 -0
  60. package/core/computed/navigation-insights.js +35 -0
  61. package/core/computed/page-dependency-graph.js +3 -7
  62. package/core/computed/resource-summary.d.ts +10 -12
  63. package/core/computed/resource-summary.js +12 -19
  64. package/core/computed/trace-engine-result.d.ts +16 -3
  65. package/core/computed/trace-engine-result.js +19 -14
  66. package/core/computed/unused-css.d.ts +3 -1
  67. package/core/computed/unused-css.js +6 -5
  68. package/core/config/config-helpers.js +0 -4
  69. package/core/config/constants.js +0 -1
  70. package/core/config/default-config.js +63 -142
  71. package/core/config/experimental-config.js +11 -0
  72. package/core/config/filters.js +0 -1
  73. package/core/gather/driver/navigation.js +4 -1
  74. package/core/gather/driver/prepare.js +1 -1
  75. package/core/gather/driver/target-manager.js +4 -3
  76. package/core/gather/driver/wait-for-condition.js +2 -3
  77. package/core/gather/driver.d.ts +12 -0
  78. package/core/gather/driver.js +27 -0
  79. package/core/gather/gatherers/accessibility.js +4 -6
  80. package/core/gather/gatherers/css-usage.d.ts +0 -21
  81. package/core/gather/gatherers/css-usage.js +9 -119
  82. package/core/gather/gatherers/root-causes.d.ts +2 -2
  83. package/core/gather/gatherers/root-causes.js +6 -5
  84. package/core/gather/gatherers/stylesheets.d.ts +26 -0
  85. package/core/gather/gatherers/stylesheets.js +138 -0
  86. package/core/gather/gatherers/trace-elements.d.ts +2 -12
  87. package/core/gather/gatherers/trace-elements.js +2 -21
  88. package/core/gather/navigation-runner.js +3 -1
  89. package/core/gather/session.d.ts +8 -0
  90. package/core/gather/session.js +14 -1
  91. package/core/lib/emulation.js +2 -2
  92. package/core/lib/i18n/i18n.d.ts +0 -1
  93. package/core/lib/i18n/i18n.js +0 -2
  94. package/core/lib/lantern/cpu-node.d.ts +7 -1
  95. package/core/lib/lantern/cpu-node.js +12 -2
  96. package/core/lib/lantern/lantern-error.d.ts +8 -0
  97. package/core/lib/lantern/lantern-error.js +9 -0
  98. package/core/lib/lantern/metric.js +2 -6
  99. package/core/lib/lantern/metrics/first-contentful-paint.d.ts +79 -0
  100. package/core/lib/lantern/metrics/first-contentful-paint.js +200 -0
  101. package/core/lib/lantern/metrics/first-meaningful-paint.d.ts +6 -0
  102. package/core/lib/lantern/metrics/first-meaningful-paint.js +64 -0
  103. package/core/lib/lantern/metrics/interactive.d.ts +26 -0
  104. package/core/lib/lantern/metrics/interactive.js +112 -0
  105. package/core/lib/lantern/metrics/largest-contentful-paint.d.ts +19 -0
  106. package/core/lib/lantern/metrics/largest-contentful-paint.js +108 -0
  107. package/core/lib/lantern/metrics/max-potential-fid.d.ts +30 -0
  108. package/core/lib/lantern/metrics/max-potential-fid.js +92 -0
  109. package/core/lib/lantern/metrics/speed-index.d.ts +38 -0
  110. package/core/lib/lantern/metrics/speed-index.js +144 -0
  111. package/core/lib/lantern/metrics/total-blocking-time.d.ts +31 -0
  112. package/core/lib/lantern/metrics/total-blocking-time.js +128 -0
  113. package/core/lib/lantern/network-node.js +28 -4
  114. package/core/lib/lantern/page-dependency-graph.d.ts +4 -4
  115. package/core/lib/lantern/page-dependency-graph.js +19 -7
  116. package/core/lib/lantern/simulator/connection-pool.d.ts +2 -12
  117. package/core/lib/lantern/simulator/connection-pool.js +3 -22
  118. package/core/lib/lantern/simulator/network-analyzer.js +1 -12
  119. package/core/lib/lantern/simulator/simulator.d.ts +2 -4
  120. package/core/lib/lantern/simulator/simulator.js +7 -14
  121. package/core/lib/lantern/types/lantern.d.ts +5 -3
  122. package/core/lib/lantern-trace-saver.js +0 -1
  123. package/core/lib/lh-error.d.ts +9 -0
  124. package/core/lib/lh-error.js +13 -3
  125. package/core/lib/lighthouse-compatibility.js +53 -10
  126. package/core/lib/navigation-error.js +3 -0
  127. package/core/lib/network-request.d.ts +1 -0
  128. package/core/lib/network-request.js +28 -0
  129. package/core/runner.js +18 -25
  130. package/dist/report/bundle.esm.js +11 -112
  131. package/dist/report/flow.js +16 -117
  132. package/dist/report/standalone.js +12 -113
  133. package/flow-report/src/help-dialog.tsx +0 -1
  134. package/flow-report/src/i18n/i18n.d.ts +0 -4
  135. package/flow-report/src/i18n/ui-strings.d.ts +0 -1
  136. package/flow-report/src/i18n/ui-strings.js +0 -2
  137. package/flow-report/src/summary/category.tsx +10 -12
  138. package/package.json +5 -5
  139. package/readme.md +4 -4
  140. package/report/assets/styles.css +1 -60
  141. package/report/assets/templates.html +0 -95
  142. package/report/renderer/category-renderer.js +1 -1
  143. package/report/renderer/components.d.ts +2 -2
  144. package/report/renderer/components.js +2 -103
  145. package/report/renderer/dom.d.ts +1 -1
  146. package/report/renderer/dom.js +1 -1
  147. package/report/renderer/performance-category-renderer.d.ts +0 -7
  148. package/report/renderer/performance-category-renderer.js +1 -32
  149. package/report/renderer/report-renderer.js +3 -13
  150. package/report/renderer/report-ui-features.js +1 -1
  151. package/report/renderer/report-utils.d.ts +0 -1
  152. package/report/renderer/report-utils.js +13 -13
  153. package/shared/localization/locales/ar-XB.json +62 -329
  154. package/shared/localization/locales/ar.json +62 -329
  155. package/shared/localization/locales/bg.json +62 -329
  156. package/shared/localization/locales/ca.json +62 -329
  157. package/shared/localization/locales/cs.json +62 -329
  158. package/shared/localization/locales/da.json +62 -329
  159. package/shared/localization/locales/de.json +62 -329
  160. package/shared/localization/locales/el.json +62 -329
  161. package/shared/localization/locales/en-GB.json +62 -329
  162. package/shared/localization/locales/en-US.json +41 -272
  163. package/shared/localization/locales/en-XA.json +62 -329
  164. package/shared/localization/locales/en-XL.json +41 -272
  165. package/shared/localization/locales/es-419.json +62 -329
  166. package/shared/localization/locales/es.json +62 -329
  167. package/shared/localization/locales/fi.json +62 -329
  168. package/shared/localization/locales/fil.json +61 -328
  169. package/shared/localization/locales/fr.json +62 -329
  170. package/shared/localization/locales/he.json +62 -329
  171. package/shared/localization/locales/hi.json +62 -329
  172. package/shared/localization/locales/hr.json +63 -330
  173. package/shared/localization/locales/hu.json +62 -329
  174. package/shared/localization/locales/id.json +62 -329
  175. package/shared/localization/locales/it.json +62 -329
  176. package/shared/localization/locales/ja.json +62 -329
  177. package/shared/localization/locales/ko.json +62 -329
  178. package/shared/localization/locales/lt.json +62 -329
  179. package/shared/localization/locales/lv.json +62 -329
  180. package/shared/localization/locales/nl.json +62 -329
  181. package/shared/localization/locales/no.json +62 -329
  182. package/shared/localization/locales/pl.json +61 -328
  183. package/shared/localization/locales/pt-PT.json +62 -329
  184. package/shared/localization/locales/pt.json +64 -331
  185. package/shared/localization/locales/ro.json +62 -329
  186. package/shared/localization/locales/ru.json +62 -329
  187. package/shared/localization/locales/sk.json +62 -329
  188. package/shared/localization/locales/sl.json +62 -329
  189. package/shared/localization/locales/sr-Latn.json +62 -329
  190. package/shared/localization/locales/sr.json +62 -329
  191. package/shared/localization/locales/sv.json +62 -329
  192. package/shared/localization/locales/ta.json +61 -328
  193. package/shared/localization/locales/te.json +62 -329
  194. package/shared/localization/locales/th.json +62 -329
  195. package/shared/localization/locales/tr.json +62 -329
  196. package/shared/localization/locales/uk.json +62 -329
  197. package/shared/localization/locales/vi.json +61 -328
  198. package/shared/localization/locales/zh-HK.json +62 -329
  199. package/shared/localization/locales/zh-TW.json +61 -328
  200. package/shared/localization/locales/zh.json +62 -329
  201. package/tsconfig.json +1 -3
  202. package/types/artifacts.d.ts +21 -110
  203. package/types/audit.d.ts +0 -10
  204. package/types/config.d.ts +0 -1
  205. package/types/externs.d.ts +0 -2
  206. package/types/gatherer.d.ts +3 -0
  207. package/types/internal/smokehouse.d.ts +1 -1
  208. package/types/lh.d.ts +0 -2
  209. package/types/lhr/audit-details.d.ts +9 -4
  210. package/types/lhr/lhr.d.ts +0 -4
  211. package/types/lhr/settings.d.ts +0 -4
  212. package/core/audits/accessibility/duplicate-id-active.js +0 -42
  213. package/core/audits/content-width.d.ts +0 -17
  214. package/core/audits/content-width.js +0 -76
  215. package/core/audits/installable-manifest.d.ts +0 -111
  216. package/core/audits/installable-manifest.js +0 -248
  217. package/core/audits/layout-shift-elements.d.ts +0 -16
  218. package/core/audits/layout-shift-elements.js +0 -101
  219. package/core/audits/manual/pwa-cross-browser.d.ts +0 -12
  220. package/core/audits/manual/pwa-cross-browser.js +0 -40
  221. package/core/audits/manual/pwa-each-page-has-url.d.ts +0 -12
  222. package/core/audits/manual/pwa-each-page-has-url.js +0 -38
  223. package/core/audits/manual/pwa-page-transitions.d.ts +0 -12
  224. package/core/audits/manual/pwa-page-transitions.js +0 -38
  225. package/core/audits/maskable-icon.d.ts +0 -25
  226. package/core/audits/maskable-icon.js +0 -70
  227. package/core/audits/multi-check-audit.d.ts +0 -28
  228. package/core/audits/multi-check-audit.js +0 -82
  229. package/core/audits/no-unload-listeners.d.ts +0 -16
  230. package/core/audits/no-unload-listeners.js +0 -86
  231. package/core/audits/performance-budget.d.ts +0 -39
  232. package/core/audits/performance-budget.js +0 -154
  233. package/core/audits/script-elements-test-audit.d.ts +0 -14
  234. package/core/audits/script-elements-test-audit.js +0 -29
  235. package/core/audits/seo/plugins.d.ts +0 -15
  236. package/core/audits/seo/plugins.js +0 -150
  237. package/core/audits/seo/tap-targets.d.ts +0 -50
  238. package/core/audits/seo/tap-targets.js +0 -352
  239. package/core/audits/splash-screen.d.ts +0 -37
  240. package/core/audits/splash-screen.js +0 -98
  241. package/core/audits/themed-omnibox.d.ts +0 -42
  242. package/core/audits/themed-omnibox.js +0 -102
  243. package/core/audits/timing-budget.d.ts +0 -43
  244. package/core/audits/timing-budget.js +0 -175
  245. package/core/computed/manifest-values.d.ts +0 -24
  246. package/core/computed/manifest-values.js +0 -136
  247. package/core/config/budget.d.ts +0 -74
  248. package/core/config/budget.js +0 -340
  249. package/core/config/metrics-to-audits.d.ts +0 -19
  250. package/core/config/metrics-to-audits.js +0 -62
  251. package/core/gather/driver/service-workers.d.ts +0 -16
  252. package/core/gather/driver/service-workers.js +0 -52
  253. package/core/gather/gatherers/dobetterweb/tags-blocking-first-paint.d.ts +0 -47
  254. package/core/gather/gatherers/dobetterweb/tags-blocking-first-paint.js +0 -233
  255. package/core/gather/gatherers/global-listeners.d.ts +0 -27
  256. package/core/gather/gatherers/global-listeners.js +0 -108
  257. package/core/gather/gatherers/installability-errors.d.ts +0 -17
  258. package/core/gather/gatherers/installability-errors.js +0 -56
  259. package/core/gather/gatherers/script-elements.d.ts +0 -21
  260. package/core/gather/gatherers/script-elements.js +0 -100
  261. package/core/gather/gatherers/seo/embedded-content.d.ts +0 -10
  262. package/core/gather/gatherers/seo/embedded-content.js +0 -63
  263. package/core/gather/gatherers/seo/tap-targets.d.ts +0 -21
  264. package/core/gather/gatherers/seo/tap-targets.js +0 -389
  265. package/core/gather/gatherers/service-worker.d.ts +0 -10
  266. package/core/gather/gatherers/service-worker.js +0 -32
  267. package/core/gather/gatherers/web-app-manifest.d.ts +0 -32
  268. package/core/gather/gatherers/web-app-manifest.js +0 -106
  269. package/report/renderer/pwa-category-renderer.d.ts +0 -55
  270. package/report/renderer/pwa-category-renderer.js +0 -184
  271. package/third-party/chromium-synchronization/installability-errors-test.js +0 -79
  272. package/types/lhr/budget.d.ts +0 -60
@@ -9,21 +9,12 @@
9
9
  import * as LH from '../../types/lh.js';
10
10
  import * as constants from './constants.js';
11
11
  import * as i18n from '../lib/i18n/i18n.js';
12
- import {metricsToAudits} from './metrics-to-audits.js';
13
12
 
14
13
  const UIStrings = {
15
14
  /** Title of the Performance category of audits. Equivalent to 'Web performance', this term is inclusive of all web page speed and loading optimization topics. Also used as a label of a score gauge; try to limit to 20 characters. */
16
15
  performanceCategoryTitle: 'Performance',
17
- /** Title of the Budgets section of the Performance Category. 'Budgets' refers to a budget (like a financial budget), but applied to the amount of resources on a page, rather than money. */
18
- budgetsGroupTitle: 'Budgets',
19
- /** Description of the Budgets section of the Performance category. Within this section the budget results are displayed. */
20
- budgetsGroupDescription: 'Performance budgets set standards for the performance of your site.',
21
16
  /** Title of the speed metrics section of the Performance category. Within this section are various speed metrics which quantify the pageload performance into values presented in seconds and milliseconds. */
22
17
  metricGroupTitle: 'Metrics',
23
- /** Title of the opportunity section of the Performance category. Within this section are audits with imperative titles that suggest actions the user can take to improve the loading performance of their web page. 'Suggestion'/'Optimization'/'Recommendation' are reasonable synonyms for 'opportunity' in this case. */
24
- loadOpportunitiesGroupTitle: 'Opportunities',
25
- /** Description of the opportunity section of the Performance category. 'Suggestions' could also be 'recommendations'. Within this section are audits with imperative titles that suggest actions the user can take to improve the loading performance of their web page. */
26
- loadOpportunitiesGroupDescription: 'These suggestions can help your page load faster. They don\'t [directly affect](https://developer.chrome.com/docs/lighthouse/performance/performance-scoring/) the Performance score.',
27
18
  /** Title of an opportunity sub-section of the Performance category. Within this section are audits with imperative titles that suggest actions the user can take to improve the time of the first initial render of the webpage. */
28
19
  firstPaintImprovementsGroupTitle: 'First Paint Improvements',
29
20
  /** Description of an opportunity sub-section of the Performance category. Within this section are audits with imperative titles that suggest actions the user can take to improve the time of the first initial render of the webpage. */
@@ -95,15 +86,6 @@ const UIStrings = {
95
86
  seoCrawlingGroupTitle: 'Crawling and Indexing',
96
87
  /** Description of the navigation section within the Search Engine Optimization (SEO) category. Within this section are audits with descriptive titles that highlight ways to make a website accessible to search engine crawlers. */
97
88
  seoCrawlingGroupDescription: 'To appear in search results, crawlers need access to your app.',
98
- /** Title of the Progressive Web Application (PWA) category of audits. This is displayed at the top of a list of audits focused on topics related to whether or not a site is a progressive web app, e.g. responds offline, uses a service worker, is on https, etc. Also used as a label of a score gauge. */
99
- pwaCategoryTitle: 'PWA',
100
- /** Description of the Progressive Web Application (PWA) category. This is displayed at the top of a list of audits focused on topics related to whether or not a site is a progressive web app, e.g. responds offline, uses a service worker, is on https, etc. No character length limits. The last sentence starting with 'Learn' becomes link text to additional documentation. */
101
- pwaCategoryDescription: 'These checks validate the aspects of a Progressive Web App. ' +
102
- '[Learn what makes a good Progressive Web App](https://web.dev/articles/pwa-checklist).',
103
- /** Description of the Progressive Web Application (PWA) manual checks category, containing a list of additional validators must be run by hand in order to check all PWA best practices. This is displayed at the top of a list of manually run audits focused on topics related to whether or not a site is a progressive web app, e.g. responds offline, uses a service worker, is on https, etc.. No character length limits. */
104
- pwaCategoryManualDescription: 'These checks are required by the baseline ' +
105
- '[PWA Checklist](https://web.dev/articles/pwa-checklist) but are ' +
106
- 'not automatically checked by Lighthouse. They do not affect your score but it\'s important that you verify them manually.',
107
89
  /** Title of the Best Practices category of audits. This is displayed at the top of a list of audits focused on topics related to following web development best practices and accepted guidelines. Also used as a label of a score gauge; try to limit to 20 characters. */
108
90
  bestPracticesCategoryTitle: 'Best Practices',
109
91
  /** Title of the Trust & Safety group of audits. This is displayed at the top of a list of audits focused on maintaining user trust and protecting security in web development. */
@@ -114,10 +96,6 @@ const UIStrings = {
114
96
  bestPracticesBrowserCompatGroupTitle: 'Browser Compatibility',
115
97
  /** 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. */
116
98
  bestPracticesGeneralGroupTitle: 'General',
117
- /** Title of the Installable section of the web app category. Within this section are audits that check if Chrome supports installing the web site as an app on their device. */
118
- pwaInstallableGroupTitle: 'Installable',
119
- /** Title of the "PWA Optimized" section of the web app category. Within this section are audits that check if the developer has taken advantage of features to make their web page more enjoyable and engaging for the user. */
120
- pwaOptimizedGroupTitle: 'PWA Optimized',
121
99
  };
122
100
 
123
101
  const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
@@ -138,13 +116,10 @@ const defaultConfig = {
138
116
  {id: 'CSSUsage', gatherer: 'css-usage'},
139
117
  {id: 'Doctype', gatherer: 'dobetterweb/doctype'},
140
118
  {id: 'DOMStats', gatherer: 'dobetterweb/domstats'},
141
- {id: 'EmbeddedContent', gatherer: 'seo/embedded-content'},
142
119
  {id: 'FontSize', gatherer: 'seo/font-size'},
143
120
  {id: 'Inputs', gatherer: 'inputs'},
144
- {id: 'GlobalListeners', gatherer: 'global-listeners'},
145
121
  {id: 'IFrameElements', gatherer: 'iframe-elements'},
146
122
  {id: 'ImageElements', gatherer: 'image-elements'},
147
- {id: 'InstallabilityErrors', gatherer: 'installability-errors'},
148
123
  {id: 'InspectorIssues', gatherer: 'inspector-issues'},
149
124
  {id: 'JsUsage', gatherer: 'js-usage'},
150
125
  {id: 'LinkElements', gatherer: 'link-elements'},
@@ -154,16 +129,12 @@ const defaultConfig = {
154
129
  {id: 'OptimizedImages', gatherer: 'dobetterweb/optimized-images'},
155
130
  {id: 'ResponseCompression', gatherer: 'dobetterweb/response-compression'},
156
131
  {id: 'RobotsTxt', gatherer: 'seo/robots-txt'},
157
- {id: 'ServiceWorker', gatherer: 'service-worker'},
158
- {id: 'ScriptElements', gatherer: 'script-elements'},
159
132
  {id: 'Scripts', gatherer: 'scripts'},
160
133
  {id: 'SourceMaps', gatherer: 'source-maps'},
161
134
  {id: 'Stacks', gatherer: 'stacks'},
162
- {id: 'TagsBlockingFirstPaint', gatherer: 'dobetterweb/tags-blocking-first-paint'},
163
- {id: 'TapTargets', gatherer: 'seo/tap-targets'},
135
+ {id: 'Stylesheets', gatherer: 'stylesheets'},
164
136
  {id: 'TraceElements', gatherer: 'trace-elements'},
165
137
  {id: 'ViewportDimensions', gatherer: 'viewport-dimensions'},
166
- {id: 'WebAppManifest', gatherer: 'web-app-manifest'},
167
138
 
168
139
  // Artifact copies are renamed for compatibility with legacy artifacts.
169
140
  {id: 'devtoolsLogs', gatherer: 'devtools-log-compat'},
@@ -177,6 +148,7 @@ const defaultConfig = {
177
148
  ],
178
149
  audits: [
179
150
  'is-on-https',
151
+ 'redirects-http',
180
152
  'viewport',
181
153
  'metrics/first-contentful-paint',
182
154
  'metrics/largest-contentful-paint',
@@ -194,19 +166,12 @@ const defaultConfig = {
194
166
  'user-timings',
195
167
  'critical-request-chains',
196
168
  'redirects',
197
- 'installable-manifest',
198
- 'splash-screen',
199
- 'themed-omnibox',
200
- 'maskable-icon',
201
- 'content-width',
202
169
  'image-aspect-ratio',
203
170
  'image-size-responsive',
204
- 'preload-fonts',
205
171
  'deprecations',
206
172
  'third-party-cookies',
207
173
  'mainthread-work-breakdown',
208
174
  'bootup-time',
209
- 'uses-rel-preload',
210
175
  'uses-rel-preconnect',
211
176
  'font-display',
212
177
  'diagnostics',
@@ -215,36 +180,32 @@ const defaultConfig = {
215
180
  'network-server-latency',
216
181
  'main-thread-tasks',
217
182
  'metrics',
218
- 'performance-budget',
219
- 'timing-budget',
220
183
  'resource-summary',
221
184
  'third-party-summary',
222
185
  'third-party-facades',
223
186
  'largest-contentful-paint-element',
224
187
  'lcp-lazy-loaded',
225
- 'layout-shift-elements',
226
188
  'layout-shifts',
227
189
  'long-tasks',
228
- 'no-unload-listeners',
229
190
  'non-composited-animations',
230
191
  'unsized-images',
231
192
  'valid-source-maps',
232
193
  'prioritize-lcp-image',
233
194
  'csp-xss',
234
195
  'script-treemap-data',
235
- 'manual/pwa-cross-browser',
236
- 'manual/pwa-page-transitions',
237
- 'manual/pwa-each-page-has-url',
238
196
  'accessibility/accesskeys',
239
197
  'accessibility/aria-allowed-attr',
240
198
  'accessibility/aria-allowed-role',
241
199
  'accessibility/aria-command-name',
200
+ 'accessibility/aria-conditional-attr',
201
+ 'accessibility/aria-deprecated-role',
242
202
  'accessibility/aria-dialog-name',
243
203
  'accessibility/aria-hidden-body',
244
204
  'accessibility/aria-hidden-focus',
245
205
  'accessibility/aria-input-field-name',
246
206
  'accessibility/aria-meter-name',
247
207
  'accessibility/aria-progressbar-name',
208
+ 'accessibility/aria-prohibited-attr',
248
209
  'accessibility/aria-required-attr',
249
210
  'accessibility/aria-required-children',
250
211
  'accessibility/aria-required-parent',
@@ -261,7 +222,6 @@ const defaultConfig = {
261
222
  'accessibility/definition-list',
262
223
  'accessibility/dlitem',
263
224
  'accessibility/document-title',
264
- 'accessibility/duplicate-id-active',
265
225
  'accessibility/duplicate-id-aria',
266
226
  'accessibility/empty-heading',
267
227
  'accessibility/form-field-multiple-labels',
@@ -340,9 +300,7 @@ const defaultConfig = {
340
300
  'seo/crawlable-anchors',
341
301
  'seo/is-crawlable',
342
302
  'seo/robots-txt',
343
- 'seo/tap-targets',
344
303
  'seo/hreflang',
345
- 'seo/plugins',
346
304
  'seo/canonical',
347
305
  'seo/manual/structured-data',
348
306
  'work-during-interaction',
@@ -352,24 +310,10 @@ const defaultConfig = {
352
310
  'metrics': {
353
311
  title: str_(UIStrings.metricGroupTitle),
354
312
  },
355
- 'load-opportunities': {
356
- title: str_(UIStrings.loadOpportunitiesGroupTitle),
357
- description: str_(UIStrings.loadOpportunitiesGroupDescription),
358
- },
359
- 'budgets': {
360
- title: str_(UIStrings.budgetsGroupTitle),
361
- description: str_(UIStrings.budgetsGroupDescription),
362
- },
363
313
  'diagnostics': {
364
314
  title: str_(UIStrings.diagnosticsGroupTitle),
365
315
  description: str_(UIStrings.diagnosticsGroupDescription),
366
316
  },
367
- 'pwa-installable': {
368
- title: str_(UIStrings.pwaInstallableGroupTitle),
369
- },
370
- 'pwa-optimized': {
371
- title: str_(UIStrings.pwaOptimizedGroupTitle),
372
- },
373
317
  'a11y-best-practices': {
374
318
  title: str_(UIStrings.a11yBestPracticesGroupTitle),
375
319
  description: str_(UIStrings.a11yBestPracticesGroupDescription),
@@ -434,64 +378,58 @@ const defaultConfig = {
434
378
  title: str_(UIStrings.performanceCategoryTitle),
435
379
  supportedModes: ['navigation', 'timespan', 'snapshot'],
436
380
  auditRefs: [
437
- {id: 'first-contentful-paint', weight: 10, group: 'metrics', acronym: 'FCP', relevantAudits: metricsToAudits.fcpRelevantAudits},
438
- {id: 'largest-contentful-paint', weight: 25, group: 'metrics', acronym: 'LCP', relevantAudits: metricsToAudits.lcpRelevantAudits},
439
- {id: 'total-blocking-time', weight: 30, group: 'metrics', acronym: 'TBT', relevantAudits: metricsToAudits.tbtRelevantAudits},
440
- {id: 'cumulative-layout-shift', weight: 25, group: 'metrics', acronym: 'CLS', relevantAudits: metricsToAudits.clsRelevantAudits},
381
+ {id: 'first-contentful-paint', weight: 10, group: 'metrics', acronym: 'FCP'},
382
+ {id: 'largest-contentful-paint', weight: 25, group: 'metrics', acronym: 'LCP'},
383
+ {id: 'total-blocking-time', weight: 30, group: 'metrics', acronym: 'TBT'},
384
+ {id: 'cumulative-layout-shift', weight: 25, group: 'metrics', acronym: 'CLS'},
441
385
  {id: 'speed-index', weight: 10, group: 'metrics', acronym: 'SI'},
442
- {id: 'interaction-to-next-paint', weight: 0, group: 'metrics', acronym: 'INP', relevantAudits: metricsToAudits.inpRelevantAudits},
386
+ {id: 'interaction-to-next-paint', weight: 0, group: 'metrics', acronym: 'INP'},
443
387
 
444
388
  // These are our "invisible" metrics. Not displayed, but still in the LHR.
445
389
  {id: 'interactive', weight: 0, group: 'hidden', acronym: 'TTI'},
446
390
  {id: 'max-potential-fid', weight: 0, group: 'hidden'},
447
391
  {id: 'first-meaningful-paint', weight: 0, acronym: 'FMP', group: 'hidden'},
448
392
 
449
- // These audits will be put in "load-opportunities" or "diagnostics" based on their details type.
450
- {id: 'render-blocking-resources', weight: 0},
451
- {id: 'uses-responsive-images', weight: 0},
452
- {id: 'offscreen-images', weight: 0},
453
- {id: 'unminified-css', weight: 0},
454
- {id: 'unminified-javascript', weight: 0},
455
- {id: 'unused-css-rules', weight: 0},
456
- {id: 'unused-javascript', weight: 0},
457
- {id: 'uses-optimized-images', weight: 0},
458
- {id: 'modern-image-formats', weight: 0},
459
- {id: 'uses-text-compression', weight: 0},
460
- {id: 'uses-rel-preconnect', weight: 0},
461
- {id: 'server-response-time', weight: 0},
462
- {id: 'redirects', weight: 0},
463
- {id: 'uses-rel-preload', weight: 0},
464
- {id: 'uses-http2', weight: 0},
465
- {id: 'efficient-animated-content', weight: 0},
466
- {id: 'duplicated-javascript', weight: 0},
467
- {id: 'legacy-javascript', weight: 0},
468
- {id: 'prioritize-lcp-image', weight: 0},
469
- {id: 'total-byte-weight', weight: 0},
470
- {id: 'uses-long-cache-ttl', weight: 0},
471
- {id: 'dom-size', weight: 0},
472
- {id: 'critical-request-chains', weight: 0},
473
- {id: 'user-timings', weight: 0},
474
- {id: 'bootup-time', weight: 0},
475
- {id: 'mainthread-work-breakdown', weight: 0},
476
- {id: 'font-display', weight: 0},
477
- {id: 'third-party-summary', weight: 0},
478
- {id: 'third-party-facades', weight: 0},
479
- {id: 'largest-contentful-paint-element', weight: 0},
480
- {id: 'lcp-lazy-loaded', weight: 0},
481
- {id: 'layout-shifts', weight: 0},
482
- {id: 'uses-passive-event-listeners', weight: 0},
483
- {id: 'no-document-write', weight: 0},
484
- {id: 'long-tasks', weight: 0},
485
- {id: 'non-composited-animations', weight: 0},
486
- {id: 'unsized-images', weight: 0},
487
- {id: 'viewport', weight: 0},
488
- {id: 'uses-responsive-images-snapshot', weight: 0},
489
- {id: 'work-during-interaction', weight: 0},
490
- {id: 'bf-cache', weight: 0},
491
-
492
- // Budget audits.
493
- {id: 'performance-budget', weight: 0, group: 'budgets'},
494
- {id: 'timing-budget', weight: 0, group: 'budgets'},
393
+ {id: 'render-blocking-resources', weight: 0, group: 'diagnostics'},
394
+ {id: 'uses-responsive-images', weight: 0, group: 'diagnostics'},
395
+ {id: 'offscreen-images', weight: 0, group: 'diagnostics'},
396
+ {id: 'unminified-css', weight: 0, group: 'diagnostics'},
397
+ {id: 'unminified-javascript', weight: 0, group: 'diagnostics'},
398
+ {id: 'unused-css-rules', weight: 0, group: 'diagnostics'},
399
+ {id: 'unused-javascript', weight: 0, group: 'diagnostics'},
400
+ {id: 'uses-optimized-images', weight: 0, group: 'diagnostics'},
401
+ {id: 'modern-image-formats', weight: 0, group: 'diagnostics'},
402
+ {id: 'uses-text-compression', weight: 0, group: 'diagnostics'},
403
+ {id: 'uses-rel-preconnect', weight: 0, group: 'diagnostics'},
404
+ {id: 'server-response-time', weight: 0, group: 'diagnostics'},
405
+ {id: 'redirects', weight: 0, group: 'diagnostics'},
406
+ {id: 'uses-http2', weight: 0, group: 'diagnostics'},
407
+ {id: 'efficient-animated-content', weight: 0, group: 'diagnostics'},
408
+ {id: 'duplicated-javascript', weight: 0, group: 'diagnostics'},
409
+ {id: 'legacy-javascript', weight: 0, group: 'diagnostics'},
410
+ {id: 'prioritize-lcp-image', weight: 0, group: 'diagnostics'},
411
+ {id: 'total-byte-weight', weight: 0, group: 'diagnostics'},
412
+ {id: 'uses-long-cache-ttl', weight: 0, group: 'diagnostics'},
413
+ {id: 'dom-size', weight: 0, group: 'diagnostics'},
414
+ {id: 'critical-request-chains', weight: 0, group: 'diagnostics'},
415
+ {id: 'user-timings', weight: 0, group: 'diagnostics'},
416
+ {id: 'bootup-time', weight: 0, group: 'diagnostics'},
417
+ {id: 'mainthread-work-breakdown', weight: 0, group: 'diagnostics'},
418
+ {id: 'font-display', weight: 0, group: 'diagnostics'},
419
+ {id: 'third-party-summary', weight: 0, group: 'diagnostics'},
420
+ {id: 'third-party-facades', weight: 0, group: 'diagnostics'},
421
+ {id: 'largest-contentful-paint-element', weight: 0, group: 'diagnostics'},
422
+ {id: 'lcp-lazy-loaded', weight: 0, group: 'diagnostics'},
423
+ {id: 'layout-shifts', weight: 0, group: 'diagnostics'},
424
+ {id: 'uses-passive-event-listeners', weight: 0, group: 'diagnostics'},
425
+ {id: 'no-document-write', weight: 0, group: 'diagnostics'},
426
+ {id: 'long-tasks', weight: 0, group: 'diagnostics'},
427
+ {id: 'non-composited-animations', weight: 0, group: 'diagnostics'},
428
+ {id: 'unsized-images', weight: 0, group: 'diagnostics'},
429
+ {id: 'viewport', weight: 0, group: 'diagnostics'},
430
+ {id: 'uses-responsive-images-snapshot', weight: 0, group: 'diagnostics'},
431
+ {id: 'work-during-interaction', weight: 0, group: 'diagnostics'},
432
+ {id: 'bf-cache', weight: 0, group: 'diagnostics'},
495
433
 
496
434
  // Audits past this point contain useful data but are not displayed with other audits.
497
435
  {id: 'network-requests', weight: 0, group: 'hidden'},
@@ -504,7 +442,6 @@ const defaultConfig = {
504
442
  {id: 'final-screenshot', weight: 0, group: 'hidden'},
505
443
  {id: 'script-treemap-data', weight: 0, group: 'hidden'},
506
444
  {id: 'resource-summary', weight: 0, group: 'hidden'},
507
- {id: 'layout-shift-elements', weight: 0, group: 'hidden'},
508
445
  ],
509
446
  },
510
447
  'accessibility': {
@@ -521,12 +458,15 @@ const defaultConfig = {
521
458
  {id: 'aria-allowed-attr', weight: 10, group: 'a11y-aria'},
522
459
  {id: 'aria-allowed-role', weight: 1, group: 'a11y-aria'},
523
460
  {id: 'aria-command-name', weight: 7, group: 'a11y-aria'},
461
+ {id: 'aria-conditional-attr', weight: 7, group: 'a11y-aria'},
462
+ {id: 'aria-deprecated-role', weight: 1, group: 'a11y-aria'},
524
463
  {id: 'aria-dialog-name', weight: 7, group: 'a11y-aria'},
525
464
  {id: 'aria-hidden-body', weight: 10, group: 'a11y-aria'},
526
465
  {id: 'aria-hidden-focus', weight: 7, group: 'a11y-aria'},
527
466
  {id: 'aria-input-field-name', weight: 7, group: 'a11y-aria'},
528
467
  {id: 'aria-meter-name', weight: 7, group: 'a11y-aria'},
529
468
  {id: 'aria-progressbar-name', weight: 7, group: 'a11y-aria'},
469
+ {id: 'aria-prohibited-attr', weight: 7, group: 'a11y-aria'},
530
470
  {id: 'aria-required-attr', weight: 10, group: 'a11y-aria'},
531
471
  {id: 'aria-required-children', weight: 10, group: 'a11y-aria'},
532
472
  {id: 'aria-required-parent', weight: 10, group: 'a11y-aria'},
@@ -543,7 +483,6 @@ const defaultConfig = {
543
483
  {id: 'definition-list', weight: 7, group: 'a11y-tables-lists'},
544
484
  {id: 'dlitem', weight: 7, group: 'a11y-tables-lists'},
545
485
  {id: 'document-title', weight: 7, group: 'a11y-names-labels'},
546
- {id: 'duplicate-id-active', weight: 7, group: 'a11y-navigation'},
547
486
  {id: 'duplicate-id-aria', weight: 10, group: 'a11y-aria'},
548
487
  {id: 'form-field-multiple-labels', weight: 3, group: 'a11y-names-labels'},
549
488
  {id: 'frame-title', weight: 7, group: 'a11y-names-labels'},
@@ -567,6 +506,7 @@ const defaultConfig = {
567
506
  {id: 'skip-link', weight: 3, group: 'a11y-names-labels'},
568
507
  {id: 'tabindex', weight: 7, group: 'a11y-navigation'},
569
508
  {id: 'table-duplicate-name', weight: 1, group: 'a11y-tables-lists'},
509
+ {id: 'target-size', weight: 7, group: 'a11y-best-practices'},
570
510
  {id: 'td-headers-attr', weight: 7, group: 'a11y-tables-lists'},
571
511
  {id: 'th-has-data-cells', weight: 7, group: 'a11y-tables-lists'},
572
512
  {id: 'valid-lang', weight: 7, group: 'a11y-language'},
@@ -586,7 +526,6 @@ const defaultConfig = {
586
526
  {id: 'empty-heading', weight: 0, group: 'hidden'},
587
527
  {id: 'identical-links-same-purpose', weight: 0, group: 'hidden'},
588
528
  {id: 'landmark-one-main', weight: 0, group: 'hidden'},
589
- {id: 'target-size', weight: 0, group: 'hidden'},
590
529
  {id: 'label-content-name-mismatch', weight: 0, group: 'hidden'},
591
530
  {id: 'table-fake-caption', weight: 0, group: 'hidden'},
592
531
  {id: 'td-has-header', weight: 0, group: 'hidden'},
@@ -598,6 +537,7 @@ const defaultConfig = {
598
537
  auditRefs: [
599
538
  // Trust & Safety
600
539
  {id: 'is-on-https', weight: 5, group: 'best-practices-trust-safety'},
540
+ {id: 'redirects-http', weight: 1, group: 'best-practices-trust-safety'},
601
541
  {id: 'geolocation-on-start', weight: 1, group: 'best-practices-trust-safety'},
602
542
  {id: 'notification-on-start', weight: 1, group: 'best-practices-trust-safety'},
603
543
  {id: 'csp-xss', weight: 0, group: 'best-practices-trust-safety'},
@@ -605,12 +545,12 @@ const defaultConfig = {
605
545
  {id: 'paste-preventing-inputs', weight: 3, group: 'best-practices-ux'},
606
546
  {id: 'image-aspect-ratio', weight: 1, group: 'best-practices-ux'},
607
547
  {id: 'image-size-responsive', weight: 1, group: 'best-practices-ux'},
608
- {id: 'preload-fonts', weight: 1, group: 'best-practices-ux'},
548
+ {id: 'viewport', weight: 1, group: 'best-practices-ux'},
549
+ {id: 'font-size', weight: 1, group: 'best-practices-ux'},
609
550
  // Browser Compatibility
610
551
  {id: 'doctype', weight: 1, group: 'best-practices-browser-compat'},
611
552
  {id: 'charset', weight: 1, group: 'best-practices-browser-compat'},
612
553
  // General Group
613
- {id: 'no-unload-listeners', weight: 1, group: 'best-practices-general'},
614
554
  {id: 'js-libraries', weight: 0, group: 'best-practices-general'},
615
555
  {id: 'deprecations', weight: 5, group: 'best-practices-general'},
616
556
  {id: 'third-party-cookies', weight: 5, group: 'best-practices-general'},
@@ -625,44 +565,25 @@ const defaultConfig = {
625
565
  manualDescription: str_(UIStrings.seoCategoryManualDescription),
626
566
  supportedModes: ['navigation', 'snapshot'],
627
567
  auditRefs: [
628
- {id: 'viewport', weight: 1, group: 'seo-mobile'},
568
+ // Should be at least 31% of the score, such that this audit failing
569
+ // results in the SEO category failing.
570
+ // Solve for w:
571
+ // w / (w + T) >= 0.31
572
+ // where T is the sum of all the other weights.
573
+ {id: 'is-crawlable', weight: 93 / 23, group: 'seo-crawl'},
629
574
  {id: 'document-title', weight: 1, group: 'seo-content'},
630
575
  {id: 'meta-description', weight: 1, group: 'seo-content'},
631
576
  {id: 'http-status-code', weight: 1, group: 'seo-crawl'},
632
577
  {id: 'link-text', weight: 1, group: 'seo-content'},
633
578
  {id: 'crawlable-anchors', weight: 1, group: 'seo-crawl'},
634
- {id: 'is-crawlable', weight: 1, group: 'seo-crawl'},
635
579
  {id: 'robots-txt', weight: 1, group: 'seo-crawl'},
636
580
  {id: 'image-alt', weight: 1, group: 'seo-content'},
637
581
  {id: 'hreflang', weight: 1, group: 'seo-content'},
638
582
  {id: 'canonical', weight: 1, group: 'seo-content'},
639
- {id: 'font-size', weight: 1, group: 'seo-mobile'},
640
- {id: 'plugins', weight: 1, group: 'seo-content'},
641
- {id: 'tap-targets', weight: 1, group: 'seo-mobile'},
642
583
  // Manual audits
643
584
  {id: 'structured-data', weight: 0},
644
585
  ],
645
586
  },
646
- 'pwa': {
647
- title: str_(UIStrings.pwaCategoryTitle),
648
- description: str_(UIStrings.pwaCategoryDescription),
649
- manualDescription: str_(UIStrings.pwaCategoryManualDescription),
650
- supportedModes: ['navigation'],
651
- auditRefs: [
652
- // Installable
653
- {id: 'installable-manifest', weight: 2, group: 'pwa-installable'},
654
- // PWA Optimized
655
- {id: 'splash-screen', weight: 1, group: 'pwa-optimized'},
656
- {id: 'themed-omnibox', weight: 1, group: 'pwa-optimized'},
657
- {id: 'content-width', weight: 1, group: 'pwa-optimized'},
658
- {id: 'viewport', weight: 2, group: 'pwa-optimized'},
659
- {id: 'maskable-icon', weight: 1, group: 'pwa-optimized'},
660
- // Manual audits
661
- {id: 'pwa-cross-browser', weight: 0},
662
- {id: 'pwa-page-transitions', weight: 0},
663
- {id: 'pwa-each-page-has-url', weight: 0},
664
- ],
665
- },
666
587
  },
667
588
  };
668
589
 
@@ -14,13 +14,24 @@ const config = {
14
14
  extends: 'lighthouse:default',
15
15
  audits: [
16
16
  'autocomplete',
17
+ // Preload advice is on hold until https://github.com/GoogleChrome/lighthouse/issues/11960
18
+ 'preload-fonts',
19
+ 'uses-rel-preload',
17
20
  ],
18
21
  categories: {
22
+ // @ts-ignore: `title` is required in CategoryJson. setting to the same value as the default
23
+ // config is awkward - easier to omit the property here. Will defer to default config.
24
+ 'performance': {
25
+ auditRefs: [
26
+ {id: 'uses-rel-preload', weight: 0, group: 'diagnostics'},
27
+ ],
28
+ },
19
29
  // @ts-ignore: `title` is required in CategoryJson. setting to the same value as the default
20
30
  // config is awkward - easier to omit the property here. Will defer to default config.
21
31
  'best-practices': {
22
32
  auditRefs: [
23
33
  {id: 'autocomplete', weight: 0, group: 'best-practices-ux'},
34
+ {id: 'preload-fonts', weight: 0, group: 'best-practices-ux'},
24
35
  ],
25
36
  },
26
37
  },
@@ -13,7 +13,6 @@ const baseArtifactKeySource = {
13
13
  fetchTime: '',
14
14
  LighthouseRunWarnings: '',
15
15
  BenchmarkIndex: '',
16
- BenchmarkIndexes: '',
17
16
  settings: '',
18
17
  Timing: '',
19
18
  URL: '',
@@ -122,7 +122,10 @@ async function gotoURL(driver, requestor, options) {
122
122
  throw new Error('Cannot wait for FCP without waiting for page load');
123
123
  }
124
124
 
125
- const waitConditions = await Promise.all(waitConditionPromises);
125
+ const waitConditions = await Promise.race([
126
+ driver.fatalRejection.promise,
127
+ Promise.all(waitConditionPromises),
128
+ ]);
126
129
  const timedOut = waitConditions.some(condition => condition.timedOut);
127
130
  const navigationUrls = await networkMonitor.getNavigationUrls();
128
131
 
@@ -45,7 +45,7 @@ async function enableAsyncStacks(session) {
45
45
  await enable();
46
46
 
47
47
  return async () => {
48
- await session.sendCommand('Debugger.disable');
48
+ await session.sendCommandAndIgnore('Debugger.disable');
49
49
  session.off('Debugger.paused', onDebuggerPaused);
50
50
  session.off('Page.frameNavigated', onFrameNavigated);
51
51
  };
@@ -180,7 +180,7 @@ class TargetManager extends ProtocolEventEmitter {
180
180
  throw err;
181
181
  } finally {
182
182
  // Resume the target if it was paused, but if it's unnecessary, we don't care about the error.
183
- await newSession.sendCommand('Runtime.runIfWaitingForDebugger').catch(() => {});
183
+ await newSession.sendCommandAndIgnore('Runtime.runIfWaitingForDebugger');
184
184
  }
185
185
  }
186
186
 
@@ -266,8 +266,9 @@ class TargetManager extends ProtocolEventEmitter {
266
266
  cdpSession.off('sessionattached', this._onSessionAttached);
267
267
  }
268
268
 
269
- await this._rootCdpSession.send('Page.disable');
270
- await this._rootCdpSession.send('Runtime.disable');
269
+ // Ignore failures on these in case the tab has crashed.
270
+ await this._rootCdpSession.send('Page.disable').catch(_ => {});
271
+ await this._rootCdpSession.send('Runtime.disable').catch(_ => {});
271
272
 
272
273
  this._enabled = false;
273
274
  this._targetIdToTargets = new Map();
@@ -498,9 +498,8 @@ async function waitForFullyLoaded(session, networkMonitor, options) {
498
498
  if (await isPageHung(session)) {
499
499
  log.warn('waitFor', 'Page appears to be hung, killing JavaScript...');
500
500
  // We don't await these, as we want to exit with PAGE_HUNG
501
- void session.sendCommand('Emulation.setScriptExecutionDisabled', {value: true})
502
- .catch(_ => {});
503
- void session.sendCommand('Runtime.terminateExecution').catch(_ => {});
501
+ void session.sendCommandAndIgnore('Emulation.setScriptExecutionDisabled', {value: true});
502
+ void session.sendCommandAndIgnore('Runtime.terminateExecution');
504
503
  throw new LighthouseError(LighthouseError.errors.PAGE_HUNG);
505
504
  }
506
505
 
@@ -14,6 +14,10 @@ export class Driver implements LH.Gatherer.Driver {
14
14
  /** @type {Fetcher|undefined} */
15
15
  _fetcher: Fetcher | undefined;
16
16
  defaultSession: import("../../types/gatherer.js").default.ProtocolSession;
17
+ fatalRejection: {
18
+ promise: Promise<never>;
19
+ rej: (_: Error) => void;
20
+ };
17
21
  /** @return {LH.Gatherer.Driver['executionContext']} */
18
22
  get executionContext(): ExecutionContext;
19
23
  get fetcher(): any;
@@ -23,6 +27,14 @@ export class Driver implements LH.Gatherer.Driver {
23
27
  url(): Promise<string>;
24
28
  /** @return {Promise<void>} */
25
29
  connect(): Promise<void>;
30
+ /**
31
+ * If the target crashes, we can't continue gathering.
32
+ *
33
+ * FWIW, if the target unexpectedly detaches (eg the user closed the tab), pptr will
34
+ * catch that and reject into our this._cdpSession.send, which we'll alrady handle appropriately
35
+ * @return {void}
36
+ */
37
+ listenForCrashes(): void;
26
38
  /** @return {Promise<void>} */
27
39
  disconnect(): Promise<void>;
28
40
  }
@@ -8,6 +8,7 @@ import log from 'lighthouse-logger';
8
8
 
9
9
  import {ExecutionContext} from './driver/execution-context.js';
10
10
  import {TargetManager} from './driver/target-manager.js';
11
+ import {LighthouseError} from '../lib/lh-error.js';
11
12
  import {Fetcher} from './fetcher.js';
12
13
  import {NetworkMonitor} from './driver/network-monitor.js';
13
14
 
@@ -26,6 +27,7 @@ const throwingSession = {
26
27
  once: throwNotConnectedFn,
27
28
  off: throwNotConnectedFn,
28
29
  sendCommand: throwNotConnectedFn,
30
+ sendCommandAndIgnore: throwNotConnectedFn,
29
31
  dispose: throwNotConnectedFn,
30
32
  };
31
33
 
@@ -46,6 +48,12 @@ class Driver {
46
48
  this._fetcher = undefined;
47
49
 
48
50
  this.defaultSession = throwingSession;
51
+
52
+ // Poor man's Promise.withResolvers()
53
+ /** @param {Error} _ */
54
+ let rej = _ => {};
55
+ const promise = /** @type {Promise<never>} */ (new Promise((_, theRej) => rej = theRej));
56
+ this.fatalRejection = {promise, rej};
49
57
  }
50
58
 
51
59
  /** @return {LH.Gatherer.Driver['executionContext']} */
@@ -85,11 +93,30 @@ class Driver {
85
93
  this._networkMonitor = new NetworkMonitor(this._targetManager);
86
94
  await this._networkMonitor.enable();
87
95
  this.defaultSession = this._targetManager.rootSession();
96
+ this.listenForCrashes();
88
97
  this._executionContext = new ExecutionContext(this.defaultSession);
89
98
  this._fetcher = new Fetcher(this.defaultSession);
90
99
  log.timeEnd(status);
91
100
  }
92
101
 
102
+ /**
103
+ * If the target crashes, we can't continue gathering.
104
+ *
105
+ * FWIW, if the target unexpectedly detaches (eg the user closed the tab), pptr will
106
+ * catch that and reject into our this._cdpSession.send, which we'll alrady handle appropriately
107
+ * @return {void}
108
+ */
109
+ listenForCrashes() {
110
+ this.defaultSession.on('Inspector.targetCrashed', async _ => {
111
+ log.error('Driver', 'Inspector.targetCrashed');
112
+ // Manually detach so no more CDP traffic is attempted.
113
+ // Don't await, else our rejection will be a 'Target closed' protocol error on cross-talk CDP calls.
114
+ void this.defaultSession.dispose();
115
+ this.fatalRejection.rej(new LighthouseError(LighthouseError.errors.TARGET_CRASHED));
116
+ });
117
+ }
118
+
119
+
93
120
  /** @return {Promise<void>} */
94
121
  async disconnect() {
95
122
  if (this.defaultSession === throwingSession) return;
@@ -43,16 +43,15 @@ async function runA11yChecks() {
43
43
  'area-alt': {enabled: false},
44
44
  'aria-allowed-role': {enabled: true},
45
45
  'aria-braille-equivalent': {enabled: false},
46
- 'aria-conditional-attr': {enabled: false},
47
- 'aria-deprecated-role': {enabled: false},
46
+ 'aria-conditional-attr': {enabled: true},
47
+ 'aria-deprecated-role': {enabled: true},
48
48
  'aria-dialog-name': {enabled: true},
49
- 'aria-prohibited-attr': {enabled: false},
49
+ 'aria-prohibited-attr': {enabled: true},
50
50
  'aria-roledescription': {enabled: false},
51
51
  'aria-treeitem-name': {enabled: true},
52
52
  'aria-text': {enabled: true},
53
53
  'audio-caption': {enabled: false},
54
54
  'blink': {enabled: false},
55
- 'duplicate-id-active': {enabled: true},
56
55
  'duplicate-id': {enabled: false},
57
56
  'empty-heading': {enabled: true},
58
57
  'frame-focusable-content': {enabled: false},
@@ -79,8 +78,7 @@ async function runA11yChecks() {
79
78
  'tabindex': {enabled: true},
80
79
  'table-duplicate-name': {enabled: true},
81
80
  'table-fake-caption': {enabled: true},
82
- // TODO: https://github.com/GoogleChrome/lighthouse/issues/15824
83
- // 'target-size': {enabled: true},
81
+ 'target-size': {enabled: true},
84
82
  'td-has-header': {enabled: true},
85
83
  },
86
84
  });