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
package/CONTRIBUTING.md CHANGED
@@ -79,8 +79,8 @@ A PR adding or changing a gatherer almost always needs to include the following:
79
79
  1. **Golden artifacts**: `sample_v2.json` is generated from a set of artifacts that come from running LH against `dbw_tester.html`. Those artifacts likely need to be updated after gatherer changes with `yarn update:sample-artifacts`, but limit to just the artifact being altered if possible. For example:
80
80
 
81
81
  ```sh
82
- # update just the ScriptElements artifact
83
- yarn update:sample-artifacts ScriptElements
82
+ # update just the Scripts artifact
83
+ yarn update:sample-artifacts Scripts
84
84
  ```
85
85
 
86
86
  This command works for updating `yarn update:sample-artifacts DevtoolsLog` or `Trace` as well, but the resulting `sample_v2.json` churn may be extensive and you might be better off editing manually.
package/cli/bin.js CHANGED
@@ -79,13 +79,6 @@ async function begin() {
79
79
  config = (await import(`../core/config/${cliFlags.preset}-config.js`)).default;
80
80
  }
81
81
 
82
- if (cliFlags.budgetPath) {
83
- cliFlags.budgetPath = path.resolve(process.cwd(), cliFlags.budgetPath);
84
- /** @type {Array<LH.Budget>} */
85
- const parsedBudget = JSON.parse(fs.readFileSync(cliFlags.budgetPath, 'utf8'));
86
- cliFlags.budgets = parsedBudget;
87
- }
88
-
89
82
  // set logging preferences
90
83
  cliFlags.logLevel = 'info';
91
84
  if (cliFlags.verbose) {
@@ -24,7 +24,7 @@ export function getYargsParser(manualArgv?: string | undefined): yargs.Argv<yarg
24
24
  default: boolean;
25
25
  describe: string;
26
26
  };
27
- }>, "port" | "screenEmulation" | "emulatedUserAgent" | "hostname" | "preset" | "save-assets" | "list-all-audits" | "list-locales" | "list-trace-categories" | "debug-navigation" | "additional-trace-categories" | "config-path" | "chrome-flags" | "form-factor" | "max-wait-for-load" | "enable-error-reporting" | "gather-mode" | "audit-mode" | "only-audits" | "only-categories" | "skip-audits" | "budget-path" | "disable-full-page-screenshot" | "ignore-status-code"> & yargs.InferredOptionTypes<{
27
+ }>, "port" | "screenEmulation" | "emulatedUserAgent" | "hostname" | "preset" | "save-assets" | "list-all-audits" | "list-locales" | "list-trace-categories" | "debug-navigation" | "additional-trace-categories" | "config-path" | "chrome-flags" | "form-factor" | "max-wait-for-load" | "enable-error-reporting" | "gather-mode" | "audit-mode" | "only-audits" | "only-categories" | "skip-audits" | "disable-full-page-screenshot" | "ignore-status-code"> & yargs.InferredOptionTypes<{
28
28
  'save-assets': {
29
29
  type: "boolean";
30
30
  default: boolean;
@@ -125,10 +125,6 @@ export function getYargsParser(manualArgv?: string | undefined): yargs.Argv<yarg
125
125
  coerce: typeof splitCommaSeparatedValues;
126
126
  describe: string;
127
127
  };
128
- 'budget-path': {
129
- type: "string";
130
- describe: string;
131
- };
132
128
  'disable-full-page-screenshot': {
133
129
  type: "boolean";
134
130
  describe: string;
package/cli/cli-flags.js CHANGED
@@ -53,8 +53,8 @@ function getYargsParser(manualArgv) {
53
53
  'lighthouse <url> --extra-headers=./path/to/file.json',
54
54
  'Path to JSON file of HTTP Header key/value pairs to send in requests')
55
55
  .example(
56
- 'lighthouse <url> --only-categories=performance,pwa',
57
- 'Only run the specified categories. Available categories: accessibility, best-practices, performance, pwa, seo')
56
+ 'lighthouse <url> --only-categories=performance,seo',
57
+ 'Only run the specified categories. Available categories: accessibility, best-practices, performance, seo')
58
58
 
59
59
  // We only have the single string positional argument, the url.
60
60
  .option('_', {
@@ -188,7 +188,7 @@ function getYargsParser(manualArgv) {
188
188
  array: true,
189
189
  type: 'string',
190
190
  coerce: splitCommaSeparatedValues,
191
- describe: 'Only run the specified categories. Available categories: accessibility, best-practices, performance, pwa, seo',
191
+ describe: 'Only run the specified categories. Available categories: accessibility, best-practices, performance, seo',
192
192
  },
193
193
  'skip-audits': {
194
194
  array: true,
@@ -196,10 +196,6 @@ function getYargsParser(manualArgv) {
196
196
  coerce: splitCommaSeparatedValues,
197
197
  describe: 'Run everything except these audits',
198
198
  },
199
- 'budget-path': {
200
- type: 'string',
201
- describe: 'The path to the budget.json file for LightWallet.',
202
- },
203
199
  'disable-full-page-screenshot': {
204
200
  type: 'boolean',
205
201
  describe: 'Disables collection of the full page screenshot, which can be quite large',
@@ -213,7 +209,7 @@ function getYargsParser(manualArgv) {
213
209
  'save-assets', 'list-all-audits', 'list-locales', 'list-trace-categories', 'additional-trace-categories',
214
210
  'config-path', 'preset', 'chrome-flags', 'port', 'hostname', 'form-factor', 'screenEmulation', 'emulatedUserAgent',
215
211
  'max-wait-for-load', 'enable-error-reporting', 'gather-mode', 'audit-mode',
216
- 'only-audits', 'only-categories', 'skip-audits', 'budget-path', 'disable-full-page-screenshot', 'ignore-status-code',
212
+ 'only-audits', 'only-categories', 'skip-audits', 'disable-full-page-screenshot', 'ignore-status-code',
217
213
  ], 'Configuration:')
218
214
 
219
215
  // Output
@@ -3,7 +3,7 @@
3
3
  exports[`getAssertionReport works (multiple failing) 1`] = `
4
4
  "X difference at cumulative-layout-shift audit.details.items.length
5
5
  expected: []
6
- found: [{\\"cumulativeLayoutShiftMainFrame\\":0.13570762803819444,\\"newEngineResult\\":{\\"cumulativeLayoutShift\\":0.13570762803819444,\\"cumulativeLayoutShiftMainFrame\\":0.13570762803819444},\\"newEngineResultDiffered\\":false}]
6
+ found: [{\\"cumulativeLayoutShiftMainFrame\\":0.09957584751767748,\\"newEngineResult\\":{\\"cumulativeLayoutShift\\":0.09957584751767748,\\"cumulativeLayoutShiftMainFrame\\":0.09957584751767748},\\"newEngineResultDiffered\\":false}]
7
7
 
8
8
 
9
9
  X difference at cumulative-layout-shift audit.details.blah
@@ -15,11 +15,11 @@ exports[`getAssertionReport works (multiple failing) 1`] = `
15
15
  \\"id\\": \\"cumulative-layout-shift\\",
16
16
  \\"title\\": \\"Cumulative Layout Shift\\",
17
17
  \\"description\\": \\"Cumulative Layout Shift measures the movement of visible elements within the viewport. [Learn more about the Cumulative Layout Shift metric](https://web.dev/articles/cls).\\",
18
- \\"score\\": 0.8,
18
+ \\"score\\": 0.9,
19
19
  \\"scoreDisplayMode\\": \\"numeric\\",
20
- \\"numericValue\\": 0.13570762803819444,
20
+ \\"numericValue\\": 0.09957584751767748,
21
21
  \\"numericUnit\\": \\"unitless\\",
22
- \\"displayValue\\": \\"0.136\\",
22
+ \\"displayValue\\": \\"0.1\\",
23
23
  \\"scoringOptions\\": {
24
24
  \\"p10\\": 0.1,
25
25
  \\"median\\": 0.25
@@ -28,10 +28,10 @@ exports[`getAssertionReport works (multiple failing) 1`] = `
28
28
  \\"type\\": \\"debugdata\\",
29
29
  \\"items\\": [
30
30
  {
31
- \\"cumulativeLayoutShiftMainFrame\\": 0.13570762803819444,
31
+ \\"cumulativeLayoutShiftMainFrame\\": 0.09957584751767748,
32
32
  \\"newEngineResult\\": {
33
- \\"cumulativeLayoutShift\\": 0.13570762803819444,
34
- \\"cumulativeLayoutShiftMainFrame\\": 0.13570762803819444
33
+ \\"cumulativeLayoutShift\\": 0.09957584751767748,
34
+ \\"cumulativeLayoutShiftMainFrame\\": 0.09957584751767748
35
35
  },
36
36
  \\"newEngineResultDiffered\\": false
37
37
  }
@@ -43,18 +43,18 @@ exports[`getAssertionReport works (multiple failing) 1`] = `
43
43
  exports[`getAssertionReport works (trivial failing) 1`] = `
44
44
  "X difference at cumulative-layout-shift audit.details.items.length
45
45
  expected: []
46
- found: [{\\"cumulativeLayoutShiftMainFrame\\":0.13570762803819444,\\"newEngineResult\\":{\\"cumulativeLayoutShift\\":0.13570762803819444,\\"cumulativeLayoutShiftMainFrame\\":0.13570762803819444},\\"newEngineResultDiffered\\":false}]
46
+ found: [{\\"cumulativeLayoutShiftMainFrame\\":0.09957584751767748,\\"newEngineResult\\":{\\"cumulativeLayoutShift\\":0.09957584751767748,\\"cumulativeLayoutShiftMainFrame\\":0.09957584751767748},\\"newEngineResultDiffered\\":false}]
47
47
 
48
48
  found result:
49
49
  {
50
50
  \\"id\\": \\"cumulative-layout-shift\\",
51
51
  \\"title\\": \\"Cumulative Layout Shift\\",
52
52
  \\"description\\": \\"Cumulative Layout Shift measures the movement of visible elements within the viewport. [Learn more about the Cumulative Layout Shift metric](https://web.dev/articles/cls).\\",
53
- \\"score\\": 0.8,
53
+ \\"score\\": 0.9,
54
54
  \\"scoreDisplayMode\\": \\"numeric\\",
55
- \\"numericValue\\": 0.13570762803819444,
55
+ \\"numericValue\\": 0.09957584751767748,
56
56
  \\"numericUnit\\": \\"unitless\\",
57
- \\"displayValue\\": \\"0.136\\",
57
+ \\"displayValue\\": \\"0.1\\",
58
58
  \\"scoringOptions\\": {
59
59
  \\"p10\\": 0.1,
60
60
  \\"median\\": 0.25
@@ -63,10 +63,10 @@ exports[`getAssertionReport works (trivial failing) 1`] = `
63
63
  \\"type\\": \\"debugdata\\",
64
64
  \\"items\\": [
65
65
  {
66
- \\"cumulativeLayoutShiftMainFrame\\": 0.13570762803819444,
66
+ \\"cumulativeLayoutShiftMainFrame\\": 0.09957584751767748,
67
67
  \\"newEngineResult\\": {
68
- \\"cumulativeLayoutShift\\": 0.13570762803819444,
69
- \\"cumulativeLayoutShiftMainFrame\\": 0.13570762803819444
68
+ \\"cumulativeLayoutShift\\": 0.09957584751767748,
69
+ \\"cumulativeLayoutShiftMainFrame\\": 0.09957584751767748
70
70
  },
71
71
  \\"newEngineResultDiffered\\": false
72
72
  }
@@ -20,11 +20,14 @@ const exclusions = {
20
20
  'redirects-client-paint-server', 'redirects-multiple-server',
21
21
  'redirects-single-server', 'redirects-single-client',
22
22
  'redirects-history-push-state', 'redirects-scripts',
23
+ 'redirects-http',
23
24
  // Disabled because these tests use settings that cannot be fully configured in
24
25
  // DevTools (e.g. throttling method "provided").
25
26
  'metrics-tricky-tti', 'metrics-tricky-tti-late-fcp', 'screenshot',
26
27
  // Disabled because of differences that need further investigation
27
28
  'byte-efficiency', 'byte-gzip', 'perf-preload',
29
+ // Disabled because a renderer crash also breaks devtools frontend
30
+ 'crash',
28
31
  ],
29
32
  };
30
33
 
@@ -7,12 +7,14 @@
7
7
  import a11y from './test-definitions/a11y.js';
8
8
  import byteEfficiency from './test-definitions/byte-efficiency.js';
9
9
  import byteGzip from './test-definitions/byte-gzip.js';
10
+ import crash from './test-definitions/crash.js';
10
11
  import cspAllowAll from './test-definitions/csp-allow-all.js';
11
12
  import cspBlockAll from './test-definitions/csp-block-all.js';
12
13
  import dbw from './test-definitions/dobetterweb.js';
13
14
  import errorsExpiredSsl from './test-definitions/errors-expired-ssl.js';
14
15
  import errorsIframeExpiredSsl from './test-definitions/errors-iframe-expired-ssl.js';
15
16
  import errorsInfiniteLoop from './test-definitions/errors-infinite-loop.js';
17
+ import fontSize from './test-definitions/font-size.js';
16
18
  import formsAutoComplete from './test-definitions/forms-autocomplete.js';
17
19
  import fpsMax from './test-definitions/fps-max.js';
18
20
  import fpsMaxPassive from './test-definitions/fps-max-passive.js';
@@ -31,12 +33,8 @@ import metricsDelayedFcp from './test-definitions/metrics-delayed-fcp.js';
31
33
  import metricsDelayedLcp from './test-definitions/metrics-delayed-lcp.js';
32
34
  import metricsTrickyTti from './test-definitions/metrics-tricky-tti.js';
33
35
  import metricsTrickyTtiLateFcp from './test-definitions/metrics-tricky-tti-late-fcp.js';
34
- import offlineOnlineOnly from './test-definitions/offline-online-only.js';
35
- import offlineReady from './test-definitions/offline-ready.js';
36
- import offlineSwBroken from './test-definitions/offline-sw-broken.js';
37
36
  import oopifRequests from './test-definitions/oopif-requests.js';
38
37
  import oopifScripts from './test-definitions/oopif-scripts.js';
39
- import perfBudgets from './test-definitions/perf-budgets.js';
40
38
  import perfDebug from './test-definitions/perf-debug.js';
41
39
  import perfDiagnosticsAnimations from './test-definitions/perf-diagnostics-animations.js';
42
40
  import perfDiagnosticsThirdParty from './test-definitions/perf-diagnostics-third-party.js';
@@ -45,13 +43,9 @@ import perfFonts from './test-definitions/perf-fonts.js';
45
43
  import perfFrameMetrics from './test-definitions/perf-frame-metrics.js';
46
44
  import perfPreload from './test-definitions/perf-preload.js';
47
45
  import perfTraceElements from './test-definitions/perf-trace-elements.js';
48
- import pwaAirhorner from './test-definitions/pwa-airhorner.js';
49
- import pwaCaltrain from './test-definitions/pwa-caltrain.js';
50
- import pwaChromestatus from './test-definitions/pwa-chromestatus.js';
51
- import pwaRocks from './test-definitions/pwa-rocks.js';
52
- import pwaSvgomg from './test-definitions/pwa-svgomg.js';
53
46
  import redirectsClientPaintServer from './test-definitions/redirects-client-paint-server.js';
54
47
  import redirectsHistoryPushState from './test-definitions/redirects-history-push-state.js';
48
+ import redirectsHttp from './test-definitions/redirects-http.js';
55
49
  import redirectsMultipleServer from './test-definitions/redirects-multiple-server.js';
56
50
  import redirectsScripts from './test-definitions/redirects-scripts.js';
57
51
  import redirectsSelf from './test-definitions/redirects-self.js';
@@ -61,7 +55,6 @@ import screenshot from './test-definitions/screenshot.js';
61
55
  import seoFailing from './test-definitions/seo-failing.js';
62
56
  import seoPassing from './test-definitions/seo-passing.js';
63
57
  import seoStatus403 from './test-definitions/seo-status-403.js';
64
- import seoTapTargets from './test-definitions/seo-tap-targets.js';
65
58
  import serviceWorkerReloaded from './test-definitions/service-worker-reloaded.js';
66
59
  import shiftAttribution from './test-definitions/shift-attribution.js';
67
60
  import sourceMaps from './test-definitions/source-maps.js';
@@ -72,12 +65,14 @@ const smokeTests = [
72
65
  a11y,
73
66
  byteEfficiency,
74
67
  byteGzip,
68
+ crash,
75
69
  cspAllowAll,
76
70
  cspBlockAll,
77
71
  dbw,
78
72
  errorsExpiredSsl,
79
73
  errorsIframeExpiredSsl,
80
74
  errorsInfiniteLoop,
75
+ fontSize,
81
76
  formsAutoComplete,
82
77
  fpsMax,
83
78
  fpsMaxPassive,
@@ -96,12 +91,8 @@ const smokeTests = [
96
91
  metricsDelayedLcp,
97
92
  metricsTrickyTti,
98
93
  metricsTrickyTtiLateFcp,
99
- offlineOnlineOnly,
100
- offlineReady,
101
- offlineSwBroken,
102
94
  oopifRequests,
103
95
  oopifScripts,
104
- perfBudgets,
105
96
  perfDebug,
106
97
  perfDiagnosticsAnimations,
107
98
  perfDiagnosticsThirdParty,
@@ -110,13 +101,9 @@ const smokeTests = [
110
101
  perfFrameMetrics,
111
102
  perfPreload,
112
103
  perfTraceElements,
113
- pwaAirhorner,
114
- pwaCaltrain,
115
- pwaChromestatus,
116
- pwaRocks,
117
- pwaSvgomg,
118
104
  redirectsClientPaintServer,
119
105
  redirectsHistoryPushState,
106
+ redirectsHttp,
120
107
  redirectsMultipleServer,
121
108
  redirectsScripts,
122
109
  redirectsSelf,
@@ -126,7 +113,6 @@ const smokeTests = [
126
113
  seoFailing,
127
114
  seoPassing,
128
115
  seoStatus403,
129
- seoTapTargets,
130
116
  serviceWorkerReloaded,
131
117
  shiftAttribution,
132
118
  sourceMaps,
@@ -59,7 +59,7 @@ function getDefinitionsToRun(allTestDefns, requestedIds, excludedTests) {
59
59
  } else {
60
60
  smokes = allTestDefns.filter(test => {
61
61
  // Include all tests that *include* requested id.
62
- // e.g. a requested 'pwa' will match 'pwa-airhorner', 'pwa-caltrain', etc
62
+ // e.g. a requested 'perf' will match 'perf-preload', 'perf-trace-elements', etc
63
63
  return requestedIds.some(requestedId => test.id.includes(requestedId));
64
64
  });
65
65
  console.log(`Running ONLY smoketests for: ${smokes.map(t => t.id).join(' ')}\n`);
@@ -125,7 +125,7 @@ async function begin() {
125
125
  const rawArgv = y
126
126
  .help('help')
127
127
  .usage('node $0 [<options>] <test-ids>')
128
- .example('node $0 -j=1 pwa seo', 'run pwa and seo tests serially')
128
+ .example('node $0 -j=1 perf seo', 'run perf and seo tests serially')
129
129
  .option('_', {
130
130
  array: true,
131
131
  type: 'string',
@@ -0,0 +1,10 @@
1
+ export default AriaConditionalAttr;
2
+ declare class AriaConditionalAttr 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-conditional-attr.d.ts.map
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2024 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ /**
8
+ * @fileoverview Ensures that ARIA attributes are used as specified for element roles.
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 accessibility audit that checks if ARIA attributes are used as specified for element roles. This title is descriptive of the successful state and is shown to users when no user action is required. */
17
+ title: 'ARIA attributes are used as specified for the element\'s role',
18
+ /** Title of an accessibility audit that checks if ARIA attributes are used as specified for element roles. 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: 'ARIA attributes are not used as specified for the element\'s role',
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: 'Some ARIA attributes are only allowed on an element under certain conditions. ' +
22
+ '[Learn more about conditional ARIA attributes](https://dequeuniversity.com/rules/axe/4.9/aria-conditional-attr).',
23
+ };
24
+
25
+ const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
26
+
27
+ class AriaConditionalAttr extends AxeAudit {
28
+ /**
29
+ * @return {LH.Audit.Meta}
30
+ */
31
+ static get meta() {
32
+ return {
33
+ id: 'aria-conditional-attr',
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 AriaConditionalAttr;
43
+ export {UIStrings};
@@ -1,5 +1,5 @@
1
- export default DuplicateIdActive;
2
- declare class DuplicateIdActive extends AxeAudit {
1
+ export default AriaDeprecatedRole;
2
+ declare class AriaDeprecatedRole extends AxeAudit {
3
3
  }
4
4
  export namespace UIStrings {
5
5
  const title: string;
@@ -7,4 +7,4 @@ export namespace UIStrings {
7
7
  const description: string;
8
8
  }
9
9
  import AxeAudit from './axe-audit.js';
10
- //# sourceMappingURL=duplicate-id-active.d.ts.map
10
+ //# sourceMappingURL=aria-deprecated-role.d.ts.map
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2024 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ /**
8
+ * @fileoverview Ensures that deprecated ARIA roles are not used.
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 accessibility audit that checks if deprecated ARIA roles are used. This title is descriptive of the successful state and is shown to users when no user action is required. */
17
+ title: 'Deprecated ARIA roles were not used',
18
+ /** Title of an accessibility audit that checks if deprecated ARIA roles are used. 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: 'Deprecated ARIA roles were used',
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: 'Deprecated ARIA roles may not be processed correctly by assistive technology. ' +
22
+ '[Learn more about deprecated ARIA roles](https://dequeuniversity.com/rules/axe/4.9/aria-deprecated-role).',
23
+ };
24
+
25
+ const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
26
+
27
+ class AriaDeprecatedRole extends AxeAudit {
28
+ /**
29
+ * @return {LH.Audit.Meta}
30
+ */
31
+ static get meta() {
32
+ return {
33
+ id: 'aria-deprecated-role',
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 AriaDeprecatedRole;
43
+ export {UIStrings};
@@ -0,0 +1,10 @@
1
+ export default AriaProhibitedAttr;
2
+ declare class AriaProhibitedAttr 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-prohibited-attr.d.ts.map
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2024 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ /**
8
+ * @fileoverview Ensures that deprecated ARIA roles are not used.
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 accessibility audit that checks if elements use prohibited ARIA attributes. This title is descriptive of the successful state and is shown to users when no user action is required. */
17
+ title: 'Elements use only permitted ARIA attributes',
18
+ /** Title of an accessibility audit that checks if elements use prohibited ARIA attributes. 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 use prohibited ARIA attributes',
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: 'Using ARIA attributes in roles where they are prohibited can mean that important ' +
22
+ 'information is not communicated to users of assistive technologies. ' +
23
+ '[Learn more about prohibited ARIA roles](https://dequeuniversity.com/rules/axe/4.9/aria-prohibited-attr).',
24
+ };
25
+
26
+ const str_ = i18n.createIcuMessageFn(import.meta.url, UIStrings);
27
+
28
+ class AriaProhibitedAttr extends AxeAudit {
29
+ /**
30
+ * @return {LH.Audit.Meta}
31
+ */
32
+ static get meta() {
33
+ return {
34
+ id: 'aria-prohibited-attr',
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 AriaProhibitedAttr;
44
+ export {UIStrings};
@@ -35,7 +35,6 @@ class TargetSize extends AxeAudit {
35
35
  title: str_(UIStrings.title),
36
36
  failureTitle: str_(UIStrings.failureTitle),
37
37
  description: str_(UIStrings.description),
38
- scoreDisplayMode: AxeAudit.SCORING_MODES.INFORMATIVE,
39
38
  requiredArtifacts: ['Accessibility'],
40
39
  };
41
40
  }
@@ -56,22 +56,6 @@ export class ByteEfficiencyAudit extends Audit {
56
56
  simulationBeforeChanges: LH.Gatherer.Simulation.Result;
57
57
  simulationAfterChanges: LH.Gatherer.Simulation.Result;
58
58
  };
59
- /**
60
- * Computes the estimated effect of all the byte savings on the maximum of the following:
61
- *
62
- * - end time of the last long task in the provided graph
63
- * - (if includeLoad is true or not provided) end time of the last node in the graph
64
- *
65
- * @param {Array<LH.Audit.ByteEfficiencyItem>} results The array of byte savings results per resource
66
- * @param {Node} graph
67
- * @param {Simulator} simulator
68
- * @param {{includeLoad?: boolean, providedWastedBytesByUrl?: Map<string, number>}=} options
69
- * @return {number}
70
- */
71
- static computeWasteWithTTIGraph(results: Array<LH.Audit.ByteEfficiencyItem>, graph: Node, simulator: Simulator, options?: {
72
- includeLoad?: boolean;
73
- providedWastedBytesByUrl?: Map<string, number>;
74
- } | undefined): number;
75
59
  /**
76
60
  * @param {ByteEfficiencyProduct} result
77
61
  * @param {Simulator} simulator
@@ -5,11 +5,9 @@
5
5
  */
6
6
 
7
7
  import {Audit} from '../audit.js';
8
- import {LanternInteractive} from '../../computed/metrics/lantern-interactive.js';
9
8
  import * as i18n from '../../lib/i18n/i18n.js';
10
9
  import {NetworkRecords} from '../../computed/network-records.js';
11
10
  import {LoadSimulator} from '../../computed/load-simulator.js';
12
- import {PageDependencyGraph} from '../../computed/page-dependency-graph.js';
13
11
  import {LanternLargestContentfulPaint} from '../../computed/metrics/lantern-largest-contentful-paint.js';
14
12
  import {LanternFirstContentfulPaint} from '../../computed/metrics/lantern-first-contentful-paint.js';
15
13
  import {LCPImageRecord} from '../../computed/lcp-image-record.js';
@@ -151,37 +149,6 @@ class ByteEfficiencyAudit extends Audit {
151
149
  };
152
150
  }
153
151
 
154
- /**
155
- * Computes the estimated effect of all the byte savings on the maximum of the following:
156
- *
157
- * - end time of the last long task in the provided graph
158
- * - (if includeLoad is true or not provided) end time of the last node in the graph
159
- *
160
- * @param {Array<LH.Audit.ByteEfficiencyItem>} results The array of byte savings results per resource
161
- * @param {Node} graph
162
- * @param {Simulator} simulator
163
- * @param {{includeLoad?: boolean, providedWastedBytesByUrl?: Map<string, number>}=} options
164
- * @return {number}
165
- */
166
- static computeWasteWithTTIGraph(results, graph, simulator, options) {
167
- options = Object.assign({includeLoad: true}, options);
168
- const {savings: savingsOnOverallLoad, simulationBeforeChanges, simulationAfterChanges} =
169
- this.computeWasteWithGraph(results, graph, simulator, {
170
- ...options,
171
- label: 'overallLoad',
172
- });
173
-
174
- const savingsOnTTI =
175
- LanternInteractive.getLastLongTaskEndTime(simulationBeforeChanges.nodeTimings) -
176
- LanternInteractive.getLastLongTaskEndTime(simulationAfterChanges.nodeTimings);
177
-
178
- let savings = savingsOnTTI;
179
- if (options.includeLoad) savings = Math.max(savings, savingsOnOverallLoad);
180
-
181
- // Round waste to nearest 10ms
182
- return Math.round(Math.max(savings, 0) / 10) * 10;
183
- }
184
-
185
152
  /**
186
153
  * @param {ByteEfficiencyProduct} result
187
154
  * @param {Simulator} simulator
@@ -204,7 +171,6 @@ class ByteEfficiencyAudit extends Audit {
204
171
  // This is useful information in the LHR and should be preserved.
205
172
  let wastedMs;
206
173
  if (metricComputationInput.gatherContext.gatherMode === 'navigation') {
207
- const graph = await PageDependencyGraph.request(metricComputationInput, context);
208
174
  const {
209
175
  optimisticGraph: optimisticFCPGraph,
210
176
  } = await LanternFirstContentfulPaint.request(metricComputationInput, context);
@@ -212,10 +178,6 @@ class ByteEfficiencyAudit extends Audit {
212
178
  optimisticGraph: optimisticLCPGraph,
213
179
  } = await LanternLargestContentfulPaint.request(metricComputationInput, context);
214
180
 
215
- wastedMs = this.computeWasteWithTTIGraph(results, graph, simulator, {
216
- providedWastedBytesByUrl: result.wastedBytesByUrl,
217
- });
218
-
219
181
  const {savings: fcpSavings} = this.computeWasteWithGraph(
220
182
  results,
221
183
  optimisticFCPGraph,
@@ -243,6 +205,7 @@ class ByteEfficiencyAudit extends Audit {
243
205
 
244
206
  metricSavings.FCP = fcpSavings;
245
207
  metricSavings.LCP = Math.max(lcpGraphSavings, lcpRecordSavings);
208
+ wastedMs = metricSavings.LCP;
246
209
  } else {
247
210
  wastedMs = simulator.computeWastedMsFromWastedBytes(wastedBytes);
248
211
  }
@@ -47,17 +47,6 @@ declare class OffscreenImages extends ByteEfficiencyAudit {
47
47
  * @param {number} interactiveTimestamp
48
48
  */
49
49
  static filterObservedResults(images: WasteResult[], interactiveTimestamp: number): WasteResult[];
50
- /**
51
- * The default byte efficiency audit will report max(TTI, load), since lazy-loading offscreen
52
- * images won't reduce the overall time and the wasted bytes are really only "wasted" for TTI,
53
- * override the function to just look at TTI savings.
54
- *
55
- * @param {Array<LH.Audit.ByteEfficiencyItem>} results
56
- * @param {LH.Gatherer.Simulation.GraphNode} graph
57
- * @param {LH.Gatherer.Simulation.Simulator} simulator
58
- * @return {number}
59
- */
60
- static computeWasteWithTTIGraph(results: Array<LH.Audit.ByteEfficiencyItem>, graph: LH.Gatherer.Simulation.GraphNode, simulator: LH.Gatherer.Simulation.Simulator): number;
61
50
  /**
62
51
  * @param {LH.Artifacts} artifacts
63
52
  * @param {Array<LH.Artifacts.NetworkRequest>} networkRecords
@@ -156,21 +156,6 @@ class OffscreenImages extends ByteEfficiencyAudit {
156
156
  });
157
157
  }
158
158
 
159
- /**
160
- * The default byte efficiency audit will report max(TTI, load), since lazy-loading offscreen
161
- * images won't reduce the overall time and the wasted bytes are really only "wasted" for TTI,
162
- * override the function to just look at TTI savings.
163
- *
164
- * @param {Array<LH.Audit.ByteEfficiencyItem>} results
165
- * @param {LH.Gatherer.Simulation.GraphNode} graph
166
- * @param {LH.Gatherer.Simulation.Simulator} simulator
167
- * @return {number}
168
- */
169
- static computeWasteWithTTIGraph(results, graph, simulator) {
170
- return super.computeWasteWithTTIGraph(results, graph, simulator,
171
- {includeLoad: false});
172
- }
173
-
174
159
  /**
175
160
  * @param {LH.Artifacts} artifacts
176
161
  * @param {Array<LH.Artifacts.NetworkRequest>} networkRecords