lighthouse 11.7.0 → 12.0.0-dev.20240422

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 (334) 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/accesskeys.js +1 -1
  10. package/core/audits/accessibility/aria-allowed-attr.js +1 -1
  11. package/core/audits/accessibility/aria-allowed-role.js +1 -1
  12. package/core/audits/accessibility/aria-command-name.js +1 -1
  13. package/core/audits/accessibility/aria-conditional-attr.d.ts +10 -0
  14. package/core/audits/accessibility/aria-conditional-attr.js +43 -0
  15. package/core/audits/accessibility/{duplicate-id-active.d.ts → aria-deprecated-role.d.ts} +3 -3
  16. package/core/audits/accessibility/aria-deprecated-role.js +43 -0
  17. package/core/audits/accessibility/aria-dialog-name.js +1 -1
  18. package/core/audits/accessibility/aria-hidden-body.js +1 -1
  19. package/core/audits/accessibility/aria-hidden-focus.js +1 -1
  20. package/core/audits/accessibility/aria-input-field-name.js +1 -1
  21. package/core/audits/accessibility/aria-meter-name.js +1 -1
  22. package/core/audits/accessibility/aria-progressbar-name.js +1 -1
  23. package/core/audits/accessibility/aria-prohibited-attr.d.ts +10 -0
  24. package/core/audits/accessibility/aria-prohibited-attr.js +44 -0
  25. package/core/audits/accessibility/aria-required-attr.js +1 -1
  26. package/core/audits/accessibility/aria-required-children.js +1 -1
  27. package/core/audits/accessibility/aria-required-parent.js +1 -1
  28. package/core/audits/accessibility/aria-roles.js +1 -1
  29. package/core/audits/accessibility/aria-text.js +1 -1
  30. package/core/audits/accessibility/aria-toggle-field-name.js +1 -1
  31. package/core/audits/accessibility/aria-tooltip-name.js +1 -1
  32. package/core/audits/accessibility/aria-treeitem-name.js +1 -1
  33. package/core/audits/accessibility/aria-valid-attr-value.js +1 -1
  34. package/core/audits/accessibility/aria-valid-attr.js +1 -1
  35. package/core/audits/accessibility/button-name.js +1 -1
  36. package/core/audits/accessibility/bypass.js +1 -1
  37. package/core/audits/accessibility/color-contrast.js +1 -1
  38. package/core/audits/accessibility/definition-list.js +1 -1
  39. package/core/audits/accessibility/dlitem.js +1 -1
  40. package/core/audits/accessibility/document-title.js +1 -1
  41. package/core/audits/accessibility/duplicate-id-aria.js +1 -1
  42. package/core/audits/accessibility/empty-heading.js +1 -1
  43. package/core/audits/accessibility/form-field-multiple-labels.js +1 -1
  44. package/core/audits/accessibility/frame-title.js +1 -1
  45. package/core/audits/accessibility/heading-order.js +1 -1
  46. package/core/audits/accessibility/html-has-lang.js +1 -1
  47. package/core/audits/accessibility/html-lang-valid.js +1 -1
  48. package/core/audits/accessibility/html-xml-lang-mismatch.js +1 -1
  49. package/core/audits/accessibility/identical-links-same-purpose.js +1 -1
  50. package/core/audits/accessibility/image-alt.js +1 -1
  51. package/core/audits/accessibility/image-redundant-alt.js +1 -1
  52. package/core/audits/accessibility/input-button-name.js +1 -1
  53. package/core/audits/accessibility/input-image-alt.js +1 -1
  54. package/core/audits/accessibility/label-content-name-mismatch.js +1 -1
  55. package/core/audits/accessibility/label.js +1 -1
  56. package/core/audits/accessibility/landmark-one-main.js +1 -1
  57. package/core/audits/accessibility/link-in-text-block.js +1 -1
  58. package/core/audits/accessibility/link-name.js +1 -1
  59. package/core/audits/accessibility/list.js +1 -1
  60. package/core/audits/accessibility/listitem.js +1 -1
  61. package/core/audits/accessibility/meta-refresh.js +1 -1
  62. package/core/audits/accessibility/meta-viewport.js +1 -1
  63. package/core/audits/accessibility/object-alt.js +1 -1
  64. package/core/audits/accessibility/select-name.js +1 -1
  65. package/core/audits/accessibility/skip-link.js +1 -1
  66. package/core/audits/accessibility/tabindex.js +1 -1
  67. package/core/audits/accessibility/table-duplicate-name.js +1 -1
  68. package/core/audits/accessibility/table-fake-caption.js +1 -1
  69. package/core/audits/accessibility/target-size.js +1 -2
  70. package/core/audits/accessibility/td-has-header.js +1 -1
  71. package/core/audits/accessibility/td-headers-attr.js +1 -1
  72. package/core/audits/accessibility/th-has-data-cells.js +1 -1
  73. package/core/audits/accessibility/valid-lang.js +1 -1
  74. package/core/audits/accessibility/video-caption.js +1 -1
  75. package/core/audits/byte-efficiency/byte-efficiency-audit.d.ts +0 -16
  76. package/core/audits/byte-efficiency/byte-efficiency-audit.js +1 -38
  77. package/core/audits/byte-efficiency/offscreen-images.d.ts +0 -11
  78. package/core/audits/byte-efficiency/offscreen-images.js +0 -15
  79. package/core/audits/byte-efficiency/render-blocking-resources.js +27 -26
  80. package/core/audits/byte-efficiency/unminified-css.js +2 -2
  81. package/core/audits/byte-efficiency/unused-css-rules.js +3 -1
  82. package/core/audits/dobetterweb/uses-http2.d.ts +0 -13
  83. package/core/audits/dobetterweb/uses-http2.js +4 -38
  84. package/core/audits/font-display.js +2 -2
  85. package/core/audits/layout-shifts.js +2 -2
  86. package/core/audits/preload-fonts.d.ts +1 -5
  87. package/core/audits/preload-fonts.js +1 -10
  88. package/core/audits/prioritize-lcp-image.js +2 -2
  89. package/core/audits/redirects-http.d.ts +19 -0
  90. package/core/audits/redirects-http.js +75 -0
  91. package/core/audits/resource-summary.d.ts +2 -0
  92. package/core/audits/resource-summary.js +5 -4
  93. package/core/audits/seo/is-crawlable.d.ts +2 -1
  94. package/core/audits/seo/link-text.js +12 -0
  95. package/core/audits/uses-rel-preload.d.ts +1 -5
  96. package/core/audits/uses-rel-preload.js +5 -15
  97. package/core/audits/work-during-interaction.d.ts +2 -2
  98. package/core/audits/work-during-interaction.js +2 -2
  99. package/core/computed/js-bundles.d.ts +1 -1
  100. package/core/computed/metrics/cumulative-layout-shift.js +2 -2
  101. package/core/computed/metrics/lantern-first-contentful-paint.d.ts +13 -82
  102. package/core/computed/metrics/lantern-first-contentful-paint.js +16 -178
  103. package/core/computed/metrics/lantern-first-meaningful-paint.d.ts +13 -12
  104. package/core/computed/metrics/lantern-first-meaningful-paint.js +11 -49
  105. package/core/computed/metrics/lantern-interactive.d.ts +13 -21
  106. package/core/computed/metrics/lantern-interactive.js +12 -84
  107. package/core/computed/metrics/lantern-largest-contentful-paint.d.ts +13 -25
  108. package/core/computed/metrics/lantern-largest-contentful-paint.js +13 -80
  109. package/core/computed/metrics/lantern-max-potential-fid.d.ts +13 -24
  110. package/core/computed/metrics/lantern-max-potential-fid.js +12 -64
  111. package/core/computed/metrics/lantern-metric.d.ts +14 -18
  112. package/core/computed/metrics/lantern-metric.js +34 -30
  113. package/core/computed/metrics/lantern-speed-index.d.ts +13 -32
  114. package/core/computed/metrics/lantern-speed-index.js +13 -116
  115. package/core/computed/metrics/lantern-total-blocking-time.d.ts +13 -25
  116. package/core/computed/metrics/lantern-total-blocking-time.js +10 -94
  117. package/core/computed/metrics/metric.js +1 -3
  118. package/core/computed/module-duplication.d.ts +1 -1
  119. package/core/computed/navigation-insights.d.ts +36 -0
  120. package/core/computed/navigation-insights.js +35 -0
  121. package/core/computed/page-dependency-graph.js +3 -7
  122. package/core/computed/resource-summary.d.ts +10 -12
  123. package/core/computed/resource-summary.js +12 -19
  124. package/core/computed/trace-engine-result.d.ts +16 -3
  125. package/core/computed/trace-engine-result.js +19 -14
  126. package/core/computed/unused-css.d.ts +3 -1
  127. package/core/computed/unused-css.js +6 -5
  128. package/core/config/config-helpers.js +0 -4
  129. package/core/config/constants.js +0 -1
  130. package/core/config/default-config.js +63 -142
  131. package/core/config/experimental-config.js +11 -0
  132. package/core/config/filters.js +0 -1
  133. package/core/gather/driver/navigation.js +4 -1
  134. package/core/gather/driver/prepare.js +1 -1
  135. package/core/gather/driver/target-manager.js +4 -3
  136. package/core/gather/driver/wait-for-condition.js +2 -3
  137. package/core/gather/driver.d.ts +12 -0
  138. package/core/gather/driver.js +27 -0
  139. package/core/gather/gatherers/accessibility.js +4 -6
  140. package/core/gather/gatherers/css-usage.d.ts +0 -21
  141. package/core/gather/gatherers/css-usage.js +9 -119
  142. package/core/gather/gatherers/root-causes.d.ts +2 -2
  143. package/core/gather/gatherers/root-causes.js +6 -5
  144. package/core/gather/gatherers/stylesheets.d.ts +26 -0
  145. package/core/gather/gatherers/stylesheets.js +138 -0
  146. package/core/gather/gatherers/trace-elements.d.ts +4 -13
  147. package/core/gather/gatherers/trace-elements.js +42 -31
  148. package/core/gather/navigation-runner.js +3 -1
  149. package/core/gather/session.d.ts +8 -0
  150. package/core/gather/session.js +14 -1
  151. package/core/lib/emulation.js +2 -2
  152. package/core/lib/i18n/i18n.d.ts +0 -1
  153. package/core/lib/i18n/i18n.js +0 -2
  154. package/core/lib/lantern/cpu-node.d.ts +7 -1
  155. package/core/lib/lantern/cpu-node.js +12 -2
  156. package/core/lib/lantern/lantern-error.d.ts +8 -0
  157. package/core/lib/lantern/lantern-error.js +9 -0
  158. package/core/lib/lantern/metric.js +2 -6
  159. package/core/lib/lantern/metrics/first-contentful-paint.d.ts +79 -0
  160. package/core/lib/lantern/metrics/first-contentful-paint.js +200 -0
  161. package/core/lib/lantern/metrics/first-meaningful-paint.d.ts +6 -0
  162. package/core/lib/lantern/metrics/first-meaningful-paint.js +64 -0
  163. package/core/lib/lantern/metrics/interactive.d.ts +26 -0
  164. package/core/lib/lantern/metrics/interactive.js +112 -0
  165. package/core/lib/lantern/metrics/largest-contentful-paint.d.ts +19 -0
  166. package/core/lib/lantern/metrics/largest-contentful-paint.js +108 -0
  167. package/core/lib/lantern/metrics/max-potential-fid.d.ts +30 -0
  168. package/core/lib/lantern/metrics/max-potential-fid.js +92 -0
  169. package/core/lib/lantern/metrics/speed-index.d.ts +38 -0
  170. package/core/lib/lantern/metrics/speed-index.js +144 -0
  171. package/core/lib/lantern/metrics/total-blocking-time.d.ts +31 -0
  172. package/core/lib/lantern/metrics/total-blocking-time.js +128 -0
  173. package/core/lib/lantern/network-node.js +28 -4
  174. package/core/lib/lantern/page-dependency-graph.d.ts +4 -4
  175. package/core/lib/lantern/page-dependency-graph.js +19 -7
  176. package/core/lib/lantern/simulator/connection-pool.d.ts +2 -12
  177. package/core/lib/lantern/simulator/connection-pool.js +3 -22
  178. package/core/lib/lantern/simulator/network-analyzer.js +1 -12
  179. package/core/lib/lantern/simulator/simulator.d.ts +2 -4
  180. package/core/lib/lantern/simulator/simulator.js +7 -14
  181. package/core/lib/lantern/types/lantern.d.ts +5 -3
  182. package/core/lib/lantern-trace-saver.js +0 -1
  183. package/core/lib/lh-error.d.ts +9 -0
  184. package/core/lib/lh-error.js +13 -3
  185. package/core/lib/lighthouse-compatibility.js +53 -10
  186. package/core/lib/navigation-error.js +3 -0
  187. package/core/lib/network-request.d.ts +1 -0
  188. package/core/lib/network-request.js +29 -1
  189. package/core/lib/proto-preprocessor.js +24 -8
  190. package/core/lib/tracehouse/trace-processor.js +15 -2
  191. package/core/runner.js +18 -25
  192. package/dist/report/bundle.esm.js +11 -112
  193. package/dist/report/flow.js +16 -117
  194. package/dist/report/standalone.js +12 -113
  195. package/flow-report/src/help-dialog.tsx +0 -1
  196. package/flow-report/src/i18n/i18n.d.ts +0 -4
  197. package/flow-report/src/i18n/ui-strings.d.ts +0 -1
  198. package/flow-report/src/i18n/ui-strings.js +0 -2
  199. package/flow-report/src/summary/category.tsx +10 -12
  200. package/package.json +7 -7
  201. package/readme.md +4 -4
  202. package/report/assets/styles.css +1 -60
  203. package/report/assets/templates.html +0 -95
  204. package/report/renderer/category-renderer.js +1 -1
  205. package/report/renderer/components.d.ts +2 -2
  206. package/report/renderer/components.js +2 -103
  207. package/report/renderer/dom.d.ts +1 -1
  208. package/report/renderer/dom.js +1 -1
  209. package/report/renderer/performance-category-renderer.d.ts +0 -7
  210. package/report/renderer/performance-category-renderer.js +1 -32
  211. package/report/renderer/report-renderer.js +3 -13
  212. package/report/renderer/report-ui-features.js +1 -1
  213. package/report/renderer/report-utils.d.ts +0 -1
  214. package/report/renderer/report-utils.js +13 -13
  215. package/shared/localization/locales/ar-XB.json +62 -329
  216. package/shared/localization/locales/ar.json +62 -329
  217. package/shared/localization/locales/bg.json +62 -329
  218. package/shared/localization/locales/ca.json +62 -329
  219. package/shared/localization/locales/cs.json +62 -329
  220. package/shared/localization/locales/da.json +62 -329
  221. package/shared/localization/locales/de.json +62 -329
  222. package/shared/localization/locales/el.json +62 -329
  223. package/shared/localization/locales/en-GB.json +62 -329
  224. package/shared/localization/locales/en-US.json +101 -332
  225. package/shared/localization/locales/en-XA.json +62 -329
  226. package/shared/localization/locales/en-XL.json +101 -332
  227. package/shared/localization/locales/es-419.json +62 -329
  228. package/shared/localization/locales/es.json +62 -329
  229. package/shared/localization/locales/fi.json +62 -329
  230. package/shared/localization/locales/fil.json +61 -328
  231. package/shared/localization/locales/fr.json +62 -329
  232. package/shared/localization/locales/he.json +62 -329
  233. package/shared/localization/locales/hi.json +62 -329
  234. package/shared/localization/locales/hr.json +63 -330
  235. package/shared/localization/locales/hu.json +62 -329
  236. package/shared/localization/locales/id.json +62 -329
  237. package/shared/localization/locales/it.json +62 -329
  238. package/shared/localization/locales/ja.json +62 -329
  239. package/shared/localization/locales/ko.json +62 -329
  240. package/shared/localization/locales/lt.json +62 -329
  241. package/shared/localization/locales/lv.json +62 -329
  242. package/shared/localization/locales/nl.json +62 -329
  243. package/shared/localization/locales/no.json +62 -329
  244. package/shared/localization/locales/pl.json +61 -328
  245. package/shared/localization/locales/pt-PT.json +62 -329
  246. package/shared/localization/locales/pt.json +64 -331
  247. package/shared/localization/locales/ro.json +62 -329
  248. package/shared/localization/locales/ru.json +62 -329
  249. package/shared/localization/locales/sk.json +62 -329
  250. package/shared/localization/locales/sl.json +62 -329
  251. package/shared/localization/locales/sr-Latn.json +62 -329
  252. package/shared/localization/locales/sr.json +62 -329
  253. package/shared/localization/locales/sv.json +62 -329
  254. package/shared/localization/locales/ta.json +61 -328
  255. package/shared/localization/locales/te.json +62 -329
  256. package/shared/localization/locales/th.json +62 -329
  257. package/shared/localization/locales/tr.json +62 -329
  258. package/shared/localization/locales/uk.json +62 -329
  259. package/shared/localization/locales/vi.json +61 -328
  260. package/shared/localization/locales/zh-HK.json +62 -329
  261. package/shared/localization/locales/zh-TW.json +61 -328
  262. package/shared/localization/locales/zh.json +62 -329
  263. package/tsconfig.json +1 -3
  264. package/types/artifacts.d.ts +21 -110
  265. package/types/audit.d.ts +0 -10
  266. package/types/config.d.ts +0 -1
  267. package/types/externs.d.ts +0 -2
  268. package/types/gatherer.d.ts +3 -0
  269. package/types/internal/smokehouse.d.ts +1 -1
  270. package/types/lh.d.ts +0 -2
  271. package/types/lhr/audit-details.d.ts +9 -4
  272. package/types/lhr/lhr.d.ts +0 -4
  273. package/types/lhr/settings.d.ts +0 -4
  274. package/core/audits/accessibility/duplicate-id-active.js +0 -42
  275. package/core/audits/content-width.d.ts +0 -17
  276. package/core/audits/content-width.js +0 -76
  277. package/core/audits/installable-manifest.d.ts +0 -111
  278. package/core/audits/installable-manifest.js +0 -248
  279. package/core/audits/layout-shift-elements.d.ts +0 -16
  280. package/core/audits/layout-shift-elements.js +0 -101
  281. package/core/audits/manual/pwa-cross-browser.d.ts +0 -12
  282. package/core/audits/manual/pwa-cross-browser.js +0 -40
  283. package/core/audits/manual/pwa-each-page-has-url.d.ts +0 -12
  284. package/core/audits/manual/pwa-each-page-has-url.js +0 -38
  285. package/core/audits/manual/pwa-page-transitions.d.ts +0 -12
  286. package/core/audits/manual/pwa-page-transitions.js +0 -38
  287. package/core/audits/maskable-icon.d.ts +0 -25
  288. package/core/audits/maskable-icon.js +0 -70
  289. package/core/audits/multi-check-audit.d.ts +0 -28
  290. package/core/audits/multi-check-audit.js +0 -82
  291. package/core/audits/no-unload-listeners.d.ts +0 -16
  292. package/core/audits/no-unload-listeners.js +0 -86
  293. package/core/audits/performance-budget.d.ts +0 -39
  294. package/core/audits/performance-budget.js +0 -154
  295. package/core/audits/script-elements-test-audit.d.ts +0 -14
  296. package/core/audits/script-elements-test-audit.js +0 -29
  297. package/core/audits/seo/plugins.d.ts +0 -15
  298. package/core/audits/seo/plugins.js +0 -150
  299. package/core/audits/seo/tap-targets.d.ts +0 -50
  300. package/core/audits/seo/tap-targets.js +0 -352
  301. package/core/audits/splash-screen.d.ts +0 -37
  302. package/core/audits/splash-screen.js +0 -98
  303. package/core/audits/themed-omnibox.d.ts +0 -42
  304. package/core/audits/themed-omnibox.js +0 -102
  305. package/core/audits/timing-budget.d.ts +0 -43
  306. package/core/audits/timing-budget.js +0 -175
  307. package/core/computed/manifest-values.d.ts +0 -24
  308. package/core/computed/manifest-values.js +0 -136
  309. package/core/config/budget.d.ts +0 -74
  310. package/core/config/budget.js +0 -340
  311. package/core/config/metrics-to-audits.d.ts +0 -19
  312. package/core/config/metrics-to-audits.js +0 -62
  313. package/core/gather/driver/service-workers.d.ts +0 -16
  314. package/core/gather/driver/service-workers.js +0 -52
  315. package/core/gather/gatherers/dobetterweb/tags-blocking-first-paint.d.ts +0 -47
  316. package/core/gather/gatherers/dobetterweb/tags-blocking-first-paint.js +0 -233
  317. package/core/gather/gatherers/global-listeners.d.ts +0 -27
  318. package/core/gather/gatherers/global-listeners.js +0 -108
  319. package/core/gather/gatherers/installability-errors.d.ts +0 -17
  320. package/core/gather/gatherers/installability-errors.js +0 -56
  321. package/core/gather/gatherers/script-elements.d.ts +0 -21
  322. package/core/gather/gatherers/script-elements.js +0 -100
  323. package/core/gather/gatherers/seo/embedded-content.d.ts +0 -10
  324. package/core/gather/gatherers/seo/embedded-content.js +0 -63
  325. package/core/gather/gatherers/seo/tap-targets.d.ts +0 -21
  326. package/core/gather/gatherers/seo/tap-targets.js +0 -389
  327. package/core/gather/gatherers/service-worker.d.ts +0 -10
  328. package/core/gather/gatherers/service-worker.js +0 -32
  329. package/core/gather/gatherers/web-app-manifest.d.ts +0 -32
  330. package/core/gather/gatherers/web-app-manifest.js +0 -106
  331. package/report/renderer/pwa-category-renderer.d.ts +0 -55
  332. package/report/renderer/pwa-category-renderer.js +0 -184
  333. package/third-party/chromium-synchronization/installability-errors-test.js +0 -79
  334. package/types/lhr/budget.d.ts +0 -60
@@ -5,89 +5,23 @@
5
5
  */
6
6
 
7
7
  import {makeComputedArtifact} from '../computed-artifact.js';
8
- import {LanternMetric} from './lantern-metric.js';
9
- import {BaseNode} from '../../lib/lantern/base-node.js';
8
+ import {getComputationDataParams, lanternErrorAdapter} from './lantern-metric.js';
10
9
  import {Speedline} from '../speedline.js';
11
10
  import {LanternFirstContentfulPaint} from './lantern-first-contentful-paint.js';
12
- import {throttling as defaultThrottling} from '../../config/constants.js';
11
+ import {SpeedIndex} from '../../lib/lantern/metrics/speed-index.js';
13
12
 
14
- /** @typedef {import('../../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>} Node */
13
+ /** @typedef {import('../../lib/lantern/metric.js').Extras} Extras */
15
14
 
16
- class LanternSpeedIndex extends LanternMetric {
15
+ class LanternSpeedIndex extends SpeedIndex {
17
16
  /**
18
- * @return {LH.Gatherer.Simulation.MetricCoefficients}
19
- */
20
- static get COEFFICIENTS() {
21
- return {
22
- // Negative intercept is OK because estimate is Math.max(FCP, Speed Index) and
23
- // the optimistic estimate is based on the real observed speed index rather than a real
24
- // lantern graph.
25
- intercept: -250,
26
- optimistic: 1.4,
27
- pessimistic: 0.65,
28
- };
29
- }
30
-
31
- /**
32
- * @param {number} rttMs
33
- * @return {LH.Gatherer.Simulation.MetricCoefficients}
34
- */
35
- static getScaledCoefficients(rttMs) { // eslint-disable-line no-unused-vars
36
- // We want to scale our default coefficients based on the speed of the connection.
37
- // We will linearly interpolate coefficients for the passed-in rttMs based on two pre-determined points:
38
- // 1. Baseline point of 30 ms RTT where Speed Index should be a ~50/50 blend of optimistic/pessimistic.
39
- // 30 ms was based on a typical home WiFi connection's actual RTT.
40
- // Coefficients here follow from the fact that the optimistic estimate should be very close
41
- // to reality at this connection speed and the pessimistic estimate compensates for minor
42
- // connection speed differences.
43
- // 2. Default throttled point of 150 ms RTT where the default coefficients have been determined to be most accurate.
44
- // Coefficients here were determined through thorough analysis and linear regression on the
45
- // lantern test data set. See core/scripts/test-lantern.sh for more detail.
46
- // While the coefficients haven't been analyzed at the interpolated points, it's our current best effort.
47
- const defaultCoefficients = this.COEFFICIENTS;
48
- const defaultRttExcess = defaultThrottling.mobileSlow4G.rttMs - 30;
49
- const multiplier = Math.max((rttMs - 30) / defaultRttExcess, 0);
50
-
51
- return {
52
- intercept: defaultCoefficients.intercept * multiplier,
53
- optimistic: 0.5 + (defaultCoefficients.optimistic - 0.5) * multiplier,
54
- pessimistic: 0.5 + (defaultCoefficients.pessimistic - 0.5) * multiplier,
55
- };
56
- }
57
-
58
- /**
59
- * @param {Node} dependencyGraph
60
- * @return {Node}
61
- */
62
- static getOptimisticGraph(dependencyGraph) {
63
- return dependencyGraph;
64
- }
65
-
66
- /**
67
- * @param {Node} dependencyGraph
68
- * @return {Node}
69
- */
70
- static getPessimisticGraph(dependencyGraph) {
71
- return dependencyGraph;
72
- }
73
-
74
- /**
75
- * @param {LH.Gatherer.Simulation.Result} simulationResult
76
- * @param {import('../../lib/lantern/metric.js').Extras} extras
77
- * @return {LH.Gatherer.Simulation.Result}
17
+ * @param {LH.Artifacts.MetricComputationDataInput} data
18
+ * @param {LH.Artifacts.ComputedContext} context
19
+ * @param {Omit<Extras, 'optimistic'>=} extras
20
+ * @return {Promise<LH.Artifacts.LanternMetric>}
78
21
  */
79
- static getEstimateFromSimulation(simulationResult, extras) {
80
- if (!extras.fcpResult) throw new Error('missing fcpResult');
81
- if (!extras.speedline) throw new Error('missing speedline');
82
-
83
- const fcpTimeInMs = extras.fcpResult.pessimisticEstimate.timeInMs;
84
- const estimate = extras.optimistic
85
- ? extras.speedline.speedIndex
86
- : LanternSpeedIndex.computeLayoutBasedSpeedIndex(simulationResult.nodeTimings, fcpTimeInMs);
87
- return {
88
- timeInMs: estimate,
89
- nodeTimings: simulationResult.nodeTimings,
90
- };
22
+ static async computeMetricWithGraphs(data, context, extras) {
23
+ return this.compute(await getComputationDataParams(data, context), extras)
24
+ .catch(lanternErrorAdapter);
91
25
  }
92
26
 
93
27
  /**
@@ -96,50 +30,13 @@ class LanternSpeedIndex extends LanternMetric {
96
30
  * @return {Promise<LH.Artifacts.LanternMetric>}
97
31
  */
98
32
  static async compute_(data, context) {
33
+ // TODO(15841): lib/lantern should probably run Speedline
99
34
  const speedline = await Speedline.request(data.trace, context);
100
35
  const fcpResult = await LanternFirstContentfulPaint.request(data, context);
101
- const metricResult = await this.computeMetricWithGraphs(data, context, {
36
+ return this.computeMetricWithGraphs(data, context, {
102
37
  speedline,
103
38
  fcpResult,
104
39
  });
105
- metricResult.timing = Math.max(metricResult.timing, fcpResult.timing);
106
- return metricResult;
107
- }
108
-
109
- /**
110
- * Approximate speed index using layout events from the simulated node timings.
111
- * The layout-based speed index is the weighted average of the endTime of CPU nodes that contained
112
- * a 'Layout' task. log(duration) is used as the weight to stand for "significance" to the page.
113
- *
114
- * If no layout events can be found or the endTime of a CPU task is too early, FCP is used instead.
115
- *
116
- * This approach was determined after evaluating the accuracy/complexity tradeoff of many
117
- * different methods. Read more in the evaluation doc.
118
- *
119
- * @see https://docs.google.com/document/d/1qJWXwxoyVLVadezIp_Tgdk867G3tDNkkVRvUJSH3K1E/edit#
120
- * @param {LH.Gatherer.Simulation.Result['nodeTimings']} nodeTimings
121
- * @param {number} fcpTimeInMs
122
- * @return {number}
123
- */
124
- static computeLayoutBasedSpeedIndex(nodeTimings, fcpTimeInMs) {
125
- /** @type {Array<{time: number, weight: number}>} */
126
- const layoutWeights = [];
127
- for (const [node, timing] of nodeTimings.entries()) {
128
- if (node.type !== BaseNode.TYPES.CPU) continue;
129
-
130
- if (node.childEvents.some(x => x.name === 'Layout')) {
131
- const timingWeight = Math.max(Math.log2(timing.endTime - timing.startTime), 0);
132
- layoutWeights.push({time: timing.endTime, weight: timingWeight});
133
- }
134
- }
135
-
136
- const totalWeightedTime = layoutWeights
137
- .map(evt => evt.weight * Math.max(evt.time, fcpTimeInMs))
138
- .reduce((a, b) => a + b, 0);
139
- const totalWeight = layoutWeights.map(evt => evt.weight).reduce((a, b) => a + b, 0);
140
-
141
- if (!totalWeight) return fcpTimeInMs;
142
- return totalWeightedTime / totalWeight;
143
40
  }
144
41
  }
145
42
 
@@ -1,37 +1,25 @@
1
1
  export { LanternTotalBlockingTimeComputed as LanternTotalBlockingTime };
2
- export type Node = import('../../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>;
2
+ export type Extras = import('../../lib/lantern/metric.js').Extras;
3
3
  declare const LanternTotalBlockingTimeComputed: typeof LanternTotalBlockingTime & {
4
4
  request: (dependencies: import("../../index.js").Artifacts.MetricComputationDataInput, context: import("../../../types/utility-types.js").default.ImmutableObject<{
5
5
  computedCache: Map<string, import("../../lib/arbitrary-equality-map.js").ArbitraryEqualityMap>;
6
6
  }>) => Promise<import("../../index.js").Artifacts.LanternMetric>;
7
7
  };
8
- /** @typedef {import('../../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>} Node */
9
- declare class LanternTotalBlockingTime extends LanternMetric {
8
+ /** @typedef {import('../../lib/lantern/metric.js').Extras} Extras */
9
+ declare class LanternTotalBlockingTime extends TotalBlockingTime {
10
10
  /**
11
- * @param {Node} dependencyGraph
12
- * @return {Node}
11
+ * @param {LH.Artifacts.MetricComputationDataInput} data
12
+ * @param {LH.Artifacts.ComputedContext} context
13
+ * @param {Omit<Extras, 'optimistic'>=} extras
14
+ * @return {Promise<LH.Artifacts.LanternMetric>}
13
15
  */
14
- static getOptimisticGraph(dependencyGraph: Node): Node;
16
+ static computeMetricWithGraphs(data: LH.Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext, extras?: Omit<Extras, 'optimistic'> | undefined): Promise<LH.Artifacts.LanternMetric>;
15
17
  /**
16
- * @param {Node} dependencyGraph
17
- * @return {Node}
18
+ * @param {LH.Artifacts.MetricComputationDataInput} data
19
+ * @param {LH.Artifacts.ComputedContext} context
20
+ * @return {Promise<LH.Artifacts.LanternMetric>}
18
21
  */
19
- static getPessimisticGraph(dependencyGraph: Node): Node;
20
- /**
21
- * @param {LH.Gatherer.Simulation.Result} simulation
22
- * @param {import('../../lib/lantern/metric.js').Extras} extras
23
- * @return {LH.Gatherer.Simulation.Result}
24
- */
25
- static getEstimateFromSimulation(simulation: LH.Gatherer.Simulation.Result, extras: import('../../lib/lantern/metric.js').Extras): LH.Gatherer.Simulation.Result;
26
- /**
27
- * @param {LH.Gatherer.Simulation.Result['nodeTimings']} nodeTimings
28
- * @param {number} minDurationMs
29
- */
30
- static getTopLevelEvents(nodeTimings: LH.Gatherer.Simulation.Result['nodeTimings'], minDurationMs: number): {
31
- start: number;
32
- end: number;
33
- duration: number;
34
- }[];
22
+ static compute_(data: LH.Artifacts.MetricComputationDataInput, context: LH.Artifacts.ComputedContext): Promise<LH.Artifacts.LanternMetric>;
35
23
  }
36
- import { LanternMetric } from './lantern-metric.js';
24
+ import { TotalBlockingTime } from '../../lib/lantern/metrics/total-blocking-time.js';
37
25
  //# sourceMappingURL=lantern-total-blocking-time.d.ts.map
@@ -4,83 +4,23 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import {TotalBlockingTime} from '../../lib/lantern/metrics/total-blocking-time.js';
7
8
  import {makeComputedArtifact} from '../computed-artifact.js';
8
- import {LanternMetric} from './lantern-metric.js';
9
- import {BaseNode} from '../../lib/lantern/base-node.js';
10
9
  import {LanternFirstContentfulPaint} from './lantern-first-contentful-paint.js';
11
10
  import {LanternInteractive} from './lantern-interactive.js';
12
- import {BLOCKING_TIME_THRESHOLD, calculateSumOfBlockingTime} from './tbt-utils.js';
11
+ import {getComputationDataParams} from './lantern-metric.js';
13
12
 
14
- /** @typedef {import('../../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>} Node */
13
+ /** @typedef {import('../../lib/lantern/metric.js').Extras} Extras */
15
14
 
16
- class LanternTotalBlockingTime extends LanternMetric {
15
+ class LanternTotalBlockingTime extends TotalBlockingTime {
17
16
  /**
18
- * @return {LH.Gatherer.Simulation.MetricCoefficients}
19
- */
20
- static get COEFFICIENTS() {
21
- return {
22
- intercept: 0,
23
- optimistic: 0.5,
24
- pessimistic: 0.5,
25
- };
26
- }
27
-
28
- /**
29
- * @param {Node} dependencyGraph
30
- * @return {Node}
31
- */
32
- static getOptimisticGraph(dependencyGraph) {
33
- return dependencyGraph;
34
- }
35
-
36
- /**
37
- * @param {Node} dependencyGraph
38
- * @return {Node}
39
- */
40
- static getPessimisticGraph(dependencyGraph) {
41
- return dependencyGraph;
42
- }
43
-
44
- /**
45
- * @param {LH.Gatherer.Simulation.Result} simulation
46
- * @param {import('../../lib/lantern/metric.js').Extras} extras
47
- * @return {LH.Gatherer.Simulation.Result}
17
+ * @param {LH.Artifacts.MetricComputationDataInput} data
18
+ * @param {LH.Artifacts.ComputedContext} context
19
+ * @param {Omit<Extras, 'optimistic'>=} extras
20
+ * @return {Promise<LH.Artifacts.LanternMetric>}
48
21
  */
49
- static getEstimateFromSimulation(simulation, extras) {
50
- if (!extras.fcpResult) throw new Error('missing fcpResult');
51
- if (!extras.interactiveResult) throw new Error('missing interactiveResult');
52
-
53
- // Intentionally use the opposite FCP estimate. A pessimistic FCP is higher than equal to an
54
- // optimistic FCP, which means potentially more tasks are excluded from the Total Blocking Time
55
- // computation. So a more pessimistic FCP gives a more optimistic Total Blocking Time for the
56
- // same work.
57
- const fcpTimeInMs = extras.optimistic
58
- ? extras.fcpResult.pessimisticEstimate.timeInMs
59
- : extras.fcpResult.optimisticEstimate.timeInMs;
60
-
61
- // Similarly, we always have pessimistic TTI >= optimistic TTI. Therefore, picking optimistic
62
- // TTI means our window of interest is smaller and thus potentially more tasks are excluded from
63
- // Total Blocking Time computation, yielding a lower (more optimistic) Total Blocking Time value
64
- // for the same work.
65
- const interactiveTimeMs = extras.optimistic
66
- ? extras.interactiveResult.optimisticEstimate.timeInMs
67
- : extras.interactiveResult.pessimisticEstimate.timeInMs;
68
-
69
- const minDurationMs = BLOCKING_TIME_THRESHOLD;
70
-
71
- const events = LanternTotalBlockingTime.getTopLevelEvents(
72
- simulation.nodeTimings,
73
- minDurationMs
74
- );
75
-
76
- return {
77
- timeInMs: calculateSumOfBlockingTime(
78
- events,
79
- fcpTimeInMs,
80
- interactiveTimeMs
81
- ),
82
- nodeTimings: simulation.nodeTimings,
83
- };
22
+ static async computeMetricWithGraphs(data, context, extras) {
23
+ return this.compute(await getComputationDataParams(data, context), extras);
84
24
  }
85
25
 
86
26
  /**
@@ -93,30 +33,6 @@ class LanternTotalBlockingTime extends LanternMetric {
93
33
  const interactiveResult = await LanternInteractive.request(data, context);
94
34
  return this.computeMetricWithGraphs(data, context, {fcpResult, interactiveResult});
95
35
  }
96
-
97
- /**
98
- * @param {LH.Gatherer.Simulation.Result['nodeTimings']} nodeTimings
99
- * @param {number} minDurationMs
100
- */
101
- static getTopLevelEvents(nodeTimings, minDurationMs) {
102
- /** @type {Array<{start: number, end: number, duration: number}>}
103
- */
104
- const events = [];
105
-
106
- for (const [node, timing] of nodeTimings.entries()) {
107
- if (node.type !== BaseNode.TYPES.CPU) continue;
108
- // Filtering out events below minimum duration.
109
- if (timing.duration < minDurationMs) continue;
110
-
111
- events.push({
112
- start: timing.startTime,
113
- end: timing.endTime,
114
- duration: timing.duration,
115
- });
116
- }
117
-
118
- return events;
119
- }
120
36
  }
121
37
 
122
38
  const LanternTotalBlockingTimeComputed = makeComputedArtifact(
@@ -61,9 +61,7 @@ class Metric {
61
61
  * @return {Promise<LH.Artifacts.LanternMetric|LH.Artifacts.Metric>}
62
62
  */
63
63
  static async compute_(data, context) {
64
- // TODO: remove this fallback when lighthouse-pub-ads plugin can update.
65
- const gatherContext = data.gatherContext || {gatherMode: 'navigation'};
66
- const {trace, devtoolsLog, settings} = data;
64
+ const {trace, devtoolsLog, settings, gatherContext} = data;
67
65
  if (!trace || !devtoolsLog || !settings) {
68
66
  throw new Error('Did not provide necessary metric computation data');
69
67
  }
@@ -1,6 +1,6 @@
1
1
  export { ModuleDuplicationComputed as ModuleDuplication };
2
2
  declare const ModuleDuplicationComputed: typeof ModuleDuplication & {
3
- request: (dependencies: Pick<import("../index.js").Artifacts, "Scripts" | "SourceMaps">, context: import("../../types/utility-types.js").default.ImmutableObject<{
3
+ request: (dependencies: Pick<import("../index.js").Artifacts, "SourceMaps" | "Scripts">, context: import("../../types/utility-types.js").default.ImmutableObject<{
4
4
  computedCache: Map<string, import("../lib/arbitrary-equality-map.js").ArbitraryEqualityMap>;
5
5
  }>) => Promise<Map<string, {
6
6
  scriptId: string;
@@ -0,0 +1,36 @@
1
+ export { NavigationInsightsComputed as NavigationInsights };
2
+ declare const NavigationInsightsComputed: typeof NavigationInsights & {
3
+ request: (dependencies: import("../index.js").Trace, context: import("../../types/utility-types.js").default.ImmutableObject<{
4
+ computedCache: Map<string, import("../lib/arbitrary-equality-map.js").ArbitraryEqualityMap>;
5
+ }>) => Promise<import("@paulirish/trace_engine/models/trace/insights/types.js").NavigationInsightData<{
6
+ AuctionWorklets: typeof import("@paulirish/trace_engine/models/trace/handlers/AuctionWorkletsHandler.js");
7
+ Initiators: typeof import("@paulirish/trace_engine/models/trace/handlers/InitiatorsHandler.js");
8
+ LayoutShifts: typeof import("@paulirish/trace_engine/models/trace/handlers/LayoutShiftsHandler.js");
9
+ NetworkRequests: typeof import("@paulirish/trace_engine/models/trace/handlers/NetworkRequestsHandler.js");
10
+ Renderer: typeof import("@paulirish/trace_engine/models/trace/handlers/RendererHandler.js");
11
+ Samples: typeof import("@paulirish/trace_engine/models/trace/handlers/SamplesHandler.js");
12
+ Screenshots: typeof import("@paulirish/trace_engine/models/trace/handlers/ScreenshotsHandler.js");
13
+ PageLoadMetrics: typeof import("@paulirish/trace_engine/models/trace/handlers/PageLoadMetricsHandler.js");
14
+ }>>;
15
+ };
16
+ /**
17
+ * @fileoverview Gets insights from the shared trace engine for the navigation audited by Lighthouse.
18
+ * Only usable in navigation mode.
19
+ */
20
+ declare class NavigationInsights {
21
+ /**
22
+ * @param {LH.Trace} trace
23
+ * @param {LH.Artifacts.ComputedContext} context
24
+ */
25
+ static compute_(trace: LH.Trace, context: LH.Artifacts.ComputedContext): Promise<import("@paulirish/trace_engine/models/trace/insights/types.js").NavigationInsightData<{
26
+ AuctionWorklets: typeof import("@paulirish/trace_engine/models/trace/handlers/AuctionWorkletsHandler.js");
27
+ Initiators: typeof import("@paulirish/trace_engine/models/trace/handlers/InitiatorsHandler.js");
28
+ LayoutShifts: typeof import("@paulirish/trace_engine/models/trace/handlers/LayoutShiftsHandler.js");
29
+ NetworkRequests: typeof import("@paulirish/trace_engine/models/trace/handlers/NetworkRequestsHandler.js");
30
+ Renderer: typeof import("@paulirish/trace_engine/models/trace/handlers/RendererHandler.js");
31
+ Samples: typeof import("@paulirish/trace_engine/models/trace/handlers/SamplesHandler.js");
32
+ Screenshots: typeof import("@paulirish/trace_engine/models/trace/handlers/ScreenshotsHandler.js");
33
+ PageLoadMetrics: typeof import("@paulirish/trace_engine/models/trace/handlers/PageLoadMetricsHandler.js");
34
+ }>>;
35
+ }
36
+ //# sourceMappingURL=navigation-insights.d.ts.map
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2024 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import {makeComputedArtifact} from './computed-artifact.js';
8
+ import {ProcessedTrace} from './processed-trace.js';
9
+ import {TraceEngineResult} from './trace-engine-result.js';
10
+
11
+ /**
12
+ * @fileoverview Gets insights from the shared trace engine for the navigation audited by Lighthouse.
13
+ * Only usable in navigation mode.
14
+ */
15
+ class NavigationInsights {
16
+ /**
17
+ * @param {LH.Trace} trace
18
+ * @param {LH.Artifacts.ComputedContext} context
19
+ */
20
+ static async compute_(trace, context) {
21
+ const processedTrace = await ProcessedTrace.request(trace, context);
22
+ const traceEngineResult = await TraceEngineResult.request({trace}, context);
23
+
24
+ const navigationId = processedTrace.timeOriginEvt.args.data?.navigationId;
25
+ if (!navigationId) throw new Error('No navigationId found');
26
+
27
+ const navInsights = traceEngineResult.insights.get(navigationId);
28
+ if (!navInsights) throw new Error('No navigations insights found');
29
+
30
+ return navInsights;
31
+ }
32
+ }
33
+
34
+ const NavigationInsightsComputed = makeComputedArtifact(NavigationInsights, null);
35
+ export {NavigationInsightsComputed as NavigationInsights};
@@ -9,7 +9,6 @@ import {PageDependencyGraph as LanternPageDependencyGraph} from '../lib/lantern/
9
9
  import {NetworkRequest} from '../lib/network-request.js';
10
10
  import {ProcessedTrace} from './processed-trace.js';
11
11
  import {NetworkRecords} from './network-records.js';
12
- import {DocumentUrls} from './document-urls.js';
13
12
 
14
13
  /** @typedef {import('../lib/lantern/base-node.js').Node<LH.Artifacts.NetworkRequest>} Node */
15
14
 
@@ -20,18 +19,15 @@ class PageDependencyGraph {
20
19
  * @return {Promise<Node>}
21
20
  */
22
21
  static async compute_(data, context) {
23
- const {trace, devtoolsLog} = data;
22
+ const {trace, devtoolsLog, URL} = data;
24
23
  const [processedTrace, networkRecords] = await Promise.all([
25
24
  ProcessedTrace.request(trace, context),
26
25
  NetworkRecords.request(devtoolsLog, context),
27
26
  ]);
28
27
 
29
- // COMPAT: Backport for pre-10.0 clients that don't pass the URL artifact here (e.g. pubads).
30
- // Calculates the URL artifact from the processed trace and DT log.
31
- const URL = data.URL || await DocumentUrls.request(data, context);
32
-
28
+ const mainThreadEvents = processedTrace.mainThreadEvents;
33
29
  const lanternRequests = networkRecords.map(NetworkRequest.asLanternNetworkRequest);
34
- return LanternPageDependencyGraph.createGraph(processedTrace, lanternRequests, URL);
30
+ return LanternPageDependencyGraph.createGraph(mainThreadEvents, lanternRequests, URL);
35
31
  }
36
32
  }
37
33
 
@@ -4,42 +4,40 @@ export type ResourceEntry = {
4
4
  resourceSize: number;
5
5
  transferSize: number;
6
6
  };
7
+ export type ResourceType = 'stylesheet' | 'image' | 'media' | 'font' | 'script' | 'document' | 'other' | 'third-party' | 'total';
7
8
  declare const ResourceSummaryComputed: typeof ResourceSummary & {
8
9
  request: (dependencies: {
9
10
  URL: LH.Artifacts['URL'];
10
11
  devtoolsLog: import("../index.js").DevtoolsLog;
11
- budgets: LH.Util.ImmutableObject<LH.Budget[] | null>;
12
12
  }, context: import("../../types/utility-types.js").default.ImmutableObject<{
13
13
  computedCache: Map<string, import("../lib/arbitrary-equality-map.js").ArbitraryEqualityMap>;
14
- }>) => Promise<Record<import("../../types/lhr/budget.js").default.ResourceType, ResourceEntry>>;
14
+ }>) => Promise<Record<ResourceType, ResourceEntry>>;
15
15
  };
16
16
  /** @typedef {{count: number, resourceSize: number, transferSize: number}} ResourceEntry */
17
+ /** @typedef {'stylesheet'|'image'|'media'|'font'|'script'|'document'|'other'|'third-party'|'total'} ResourceType */
17
18
  declare class ResourceSummary {
18
19
  /**
19
20
  * @param {LH.Artifacts.NetworkRequest} record
20
- * @return {LH.Budget.ResourceType}
21
+ * @return {ResourceType}
21
22
  */
22
- static determineResourceType(record: LH.Artifacts.NetworkRequest): LH.Budget.ResourceType;
23
+ static determineResourceType(record: LH.Artifacts.NetworkRequest): ResourceType;
23
24
  /**
24
25
  * @param {Array<LH.Artifacts.NetworkRequest>} networkRecords
25
26
  * @param {LH.Artifacts.URL} URLArtifact
26
- * @param {LH.Util.ImmutableObject<LH.Budget[]|null>} budgets
27
27
  * @param {LH.Artifacts.EntityClassification} classifiedEntities
28
- * @return {Record<LH.Budget.ResourceType, ResourceEntry>}
28
+ * @return {Record<ResourceType, ResourceEntry>}
29
29
  */
30
- static summarize(networkRecords: Array<LH.Artifacts.NetworkRequest>, URLArtifact: LH.Artifacts.URL, budgets: LH.Util.ImmutableObject<LH.Budget[] | null>, classifiedEntities: LH.Artifacts.EntityClassification): Record<LH.Budget.ResourceType, ResourceEntry>;
30
+ static summarize(networkRecords: Array<LH.Artifacts.NetworkRequest>, URLArtifact: LH.Artifacts.URL, classifiedEntities: LH.Artifacts.EntityClassification): Record<ResourceType, ResourceEntry>;
31
31
  /**
32
- * @param {{URL: LH.Artifacts['URL'], devtoolsLog: LH.DevtoolsLog, budgets: LH.Util.ImmutableObject<LH.Budget[]|null>}} data
32
+ * @param {{URL: LH.Artifacts['URL'], devtoolsLog: LH.DevtoolsLog}} data
33
33
  * @param {LH.Artifacts.ComputedContext} context
34
- * @return {Promise<Record<LH.Budget.ResourceType,ResourceEntry>>}
34
+ * @return {Promise<Record<ResourceType,ResourceEntry>>}
35
35
  */
36
36
  static compute_(data: {
37
37
  URL: LH.Artifacts['URL'];
38
38
  devtoolsLog: import("../index.js").DevtoolsLog;
39
- budgets: LH.Util.ImmutableObject<LH.Budget[] | null>;
40
- }, context: LH.Artifacts.ComputedContext): Promise<Record<LH.Budget.ResourceType, ResourceEntry>>;
39
+ }, context: LH.Artifacts.ComputedContext): Promise<Record<ResourceType, ResourceEntry>>;
41
40
  }
42
- import { Budget } from '../config/budget.js';
43
41
  import { NetworkRequest } from '../lib/network-request.js';
44
42
  import { EntityClassification } from './entity-classification.js';
45
43
  //# sourceMappingURL=resource-summary.d.ts.map
@@ -8,19 +8,19 @@ import {EntityClassification} from './entity-classification.js';
8
8
  import {makeComputedArtifact} from './computed-artifact.js';
9
9
  import {NetworkRecords} from './network-records.js';
10
10
  import {NetworkRequest} from '../lib/network-request.js';
11
- import {Budget} from '../config/budget.js';
12
11
  import UrlUtils from '../lib/url-utils.js';
13
12
 
14
13
  /** @typedef {{count: number, resourceSize: number, transferSize: number}} ResourceEntry */
14
+ /** @typedef {'stylesheet'|'image'|'media'|'font'|'script'|'document'|'other'|'third-party'|'total'} ResourceType */
15
15
 
16
16
  class ResourceSummary {
17
17
  /**
18
18
  * @param {LH.Artifacts.NetworkRequest} record
19
- * @return {LH.Budget.ResourceType}
19
+ * @return {ResourceType}
20
20
  */
21
21
  static determineResourceType(record) {
22
22
  if (!record.resourceType) return 'other';
23
- /** @type {Partial<Record<LH.Crdp.Network.ResourceType, LH.Budget.ResourceType>>} */
23
+ /** @type {Partial<Record<LH.Crdp.Network.ResourceType, ResourceType>>} */
24
24
  const requestToResourceType = {
25
25
  'Stylesheet': 'stylesheet',
26
26
  'Image': 'image',
@@ -35,12 +35,11 @@ class ResourceSummary {
35
35
  /**
36
36
  * @param {Array<LH.Artifacts.NetworkRequest>} networkRecords
37
37
  * @param {LH.Artifacts.URL} URLArtifact
38
- * @param {LH.Util.ImmutableObject<LH.Budget[]|null>} budgets
39
38
  * @param {LH.Artifacts.EntityClassification} classifiedEntities
40
- * @return {Record<LH.Budget.ResourceType, ResourceEntry>}
39
+ * @return {Record<ResourceType, ResourceEntry>}
41
40
  */
42
- static summarize(networkRecords, URLArtifact, budgets, classifiedEntities) {
43
- /** @type {Record<LH.Budget.ResourceType, ResourceEntry>} */
41
+ static summarize(networkRecords, URLArtifact, classifiedEntities) {
42
+ /** @type {Record<ResourceType, ResourceEntry>} */
44
43
  const resourceSummary = {
45
44
  'stylesheet': {count: 0, resourceSize: 0, transferSize: 0},
46
45
  'image': {count: 0, resourceSize: 0, transferSize: 0},
@@ -52,15 +51,9 @@ class ResourceSummary {
52
51
  'total': {count: 0, resourceSize: 0, transferSize: 0},
53
52
  'third-party': {count: 0, resourceSize: 0, transferSize: 0},
54
53
  };
55
- const budget = Budget.getMatchingBudget(budgets, URLArtifact.mainDocumentUrl);
56
54
  /** @type {ReadonlyArray<string>} */
57
- let firstPartyHosts = [];
58
- if (budget?.options?.firstPartyHostnames) {
59
- firstPartyHosts = budget.options.firstPartyHostnames;
60
- } else {
61
- firstPartyHosts = classifiedEntities.firstParty?.domains.map(domain => `*.${domain}`) ||
62
- [`*.${UrlUtils.getRootDomain(URLArtifact.finalDisplayedUrl)}`];
63
- }
55
+ const firstPartyHosts = classifiedEntities.firstParty?.domains.map(domain => `*.${domain}`) ||
56
+ [`*.${UrlUtils.getRootDomain(URLArtifact.finalDisplayedUrl)}`];
64
57
 
65
58
  networkRecords.filter(record => {
66
59
  // Ignore favicon.co
@@ -101,18 +94,18 @@ class ResourceSummary {
101
94
  }
102
95
 
103
96
  /**
104
- * @param {{URL: LH.Artifacts['URL'], devtoolsLog: LH.DevtoolsLog, budgets: LH.Util.ImmutableObject<LH.Budget[]|null>}} data
97
+ * @param {{URL: LH.Artifacts['URL'], devtoolsLog: LH.DevtoolsLog}} data
105
98
  * @param {LH.Artifacts.ComputedContext} context
106
- * @return {Promise<Record<LH.Budget.ResourceType,ResourceEntry>>}
99
+ * @return {Promise<Record<ResourceType,ResourceEntry>>}
107
100
  */
108
101
  static async compute_(data, context) {
109
102
  const networkRecords = await NetworkRecords.request(data.devtoolsLog, context);
110
103
  const classifiedEntities = await EntityClassification.request(
111
104
  {URL: data.URL, devtoolsLog: data.devtoolsLog}, context);
112
- return ResourceSummary.summarize(networkRecords, data.URL, data.budgets, classifiedEntities);
105
+ return ResourceSummary.summarize(networkRecords, data.URL, classifiedEntities);
113
106
  }
114
107
  }
115
108
 
116
109
  const ResourceSummaryComputed =
117
- makeComputedArtifact(ResourceSummary, ['URL', 'devtoolsLog', 'budgets']);
110
+ makeComputedArtifact(ResourceSummary, ['URL', 'devtoolsLog']);
118
111
  export {ResourceSummaryComputed as ResourceSummary};
@@ -1,19 +1,31 @@
1
1
  export { TraceEngineResultComputed as TraceEngineResult };
2
+ export type EnabledHandlers = typeof ENABLED_HANDLERS;
2
3
  declare const TraceEngineResultComputed: typeof TraceEngineResult & {
3
4
  request: (dependencies: {
4
5
  trace: LH.Trace;
5
- }, context: import("../../types/utility-types.js").default.ImmutableObject<{
6
+ }, context: LH.Util.ImmutableObject<{
6
7
  computedCache: Map<string, import("../lib/arbitrary-equality-map.js").ArbitraryEqualityMap>;
7
- }>) => Promise<Readonly<import("@paulirish/trace_engine/models/trace/handlers/types.js").EnabledHandlerDataWithMeta<typeof import("@paulirish/trace_engine/models/trace/handlers/ModelHandlers.js")>>>;
8
+ }>) => Promise<LH.Artifacts.TraceEngineResult>;
8
9
  };
10
+ declare namespace ENABLED_HANDLERS {
11
+ const AuctionWorklets: typeof import("@paulirish/trace_engine/models/trace/handlers/AuctionWorkletsHandler.js");
12
+ const Initiators: typeof import("@paulirish/trace_engine/models/trace/handlers/InitiatorsHandler.js");
13
+ const LayoutShifts: typeof import("@paulirish/trace_engine/models/trace/handlers/LayoutShiftsHandler.js");
14
+ const NetworkRequests: typeof import("@paulirish/trace_engine/models/trace/handlers/NetworkRequestsHandler.js");
15
+ const Renderer: typeof import("@paulirish/trace_engine/models/trace/handlers/RendererHandler.js");
16
+ const Samples: typeof import("@paulirish/trace_engine/models/trace/handlers/SamplesHandler.js");
17
+ const Screenshots: typeof import("@paulirish/trace_engine/models/trace/handlers/ScreenshotsHandler.js");
18
+ const PageLoadMetrics: typeof import("@paulirish/trace_engine/models/trace/handlers/PageLoadMetricsHandler.js");
19
+ }
9
20
  /**
10
21
  * @fileoverview Processes trace with the shared trace engine.
11
22
  */
12
23
  declare class TraceEngineResult {
13
24
  /**
14
25
  * @param {LH.TraceEvent[]} traceEvents
26
+ * @return {Promise<LH.Artifacts.TraceEngineResult>}
15
27
  */
16
- static runTraceEngine(traceEvents: LH.TraceEvent[]): Promise<Readonly<import("@paulirish/trace_engine/models/trace/handlers/types.js").EnabledHandlerDataWithMeta<typeof import("@paulirish/trace_engine/models/trace/handlers/ModelHandlers.js")>>>;
28
+ static runTraceEngine(traceEvents: LH.TraceEvent[]): Promise<LH.Artifacts.TraceEngineResult>;
17
29
  /**
18
30
  * @param {{trace: LH.Trace}} data
19
31
  * @param {LH.Artifacts.ComputedContext} context
@@ -23,4 +35,5 @@ declare class TraceEngineResult {
23
35
  trace: LH.Trace;
24
36
  }, context: LH.Artifacts.ComputedContext): Promise<LH.Artifacts.TraceEngineResult>;
25
37
  }
38
+ import * as LH from '../../types/lh.js';
26
39
  //# sourceMappingURL=trace-engine-result.d.ts.map