lighthouse 12.1.0 → 12.2.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 (436) hide show
  1. package/cli/cli-flags.d.ts +2 -2
  2. package/cli/cli-flags.js +1 -1
  3. package/cli/sentry-prompt.js +2 -2
  4. package/cli/test/smokehouse/frontends/lib.d.ts +1 -1
  5. package/cli/test/smokehouse/lib/concurrent-mapper.d.ts +6 -6
  6. package/cli/test/smokehouse/lighthouse-runners/bundle.d.ts +1 -1
  7. package/cli/test/smokehouse/lighthouse-runners/cli.d.ts +1 -2
  8. package/cli/test/smokehouse/lighthouse-runners/devtools.d.ts +1 -1
  9. package/cli/test/smokehouse/report-assert.d.ts +0 -1
  10. package/cli/test/smokehouse/version-check.d.ts +3 -3
  11. package/core/audits/accessibility/accesskeys.d.ts +3 -3
  12. package/core/audits/accessibility/aria-allowed-attr.d.ts +3 -3
  13. package/core/audits/accessibility/aria-allowed-role.d.ts +3 -3
  14. package/core/audits/accessibility/aria-command-name.d.ts +3 -3
  15. package/core/audits/accessibility/aria-conditional-attr.d.ts +3 -3
  16. package/core/audits/accessibility/aria-deprecated-role.d.ts +3 -3
  17. package/core/audits/accessibility/aria-dialog-name.d.ts +3 -3
  18. package/core/audits/accessibility/aria-hidden-body.d.ts +3 -3
  19. package/core/audits/accessibility/aria-hidden-focus.d.ts +3 -3
  20. package/core/audits/accessibility/aria-input-field-name.d.ts +3 -3
  21. package/core/audits/accessibility/aria-meter-name.d.ts +3 -3
  22. package/core/audits/accessibility/aria-progressbar-name.d.ts +3 -3
  23. package/core/audits/accessibility/aria-prohibited-attr.d.ts +3 -3
  24. package/core/audits/accessibility/aria-required-attr.d.ts +3 -3
  25. package/core/audits/accessibility/aria-required-children.d.ts +3 -3
  26. package/core/audits/accessibility/aria-required-parent.d.ts +3 -3
  27. package/core/audits/accessibility/aria-roles.d.ts +3 -3
  28. package/core/audits/accessibility/aria-text.d.ts +3 -3
  29. package/core/audits/accessibility/aria-toggle-field-name.d.ts +3 -3
  30. package/core/audits/accessibility/aria-tooltip-name.d.ts +3 -3
  31. package/core/audits/accessibility/aria-treeitem-name.d.ts +3 -3
  32. package/core/audits/accessibility/aria-valid-attr-value.d.ts +3 -3
  33. package/core/audits/accessibility/aria-valid-attr.d.ts +3 -3
  34. package/core/audits/accessibility/axe-audit.d.ts +1 -1
  35. package/core/audits/accessibility/button-name.d.ts +3 -3
  36. package/core/audits/accessibility/bypass.d.ts +3 -3
  37. package/core/audits/accessibility/color-contrast.d.ts +3 -3
  38. package/core/audits/accessibility/definition-list.d.ts +3 -3
  39. package/core/audits/accessibility/dlitem.d.ts +3 -3
  40. package/core/audits/accessibility/document-title.d.ts +3 -3
  41. package/core/audits/accessibility/duplicate-id-aria.d.ts +3 -3
  42. package/core/audits/accessibility/empty-heading.d.ts +3 -3
  43. package/core/audits/accessibility/form-field-multiple-labels.d.ts +3 -3
  44. package/core/audits/accessibility/frame-title.d.ts +3 -3
  45. package/core/audits/accessibility/heading-order.d.ts +3 -3
  46. package/core/audits/accessibility/html-has-lang.d.ts +3 -3
  47. package/core/audits/accessibility/html-lang-valid.d.ts +3 -3
  48. package/core/audits/accessibility/html-xml-lang-mismatch.d.ts +3 -3
  49. package/core/audits/accessibility/identical-links-same-purpose.d.ts +3 -3
  50. package/core/audits/accessibility/image-alt.d.ts +3 -3
  51. package/core/audits/accessibility/image-redundant-alt.d.ts +3 -3
  52. package/core/audits/accessibility/input-button-name.d.ts +3 -3
  53. package/core/audits/accessibility/input-image-alt.d.ts +3 -3
  54. package/core/audits/accessibility/label-content-name-mismatch.d.ts +3 -3
  55. package/core/audits/accessibility/label.d.ts +3 -3
  56. package/core/audits/accessibility/landmark-one-main.d.ts +3 -3
  57. package/core/audits/accessibility/link-in-text-block.d.ts +3 -3
  58. package/core/audits/accessibility/link-name.d.ts +3 -3
  59. package/core/audits/accessibility/list.d.ts +3 -3
  60. package/core/audits/accessibility/listitem.d.ts +3 -3
  61. package/core/audits/accessibility/meta-refresh.d.ts +3 -3
  62. package/core/audits/accessibility/meta-viewport.d.ts +3 -3
  63. package/core/audits/accessibility/object-alt.d.ts +3 -3
  64. package/core/audits/accessibility/select-name.d.ts +3 -3
  65. package/core/audits/accessibility/skip-link.d.ts +3 -3
  66. package/core/audits/accessibility/tabindex.d.ts +3 -3
  67. package/core/audits/accessibility/table-duplicate-name.d.ts +3 -3
  68. package/core/audits/accessibility/table-fake-caption.d.ts +3 -3
  69. package/core/audits/accessibility/target-size.d.ts +3 -3
  70. package/core/audits/accessibility/td-has-header.d.ts +3 -3
  71. package/core/audits/accessibility/td-headers-attr.d.ts +3 -3
  72. package/core/audits/accessibility/th-has-data-cells.d.ts +3 -3
  73. package/core/audits/accessibility/valid-lang.d.ts +3 -3
  74. package/core/audits/accessibility/video-caption.d.ts +3 -3
  75. package/core/audits/audit.d.ts +17 -17
  76. package/core/audits/autocomplete.d.ts +9 -9
  77. package/core/audits/bf-cache.d.ts +10 -10
  78. package/core/audits/bootup-time.d.ts +7 -7
  79. package/core/audits/byte-efficiency/byte-efficiency-audit.d.ts +6 -8
  80. package/core/audits/byte-efficiency/byte-efficiency-audit.js +3 -6
  81. package/core/audits/byte-efficiency/duplicated-javascript.d.ts +4 -4
  82. package/core/audits/byte-efficiency/efficient-animated-content.d.ts +3 -4
  83. package/core/audits/byte-efficiency/legacy-javascript.d.ts +7 -8
  84. package/core/audits/byte-efficiency/modern-image-formats.d.ts +3 -3
  85. package/core/audits/byte-efficiency/offscreen-images.d.ts +3 -4
  86. package/core/audits/byte-efficiency/render-blocking-resources.d.ts +5 -9
  87. package/core/audits/byte-efficiency/render-blocking-resources.js +10 -16
  88. package/core/audits/byte-efficiency/total-byte-weight.d.ts +4 -4
  89. package/core/audits/byte-efficiency/unminified-css.d.ts +3 -3
  90. package/core/audits/byte-efficiency/unminified-javascript.d.ts +3 -3
  91. package/core/audits/byte-efficiency/unused-css-rules.d.ts +3 -3
  92. package/core/audits/byte-efficiency/unused-javascript.d.ts +3 -3
  93. package/core/audits/byte-efficiency/uses-long-cache-ttl.d.ts +4 -6
  94. package/core/audits/byte-efficiency/uses-optimized-images.d.ts +3 -3
  95. package/core/audits/byte-efficiency/uses-responsive-images-snapshot.d.ts +4 -4
  96. package/core/audits/byte-efficiency/uses-responsive-images.d.ts +4 -5
  97. package/core/audits/byte-efficiency/uses-text-compression.d.ts +3 -3
  98. package/core/audits/critical-request-chains.d.ts +3 -3
  99. package/core/audits/csp-xss.d.ts +8 -8
  100. package/core/audits/deprecations.d.ts +6 -6
  101. package/core/audits/dobetterweb/charset.d.ts +3 -3
  102. package/core/audits/dobetterweb/doctype.d.ts +9 -9
  103. package/core/audits/dobetterweb/dom-size.d.ts +9 -9
  104. package/core/audits/dobetterweb/geolocation-on-start.d.ts +3 -3
  105. package/core/audits/dobetterweb/inspector-issues.d.ts +6 -6
  106. package/core/audits/dobetterweb/js-libraries.d.ts +3 -3
  107. package/core/audits/dobetterweb/no-document-write.d.ts +3 -3
  108. package/core/audits/dobetterweb/notification-on-start.d.ts +3 -3
  109. package/core/audits/dobetterweb/paste-preventing-inputs.d.ts +3 -3
  110. package/core/audits/dobetterweb/uses-http2.d.ts +7 -11
  111. package/core/audits/dobetterweb/uses-http2.js +2 -5
  112. package/core/audits/dobetterweb/uses-passive-event-listeners.d.ts +3 -3
  113. package/core/audits/errors-in-console.d.ts +4 -4
  114. package/core/audits/font-display.d.ts +4 -4
  115. package/core/audits/image-aspect-ratio.d.ts +5 -5
  116. package/core/audits/image-size-responsive.d.ts +7 -7
  117. package/core/audits/is-on-https.d.ts +10 -10
  118. package/core/audits/largest-contentful-paint-element.d.ts +9 -9
  119. package/core/audits/layout-shifts.d.ts +9 -9
  120. package/core/audits/lcp-lazy-loaded.d.ts +3 -3
  121. package/core/audits/long-tasks.d.ts +11 -11
  122. package/core/audits/long-tasks.js +5 -5
  123. package/core/audits/mainthread-work-breakdown.d.ts +5 -5
  124. package/core/audits/metrics/cumulative-layout-shift.d.ts +1 -1
  125. package/core/audits/metrics/first-contentful-paint.d.ts +1 -1
  126. package/core/audits/metrics/first-meaningful-paint.d.ts +1 -1
  127. package/core/audits/metrics/interaction-to-next-paint.d.ts +1 -1
  128. package/core/audits/metrics/interactive.d.ts +1 -1
  129. package/core/audits/metrics/largest-contentful-paint.d.ts +1 -1
  130. package/core/audits/metrics/max-potential-fid.d.ts +2 -4
  131. package/core/audits/metrics/speed-index.d.ts +1 -1
  132. package/core/audits/metrics/total-blocking-time.d.ts +1 -1
  133. package/core/audits/network-rtt.d.ts +2 -2
  134. package/core/audits/network-server-latency.d.ts +2 -2
  135. package/core/audits/non-composited-animations.d.ts +9 -9
  136. package/core/audits/oopif-iframe-test-audit.d.ts +5 -5
  137. package/core/audits/preload-fonts.d.ts +3 -3
  138. package/core/audits/prioritize-lcp-image.d.ts +7 -7
  139. package/core/audits/redirects-http.d.ts +3 -3
  140. package/core/audits/redirects.d.ts +2 -3
  141. package/core/audits/resource-summary.d.ts +1 -1
  142. package/core/audits/screenshot-thumbnails.d.ts +2 -3
  143. package/core/audits/script-treemap-data.d.ts +1 -1
  144. package/core/audits/seo/canonical.d.ts +8 -8
  145. package/core/audits/seo/crawlable-anchors.d.ts +4 -4
  146. package/core/audits/seo/font-size.d.ts +11 -11
  147. package/core/audits/seo/hreflang.d.ts +6 -6
  148. package/core/audits/seo/http-status-code.d.ts +3 -3
  149. package/core/audits/seo/is-crawlable.d.ts +9 -10
  150. package/core/audits/seo/link-text.d.ts +4 -4
  151. package/core/audits/seo/manual/structured-data.d.ts +2 -2
  152. package/core/audits/seo/meta-description.d.ts +4 -4
  153. package/core/audits/seo/robots-txt.d.ts +6 -6
  154. package/core/audits/server-response-time.d.ts +4 -4
  155. package/core/audits/third-party-cookies.d.ts +4 -4
  156. package/core/audits/third-party-facades.d.ts +11 -12
  157. package/core/audits/third-party-summary.d.ts +5 -6
  158. package/core/audits/third-party-summary.js +7 -4
  159. package/core/audits/unsized-images.d.ts +3 -3
  160. package/core/audits/user-timings.d.ts +6 -6
  161. package/core/audits/uses-rel-preconnect.d.ts +5 -5
  162. package/core/audits/uses-rel-preload.d.ts +7 -7
  163. package/core/audits/uses-rel-preload.js +8 -6
  164. package/core/audits/valid-source-maps.d.ts +6 -7
  165. package/core/audits/viewport.d.ts +4 -4
  166. package/core/audits/work-during-interaction.d.ts +11 -12
  167. package/core/computed/computed-artifact.d.ts +2 -2
  168. package/core/computed/critical-request-chains.d.ts +9 -11
  169. package/core/computed/critical-request-chains.js +6 -6
  170. package/core/computed/document-urls.d.ts +3 -8
  171. package/core/computed/document-urls.js +1 -1
  172. package/core/computed/entity-classification.d.ts +6 -8
  173. package/core/computed/image-records.d.ts +3 -5
  174. package/core/computed/js-bundles.d.ts +2 -4
  175. package/core/computed/lcp-image-record.d.ts +3 -5
  176. package/core/computed/load-simulator.d.ts +7 -11
  177. package/core/computed/load-simulator.js +1 -1
  178. package/core/computed/main-resource.d.ts +5 -7
  179. package/core/computed/main-resource.js +1 -1
  180. package/core/computed/main-thread-tasks.d.ts +1 -3
  181. package/core/computed/metrics/cumulative-layout-shift.d.ts +2 -14
  182. package/core/computed/metrics/first-contentful-paint-all-frames.d.ts +1 -3
  183. package/core/computed/metrics/first-contentful-paint.d.ts +1 -3
  184. package/core/computed/metrics/interactive.d.ts +1 -3
  185. package/core/computed/metrics/lantern-first-contentful-paint.d.ts +3 -7
  186. package/core/computed/metrics/lantern-first-contentful-paint.js +3 -5
  187. package/core/computed/metrics/lantern-interactive.d.ts +3 -7
  188. package/core/computed/metrics/lantern-interactive.js +3 -5
  189. package/core/computed/metrics/lantern-largest-contentful-paint.d.ts +3 -7
  190. package/core/computed/metrics/lantern-largest-contentful-paint.js +3 -5
  191. package/core/computed/metrics/lantern-max-potential-fid.d.ts +3 -7
  192. package/core/computed/metrics/lantern-max-potential-fid.js +3 -5
  193. package/core/computed/metrics/lantern-metric.d.ts +8 -8
  194. package/core/computed/metrics/lantern-metric.js +1 -1
  195. package/core/computed/metrics/lantern-speed-index.d.ts +3 -7
  196. package/core/computed/metrics/lantern-speed-index.js +3 -5
  197. package/core/computed/metrics/lantern-total-blocking-time.d.ts +3 -7
  198. package/core/computed/metrics/lantern-total-blocking-time.js +1 -3
  199. package/core/computed/metrics/largest-contentful-paint-all-frames.d.ts +1 -3
  200. package/core/computed/metrics/largest-contentful-paint.d.ts +1 -3
  201. package/core/computed/metrics/lcp-breakdown.d.ts +3 -9
  202. package/core/computed/metrics/max-potential-fid.d.ts +1 -3
  203. package/core/computed/metrics/responsiveness.d.ts +7 -10
  204. package/core/computed/metrics/speed-index.d.ts +1 -3
  205. package/core/computed/metrics/time-to-first-byte.d.ts +1 -3
  206. package/core/computed/metrics/timing-summary.d.ts +8 -13
  207. package/core/computed/metrics/total-blocking-time.d.ts +1 -3
  208. package/core/computed/metrics/total-blocking-time.js +1 -1
  209. package/core/computed/module-duplication.d.ts +2 -8
  210. package/core/computed/navigation-insights.d.ts +2 -4
  211. package/core/computed/network-analysis.d.ts +2 -4
  212. package/core/computed/network-analysis.js +1 -1
  213. package/core/computed/network-records.d.ts +1 -3
  214. package/core/computed/page-dependency-graph.d.ts +9 -14
  215. package/core/computed/page-dependency-graph.js +3 -4
  216. package/core/computed/processed-navigation.d.ts +2 -5
  217. package/core/computed/processed-trace.d.ts +1 -3
  218. package/core/computed/resource-summary.d.ts +6 -10
  219. package/core/computed/screenshots.d.ts +1 -6
  220. package/core/computed/speedline.d.ts +1 -3
  221. package/core/computed/tbt-impact-tasks.d.ts +4 -5
  222. package/core/computed/tbt-impact-tasks.js +31 -8
  223. package/core/computed/trace-engine-result.d.ts +1 -3
  224. package/core/computed/trace-engine-result.js +10 -1
  225. package/core/computed/unused-css.d.ts +7 -9
  226. package/core/computed/unused-javascript-summary.d.ts +3 -5
  227. package/core/computed/user-timings.d.ts +3 -5
  228. package/core/computed/viewport-meta.d.ts +7 -9
  229. package/core/config/config-helpers.d.ts +5 -5
  230. package/core/config/config.d.ts +3 -3
  231. package/core/config/constants.d.ts +6 -6
  232. package/core/config/filters.d.ts +8 -8
  233. package/core/config/validation.d.ts +1 -1
  234. package/core/gather/driver/environment.d.ts +5 -5
  235. package/core/gather/driver/environment.js +1 -1
  236. package/core/gather/driver/execution-context.d.ts +6 -6
  237. package/core/gather/driver/navigation.d.ts +3 -3
  238. package/core/gather/driver/network-monitor.d.ts +6 -6
  239. package/core/gather/driver/storage.d.ts +4 -4
  240. package/core/gather/driver/target-manager.d.ts +4 -5
  241. package/core/gather/driver/target-manager.js +1 -1
  242. package/core/gather/driver/wait-for-condition.d.ts +3 -3
  243. package/core/gather/driver/wait-for-condition.js +4 -4
  244. package/core/gather/driver.d.ts +1 -1
  245. package/core/gather/gatherers/accessibility.d.ts +1 -1
  246. package/core/gather/gatherers/anchor-elements.d.ts +1 -1
  247. package/core/gather/gatherers/bf-cache-failures.d.ts +3 -3
  248. package/core/gather/gatherers/cache-contents.d.ts +1 -1
  249. package/core/gather/gatherers/console-messages.d.ts +1 -1
  250. package/core/gather/gatherers/css-usage.d.ts +1 -1
  251. package/core/gather/gatherers/devtools-log-compat.d.ts +3 -3
  252. package/core/gather/gatherers/devtools-log.d.ts +3 -3
  253. package/core/gather/gatherers/dobetterweb/doctype.d.ts +1 -1
  254. package/core/gather/gatherers/dobetterweb/domstats.d.ts +1 -1
  255. package/core/gather/gatherers/dobetterweb/optimized-images.d.ts +6 -7
  256. package/core/gather/gatherers/dobetterweb/response-compression.d.ts +4 -5
  257. package/core/gather/gatherers/full-page-screenshot.d.ts +3 -3
  258. package/core/gather/gatherers/iframe-elements.d.ts +1 -1
  259. package/core/gather/gatherers/image-elements.d.ts +1 -1
  260. package/core/gather/gatherers/inputs.d.ts +1 -1
  261. package/core/gather/gatherers/inspector-issues.d.ts +2 -2
  262. package/core/gather/gatherers/js-usage.d.ts +1 -1
  263. package/core/gather/gatherers/link-elements.d.ts +6 -10
  264. package/core/gather/gatherers/link-elements.js +5 -12
  265. package/core/gather/gatherers/main-document-content.d.ts +2 -2
  266. package/core/gather/gatherers/meta-elements.d.ts +1 -1
  267. package/core/gather/gatherers/network-user-agent.d.ts +4 -4
  268. package/core/gather/gatherers/root-causes.d.ts +3 -4
  269. package/core/gather/gatherers/seo/font-size.d.ts +19 -19
  270. package/core/gather/gatherers/seo/robots-txt.d.ts +1 -1
  271. package/core/gather/gatherers/source-maps.d.ts +2 -2
  272. package/core/gather/gatherers/stacks.d.ts +2 -2
  273. package/core/gather/gatherers/stylesheets.d.ts +1 -9
  274. package/core/gather/gatherers/stylesheets.js +8 -39
  275. package/core/gather/gatherers/trace-compat.d.ts +3 -3
  276. package/core/gather/gatherers/trace-elements.d.ts +4 -6
  277. package/core/gather/navigation-runner.d.ts +3 -4
  278. package/core/gather/runner-helpers.d.ts +3 -3
  279. package/core/gather/session.d.ts +4 -4
  280. package/core/gather/session.js +1 -1
  281. package/core/gather/snapshot-runner.d.ts +2 -2
  282. package/core/gather/timespan-runner.d.ts +3 -3
  283. package/core/index.d.cts +1 -7
  284. package/core/index.d.ts +6 -6
  285. package/core/lib/arbitrary-equality-map.d.ts +2 -2
  286. package/core/lib/asset-saver.d.ts +3 -3
  287. package/core/lib/asset-saver.js +1 -1
  288. package/core/lib/bf-cache-strings.d.ts +117 -117
  289. package/core/lib/cdt/Platform.d.ts +1 -1
  290. package/core/lib/cdt/SDK.d.ts +1 -1
  291. package/core/lib/cdt/generated/ParsedURL.js +2 -2
  292. package/core/lib/cdt/generated/SourceMap.d.ts +11 -11
  293. package/core/lib/cdt/generated/SourceMap.js +3 -3
  294. package/core/lib/csp-evaluator.d.ts +20 -20
  295. package/core/lib/deprecation-description.d.ts +3 -3
  296. package/core/lib/deprecations-strings.d.ts +112 -112
  297. package/core/lib/i18n/i18n.d.ts +48 -48
  298. package/core/lib/icons.d.ts +3 -3
  299. package/core/lib/lantern/lantern.d.ts +2 -19
  300. package/core/lib/lantern/lantern.js +2 -45
  301. package/core/lib/lantern-trace-saver.d.ts +5 -7
  302. package/core/lib/lantern-trace-saver.js +2 -3
  303. package/core/lib/lh-error.d.ts +87 -87
  304. package/core/lib/lighthouse-compatibility.d.ts +1 -1
  305. package/core/lib/manifest-parser.d.ts +1 -1
  306. package/core/lib/minify-devtoolslog.d.ts +1 -1
  307. package/core/lib/navigation-error.d.ts +4 -6
  308. package/core/lib/navigation-error.js +2 -2
  309. package/core/lib/network-recorder.js +1 -1
  310. package/core/lib/network-request.d.ts +5 -5
  311. package/core/lib/network-request.js +2 -2
  312. package/core/lib/page-functions.d.ts +2 -2
  313. package/core/lib/script-helpers.d.ts +0 -1
  314. package/core/lib/sentry.d.ts +8 -8
  315. package/core/lib/stack-packs.d.ts +1 -1
  316. package/core/lib/trace-engine.d.ts +2 -2
  317. package/core/lib/tracehouse/cpu-profile-model.d.ts +8 -8
  318. package/core/lib/tracehouse/cpu-profile-model.js +2 -2
  319. package/core/lib/tracehouse/main-thread-tasks.d.ts +5 -5
  320. package/core/lib/tracehouse/task-groups.d.ts +6 -38
  321. package/core/lib/tracehouse/task-summary.d.ts +0 -1
  322. package/core/lib/tracehouse/trace-processor.d.ts +9 -9
  323. package/core/lib/traces/metric-trace-events.d.ts +1 -1
  324. package/core/lib/url-utils.d.ts +4 -4
  325. package/core/runner.d.ts +3 -4
  326. package/core/runner.js +0 -1
  327. package/core/scoring.d.ts +0 -1
  328. package/core/user-flow.d.ts +5 -5
  329. package/dist/report/bundle.esm.js +1 -1
  330. package/dist/report/flow.js +1 -1
  331. package/dist/report/standalone.js +1 -1
  332. package/eslint-local-rules.d.cts +4 -1
  333. package/flow-report/src/i18n/localized-strings.d.ts +1 -1
  334. package/flow-report/src/i18n/ui-strings.d.ts +43 -43
  335. package/package.json +7 -7
  336. package/readme.md +0 -2
  337. package/report/generator/file-namer.d.ts +2 -2
  338. package/report/generator/flow-report-assets.d.ts +1 -1
  339. package/report/generator/report-generator.d.ts +4 -4
  340. package/report/renderer/api.d.ts +2 -5
  341. package/report/renderer/category-renderer.d.ts +8 -8
  342. package/report/renderer/components.d.ts +2 -2
  343. package/report/renderer/crc-details-renderer.d.ts +2 -2
  344. package/report/renderer/details-renderer.d.ts +7 -7
  345. package/report/renderer/dom.d.ts +7 -7
  346. package/report/renderer/drop-down-menu.d.ts +1 -1
  347. package/report/renderer/drop-down-menu.js +15 -17
  348. package/report/renderer/element-screenshot-renderer.d.ts +3 -3
  349. package/report/renderer/explodey-gauge.d.ts +2 -2
  350. package/report/renderer/features-util.d.ts +1 -1
  351. package/report/renderer/performance-category-renderer.d.ts +1 -1
  352. package/report/renderer/report-globals.d.ts +1 -1
  353. package/report/renderer/report-renderer.d.ts +1 -1
  354. package/report/renderer/report-ui-features.d.ts +1 -1
  355. package/report/renderer/report-utils.d.ts +62 -62
  356. package/report/renderer/snippet-renderer.d.ts +9 -9
  357. package/report/renderer/swap-locale-feature.d.ts +2 -2
  358. package/report/renderer/topbar-features.d.ts +2 -2
  359. package/report/types/augment-dom.d.ts +0 -11
  360. package/shared/localization/format.d.ts +3 -3
  361. package/shared/localization/locales/en-US.json +1 -1
  362. package/shared/localization/locales/en-XL.json +1 -1
  363. package/shared/localization/locales.d.ts +1 -1
  364. package/shared/type-verifiers.d.ts +1 -1
  365. package/shared/util.d.ts +6 -6
  366. package/tsconfig.json +1 -11
  367. package/types/artifacts.d.ts +4 -4
  368. package/types/gatherer.d.ts +4 -5
  369. package/types/internal/node.d.ts +0 -6
  370. package/types/internal/query-selector.d.ts +2 -2
  371. package/core/lib/lantern/BaseNode.d.ts +0 -163
  372. package/core/lib/lantern/BaseNode.js +0 -369
  373. package/core/lib/lantern/BaseNode.test.js +0 -385
  374. package/core/lib/lantern/CpuNode.d.ts +0 -43
  375. package/core/lib/lantern/CpuNode.js +0 -99
  376. package/core/lib/lantern/LanternError.d.ts +0 -8
  377. package/core/lib/lantern/LanternError.js +0 -9
  378. package/core/lib/lantern/Metric.d.ts +0 -69
  379. package/core/lib/lantern/Metric.js +0 -137
  380. package/core/lib/lantern/NetworkNode.d.ts +0 -49
  381. package/core/lib/lantern/NetworkNode.js +0 -136
  382. package/core/lib/lantern/PageDependencyGraph.d.ts +0 -82
  383. package/core/lib/lantern/PageDependencyGraph.js +0 -610
  384. package/core/lib/lantern/PageDependencyGraph.test.js +0 -654
  385. package/core/lib/lantern/TBTUtils.d.ts +0 -44
  386. package/core/lib/lantern/TBTUtils.js +0 -76
  387. package/core/lib/lantern/TBTUtils.test.d.ts +0 -2
  388. package/core/lib/lantern/TBTUtils.test.js +0 -130
  389. package/core/lib/lantern/TraceEngineComputationData.d.ts +0 -25
  390. package/core/lib/lantern/TraceEngineComputationData.js +0 -466
  391. package/core/lib/lantern/metrics/FirstContentfulPaint.d.ts +0 -79
  392. package/core/lib/lantern/metrics/FirstContentfulPaint.js +0 -198
  393. package/core/lib/lantern/metrics/FirstContentfulPaint.test.js +0 -54
  394. package/core/lib/lantern/metrics/Interactive.d.ts +0 -20
  395. package/core/lib/lantern/metrics/Interactive.js +0 -109
  396. package/core/lib/lantern/metrics/Interactive.test.js +0 -56
  397. package/core/lib/lantern/metrics/LargestContentfulPaint.d.ts +0 -19
  398. package/core/lib/lantern/metrics/LargestContentfulPaint.js +0 -105
  399. package/core/lib/lantern/metrics/LargestContentfulPaint.test.js +0 -42
  400. package/core/lib/lantern/metrics/MaxPotentialFID.d.ts +0 -24
  401. package/core/lib/lantern/metrics/MaxPotentialFID.js +0 -91
  402. package/core/lib/lantern/metrics/MetricTestUtils.d.ts +0 -19
  403. package/core/lib/lantern/metrics/MetricTestUtils.js +0 -48
  404. package/core/lib/lantern/metrics/SpeedIndex.d.ts +0 -32
  405. package/core/lib/lantern/metrics/SpeedIndex.js +0 -142
  406. package/core/lib/lantern/metrics/SpeedIndex.test.js +0 -83
  407. package/core/lib/lantern/metrics/TotalBlockingTime.d.ts +0 -25
  408. package/core/lib/lantern/metrics/TotalBlockingTime.js +0 -125
  409. package/core/lib/lantern/metrics/__snapshots__/FirstContentfulPaint.test.js.snap +0 -11
  410. package/core/lib/lantern/metrics/__snapshots__/Interactive.test.js.snap +0 -17
  411. package/core/lib/lantern/metrics/metrics.d.ts +0 -9
  412. package/core/lib/lantern/metrics/metrics.js +0 -16
  413. package/core/lib/lantern/simulation/ConnectionPool.d.ts +0 -48
  414. package/core/lib/lantern/simulation/ConnectionPool.js +0 -152
  415. package/core/lib/lantern/simulation/ConnectionPool.test.js +0 -195
  416. package/core/lib/lantern/simulation/Constants.d.ts +0 -52
  417. package/core/lib/lantern/simulation/Constants.js +0 -48
  418. package/core/lib/lantern/simulation/DNSCache.d.ts +0 -42
  419. package/core/lib/lantern/simulation/DNSCache.js +0 -74
  420. package/core/lib/lantern/simulation/DNSCache.test.js +0 -72
  421. package/core/lib/lantern/simulation/NetworkAnalyzer.d.ts +0 -209
  422. package/core/lib/lantern/simulation/NetworkAnalyzer.js +0 -597
  423. package/core/lib/lantern/simulation/NetworkAnalyzer.test.js +0 -475
  424. package/core/lib/lantern/simulation/SimulationTimingMap.d.ts +0 -153
  425. package/core/lib/lantern/simulation/SimulationTimingMap.js +0 -219
  426. package/core/lib/lantern/simulation/Simulator.d.ts +0 -157
  427. package/core/lib/lantern/simulation/Simulator.js +0 -593
  428. package/core/lib/lantern/simulation/Simulator.test.js +0 -434
  429. package/core/lib/lantern/simulation/TCPConnection.test.d.ts +0 -2
  430. package/core/lib/lantern/simulation/TCPConnection.test.js +0 -374
  431. package/core/lib/lantern/simulation/TcpConnection.d.ts +0 -89
  432. package/core/lib/lantern/simulation/TcpConnection.js +0 -230
  433. package/core/lib/lantern/simulation/simulation.d.ts +0 -21
  434. package/core/lib/lantern/simulation/simulation.js +0 -28
  435. package/core/lib/lantern/types/lantern.d.ts +0 -256
  436. package/core/lib/lantern/types/lantern.js +0 -7
@@ -1,654 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2024 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- import assert from 'assert/strict';
8
-
9
- import * as Lantern from './lantern.js';
10
-
11
- const {PageDependencyGraph, NetworkRequestTypes} = Lantern;
12
-
13
- function createRequest(
14
- requestId,
15
- url,
16
- rendererStartTime = 0,
17
- initiator = null,
18
- resourceType = NetworkRequestTypes.Document,
19
- fromWorker = false
20
- ) {
21
- const networkEndTime = rendererStartTime + 50;
22
- return {
23
- requestId,
24
- url,
25
- rendererStartTime,
26
- networkEndTime,
27
- initiator,
28
- resourceType,
29
- fromWorker,
30
- };
31
- }
32
-
33
- const TOPLEVEL_TASK_NAME = 'TaskQueueManager::ProcessTaskFromWorkQueue';
34
- describe('PageDependencyGraph', () => {
35
- let traceEvents;
36
- let URL;
37
-
38
- function addTaskEvents(startTs, duration, evts) {
39
- const mainEvent = {
40
- name: TOPLEVEL_TASK_NAME,
41
- tid: 1,
42
- ts: startTs * 1000,
43
- dur: duration * 1000,
44
- args: {},
45
- };
46
-
47
- traceEvents.push(mainEvent);
48
-
49
- let i = 0;
50
- for (const evt of evts) {
51
- i++;
52
- traceEvents.push({
53
- name: evt.name,
54
- ts: (evt.ts * 1000) || (startTs * 1000 + i),
55
- args: {data: evt.data},
56
- });
57
- }
58
- }
59
-
60
- beforeEach(() => {
61
- traceEvents = [];
62
- URL = {requestedUrl: 'https://example.com/', mainDocumentUrl: 'https://example.com/'};
63
- });
64
-
65
- describe('#getNetworkNodeOutput', () => {
66
- const request1 = createRequest(1, 'https://example.com/');
67
- const request2 = createRequest(2, 'https://example.com/page');
68
- const request3 = createRequest(3, 'https://example.com/page');
69
- const networkRequests = [request1, request2, request3];
70
-
71
- it('should create network nodes', () => {
72
- const networkNodeOutput = PageDependencyGraph.getNetworkNodeOutput(networkRequests);
73
- for (let i = 0; i < networkRequests.length; i++) {
74
- const node = networkNodeOutput.nodes[i];
75
- assert.ok(node, `did not create node at index ${i}`);
76
- assert.equal(node.id, i + 1);
77
- assert.equal(node.type, 'network');
78
- assert.equal(node.request, networkRequests[i]);
79
- }
80
- });
81
-
82
- it('should ignore worker requests', () => {
83
- const workerRequest = createRequest(4, 'https://example.com/worker.js', 0, null, 'Script', true);
84
- const recordsWithWorker = [
85
- ...networkRequests,
86
- workerRequest,
87
- ];
88
-
89
- const networkNodeOutput = PageDependencyGraph.getNetworkNodeOutput(recordsWithWorker);
90
-
91
- expect(networkNodeOutput.nodes).toHaveLength(3);
92
- expect(networkNodeOutput.nodes.map(node => node.request)).not.toContain(workerRequest);
93
- });
94
-
95
- it('should index nodes by ID', () => {
96
- const networkNodeOutput = PageDependencyGraph.getNetworkNodeOutput(networkRequests);
97
- const indexedById = networkNodeOutput.idToNodeMap;
98
- for (const request of networkRequests) {
99
- assert.equal(indexedById.get(request.requestId).request, request);
100
- }
101
- });
102
-
103
- it('should index nodes by URL', () => {
104
- const networkNodeOutput = PageDependencyGraph.getNetworkNodeOutput(networkRequests);
105
- const nodes = networkNodeOutput.nodes;
106
- const indexedByUrl = networkNodeOutput.urlToNodeMap;
107
- assert.deepEqual(indexedByUrl.get('https://example.com/'), [nodes[0]]);
108
- assert.deepEqual(indexedByUrl.get('https://example.com/page'), [nodes[1], nodes[2]]);
109
- });
110
-
111
- it('should index nodes by frame', () => {
112
- const networkNodeOutput = PageDependencyGraph.getNetworkNodeOutput([
113
- {...createRequest(1, 'https://example.com/'), documentURL: 'https://example.com/', frameId: 'A'},
114
- {...createRequest(2, 'https://example.com/page'), documentURL: 'https://example.com/', frameId: 'A'},
115
- {...createRequest(3, 'https://example.com/page2'), documentURL: 'https://example.com/page2', frameId: 'C',
116
- resourceType: NetworkRequestTypes.XHR},
117
- {...createRequest(4, 'https://example.com/page3'), documentURL: 'https://example.com/page3', frameId: 'D'},
118
- {...createRequest(4, 'https://example.com/page4'), documentURL: 'https://example.com/page4', frameId: undefined},
119
- {...createRequest(4, 'https://example.com/page5'), documentURL: 'https://example.com/page5', frameId: 'collision'},
120
- {...createRequest(4, 'https://example.com/page6'), documentURL: 'https://example.com/page6', frameId: 'collision'},
121
- ]);
122
-
123
- const nodes = networkNodeOutput.nodes;
124
- const indexedByFrame = networkNodeOutput.frameIdToNodeMap;
125
- expect([...indexedByFrame.entries()]).toEqual([
126
- ['A', nodes[0]],
127
- ['D', nodes[3]],
128
- ['collision', null],
129
- ]);
130
- });
131
- });
132
-
133
- describe('#getCPUNodes', () => {
134
- it('should create CPU nodes', () => {
135
- addTaskEvents(0, 100, [
136
- {name: 'MyCustomEvent'},
137
- {name: 'OtherEvent'},
138
- {name: 'OutsideTheWindow', ts: 200},
139
- {name: 'OrphanedEvent'}, // should be ignored since we stopped at OutsideTheWindow
140
- ]);
141
-
142
- addTaskEvents(250, 50, [
143
- {name: 'LaterEvent'},
144
- ]);
145
-
146
- assert.equal(traceEvents.length, 7);
147
- const nodes = PageDependencyGraph.getCPUNodes(traceEvents);
148
- assert.equal(nodes.length, 2);
149
-
150
- const node1 = nodes[0];
151
- assert.equal(node1.id, '1.0');
152
- assert.equal(node1.type, 'cpu');
153
- assert.equal(node1.event, traceEvents[0]);
154
- assert.equal(node1.childEvents.length, 2);
155
- assert.equal(node1.childEvents[1].name, 'OtherEvent');
156
-
157
- const node2 = nodes[1];
158
- assert.equal(node2.id, '1.250000');
159
- assert.equal(node2.type, 'cpu');
160
- assert.equal(node2.event, traceEvents[5]);
161
- assert.equal(node2.childEvents.length, 1);
162
- assert.equal(node2.childEvents[0].name, 'LaterEvent');
163
- });
164
-
165
- it('should correct overlapping tasks', () => {
166
- addTaskEvents(0, 500, [
167
- {name: 'MyCustomEvent'},
168
- {name: 'OtherEvent'},
169
- ]);
170
-
171
- addTaskEvents(400, 50, [
172
- {name: 'OverlappingEvent'},
173
- ]);
174
-
175
- assert.equal(traceEvents.length, 5);
176
- const nodes = PageDependencyGraph.getCPUNodes(traceEvents);
177
- assert.equal(nodes.length, 2);
178
-
179
- const node1 = nodes[0];
180
- assert.equal(node1.id, '1.0');
181
- assert.equal(node1.type, 'cpu');
182
- assert.equal(node1.event, traceEvents[0]);
183
- assert.equal(node1.childEvents.length, 2);
184
- assert.equal(node1.childEvents[0].name, 'MyCustomEvent');
185
- assert.equal(node1.childEvents[1].name, 'OtherEvent');
186
-
187
- const node2 = nodes[1];
188
- assert.equal(node2.id, '1.400000');
189
- assert.equal(node2.type, 'cpu');
190
- assert.equal(node2.event, traceEvents[3]);
191
- assert.equal(node2.childEvents.length, 1);
192
- assert.equal(node2.childEvents[0].name, 'OverlappingEvent');
193
- });
194
- });
195
-
196
- describe('#createGraph', () => {
197
- it('should compute a simple network graph', () => {
198
- const request1 = createRequest(1, 'https://example.com/', 0);
199
- const request2 = createRequest(2, 'https://example.com/page', 5);
200
- const request3 = createRequest(3, 'https://example.com/page2', 5);
201
- const request4 = createRequest(4, 'https://example.com/page3', 10, {url: 'https://example.com/page'});
202
- const networkRequests = [request1, request2, request3, request4];
203
-
204
- addTaskEvents(0, 0, []);
205
-
206
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
207
- const nodes = [];
208
- graph.traverse(node => nodes.push(node));
209
-
210
- assert.equal(nodes.length, 4);
211
- assert.deepEqual(nodes.map(node => node.id), [1, 2, 3, 4]);
212
- assert.deepEqual(nodes[0].getDependencies(), []);
213
- assert.deepEqual(nodes[1].getDependencies(), [nodes[0]]);
214
- assert.deepEqual(nodes[2].getDependencies(), [nodes[0]]);
215
- assert.deepEqual(nodes[3].getDependencies(), [nodes[1]]);
216
- });
217
-
218
- it('should compute a simple network and CPU graph', () => {
219
- const request1 = createRequest(1, 'https://example.com/', 0);
220
- const request2 = createRequest(2, 'https://example.com/page', 50);
221
- const request3 = createRequest(3, 'https://example.com/page2', 50);
222
- const request4 = createRequest(4, 'https://example.com/page3', 300, null, NetworkRequestTypes.XHR);
223
- const networkRequests = [request1, request2, request3, request4];
224
-
225
- addTaskEvents(200, 200, [
226
- {name: 'EvaluateScript', data: {url: 'https://example.com/page'}},
227
- {name: 'ResourceSendRequest', data: {requestId: 4}},
228
- ]);
229
-
230
- addTaskEvents(700, 50, [
231
- {name: 'InvalidateLayout', data: {stackTrace: [{url: 'https://example.com/page2'}]}},
232
- {name: 'XHRReadyStateChange', data: {readyState: 4, url: 'https://example.com/page3'}},
233
- ]);
234
-
235
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
236
- const nodes = [];
237
- graph.traverse(node => nodes.push(node));
238
-
239
- const getIds = nodes => nodes.map(node => node.id);
240
- const getDependencyIds = node => getIds(node.getDependencies());
241
-
242
- assert.equal(nodes.length, 6);
243
- assert.deepEqual(getIds(nodes), [1, 2, 3, 4, '1.200000', '1.700000']);
244
- assert.deepEqual(getDependencyIds(nodes[0]), []);
245
- assert.deepEqual(getDependencyIds(nodes[1]), [1]);
246
- assert.deepEqual(getDependencyIds(nodes[2]), [1]);
247
- assert.deepEqual(getDependencyIds(nodes[3]), [1, '1.200000']);
248
- assert.deepEqual(getDependencyIds(nodes[4]), [2]);
249
- assert.deepEqual(getDependencyIds(nodes[5]), [3, 4]);
250
- });
251
-
252
- it('should compute a network graph with duplicate URLs', () => {
253
- const request1 = createRequest(1, 'https://example.com/', 0);
254
- const request2 = createRequest(2, 'https://example.com/page', 5);
255
- const request3 = createRequest(3, 'https://example.com/page', 5); // duplicate URL
256
- const request4 = createRequest(4, 'https://example.com/page3', 10, {url: 'https://example.com/page'});
257
- const networkRequests = [request1, request2, request3, request4];
258
-
259
- addTaskEvents(0, 0, []);
260
-
261
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
262
- const nodes = [];
263
- graph.traverse(node => nodes.push(node));
264
-
265
- assert.equal(nodes.length, 4);
266
- assert.deepEqual(nodes.map(node => node.id), [1, 2, 3, 4]);
267
- assert.deepEqual(nodes[0].getDependencies(), []);
268
- assert.deepEqual(nodes[1].getDependencies(), [nodes[0]]);
269
- assert.deepEqual(nodes[2].getDependencies(), [nodes[0]]);
270
- assert.deepEqual(nodes[3].getDependencies(), [nodes[0]]); // should depend on rootNode instead
271
- });
272
-
273
- it('should be forgiving without cyclic dependencies', () => {
274
- const request1 = createRequest(1, 'https://example.com/', 0);
275
- const request2 = createRequest(2, 'https://example.com/page', 250, null, NetworkRequestTypes.XHR);
276
- const request3 = createRequest(3, 'https://example.com/page2', 210);
277
- const request4 = createRequest(4, 'https://example.com/page3', 590);
278
- const request5 = createRequest(5, 'https://example.com/page4', 595, null, NetworkRequestTypes.XHR);
279
- const networkRequests = [request1, request2, request3, request4, request5];
280
-
281
- addTaskEvents(200, 200, [
282
- // CPU 1.2 should depend on Network 1
283
- {name: 'EvaluateScript', data: {url: 'https://example.com/'}},
284
-
285
- // Network 2 should depend on CPU 1.2, but 1.2 should not depend on Network 1
286
- {name: 'ResourceSendRequest', data: {requestId: 2}},
287
- {name: 'XHRReadyStateChange', data: {readyState: 4, url: 'https://example.com/page'}},
288
-
289
- // CPU 1.2 should not depend on Network 3 because it starts after CPU 1.2
290
- {name: 'EvaluateScript', data: {url: 'https://example.com/page2'}},
291
- ]);
292
-
293
- addTaskEvents(600, 150, [
294
- // CPU 1.6 should depend on Network 4 even though it ends at 410ms
295
- {name: 'InvalidateLayout', data: {stackTrace: [{url: 'https://example.com/page3'}]}},
296
- // Network 5 should not depend on CPU 1.6 because it started before CPU 1.6
297
- {name: 'ResourceSendRequest', data: {requestId: 5}},
298
- ]);
299
-
300
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
301
- const nodes = [];
302
- graph.traverse(node => nodes.push(node));
303
-
304
- const getDependencyIds = node => node.getDependencies().map(node => node.id);
305
-
306
- assert.equal(nodes.length, 7);
307
- assert.deepEqual(getDependencyIds(nodes[0]), []);
308
- assert.deepEqual(getDependencyIds(nodes[1]), [1, '1.200000']);
309
- assert.deepEqual(getDependencyIds(nodes[2]), [1]);
310
- assert.deepEqual(getDependencyIds(nodes[3]), [1]);
311
- assert.deepEqual(getDependencyIds(nodes[4]), [1]);
312
- assert.deepEqual(getDependencyIds(nodes[5]), [1]);
313
- assert.deepEqual(getDependencyIds(nodes[6]), [4]);
314
- });
315
-
316
- it('should not install timer dependency on itself', () => {
317
- const request1 = createRequest(1, 'https://example.com/', 0);
318
- const networkRequests = [request1];
319
-
320
- addTaskEvents(200, 200, [
321
- // CPU 1.2 should depend on Network 1
322
- {name: 'EvaluateScript', data: {url: 'https://example.com/'}},
323
- // CPU 1.2 will install and fire it's own timer, but should not depend on itself
324
- {name: 'TimerInstall', data: {timerId: 'timer1'}},
325
- {name: 'TimerFire', data: {timerId: 'timer1'}},
326
- ]);
327
-
328
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
329
- const nodes = [];
330
- graph.traverse(node => nodes.push(node));
331
-
332
- const getDependencyIds = node => node.getDependencies().map(node => node.id);
333
-
334
- assert.equal(nodes.length, 2);
335
- assert.deepEqual(getDependencyIds(nodes[0]), []);
336
- assert.deepEqual(getDependencyIds(nodes[1]), [1]);
337
- });
338
-
339
- it('should prune short tasks', () => {
340
- const request0 = createRequest(0, 'https://example.com/page0', 0);
341
- const request1 = createRequest(1, 'https://example.com/', 100, null, NetworkRequestTypes.Script);
342
- const request2 = createRequest(2, 'https://example.com/page', 200, null, NetworkRequestTypes.XHR);
343
- const request3 = createRequest(3, 'https://example.com/page2', 300, null, NetworkRequestTypes.Script);
344
- const request4 = createRequest(4, 'https://example.com/page3', 400, null, NetworkRequestTypes.XHR);
345
- const networkRequests = [request0, request1, request2, request3, request4];
346
- URL = {requestedUrl: 'https://example.com/page0', mainDocumentUrl: 'https://example.com/page0'};
347
-
348
- // Long task, should be kept in the output.
349
- addTaskEvents(120, 50, [
350
- {name: 'EvaluateScript', data: {url: 'https://example.com/'}},
351
- {name: 'ResourceSendRequest', data: {requestId: 2}},
352
- {name: 'XHRReadyStateChange', data: {readyState: 4, url: 'https://example.com/page'}},
353
- ]);
354
-
355
- // Short task, should be pruned, but the 3->4 relationship should be retained
356
- addTaskEvents(350, 5, [
357
- {name: 'EvaluateScript', data: {url: 'https://example.com/page2'}},
358
- {name: 'ResourceSendRequest', data: {requestId: 4}},
359
- {name: 'XHRReadyStateChange', data: {readyState: 4, url: 'https://example.com/page3'}},
360
- ]);
361
-
362
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
363
- const nodes = [];
364
- graph.traverse(node => nodes.push(node));
365
-
366
- const getDependencyIds = node => node.getDependencies().map(node => node.id);
367
-
368
- assert.equal(nodes.length, 6);
369
-
370
- assert.deepEqual(getDependencyIds(nodes[0]), []);
371
- assert.deepEqual(getDependencyIds(nodes[1]), [0]);
372
- assert.deepEqual(getDependencyIds(nodes[2]), [0, '1.120000']);
373
- assert.deepEqual(getDependencyIds(nodes[3]), [0]);
374
- assert.deepEqual(getDependencyIds(nodes[4]), [0, 3]);
375
-
376
- assert.equal('1.120000', nodes[5].id);
377
- assert.deepEqual(getDependencyIds(nodes[5]), [1]);
378
- });
379
-
380
- it('should not prune highly-connected short tasks', () => {
381
- const request0 = createRequest(0, 'https://example.com/page0', 0);
382
- const request1 = {
383
- ...createRequest(1, 'https://example.com/', 100, null, NetworkRequestTypes.Document),
384
- documentURL: 'https://example.com/',
385
- frameId: 'frame1',
386
- };
387
- const request2 = {
388
- ...createRequest(2, 'https://example.com/page', 200, null, NetworkRequestTypes.Script),
389
- documentURL: 'https://example.com/',
390
- frameId: 'frame1',
391
- };
392
- const request3 = createRequest(3, 'https://example.com/page2', 300, null, NetworkRequestTypes.XHR);
393
- const request4 = createRequest(4, 'https://example.com/page3', 400, null, NetworkRequestTypes.XHR);
394
- const networkRequests = [request0, request1, request2, request3, request4];
395
- URL = {requestedUrl: 'https://example.com/page0', mainDocumentUrl: 'https://example.com/page0'};
396
-
397
- // Short task, evaluates script (2) and sends two XHRs.
398
- addTaskEvents(220, 5, [
399
- {name: 'EvaluateScript', data: {url: 'https://example.com/page', frame: 'frame1'}},
400
-
401
- {name: 'ResourceSendRequest', data: {requestId: 3}},
402
- {name: 'XHRReadyStateChange', data: {readyState: 4, url: 'https://example.com/page2'}},
403
-
404
- {name: 'ResourceSendRequest', data: {requestId: 4}},
405
- {name: 'XHRReadyStateChange', data: {readyState: 4, url: 'https://example.com/page3'}},
406
- ]);
407
-
408
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
409
- const nodes = [];
410
- graph.traverse(node => nodes.push(node));
411
-
412
- const getDependencyIds = node => node.getDependencies().map(node => node.id);
413
-
414
- assert.equal(nodes.length, 6);
415
-
416
- assert.deepEqual(getDependencyIds(nodes[0]), []);
417
- assert.deepEqual(getDependencyIds(nodes[1]), [0]);
418
- assert.deepEqual(getDependencyIds(nodes[2]), [0]);
419
- assert.deepEqual(getDependencyIds(nodes[3]), [0, '1.220000']);
420
- assert.deepEqual(getDependencyIds(nodes[4]), [0, '1.220000']);
421
-
422
- assert.equal('1.220000', nodes[5].id);
423
- assert.deepEqual(getDependencyIds(nodes[5]), [1, 2]);
424
- });
425
-
426
- it('should not prune short, first tasks of critical events', () => {
427
- const request0 = createRequest(0, 'https://example.com/page0', 0);
428
- const networkRequests = [request0];
429
- URL = {requestedUrl: 'https://example.com/page0', mainDocumentUrl: 'https://example.com/page0'};
430
-
431
- const makeShortEvent = firstEventName => {
432
- const startTs = traceEvents.length * 100;
433
- addTaskEvents(startTs, 5, [
434
- {name: firstEventName, data: {url: 'https://example.com/page0'}},
435
- ]);
436
- };
437
-
438
- const criticalEventNames = [
439
- 'Paint',
440
- 'Layout',
441
- 'ParseHTML',
442
- ];
443
- for (const eventName of criticalEventNames) {
444
- makeShortEvent(eventName);
445
- makeShortEvent(eventName);
446
- }
447
-
448
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
449
- const cpuNodes = [];
450
- graph.traverse(node => node.type === 'cpu' && cpuNodes.push(node));
451
-
452
- expect(cpuNodes.map(node => {
453
- return {
454
- id: node.id,
455
- name: node.childEvents[0].name,
456
- };
457
- })).toEqual([
458
- {
459
- id: '1.0',
460
- name: 'Paint',
461
- },
462
- {
463
- // ID jumps by 4 between each because each node has 2 CPU tasks and we skip the 2nd of each event type
464
- id: '1.400000',
465
- name: 'Layout',
466
- },
467
- {
468
- id: '1.800000',
469
- name: 'ParseHTML',
470
- },
471
- ]);
472
- });
473
-
474
- it('should set isMainDocument on request with mainDocumentUrl', () => {
475
- const request1 = createRequest(1, 'https://example.com/', 0, null, NetworkRequestTypes.Other);
476
- const request2 = createRequest(2, 'https://example.com/page', 5, null, NetworkRequestTypes.Document);
477
- // Add in another unrelated + early request to make sure we pick the correct chain
478
- const request3 = createRequest(3, 'https://example.com/page2', 0, null, NetworkRequestTypes.Other);
479
- request2.redirects = [request1];
480
- const networkRequests = [request1, request2, request3];
481
- URL = {requestedUrl: 'https://example.com/', mainDocumentUrl: 'https://example.com/page'};
482
-
483
- addTaskEvents(0, 0, []);
484
-
485
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
486
- const nodes = [];
487
- graph.traverse(node => nodes.push(node));
488
-
489
- assert.equal(nodes.length, 3);
490
- assert.equal(nodes[0].id, 1);
491
- assert.equal(nodes[0].isMainDocument(), false);
492
- assert.equal(nodes[1].isMainDocument(), true);
493
- assert.equal(nodes[2].isMainDocument(), false);
494
- });
495
-
496
- it('should link up script initiators', () => {
497
- const request1 = createRequest(1, 'https://example.com/', 0);
498
- const request2 = createRequest(2, 'https://example.com/page', 5);
499
- const request3 = createRequest(3, 'https://example.com/page2', 5);
500
- const request4 = createRequest(4, 'https://example.com/page3', 20);
501
- // Set multiple initiator requests through script stack.
502
- request4.initiator = {
503
- type: 'script',
504
- stack: {callFrames: [{url: 'https://example.com/page'}], parent: {parent: {callFrames: [{url: 'https://example.com/page2'}]}}},
505
- };
506
- // Also set the initiatorRequest that Lighthouse's network-recorder.js creates.
507
- // This should be ignored and only used as a fallback.
508
- request4.initiatorRequest = request1;
509
- const networkRequests = [request1, request2, request3, request4];
510
-
511
- addTaskEvents(0, 0, []);
512
-
513
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
514
- const nodes = [];
515
- graph.traverse(node => nodes.push(node));
516
-
517
- assert.equal(nodes.length, 4);
518
- assert.deepEqual(nodes.map(node => node.id), [1, 2, 3, 4]);
519
- assert.deepEqual(nodes[0].getDependencies(), []);
520
- assert.deepEqual(nodes[1].getDependencies(), [nodes[0]]);
521
- assert.deepEqual(nodes[2].getDependencies(), [nodes[0]]);
522
- assert.deepEqual(nodes[3].getDependencies(), [nodes[1], nodes[2]]);
523
- });
524
-
525
- it('should link up script initiators only when timing is valid', () => {
526
- const request1 = createRequest(1, 'https://example.com/', 0);
527
- const request2 = createRequest(2, 'https://example.com/page', 500);
528
- const request3 = createRequest(3, 'https://example.com/page2', 500);
529
- const request4 = createRequest(4, 'https://example.com/page3', 20);
530
- request4.initiator = {
531
- type: 'script',
532
- stack: {callFrames: [{url: 'https://example.com/page'}], parent: {parent: {callFrames: [{url: 'https://example.com/page2'}]}}},
533
- };
534
- const networkRequests = [request1, request2, request3, request4];
535
-
536
- addTaskEvents(0, 0, []);
537
-
538
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
539
- const nodes = [];
540
- graph.traverse(node => nodes.push(node));
541
-
542
- assert.equal(nodes.length, 4);
543
- assert.deepEqual(nodes.map(node => node.id), [1, 2, 3, 4]);
544
- assert.deepEqual(nodes[0].getDependencies(), []);
545
- assert.deepEqual(nodes[1].getDependencies(), [nodes[0]]);
546
- assert.deepEqual(nodes[2].getDependencies(), [nodes[0]]);
547
- assert.deepEqual(nodes[3].getDependencies(), [nodes[0]]);
548
- });
549
-
550
- it('should link up script initiators with prefetch requests', () => {
551
- const request1 = createRequest(1, 'https://a.com/1', 0);
552
- const request2Prefetch = createRequest(2, 'https://a.com/js', 5);
553
- const request2Fetch = createRequest(3, 'https://a.com/js', 10);
554
- const request3 = createRequest(4, 'https://a.com/4', 20);
555
- // Set the initiator to an ambiguous URL (there are 2 requests for https://a.com/js)
556
- request3.initiator = {
557
- type: 'script',
558
- stack: {callFrames: [{url: 'https://a.com/js'}], parent: {parent: {callFrames: [{url: 'js'}]}}},
559
- };
560
- // Set the initiatorRequest that it should fallback to.
561
- request3.initiatorRequest = request2Fetch;
562
- const networkRequests = [request1, request2Prefetch, request2Fetch, request3];
563
- URL = {requestedUrl: 'https://a.com/1', mainDocumentUrl: 'https://a.com/1'};
564
-
565
- addTaskEvents(0, 0, []);
566
-
567
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
568
- const nodes = [];
569
- graph.traverse(node => nodes.push(node));
570
-
571
- assert.equal(nodes.length, 4);
572
- assert.deepEqual(nodes.map(node => node.id), [1, 2, 3, 4]);
573
- assert.deepEqual(nodes[0].getDependencies(), []);
574
- assert.deepEqual(nodes[1].getDependencies(), [nodes[0]]);
575
- assert.deepEqual(nodes[2].getDependencies(), [nodes[0]]);
576
- assert.deepEqual(nodes[3].getDependencies(), [nodes[2]]);
577
- });
578
-
579
- it('should not link up initiators with circular dependencies', () => {
580
- const rootRequest = createRequest(1, 'https://a.com', 0);
581
- // jsRequest1 initiated by jsRequest2
582
- // *AND*
583
- // jsRequest2 initiated by jsRequest1
584
- const jsRequest1 = createRequest(2, 'https://a.com/js1', 1, {url: 'https://a.com/js2'});
585
- const jsRequest2 = createRequest(3, 'https://a.com/js2', 1, {url: 'https://a.com/js1'});
586
- const networkRequests = [rootRequest, jsRequest1, jsRequest2];
587
- URL = {requestedUrl: 'https://a.com', mainDocumentUrl: 'https://a.com'};
588
-
589
- addTaskEvents(0, 0, []);
590
-
591
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
592
- const nodes = [];
593
- graph.traverse(node => nodes.push(node));
594
- nodes.sort((a, b) => a.id - b.id);
595
-
596
- assert.equal(nodes.length, 3);
597
- assert.deepEqual(nodes.map(node => node.id), [1, 2, 3]);
598
- assert.deepEqual(nodes[0].getDependencies(), []);
599
- // We don't know which of the initiators to trust in a cycle, so for now we
600
- // trust the earliest one (mostly because it's simplest).
601
- // In the wild so far we've only seen this for self-referential relationships.
602
- // If the evidence changes, then feel free to change these expectations :)
603
- assert.deepEqual(nodes[1].getDependencies(), [nodes[2]]);
604
- assert.deepEqual(nodes[2].getDependencies(), [nodes[0]]);
605
- });
606
-
607
- it('should not link up initiatorRequests with circular dependencies', () => {
608
- const rootRequest = createRequest(1, 'https://a.com', 0);
609
- // jsRequest1 initiated by jsRequest2
610
- // *AND*
611
- // jsRequest2 initiated by jsRequest1
612
- const jsRequest1 = createRequest(2, 'https://a.com/js1', 1);
613
- const jsRequest2 = createRequest(3, 'https://a.com/js2', 1);
614
- jsRequest1.initiatorRequest = jsRequest2;
615
- jsRequest2.initiatorRequest = jsRequest1;
616
- const networkRequests = [rootRequest, jsRequest1, jsRequest2];
617
- URL = {requestedUrl: 'https://a.com', mainDocumentUrl: 'https://a.com'};
618
-
619
- addTaskEvents(0, 0, []);
620
-
621
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
622
- const nodes = [];
623
- graph.traverse(node => nodes.push(node));
624
- nodes.sort((a, b) => a.id - b.id);
625
-
626
- assert.equal(nodes.length, 3);
627
- assert.deepEqual(nodes.map(node => node.id), [1, 2, 3]);
628
- assert.deepEqual(nodes[0].getDependencies(), []);
629
- assert.deepEqual(nodes[1].getDependencies(), [nodes[2]]);
630
- assert.deepEqual(nodes[2].getDependencies(), [nodes[0]]);
631
- });
632
-
633
- it('should find root if it is not the first node', () => {
634
- const request1 = createRequest(1, 'https://example.com/', 0, null, NetworkRequestTypes.Other);
635
- const request2 = createRequest(2, 'https://example.com/page', 5, null, NetworkRequestTypes.Document);
636
- const networkRequests = [request1, request2];
637
- URL = {requestedUrl: 'https://example.com/page', mainDocumentUrl: 'https://example.com/page'};
638
-
639
- // Evaluated before root request.
640
- addTaskEvents(0.1, 50, [
641
- {name: 'EvaluateScript'},
642
- ]);
643
-
644
- const graph = PageDependencyGraph.createGraph(traceEvents, networkRequests, URL);
645
- const nodes = [];
646
- graph.traverse(node => nodes.push(node));
647
-
648
- assert.equal(nodes.length, 1);
649
- assert.deepEqual(nodes.map(node => node.id), [2]);
650
- assert.deepEqual(nodes[0].getDependencies(), []);
651
- assert.deepEqual(nodes[0].getDependents(), []);
652
- });
653
- });
654
- });