@paulirish/trace_engine 0.0.10 → 0.0.12

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 (256) hide show
  1. package/README.md +1 -1
  2. package/analyze-trace.mjs +1 -1
  3. package/core/platform/DevToolsPath.d.ts +4 -13
  4. package/core/platform/DevToolsPath.js +7 -4
  5. package/core/platform/DevToolsPath.js.map +1 -7
  6. package/core/platform/MimeType.d.ts +27 -0
  7. package/core/platform/MimeType.js +119 -86
  8. package/core/platform/MimeType.js.map +1 -7
  9. package/core/platform/Timing.d.ts +7 -0
  10. package/core/platform/Timing.js +7 -4
  11. package/core/platform/Timing.js.map +1 -7
  12. package/core/platform/UIString.d.ts +2 -5
  13. package/core/platform/UIString.js +5 -2
  14. package/core/platform/UIString.js.map +1 -7
  15. package/core/platform/UserVisibleError.js +19 -10
  16. package/core/platform/UserVisibleError.js.map +1 -7
  17. package/core/platform/array-utilities.d.ts +48 -10
  18. package/core/platform/array-utilities.js +160 -124
  19. package/core/platform/array-utilities.js.map +1 -7
  20. package/core/platform/brand.d.ts +14 -0
  21. package/core/platform/brand.js +5 -1
  22. package/core/platform/brand.js.map +1 -7
  23. package/core/platform/date-utilities.js +10 -6
  24. package/core/platform/date-utilities.js.map +1 -7
  25. package/core/platform/dom-utilities.d.ts +3 -1
  26. package/core/platform/dom-utilities.js +94 -83
  27. package/core/platform/dom-utilities.js.map +1 -7
  28. package/core/platform/keyboard-utilities.d.ts +2 -0
  29. package/core/platform/keyboard-utilities.js +15 -24
  30. package/core/platform/keyboard-utilities.js.map +1 -7
  31. package/core/platform/map-utilities.d.ts +4 -0
  32. package/core/platform/map-utilities.js +66 -60
  33. package/core/platform/map-utilities.js.map +1 -7
  34. package/core/platform/number-utilities.js +66 -55
  35. package/core/platform/number-utilities.js.map +1 -7
  36. package/core/platform/platform.d.ts +5 -1
  37. package/core/platform/platform.js +54 -37
  38. package/core/platform/platform.js.map +1 -7
  39. package/core/platform/promise-utilities.d.ts +10 -0
  40. package/core/platform/promise-utilities.js +16 -8
  41. package/core/platform/promise-utilities.js.map +1 -7
  42. package/core/platform/set-utilities.js +20 -17
  43. package/core/platform/set-utilities.js.map +1 -7
  44. package/core/platform/string-utilities.d.ts +32 -1
  45. package/core/platform/string-utilities.js +453 -379
  46. package/core/platform/string-utilities.js.map +1 -7
  47. package/core/platform/typescript-utilities.d.ts +5 -5
  48. package/core/platform/typescript-utilities.js +19 -7
  49. package/core/platform/typescript-utilities.js.map +1 -7
  50. package/generated/protocol.d.ts +2081 -347
  51. package/generated/protocol.js +5 -2230
  52. package/models/cpu_profile/CPUProfileDataModel.d.ts +77 -0
  53. package/models/cpu_profile/CPUProfileDataModel.js +492 -359
  54. package/models/cpu_profile/CPUProfileDataModel.js.map +1 -7
  55. package/models/cpu_profile/ProfileTreeModel.d.ts +29 -0
  56. package/models/cpu_profile/ProfileTreeModel.js +87 -82
  57. package/models/cpu_profile/ProfileTreeModel.js.map +1 -7
  58. package/models/cpu_profile/cpu_profile.d.ts +3 -0
  59. package/models/cpu_profile/cpu_profile.js +7 -7
  60. package/models/cpu_profile/cpu_profile.js.map +1 -7
  61. package/models/trace/EntriesFilter.d.ts +55 -0
  62. package/models/trace/EntriesFilter.js +227 -166
  63. package/models/trace/EntriesFilter.js.map +1 -7
  64. package/models/trace/LegacyTracingModel.js.map +1 -7
  65. package/models/trace/ModelImpl.d.ts +110 -0
  66. package/models/trace/ModelImpl.js +161 -102
  67. package/models/trace/ModelImpl.js.map +1 -7
  68. package/models/trace/Processor.d.ts +36 -0
  69. package/models/trace/Processor.js +197 -163
  70. package/models/trace/Processor.js.map +1 -7
  71. package/models/trace/TracingManager.js.map +1 -7
  72. package/models/trace/extras/FetchNodes.d.ts +46 -0
  73. package/models/trace/extras/FetchNodes.js +132 -91
  74. package/models/trace/extras/FetchNodes.js.map +1 -7
  75. package/models/trace/extras/FilmStrip.d.ts +19 -0
  76. package/models/trace/extras/FilmStrip.js +38 -31
  77. package/models/trace/extras/FilmStrip.js.map +1 -7
  78. package/models/trace/extras/MainThreadActivity.d.ts +2 -0
  79. package/models/trace/extras/MainThreadActivity.js +72 -56
  80. package/models/trace/extras/MainThreadActivity.js.map +1 -7
  81. package/models/trace/extras/Metadata.d.ts +2 -0
  82. package/models/trace/extras/Metadata.js +42 -26
  83. package/models/trace/extras/Metadata.js.map +1 -7
  84. package/models/trace/extras/extras.js.map +1 -7
  85. package/models/trace/handlers/AnimationHandler.d.ts +8 -0
  86. package/models/trace/handlers/AnimationHandler.js +22 -20
  87. package/models/trace/handlers/AnimationHandler.js.map +1 -7
  88. package/models/trace/handlers/AuctionWorkletsHandler.d.ts +8 -0
  89. package/models/trace/handlers/AuctionWorkletsHandler.js +143 -89
  90. package/models/trace/handlers/AuctionWorkletsHandler.js.map +1 -7
  91. package/models/trace/handlers/FramesHandler.d.ts +76 -0
  92. package/models/trace/handlers/FramesHandler.js +424 -355
  93. package/models/trace/handlers/FramesHandler.js.map +1 -7
  94. package/models/trace/handlers/GPUHandler.d.ts +11 -0
  95. package/models/trace/handlers/GPUHandler.js +41 -37
  96. package/models/trace/handlers/GPUHandler.js.map +1 -7
  97. package/models/trace/handlers/InitiatorsHandler.d.ts +10 -0
  98. package/models/trace/handlers/InitiatorsHandler.js +164 -113
  99. package/models/trace/handlers/InitiatorsHandler.js.map +1 -7
  100. package/models/trace/handlers/InvalidationsHandler.d.ts +10 -0
  101. package/models/trace/handlers/InvalidationsHandler.js +101 -79
  102. package/models/trace/handlers/InvalidationsHandler.js.map +1 -7
  103. package/models/trace/handlers/LargestImagePaintHandler.d.ts +5 -0
  104. package/models/trace/handlers/LargestImagePaintHandler.js +32 -12
  105. package/models/trace/handlers/LargestImagePaintHandler.js.map +1 -7
  106. package/models/trace/handlers/LargestTextPaintHandler.d.ts +5 -0
  107. package/models/trace/handlers/LargestTextPaintHandler.js +20 -12
  108. package/models/trace/handlers/LargestTextPaintHandler.js.map +1 -7
  109. package/models/trace/handlers/LayerTreeHandler.d.ts +13 -0
  110. package/models/trace/handlers/LayerTreeHandler.js +96 -70
  111. package/models/trace/handlers/LayerTreeHandler.js.map +1 -7
  112. package/models/trace/handlers/LayoutShiftsHandler.d.ts +44 -0
  113. package/models/trace/handlers/LayoutShiftsHandler.js +304 -227
  114. package/models/trace/handlers/LayoutShiftsHandler.js.map +1 -7
  115. package/models/trace/handlers/MemoryHandler.d.ts +7 -0
  116. package/models/trace/handlers/MemoryHandler.js +14 -11
  117. package/models/trace/handlers/MemoryHandler.js.map +1 -7
  118. package/models/trace/handlers/MetaHandler.d.ts +37 -0
  119. package/models/trace/handlers/MetaHandler.js +314 -226
  120. package/models/trace/handlers/MetaHandler.js.map +1 -7
  121. package/models/trace/handlers/ModelHandlers.d.ts +21 -0
  122. package/models/trace/handlers/ModelHandlers.js +25 -22
  123. package/models/trace/handlers/ModelHandlers.js.map +1 -7
  124. package/models/trace/handlers/NetworkRequestsHandler.d.ts +17 -0
  125. package/models/trace/handlers/NetworkRequestsHandler.js +342 -218
  126. package/models/trace/handlers/NetworkRequestsHandler.js.map +1 -7
  127. package/models/trace/handlers/PageLoadMetricsHandler.d.ts +67 -0
  128. package/models/trace/handlers/PageLoadMetricsHandler.js +357 -284
  129. package/models/trace/handlers/PageLoadMetricsHandler.js.map +1 -7
  130. package/models/trace/handlers/RendererHandler.d.ts +101 -0
  131. package/models/trace/handlers/RendererHandler.js +295 -191
  132. package/models/trace/handlers/RendererHandler.js.map +1 -7
  133. package/models/trace/handlers/SamplesHandler.d.ts +46 -0
  134. package/models/trace/handlers/SamplesHandler.js +195 -158
  135. package/models/trace/handlers/SamplesHandler.js.map +1 -7
  136. package/models/trace/handlers/ScreenshotsHandler.d.ts +7 -0
  137. package/models/trace/handlers/ScreenshotsHandler.js +63 -41
  138. package/models/trace/handlers/ScreenshotsHandler.js.map +1 -7
  139. package/models/trace/handlers/Threads.d.ts +33 -0
  140. package/models/trace/handlers/Threads.js +85 -67
  141. package/models/trace/handlers/Threads.js.map +1 -7
  142. package/models/trace/handlers/UserInteractionsHandler.d.ts +57 -0
  143. package/models/trace/handlers/UserInteractionsHandler.js +240 -141
  144. package/models/trace/handlers/UserInteractionsHandler.js.map +1 -7
  145. package/models/trace/handlers/UserTimingsHandler.d.ts +28 -0
  146. package/models/trace/handlers/UserTimingsHandler.js +91 -80
  147. package/models/trace/handlers/UserTimingsHandler.js.map +1 -7
  148. package/models/trace/handlers/WarningsHandler.d.ts +14 -0
  149. package/models/trace/handlers/WarningsHandler.js +100 -62
  150. package/models/trace/handlers/WarningsHandler.js.map +1 -7
  151. package/models/trace/handlers/WorkersHandler.d.ts +11 -0
  152. package/models/trace/handlers/WorkersHandler.js +40 -38
  153. package/models/trace/handlers/WorkersHandler.js.map +1 -7
  154. package/models/trace/handlers/handlers.d.ts +3 -0
  155. package/models/trace/handlers/handlers.js +7 -4
  156. package/models/trace/handlers/handlers.js.map +1 -7
  157. package/models/trace/handlers/types.d.ts +45 -0
  158. package/models/trace/handlers/types.js +15 -15
  159. package/models/trace/handlers/types.js.map +1 -7
  160. package/models/trace/helpers/SamplesIntegrator.d.ts +49 -0
  161. package/models/trace/helpers/SamplesIntegrator.js +381 -204
  162. package/models/trace/helpers/SamplesIntegrator.js.map +1 -7
  163. package/models/trace/helpers/Timing.d.ts +26 -0
  164. package/models/trace/helpers/Timing.js +131 -110
  165. package/models/trace/helpers/Timing.js.map +1 -7
  166. package/models/trace/helpers/Trace.d.ts +37 -0
  167. package/models/trace/helpers/Trace.js +200 -166
  168. package/models/trace/helpers/Trace.js.map +1 -7
  169. package/models/trace/helpers/TreeHelpers.d.ts +90 -0
  170. package/models/trace/helpers/TreeHelpers.js +203 -100
  171. package/models/trace/helpers/TreeHelpers.js.map +1 -7
  172. package/models/trace/helpers/helpers.d.ts +4 -0
  173. package/models/trace/helpers/helpers.js +8 -5
  174. package/models/trace/helpers/helpers.js.map +1 -7
  175. package/models/trace/root-causes/LayoutShift.d.ts +119 -0
  176. package/models/trace/root-causes/LayoutShift.js +470 -323
  177. package/models/trace/root-causes/LayoutShift.js.map +1 -7
  178. package/models/trace/root-causes/RootCauses.d.ts +14 -0
  179. package/models/trace/root-causes/RootCauses.js +9 -6
  180. package/models/trace/root-causes/RootCauses.js.map +1 -7
  181. package/models/trace/root-causes/root-causes.d.ts +1 -0
  182. package/models/trace/root-causes/root-causes.js +5 -2
  183. package/models/trace/root-causes/root-causes.js.map +1 -7
  184. package/models/trace/trace.d.ts +11 -0
  185. package/models/trace/trace.js +17 -23
  186. package/models/trace/trace.js.map +1 -7
  187. package/models/trace/types/Configuration.d.ts +33 -0
  188. package/models/trace/types/Configuration.js +25 -14
  189. package/models/trace/types/Configuration.js.map +1 -7
  190. package/models/trace/types/File.d.ts +23 -0
  191. package/models/trace/types/File.js +5 -6
  192. package/models/trace/types/File.js.map +1 -7
  193. package/models/trace/types/Timing.d.ts +25 -0
  194. package/models/trace/types/Timing.js +10 -11
  195. package/models/trace/types/Timing.js.map +1 -7
  196. package/models/trace/types/TraceEvents.d.ts +1571 -0
  197. package/models/trace/types/TraceEvents.js +174 -381
  198. package/models/trace/types/TraceEvents.js.map +1 -7
  199. package/models/trace/types/types.d.ts +4 -0
  200. package/models/trace/types/types.js +8 -5
  201. package/models/trace/types/types.js.map +1 -7
  202. package/package.json +1 -1
  203. package/TracingManager.js +0 -0
  204. package/core/platform/devtools_entrypoint-bundle-tsconfig-tsconfig.json +0 -40
  205. package/core/platform/platform.js.compressed +0 -0
  206. package/core/platform/platform.js.hash +0 -1
  207. package/core/platform/platform.prebundle.d.ts +0 -15
  208. package/core/platform/platform.prebundle.js +0 -50
  209. package/core/platform/platform.prebundle.js.map +0 -1
  210. package/core/platform/platform.prebundle.ts +0 -64
  211. package/extras/extras.js +0 -0
  212. package/models/trace/SDKServices.js +0 -104
  213. package/models/trace/SDKServices.js.map +0 -7
  214. package/models/trace/TraceProcessor.js +0 -133
  215. package/models/trace/TraceProcessor.js.map +0 -7
  216. package/models/trace/TreeManipulator.js +0 -85
  217. package/models/trace/TreeManipulator.js.map +0 -7
  218. package/models/trace/devtools_entrypoint-legacy-typescript-tsconfig.json +0 -43
  219. package/models/trace/frames/TimelineFrameModel.js +0 -392
  220. package/models/trace/frames/TimelineFrameModel.js.map +0 -7
  221. package/models/trace/frames/bundle-tsconfig.json +0 -1
  222. package/models/trace/frames/devtools_entrypoint-bundle-typescript-tsconfig.json +0 -43
  223. package/models/trace/frames/frames-tsconfig.json +0 -58
  224. package/models/trace/frames/frames.js +0 -5
  225. package/models/trace/frames/frames.js.map +0 -7
  226. package/models/trace/handlers/Migration.js +0 -27
  227. package/models/trace/handlers/Migration.js.map +0 -7
  228. package/models/trace/handlers/UberFramesHandler.js +0 -293
  229. package/models/trace/handlers/UberFramesHandler.js.map +0 -7
  230. package/models/trace/legacy-tsconfig.json +0 -1
  231. package/models/trace/sdk_services/DOMNodeLookup.js +0 -41
  232. package/models/trace/sdk_services/DOMNodeLookup.js.map +0 -7
  233. package/models/trace/sdk_services/LayoutShifts.js +0 -68
  234. package/models/trace/sdk_services/LayoutShifts.js.map +0 -7
  235. package/models/trace/sdk_services/bundle-tsconfig.json +0 -1
  236. package/models/trace/sdk_services/devtools_entrypoint-bundle-typescript-tsconfig.json +0 -41
  237. package/models/trace/sdk_services/sdk_services-tsconfig.json +0 -57
  238. package/models/trace/sdk_services/sdk_services.js +0 -7
  239. package/models/trace/sdk_services/sdk_services.js.map +0 -7
  240. package/models/trace/trace-legacy.js +0 -16
  241. package/models/trace/trace-legacy.js.map +0 -7
  242. package/models/trace/worker/Processor.js +0 -143
  243. package/models/trace/worker/Processor.js.map +0 -7
  244. package/models/trace/worker/Types.js +0 -1
  245. package/models/trace/worker/Types.js.map +0 -7
  246. package/models/trace/worker/bundle-tsconfig.json +0 -1
  247. package/models/trace/worker/devtools_entrypoint-bundle-typescript-tsconfig.json +0 -41
  248. package/models/trace/worker/devtools_entrypoint-worker_entrypoint-typescript-tsconfig.json +0 -41
  249. package/models/trace/worker/processor-tsconfig.json +0 -45
  250. package/models/trace/worker/worker.js +0 -7
  251. package/models/trace/worker/worker.js.map +0 -7
  252. package/models/trace/worker/worker_entrypoint-tsconfig.json +0 -1
  253. package/models/trace/worker/worker_entrypoint.js +0 -36
  254. package/models/trace/worker/worker_entrypoint.js.map +0 -7
  255. package/trace.mjs +0 -6980
  256. package/trace.mjs.map +0 -8
@@ -1,334 +1,407 @@
1
- import * as Platform from "../../../core/platform/platform.js";
2
- import * as Helpers from "../helpers/helpers.js";
3
- import * as Types from "../types/types.js";
4
- import { data as metaHandlerData } from "./MetaHandler.js";
5
- const metricScoresByFrameId = /* @__PURE__ */ new Map();
1
+ // Copyright 2022 The Chromium Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+ /**
5
+ * This handler stores page load metrics, including web vitals,
6
+ * and exports them in the shape of a map with the following shape:
7
+ * Map(FrameId -> Map(navigationID -> metrics) )
8
+ *
9
+ * It also exports all markers in a trace in an array.
10
+ *
11
+ * Some metrics are taken directly from a page load events (AKA markers) like DCL.
12
+ * Others require processing multiple events to be determined, like CLS and TBT.
13
+ */
14
+ import * as Platform from '../../../core/platform/platform.js';
15
+ import * as Helpers from '../helpers/helpers.js';
16
+ import * as Types from '../types/types.js';
17
+ import { data as metaHandlerData } from './MetaHandler.js';
18
+ /**
19
+ * This represents the metric scores for all navigations, for all frames in a trace.
20
+ * Given a frame id, the map points to another map from navigation id to metric scores.
21
+ * The metric scores include the event related to the metric as well as the data regarding
22
+ * the score itself.
23
+ */
24
+ const metricScoresByFrameId = new Map();
25
+ /**
26
+ * Page load events with no associated duration that happened in the
27
+ * main frame.
28
+ */
6
29
  let allMarkerEvents = [];
7
30
  export function reset() {
8
- metricScoresByFrameId.clear();
9
- pageLoadEventsArray = [];
10
- allMarkerEvents = [];
11
- selectedLCPCandidateEvents.clear();
31
+ metricScoresByFrameId.clear();
32
+ pageLoadEventsArray = [];
33
+ allMarkerEvents = [];
34
+ selectedLCPCandidateEvents.clear();
12
35
  }
13
36
  let pageLoadEventsArray = [];
14
- const selectedLCPCandidateEvents = /* @__PURE__ */ new Set();
15
- export const MarkerName = ["MarkDOMContent", "MarkLoad", "firstPaint", "firstContentfulPaint", "largestContentfulPaint::Candidate"];
37
+ // Once we've found the LCP events in the trace we want to fetch their DOM Node
38
+ // from the backend. We could do this by parsing through our Map of frame =>
39
+ // navigation => metric, but it's easier to keep a set of LCP events. As we
40
+ // parse the trace, any time we store an LCP candidate as the potential LCP
41
+ // event, we store the event here. If we later find a new candidate in the
42
+ // trace, we store that and delete the prior event. When we've parsed the
43
+ // entire trace this set will contain all the LCP events that were used - e.g.
44
+ // the candidates that were the actual LCP events.
45
+ const selectedLCPCandidateEvents = new Set();
46
+ export const MarkerName = ['MarkDOMContent', 'MarkLoad', 'firstPaint', 'firstContentfulPaint', 'largestContentfulPaint::Candidate'];
16
47
  const markerTypeGuards = [
17
- Types.TraceEvents.isTraceEventMarkDOMContent,
18
- Types.TraceEvents.isTraceEventMarkLoad,
19
- Types.TraceEvents.isTraceEventFirstPaint,
20
- Types.TraceEvents.isTraceEventFirstContentfulPaint,
21
- Types.TraceEvents.isTraceEventLargestContentfulPaintCandidate,
22
- Types.TraceEvents.isTraceEventNavigationStart
48
+ Types.TraceEvents.isTraceEventMarkDOMContent,
49
+ Types.TraceEvents.isTraceEventMarkLoad,
50
+ Types.TraceEvents.isTraceEventFirstPaint,
51
+ Types.TraceEvents.isTraceEventFirstContentfulPaint,
52
+ Types.TraceEvents.isTraceEventLargestContentfulPaintCandidate,
53
+ Types.TraceEvents.isTraceEventNavigationStart,
23
54
  ];
24
55
  export function isTraceEventMarkerEvent(event) {
25
- return markerTypeGuards.some((fn) => fn(event));
56
+ return markerTypeGuards.some(fn => fn(event));
26
57
  }
27
58
  const pageLoadEventTypeGuards = [
28
- ...markerTypeGuards,
29
- Types.TraceEvents.isTraceEventInteractiveTime
59
+ ...markerTypeGuards,
60
+ Types.TraceEvents.isTraceEventInteractiveTime,
30
61
  ];
31
62
  export function eventIsPageLoadEvent(event) {
32
- return pageLoadEventTypeGuards.some((fn) => fn(event));
63
+ return pageLoadEventTypeGuards.some(fn => fn(event));
33
64
  }
34
65
  export function handleEvent(event) {
35
- if (!eventIsPageLoadEvent(event)) {
36
- return;
37
- }
38
- pageLoadEventsArray.push(event);
66
+ if (!eventIsPageLoadEvent(event)) {
67
+ return;
68
+ }
69
+ pageLoadEventsArray.push(event);
39
70
  }
40
71
  function storePageLoadMetricAgainstNavigationId(navigation, event) {
41
- const navigationId = navigation.args.data?.navigationId;
42
- if (!navigationId) {
43
- throw new Error("Navigation event unexpectedly had no navigation ID.");
44
- }
45
- const frameId = getFrameIdForPageLoadEvent(event);
46
- const { rendererProcessesByFrame } = metaHandlerData();
47
- const rendererProcessesInFrame = rendererProcessesByFrame.get(frameId);
48
- if (!rendererProcessesInFrame) {
49
- return;
50
- }
51
- const processData = rendererProcessesInFrame.get(event.pid);
52
- if (!processData) {
53
- return;
54
- }
55
- if (Types.TraceEvents.isTraceEventNavigationStart(event)) {
56
- return;
57
- }
58
- if (Types.TraceEvents.isTraceEventFirstContentfulPaint(event)) {
59
- const fcpTime = Types.Timing.MicroSeconds(event.ts - navigation.ts);
60
- const score = Helpers.Timing.formatMicrosecondsTime(fcpTime, {
61
- format: Types.Timing.TimeUnit.SECONDS,
62
- maximumFractionDigits: 2
63
- });
64
- const classification = scoreClassificationForFirstContentfulPaint(fcpTime);
65
- const metricScore = { event, score, metricName: MetricName.FCP, classification, navigation };
66
- storeMetricScore(frameId, navigationId, metricScore);
67
- return;
68
- }
69
- if (Types.TraceEvents.isTraceEventFirstPaint(event)) {
70
- const paintTime = Types.Timing.MicroSeconds(event.ts - navigation.ts);
71
- const score = Helpers.Timing.formatMicrosecondsTime(paintTime, {
72
- format: Types.Timing.TimeUnit.SECONDS,
73
- maximumFractionDigits: 2
74
- });
75
- const classification = ScoreClassification.UNCLASSIFIED;
76
- const metricScore = { event, score, metricName: MetricName.FP, classification, navigation };
77
- storeMetricScore(frameId, navigationId, metricScore);
78
- return;
79
- }
80
- if (Types.TraceEvents.isTraceEventMarkDOMContent(event)) {
81
- const dclTime = Types.Timing.MicroSeconds(event.ts - navigation.ts);
82
- const score = Helpers.Timing.formatMicrosecondsTime(dclTime, {
83
- format: Types.Timing.TimeUnit.SECONDS,
84
- maximumFractionDigits: 2
85
- });
86
- const metricScore = {
87
- event,
88
- score,
89
- metricName: MetricName.DCL,
90
- classification: scoreClassificationForDOMContentLoaded(dclTime),
91
- navigation
92
- };
93
- storeMetricScore(frameId, navigationId, metricScore);
94
- return;
95
- }
96
- if (Types.TraceEvents.isTraceEventInteractiveTime(event)) {
97
- const ttiValue = Types.Timing.MicroSeconds(event.ts - navigation.ts);
98
- const ttiScore = Helpers.Timing.formatMicrosecondsTime(ttiValue, {
99
- format: Types.Timing.TimeUnit.SECONDS,
100
- maximumFractionDigits: 2
101
- });
102
- const tti = {
103
- event,
104
- score: ttiScore,
105
- metricName: MetricName.TTI,
106
- classification: scoreClassificationForTimeToInteractive(ttiValue),
107
- navigation
108
- };
109
- storeMetricScore(frameId, navigationId, tti);
110
- const tbtValue = Helpers.Timing.millisecondsToMicroseconds(Types.Timing.MilliSeconds(event.args.args.total_blocking_time_ms));
111
- const tbtScore = Helpers.Timing.formatMicrosecondsTime(tbtValue, {
112
- format: Types.Timing.TimeUnit.MILLISECONDS,
113
- maximumFractionDigits: 2
114
- });
115
- const tbt = {
116
- event,
117
- score: tbtScore,
118
- metricName: MetricName.TBT,
119
- classification: scoreClassificationForTotalBlockingTime(tbtValue),
120
- navigation
121
- };
122
- storeMetricScore(frameId, navigationId, tbt);
123
- return;
124
- }
125
- if (Types.TraceEvents.isTraceEventMarkLoad(event)) {
126
- const loadTime = Types.Timing.MicroSeconds(event.ts - navigation.ts);
127
- const score = Helpers.Timing.formatMicrosecondsTime(loadTime, {
128
- format: Types.Timing.TimeUnit.SECONDS,
129
- maximumFractionDigits: 2
130
- });
131
- const metricScore = {
132
- event,
133
- score,
134
- metricName: MetricName.L,
135
- classification: ScoreClassification.UNCLASSIFIED,
136
- navigation
137
- };
138
- storeMetricScore(frameId, navigationId, metricScore);
139
- return;
140
- }
141
- if (Types.TraceEvents.isTraceEventLargestContentfulPaintCandidate(event)) {
142
- const candidateIndex = event.args.data?.candidateIndex;
143
- if (!candidateIndex) {
144
- throw new Error("Largest Contenful Paint unexpectedly had no candidateIndex.");
72
+ const navigationId = navigation.args.data?.navigationId;
73
+ if (!navigationId) {
74
+ throw new Error('Navigation event unexpectedly had no navigation ID.');
145
75
  }
146
- const lcpTime = Types.Timing.MicroSeconds(event.ts - navigation.ts);
147
- const lcpScore = Helpers.Timing.formatMicrosecondsTime(lcpTime, {
148
- format: Types.Timing.TimeUnit.SECONDS,
149
- maximumFractionDigits: 2
150
- });
151
- const lcp = {
152
- event,
153
- score: lcpScore,
154
- metricName: MetricName.LCP,
155
- classification: scoreClassificationForLargestContentfulPaint(lcpTime),
156
- navigation
157
- };
158
- const metricsByNavigation = Platform.MapUtilities.getWithDefault(metricScoresByFrameId, frameId, () => /* @__PURE__ */ new Map());
159
- const metrics = Platform.MapUtilities.getWithDefault(metricsByNavigation, navigationId, () => /* @__PURE__ */ new Map());
160
- const lastLCPCandidate = metrics.get(MetricName.LCP);
161
- if (lastLCPCandidate === void 0) {
162
- selectedLCPCandidateEvents.add(lcp.event);
163
- storeMetricScore(frameId, navigationId, lcp);
164
- return;
76
+ const frameId = getFrameIdForPageLoadEvent(event);
77
+ const { rendererProcessesByFrame } = metaHandlerData();
78
+ // If either of these pieces of data do not exist, the most likely
79
+ // explanation is that the page load metric we found is for a frame/process
80
+ // combo that the MetaHandler discarded. This typically happens if we get a
81
+ // navigation event with an empty URL. Therefore, we will silently return and
82
+ // drop this metric. If we didn't care about the navigation, we certainly do
83
+ // not need to care about metrics for that navigation.
84
+ const rendererProcessesInFrame = rendererProcessesByFrame.get(frameId);
85
+ if (!rendererProcessesInFrame) {
86
+ return;
87
+ }
88
+ const processData = rendererProcessesInFrame.get(event.pid);
89
+ if (!processData) {
90
+ return;
91
+ }
92
+ if (Types.TraceEvents.isTraceEventNavigationStart(event)) {
93
+ return;
94
+ }
95
+ if (Types.TraceEvents.isTraceEventFirstContentfulPaint(event)) {
96
+ const fcpTime = Types.Timing.MicroSeconds(event.ts - navigation.ts);
97
+ const score = Helpers.Timing.formatMicrosecondsTime(fcpTime, {
98
+ format: 2 /* Types.Timing.TimeUnit.SECONDS */,
99
+ maximumFractionDigits: 2,
100
+ });
101
+ const classification = scoreClassificationForFirstContentfulPaint(fcpTime);
102
+ const metricScore = { event, score, metricName: "FCP" /* MetricName.FCP */, classification, navigation };
103
+ storeMetricScore(frameId, navigationId, metricScore);
104
+ return;
105
+ }
106
+ if (Types.TraceEvents.isTraceEventFirstPaint(event)) {
107
+ const paintTime = Types.Timing.MicroSeconds(event.ts - navigation.ts);
108
+ const score = Helpers.Timing.formatMicrosecondsTime(paintTime, {
109
+ format: 2 /* Types.Timing.TimeUnit.SECONDS */,
110
+ maximumFractionDigits: 2,
111
+ });
112
+ const classification = "unclassified" /* ScoreClassification.UNCLASSIFIED */;
113
+ const metricScore = { event, score, metricName: "FP" /* MetricName.FP */, classification, navigation };
114
+ storeMetricScore(frameId, navigationId, metricScore);
115
+ return;
116
+ }
117
+ if (Types.TraceEvents.isTraceEventMarkDOMContent(event)) {
118
+ const dclTime = Types.Timing.MicroSeconds(event.ts - navigation.ts);
119
+ const score = Helpers.Timing.formatMicrosecondsTime(dclTime, {
120
+ format: 2 /* Types.Timing.TimeUnit.SECONDS */,
121
+ maximumFractionDigits: 2,
122
+ });
123
+ const metricScore = {
124
+ event,
125
+ score,
126
+ metricName: "DCL" /* MetricName.DCL */,
127
+ classification: scoreClassificationForDOMContentLoaded(dclTime),
128
+ navigation,
129
+ };
130
+ storeMetricScore(frameId, navigationId, metricScore);
131
+ return;
132
+ }
133
+ if (Types.TraceEvents.isTraceEventInteractiveTime(event)) {
134
+ const ttiValue = Types.Timing.MicroSeconds(event.ts - navigation.ts);
135
+ const ttiScore = Helpers.Timing.formatMicrosecondsTime(ttiValue, {
136
+ format: 2 /* Types.Timing.TimeUnit.SECONDS */,
137
+ maximumFractionDigits: 2,
138
+ });
139
+ const tti = {
140
+ event,
141
+ score: ttiScore,
142
+ metricName: "TTI" /* MetricName.TTI */,
143
+ classification: scoreClassificationForTimeToInteractive(ttiValue),
144
+ navigation,
145
+ };
146
+ storeMetricScore(frameId, navigationId, tti);
147
+ const tbtValue = Helpers.Timing.millisecondsToMicroseconds(Types.Timing.MilliSeconds(event.args.args.total_blocking_time_ms));
148
+ const tbtScore = Helpers.Timing.formatMicrosecondsTime(tbtValue, {
149
+ format: 1 /* Types.Timing.TimeUnit.MILLISECONDS */,
150
+ maximumFractionDigits: 2,
151
+ });
152
+ const tbt = {
153
+ event,
154
+ score: tbtScore,
155
+ metricName: "TBT" /* MetricName.TBT */,
156
+ classification: scoreClassificationForTotalBlockingTime(tbtValue),
157
+ navigation,
158
+ };
159
+ storeMetricScore(frameId, navigationId, tbt);
160
+ return;
165
161
  }
166
- const lastLCPCandidateEvent = lastLCPCandidate.event;
167
- if (!Types.TraceEvents.isTraceEventLargestContentfulPaintCandidate(lastLCPCandidateEvent)) {
168
- return;
162
+ if (Types.TraceEvents.isTraceEventMarkLoad(event)) {
163
+ const loadTime = Types.Timing.MicroSeconds(event.ts - navigation.ts);
164
+ const score = Helpers.Timing.formatMicrosecondsTime(loadTime, {
165
+ format: 2 /* Types.Timing.TimeUnit.SECONDS */,
166
+ maximumFractionDigits: 2,
167
+ });
168
+ const metricScore = {
169
+ event,
170
+ score,
171
+ metricName: "L" /* MetricName.L */,
172
+ classification: "unclassified" /* ScoreClassification.UNCLASSIFIED */,
173
+ navigation,
174
+ };
175
+ storeMetricScore(frameId, navigationId, metricScore);
176
+ return;
169
177
  }
170
- const lastCandidateIndex = lastLCPCandidateEvent.args.data?.candidateIndex;
171
- if (!lastCandidateIndex) {
172
- return;
178
+ if (Types.TraceEvents.isTraceEventLargestContentfulPaintCandidate(event)) {
179
+ const candidateIndex = event.args.data?.candidateIndex;
180
+ if (!candidateIndex) {
181
+ throw new Error('Largest Contenful Paint unexpectedly had no candidateIndex.');
182
+ }
183
+ const lcpTime = Types.Timing.MicroSeconds(event.ts - navigation.ts);
184
+ const lcpScore = Helpers.Timing.formatMicrosecondsTime(lcpTime, {
185
+ format: 2 /* Types.Timing.TimeUnit.SECONDS */,
186
+ maximumFractionDigits: 2,
187
+ });
188
+ const lcp = {
189
+ event,
190
+ score: lcpScore,
191
+ metricName: "LCP" /* MetricName.LCP */,
192
+ classification: scoreClassificationForLargestContentfulPaint(lcpTime),
193
+ navigation,
194
+ };
195
+ const metricsByNavigation = Platform.MapUtilities.getWithDefault(metricScoresByFrameId, frameId, () => new Map());
196
+ const metrics = Platform.MapUtilities.getWithDefault(metricsByNavigation, navigationId, () => new Map());
197
+ const lastLCPCandidate = metrics.get("LCP" /* MetricName.LCP */);
198
+ if (lastLCPCandidate === undefined) {
199
+ selectedLCPCandidateEvents.add(lcp.event);
200
+ storeMetricScore(frameId, navigationId, lcp);
201
+ return;
202
+ }
203
+ const lastLCPCandidateEvent = lastLCPCandidate.event;
204
+ if (!Types.TraceEvents.isTraceEventLargestContentfulPaintCandidate(lastLCPCandidateEvent)) {
205
+ return;
206
+ }
207
+ const lastCandidateIndex = lastLCPCandidateEvent.args.data?.candidateIndex;
208
+ if (!lastCandidateIndex) {
209
+ // lastCandidateIndex cannot be undefined because we don't store candidates with
210
+ // with an undefined candidateIndex value. This check is only to make TypeScript
211
+ // treat the field as not undefined below.
212
+ return;
213
+ }
214
+ if (lastCandidateIndex < candidateIndex) {
215
+ selectedLCPCandidateEvents.delete(lastLCPCandidateEvent);
216
+ selectedLCPCandidateEvents.add(lcp.event);
217
+ storeMetricScore(frameId, navigationId, lcp);
218
+ }
219
+ return;
173
220
  }
174
- if (lastCandidateIndex < candidateIndex) {
175
- selectedLCPCandidateEvents.delete(lastLCPCandidateEvent);
176
- selectedLCPCandidateEvents.add(lcp.event);
177
- storeMetricScore(frameId, navigationId, lcp);
221
+ if (Types.TraceEvents.isTraceEventLayoutShift(event)) {
222
+ return;
178
223
  }
179
- return;
180
- }
181
- if (Types.TraceEvents.isTraceEventLayoutShift(event)) {
182
- return;
183
- }
184
- return Platform.assertNever(event, `Unexpected event type: ${event}`);
224
+ return Platform.assertNever(event, `Unexpected event type: ${event}`);
185
225
  }
186
226
  function storeMetricScore(frameId, navigationId, metricScore) {
187
- const metricsByNavigation = Platform.MapUtilities.getWithDefault(metricScoresByFrameId, frameId, () => /* @__PURE__ */ new Map());
188
- const metrics = Platform.MapUtilities.getWithDefault(metricsByNavigation, navigationId, () => /* @__PURE__ */ new Map());
189
- metrics.delete(metricScore.metricName);
190
- metrics.set(metricScore.metricName, metricScore);
227
+ const metricsByNavigation = Platform.MapUtilities.getWithDefault(metricScoresByFrameId, frameId, () => new Map());
228
+ const metrics = Platform.MapUtilities.getWithDefault(metricsByNavigation, navigationId, () => new Map());
229
+ // If an entry with that metric name is present, delete it so that the new entry that
230
+ // will replace it is added at the end of the map. This way we guarantee the map entries
231
+ // are ordered in ASC manner by timestamp.
232
+ metrics.delete(metricScore.metricName);
233
+ metrics.set(metricScore.metricName, metricScore);
191
234
  }
192
235
  export function getFrameIdForPageLoadEvent(event) {
193
- if (Types.TraceEvents.isTraceEventFirstContentfulPaint(event) || Types.TraceEvents.isTraceEventInteractiveTime(event) || Types.TraceEvents.isTraceEventLargestContentfulPaintCandidate(event) || Types.TraceEvents.isTraceEventNavigationStart(event) || Types.TraceEvents.isTraceEventLayoutShift(event) || Types.TraceEvents.isTraceEventFirstPaint(event)) {
194
- return event.args.frame;
195
- }
196
- if (Types.TraceEvents.isTraceEventMarkDOMContent(event) || Types.TraceEvents.isTraceEventMarkLoad(event)) {
197
- const frameId = event.args.data?.frame;
198
- if (!frameId) {
199
- throw new Error("MarkDOMContent unexpectedly had no frame ID.");
236
+ if (Types.TraceEvents.isTraceEventFirstContentfulPaint(event) ||
237
+ Types.TraceEvents.isTraceEventInteractiveTime(event) ||
238
+ Types.TraceEvents.isTraceEventLargestContentfulPaintCandidate(event) ||
239
+ Types.TraceEvents.isTraceEventNavigationStart(event) || Types.TraceEvents.isTraceEventLayoutShift(event) ||
240
+ Types.TraceEvents.isTraceEventFirstPaint(event)) {
241
+ return event.args.frame;
200
242
  }
201
- return frameId;
202
- }
203
- Platform.assertNever(event, `Unexpected event type: ${event}`);
243
+ if (Types.TraceEvents.isTraceEventMarkDOMContent(event) || Types.TraceEvents.isTraceEventMarkLoad(event)) {
244
+ const frameId = event.args.data?.frame;
245
+ if (!frameId) {
246
+ throw new Error('MarkDOMContent unexpectedly had no frame ID.');
247
+ }
248
+ return frameId;
249
+ }
250
+ Platform.assertNever(event, `Unexpected event type: ${event}`);
204
251
  }
205
252
  function getNavigationForPageLoadEvent(event) {
206
- if (Types.TraceEvents.isTraceEventFirstContentfulPaint(event) || Types.TraceEvents.isTraceEventLargestContentfulPaintCandidate(event) || Types.TraceEvents.isTraceEventFirstPaint(event)) {
207
- const navigationId = event.args.data?.navigationId;
208
- if (!navigationId) {
209
- throw new Error("Trace event unexpectedly had no navigation ID.");
253
+ if (Types.TraceEvents.isTraceEventFirstContentfulPaint(event) ||
254
+ Types.TraceEvents.isTraceEventLargestContentfulPaintCandidate(event) ||
255
+ Types.TraceEvents.isTraceEventFirstPaint(event)) {
256
+ const navigationId = event.args.data?.navigationId;
257
+ if (!navigationId) {
258
+ throw new Error('Trace event unexpectedly had no navigation ID.');
259
+ }
260
+ const { navigationsByNavigationId } = metaHandlerData();
261
+ const navigation = navigationsByNavigationId.get(navigationId);
262
+ if (!navigation) {
263
+ // This event's navigation has been filtered out by the meta handler as a noise event.
264
+ return null;
265
+ }
266
+ return navigation;
210
267
  }
211
- const { navigationsByNavigationId } = metaHandlerData();
212
- const navigation = navigationsByNavigationId.get(navigationId);
213
- if (!navigation) {
214
- return null;
268
+ if (Types.TraceEvents.isTraceEventMarkDOMContent(event) || Types.TraceEvents.isTraceEventInteractiveTime(event) ||
269
+ Types.TraceEvents.isTraceEventLayoutShift(event) || Types.TraceEvents.isTraceEventMarkLoad(event)) {
270
+ const frameId = getFrameIdForPageLoadEvent(event);
271
+ const { navigationsByFrameId } = metaHandlerData();
272
+ return Helpers.Trace.getNavigationForTraceEvent(event, frameId, navigationsByFrameId);
215
273
  }
216
- return navigation;
217
- }
218
- if (Types.TraceEvents.isTraceEventMarkDOMContent(event) || Types.TraceEvents.isTraceEventInteractiveTime(event) || Types.TraceEvents.isTraceEventLayoutShift(event) || Types.TraceEvents.isTraceEventMarkLoad(event)) {
219
- const frameId = getFrameIdForPageLoadEvent(event);
220
- const { navigationsByFrameId } = metaHandlerData();
221
- return Helpers.Trace.getNavigationForTraceEvent(event, frameId, navigationsByFrameId);
222
- }
223
- if (Types.TraceEvents.isTraceEventNavigationStart(event)) {
224
- return null;
225
- }
226
- return Platform.assertNever(event, `Unexpected event type: ${event}`);
274
+ if (Types.TraceEvents.isTraceEventNavigationStart(event)) {
275
+ // We don't want to compute metrics of the navigation relative to itself, so we'll avoid avoid all that.
276
+ return null;
277
+ }
278
+ return Platform.assertNever(event, `Unexpected event type: ${event}`);
227
279
  }
280
+ /**
281
+ * Classifications sourced from
282
+ * https://web.dev/fcp/
283
+ */
228
284
  export function scoreClassificationForFirstContentfulPaint(fcpScoreInMicroseconds) {
229
- const FCP_GOOD_TIMING = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(1.8));
230
- const FCP_MEDIUM_TIMING = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(3));
231
- let scoreClassification = ScoreClassification.BAD;
232
- if (fcpScoreInMicroseconds <= FCP_MEDIUM_TIMING) {
233
- scoreClassification = ScoreClassification.OK;
234
- }
235
- if (fcpScoreInMicroseconds <= FCP_GOOD_TIMING) {
236
- scoreClassification = ScoreClassification.GOOD;
237
- }
238
- return scoreClassification;
285
+ const FCP_GOOD_TIMING = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(1.8));
286
+ const FCP_MEDIUM_TIMING = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(3.0));
287
+ let scoreClassification = "bad" /* ScoreClassification.BAD */;
288
+ if (fcpScoreInMicroseconds <= FCP_MEDIUM_TIMING) {
289
+ scoreClassification = "ok" /* ScoreClassification.OK */;
290
+ }
291
+ if (fcpScoreInMicroseconds <= FCP_GOOD_TIMING) {
292
+ scoreClassification = "good" /* ScoreClassification.GOOD */;
293
+ }
294
+ return scoreClassification;
239
295
  }
296
+ /**
297
+ * Classifications sourced from
298
+ * https://web.dev/interactive/#how-lighthouse-determines-your-tti-score
299
+ */
240
300
  export function scoreClassificationForTimeToInteractive(ttiTimeInMicroseconds) {
241
- const TTI_GOOD_TIMING = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(3.8));
242
- const TTI_MEDIUM_TIMING = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(7.3));
243
- let scoreClassification = ScoreClassification.BAD;
244
- if (ttiTimeInMicroseconds <= TTI_MEDIUM_TIMING) {
245
- scoreClassification = ScoreClassification.OK;
246
- }
247
- if (ttiTimeInMicroseconds <= TTI_GOOD_TIMING) {
248
- scoreClassification = ScoreClassification.GOOD;
249
- }
250
- return scoreClassification;
301
+ const TTI_GOOD_TIMING = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(3.8));
302
+ const TTI_MEDIUM_TIMING = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(7.3));
303
+ let scoreClassification = "bad" /* ScoreClassification.BAD */;
304
+ if (ttiTimeInMicroseconds <= TTI_MEDIUM_TIMING) {
305
+ scoreClassification = "ok" /* ScoreClassification.OK */;
306
+ }
307
+ if (ttiTimeInMicroseconds <= TTI_GOOD_TIMING) {
308
+ scoreClassification = "good" /* ScoreClassification.GOOD */;
309
+ }
310
+ return scoreClassification;
251
311
  }
312
+ /**
313
+ * Classifications sourced from
314
+ * https://web.dev/lcp/#what-is-lcp
315
+ */
252
316
  export function scoreClassificationForLargestContentfulPaint(lcpTimeInMicroseconds) {
253
- const LCP_GOOD_TIMING = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(2.5));
254
- const LCP_MEDIUM_TIMING = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(4));
255
- let scoreClassification = ScoreClassification.BAD;
256
- if (lcpTimeInMicroseconds <= LCP_MEDIUM_TIMING) {
257
- scoreClassification = ScoreClassification.OK;
258
- }
259
- if (lcpTimeInMicroseconds <= LCP_GOOD_TIMING) {
260
- scoreClassification = ScoreClassification.GOOD;
261
- }
262
- return scoreClassification;
317
+ const LCP_GOOD_TIMING = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(2.5));
318
+ const LCP_MEDIUM_TIMING = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(4));
319
+ let scoreClassification = "bad" /* ScoreClassification.BAD */;
320
+ if (lcpTimeInMicroseconds <= LCP_MEDIUM_TIMING) {
321
+ scoreClassification = "ok" /* ScoreClassification.OK */;
322
+ }
323
+ if (lcpTimeInMicroseconds <= LCP_GOOD_TIMING) {
324
+ scoreClassification = "good" /* ScoreClassification.GOOD */;
325
+ }
326
+ return scoreClassification;
263
327
  }
328
+ /**
329
+ * DCL does not have a classification.
330
+ */
264
331
  export function scoreClassificationForDOMContentLoaded(_dclTimeInMicroseconds) {
265
- return ScoreClassification.UNCLASSIFIED;
332
+ return "unclassified" /* ScoreClassification.UNCLASSIFIED */;
266
333
  }
334
+ /**
335
+ * Classifications sourced from
336
+ * https://web.dev/lighthouse-total-blocking-#time/
337
+ */
267
338
  export function scoreClassificationForTotalBlockingTime(tbtTimeInMicroseconds) {
268
- const TBT_GOOD_TIMING = Helpers.Timing.millisecondsToMicroseconds(Types.Timing.MilliSeconds(200));
269
- const TBT_MEDIUM_TIMING = Helpers.Timing.millisecondsToMicroseconds(Types.Timing.MilliSeconds(600));
270
- let scoreClassification = ScoreClassification.BAD;
271
- if (tbtTimeInMicroseconds <= TBT_MEDIUM_TIMING) {
272
- scoreClassification = ScoreClassification.OK;
273
- }
274
- if (tbtTimeInMicroseconds <= TBT_GOOD_TIMING) {
275
- scoreClassification = ScoreClassification.GOOD;
276
- }
277
- return scoreClassification;
339
+ const TBT_GOOD_TIMING = Helpers.Timing.millisecondsToMicroseconds(Types.Timing.MilliSeconds(200));
340
+ const TBT_MEDIUM_TIMING = Helpers.Timing.millisecondsToMicroseconds(Types.Timing.MilliSeconds(600));
341
+ let scoreClassification = "bad" /* ScoreClassification.BAD */;
342
+ if (tbtTimeInMicroseconds <= TBT_MEDIUM_TIMING) {
343
+ scoreClassification = "ok" /* ScoreClassification.OK */;
344
+ }
345
+ if (tbtTimeInMicroseconds <= TBT_GOOD_TIMING) {
346
+ scoreClassification = "good" /* ScoreClassification.GOOD */;
347
+ }
348
+ return scoreClassification;
278
349
  }
350
+ /**
351
+ * Gets all the Largest Contentful Paint scores of all the frames in the
352
+ * trace.
353
+ */
279
354
  function gatherFinalLCPEvents() {
280
- const allFinalLCPEvents = [];
281
- const dataForAllFrames = [...metricScoresByFrameId.values()];
282
- const dataForAllNavigations = dataForAllFrames.flatMap((frameData) => [...frameData.values()]);
283
- for (let i = 0; i < dataForAllNavigations.length; i++) {
284
- const navigationData = dataForAllNavigations[i];
285
- const lcpInNavigation = navigationData.get(MetricName.LCP);
286
- if (!lcpInNavigation || !lcpInNavigation.event) {
287
- continue;
355
+ const allFinalLCPEvents = [];
356
+ const dataForAllFrames = [...metricScoresByFrameId.values()];
357
+ const dataForAllNavigations = dataForAllFrames.flatMap(frameData => [...frameData.values()]);
358
+ for (let i = 0; i < dataForAllNavigations.length; i++) {
359
+ const navigationData = dataForAllNavigations[i];
360
+ const lcpInNavigation = navigationData.get("LCP" /* MetricName.LCP */);
361
+ if (!lcpInNavigation || !lcpInNavigation.event) {
362
+ continue;
363
+ }
364
+ allFinalLCPEvents.push(lcpInNavigation.event);
288
365
  }
289
- allFinalLCPEvents.push(lcpInNavigation.event);
290
- }
291
- return allFinalLCPEvents;
366
+ return allFinalLCPEvents;
292
367
  }
293
368
  export async function finalize() {
294
- pageLoadEventsArray.sort((a, b) => a.ts - b.ts);
295
- for (const pageLoadEvent of pageLoadEventsArray) {
296
- const navigation = getNavigationForPageLoadEvent(pageLoadEvent);
297
- if (navigation) {
298
- storePageLoadMetricAgainstNavigationId(navigation, pageLoadEvent);
369
+ pageLoadEventsArray.sort((a, b) => a.ts - b.ts);
370
+ for (const pageLoadEvent of pageLoadEventsArray) {
371
+ const navigation = getNavigationForPageLoadEvent(pageLoadEvent);
372
+ if (navigation) {
373
+ // Event's navigation was not filtered out as noise.
374
+ storePageLoadMetricAgainstNavigationId(navigation, pageLoadEvent);
375
+ }
299
376
  }
300
- }
301
- const allFinalLCPEvents = gatherFinalLCPEvents();
302
- const mainFrame = metaHandlerData().mainFrameId;
303
- const allEventsButLCP = pageLoadEventsArray.filter((event) => !Types.TraceEvents.isTraceEventLargestContentfulPaintCandidate(event));
304
- const markerEvents = [...allFinalLCPEvents, ...allEventsButLCP].filter(isTraceEventMarkerEvent);
305
- allMarkerEvents = markerEvents.filter((event) => getFrameIdForPageLoadEvent(event) === mainFrame).sort((a, b) => a.ts - b.ts);
377
+ // NOTE: if you are looking for the TBT calculation, it has temporarily been
378
+ // removed. See crbug.com/1424335 for details.
379
+ const allFinalLCPEvents = gatherFinalLCPEvents();
380
+ const mainFrame = metaHandlerData().mainFrameId;
381
+ // Filter out LCP candidates to use only definitive LCP values
382
+ const allEventsButLCP = pageLoadEventsArray.filter(event => !Types.TraceEvents.isTraceEventLargestContentfulPaintCandidate(event));
383
+ const markerEvents = [...allFinalLCPEvents, ...allEventsButLCP].filter(isTraceEventMarkerEvent);
384
+ // Filter by main frame and sort.
385
+ allMarkerEvents =
386
+ markerEvents.filter(event => getFrameIdForPageLoadEvent(event) === mainFrame).sort((a, b) => a.ts - b.ts);
306
387
  }
307
388
  export function data() {
308
- return {
309
- metricScoresByFrameId: new Map(metricScoresByFrameId),
310
- allMarkerEvents: [...allMarkerEvents]
311
- };
389
+ return {
390
+ /**
391
+ * This represents the metric scores for all navigations, for all frames in a trace.
392
+ * Given a frame id, the map points to another map from navigation id to metric scores.
393
+ * The metric scores include the event related to the metric as well as the data regarding
394
+ * the score itself.
395
+ */
396
+ metricScoresByFrameId: new Map(metricScoresByFrameId),
397
+ /**
398
+ * Page load events with no associated duration that happened in the
399
+ * main frame.
400
+ */
401
+ allMarkerEvents: [...allMarkerEvents],
402
+ };
312
403
  }
313
404
  export function deps() {
314
- return ["Meta"];
405
+ return ['Meta'];
315
406
  }
316
- export var ScoreClassification = /* @__PURE__ */ ((ScoreClassification2) => {
317
- ScoreClassification2["GOOD"] = "good";
318
- ScoreClassification2["OK"] = "ok";
319
- ScoreClassification2["BAD"] = "bad";
320
- ScoreClassification2["UNCLASSIFIED"] = "unclassified";
321
- return ScoreClassification2;
322
- })(ScoreClassification || {});
323
- export var MetricName = /* @__PURE__ */ ((MetricName2) => {
324
- MetricName2["FCP"] = "FCP";
325
- MetricName2["FP"] = "FP";
326
- MetricName2["L"] = "L";
327
- MetricName2["LCP"] = "LCP";
328
- MetricName2["DCL"] = "DCL";
329
- MetricName2["TTI"] = "TTI";
330
- MetricName2["TBT"] = "TBT";
331
- MetricName2["CLS"] = "CLS";
332
- return MetricName2;
333
- })(MetricName || {});
334
- //# sourceMappingURL=PageLoadMetricsHandler.js.map
407
+ //# sourceMappingURL=PageLoadMetricsHandler.js.map