@paulirish/trace_engine 0.0.31 → 0.0.33

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 (283) hide show
  1. package/README.md +6 -10
  2. package/analyze-trace.mjs +9 -10
  3. package/core/platform/ArrayUtilities.js +1 -0
  4. package/core/platform/ArrayUtilities.js.map +1 -1
  5. package/core/platform/DevToolsPath.d.ts +1 -1
  6. package/core/platform/DevToolsPath.js.map +1 -1
  7. package/core/platform/MimeType.js +4 -2
  8. package/core/platform/MimeType.js.map +1 -1
  9. package/core/platform/NumberUtilities.js +8 -0
  10. package/core/platform/NumberUtilities.js.map +1 -1
  11. package/core/platform/ServerTiming.d.ts +31 -0
  12. package/core/platform/ServerTiming.js +212 -0
  13. package/core/platform/ServerTiming.js.map +1 -0
  14. package/core/platform/Timing.d.ts +1 -1
  15. package/core/platform/Timing.js.map +1 -1
  16. package/core/platform/TypescriptUtilities.d.ts +3 -0
  17. package/core/platform/TypescriptUtilities.js.map +1 -1
  18. package/core/platform/UIString.d.ts +1 -1
  19. package/core/platform/UIString.js.map +1 -1
  20. package/core/platform/UserVisibleError.d.ts +1 -1
  21. package/core/platform/UserVisibleError.js.map +1 -1
  22. package/core/platform/platform-tsconfig.json +1 -1
  23. package/core/platform/platform.d.ts +2 -2
  24. package/core/platform/platform.js +2 -2
  25. package/core/platform/platform.js.map +1 -1
  26. package/generated/protocol.d.ts +258 -14
  27. package/models/trace/LanternComputationData.d.ts +4 -4
  28. package/models/trace/LanternComputationData.js +22 -23
  29. package/models/trace/LanternComputationData.js.map +1 -1
  30. package/models/trace/ModelImpl.d.ts +11 -12
  31. package/models/trace/ModelImpl.js +22 -33
  32. package/models/trace/ModelImpl.js.map +1 -1
  33. package/models/trace/Processor.d.ts +21 -12
  34. package/models/trace/Processor.js +148 -67
  35. package/models/trace/Processor.js.map +1 -1
  36. package/models/trace/TracingManager.js.map +1 -1
  37. package/models/trace/extras/FetchNodes.d.ts +8 -8
  38. package/models/trace/extras/FetchNodes.js +16 -11
  39. package/models/trace/extras/FetchNodes.js.map +1 -1
  40. package/models/trace/extras/FilmStrip.d.ts +2 -2
  41. package/models/trace/extras/FilmStrip.js +8 -8
  42. package/models/trace/extras/FilmStrip.js.map +1 -1
  43. package/models/trace/extras/MainThreadActivity.d.ts +1 -1
  44. package/models/trace/extras/MainThreadActivity.js +1 -1
  45. package/models/trace/extras/MainThreadActivity.js.map +1 -1
  46. package/models/trace/extras/Metadata.js +2 -2
  47. package/models/trace/extras/Metadata.js.map +1 -1
  48. package/models/trace/extras/URLForEntry.d.ts +9 -1
  49. package/models/trace/extras/URLForEntry.js +18 -10
  50. package/models/trace/extras/URLForEntry.js.map +1 -1
  51. package/models/trace/extras/extras.js +1 -1
  52. package/models/trace/handlers/AnimationHandler.d.ts +2 -2
  53. package/models/trace/handlers/AnimationHandler.js +1 -1
  54. package/models/trace/handlers/AnimationHandler.js.map +1 -1
  55. package/models/trace/handlers/AuctionWorkletsHandler.d.ts +2 -2
  56. package/models/trace/handlers/AuctionWorkletsHandler.js +11 -11
  57. package/models/trace/handlers/AuctionWorkletsHandler.js.map +1 -1
  58. package/models/trace/handlers/ExtensionTraceDataHandler.d.ts +7 -5
  59. package/models/trace/handlers/ExtensionTraceDataHandler.js +16 -10
  60. package/models/trace/handlers/ExtensionTraceDataHandler.js.map +1 -1
  61. package/models/trace/handlers/FramesHandler.d.ts +24 -19
  62. package/models/trace/handlers/FramesHandler.js +46 -25
  63. package/models/trace/handlers/FramesHandler.js.map +1 -1
  64. package/models/trace/handlers/GPUHandler.d.ts +4 -4
  65. package/models/trace/handlers/GPUHandler.js +3 -3
  66. package/models/trace/handlers/GPUHandler.js.map +1 -1
  67. package/models/trace/handlers/ImagePaintingHandler.d.ts +3 -3
  68. package/models/trace/handlers/ImagePaintingHandler.js +6 -8
  69. package/models/trace/handlers/ImagePaintingHandler.js.map +1 -1
  70. package/models/trace/handlers/InitiatorsHandler.d.ts +3 -3
  71. package/models/trace/handlers/InitiatorsHandler.js +14 -14
  72. package/models/trace/handlers/InitiatorsHandler.js.map +1 -1
  73. package/models/trace/handlers/InvalidationsHandler.d.ts +4 -2
  74. package/models/trace/handlers/InvalidationsHandler.js +29 -11
  75. package/models/trace/handlers/InvalidationsHandler.js.map +1 -1
  76. package/models/trace/handlers/LargestImagePaintHandler.d.ts +2 -2
  77. package/models/trace/handlers/LargestImagePaintHandler.js +1 -1
  78. package/models/trace/handlers/LargestImagePaintHandler.js.map +1 -1
  79. package/models/trace/handlers/LargestTextPaintHandler.d.ts +2 -2
  80. package/models/trace/handlers/LargestTextPaintHandler.js +1 -1
  81. package/models/trace/handlers/LargestTextPaintHandler.js.map +1 -1
  82. package/models/trace/handlers/LayerTreeHandler.d.ts +6 -6
  83. package/models/trace/handlers/LayerTreeHandler.js +6 -6
  84. package/models/trace/handlers/LayerTreeHandler.js.map +1 -1
  85. package/models/trace/handlers/LayoutShiftsHandler.d.ts +12 -20
  86. package/models/trace/handlers/LayoutShiftsHandler.js +73 -12
  87. package/models/trace/handlers/LayoutShiftsHandler.js.map +1 -1
  88. package/models/trace/handlers/MemoryHandler.d.ts +2 -2
  89. package/models/trace/handlers/MemoryHandler.js +1 -1
  90. package/models/trace/handlers/MemoryHandler.js.map +1 -1
  91. package/models/trace/handlers/MetaHandler.d.ts +15 -14
  92. package/models/trace/handlers/MetaHandler.js +32 -30
  93. package/models/trace/handlers/MetaHandler.js.map +1 -1
  94. package/models/trace/handlers/ModelHandlers.d.ts +1 -1
  95. package/models/trace/handlers/ModelHandlers.js +1 -1
  96. package/models/trace/handlers/ModelHandlers.js.map +1 -1
  97. package/models/trace/handlers/NetworkRequestsHandler.d.ts +13 -12
  98. package/models/trace/handlers/NetworkRequestsHandler.js +68 -66
  99. package/models/trace/handlers/NetworkRequestsHandler.js.map +1 -1
  100. package/models/trace/handlers/PageFramesHandler.d.ts +2 -2
  101. package/models/trace/handlers/PageFramesHandler.js +2 -2
  102. package/models/trace/handlers/PageFramesHandler.js.map +1 -1
  103. package/models/trace/handlers/PageLoadMetricsHandler.d.ts +7 -7
  104. package/models/trace/handlers/PageLoadMetricsHandler.js +21 -24
  105. package/models/trace/handlers/PageLoadMetricsHandler.js.map +1 -1
  106. package/models/trace/handlers/RendererHandler.d.ts +19 -19
  107. package/models/trace/handlers/RendererHandler.js +5 -5
  108. package/models/trace/handlers/RendererHandler.js.map +1 -1
  109. package/models/trace/handlers/SamplesHandler.d.ts +6 -6
  110. package/models/trace/handlers/SamplesHandler.js +4 -4
  111. package/models/trace/handlers/SamplesHandler.js.map +1 -1
  112. package/models/trace/handlers/ScreenshotsHandler.d.ts +6 -4
  113. package/models/trace/handlers/ScreenshotsHandler.js +11 -9
  114. package/models/trace/handlers/ScreenshotsHandler.js.map +1 -1
  115. package/models/trace/handlers/SelectorStatsHandler.d.ts +3 -3
  116. package/models/trace/handlers/SelectorStatsHandler.js +2 -2
  117. package/models/trace/handlers/SelectorStatsHandler.js.map +1 -1
  118. package/models/trace/handlers/ServerTimingsHandler.d.ts +10 -0
  119. package/models/trace/handlers/ServerTimingsHandler.js +118 -0
  120. package/models/trace/handlers/ServerTimingsHandler.js.map +1 -0
  121. package/models/trace/handlers/Threads.d.ts +7 -7
  122. package/models/trace/handlers/Threads.js +5 -5
  123. package/models/trace/handlers/Threads.js.map +1 -1
  124. package/models/trace/handlers/UserInteractionsHandler.d.ts +13 -11
  125. package/models/trace/handlers/UserInteractionsHandler.js +13 -7
  126. package/models/trace/handlers/UserInteractionsHandler.js.map +1 -1
  127. package/models/trace/handlers/UserTimingsHandler.d.ts +5 -5
  128. package/models/trace/handlers/UserTimingsHandler.js +52 -9
  129. package/models/trace/handlers/UserTimingsHandler.js.map +1 -1
  130. package/models/trace/handlers/WarningsHandler.d.ts +5 -5
  131. package/models/trace/handlers/WarningsHandler.js +4 -5
  132. package/models/trace/handlers/WarningsHandler.js.map +1 -1
  133. package/models/trace/handlers/WorkersHandler.d.ts +4 -4
  134. package/models/trace/handlers/WorkersHandler.js +1 -1
  135. package/models/trace/handlers/WorkersHandler.js.map +1 -1
  136. package/models/trace/handlers/handlers-tsconfig.json +1 -1
  137. package/models/trace/handlers/types.d.ts +7 -7
  138. package/models/trace/handlers/types.js.map +1 -1
  139. package/models/trace/helpers/Extensions.d.ts +5 -1
  140. package/models/trace/helpers/Extensions.js +5 -3
  141. package/models/trace/helpers/Extensions.js.map +1 -1
  142. package/models/trace/helpers/Network.d.ts +2 -2
  143. package/models/trace/helpers/Network.js +19 -2
  144. package/models/trace/helpers/Network.js.map +1 -1
  145. package/models/trace/helpers/SamplesIntegrator.d.ts +5 -5
  146. package/models/trace/helpers/SamplesIntegrator.js +10 -11
  147. package/models/trace/helpers/SamplesIntegrator.js.map +1 -1
  148. package/models/trace/helpers/SyntheticEvents.d.ts +8 -14
  149. package/models/trace/helpers/SyntheticEvents.js +20 -31
  150. package/models/trace/helpers/SyntheticEvents.js.map +1 -1
  151. package/models/trace/helpers/Timing.d.ts +16 -5
  152. package/models/trace/helpers/Timing.js +33 -7
  153. package/models/trace/helpers/Timing.js.map +1 -1
  154. package/models/trace/helpers/Trace.d.ts +46 -33
  155. package/models/trace/helpers/Trace.js +53 -38
  156. package/models/trace/helpers/Trace.js.map +1 -1
  157. package/models/trace/helpers/TreeHelpers.d.ts +30 -8
  158. package/models/trace/helpers/TreeHelpers.js +91 -23
  159. package/models/trace/helpers/TreeHelpers.js.map +1 -1
  160. package/models/trace/insights/Common.d.ts +8 -2
  161. package/models/trace/insights/Common.js +33 -7
  162. package/models/trace/insights/Common.js.map +1 -1
  163. package/models/trace/insights/CumulativeLayoutShift.d.ts +34 -13
  164. package/models/trace/insights/CumulativeLayoutShift.js +151 -59
  165. package/models/trace/insights/CumulativeLayoutShift.js.map +1 -1
  166. package/models/trace/insights/DocumentLatency.d.ts +9 -4
  167. package/models/trace/insights/DocumentLatency.js +82 -7
  168. package/models/trace/insights/DocumentLatency.js.map +1 -1
  169. package/models/trace/insights/FontDisplay.d.ts +11 -0
  170. package/models/trace/insights/FontDisplay.js +44 -0
  171. package/models/trace/insights/FontDisplay.js.map +1 -0
  172. package/models/trace/insights/InsightRunners.d.ts +3 -0
  173. package/models/trace/insights/InsightRunners.js +3 -0
  174. package/models/trace/insights/InsightRunners.js.map +1 -1
  175. package/models/trace/insights/InteractionToNextPaint.d.ts +4 -5
  176. package/models/trace/insights/InteractionToNextPaint.js +5 -3
  177. package/models/trace/insights/InteractionToNextPaint.js.map +1 -1
  178. package/models/trace/insights/LargestContentfulPaint.d.ts +20 -7
  179. package/models/trace/insights/LargestContentfulPaint.js +57 -37
  180. package/models/trace/insights/LargestContentfulPaint.js.map +1 -1
  181. package/models/trace/insights/RenderBlocking.d.ts +3 -3
  182. package/models/trace/insights/RenderBlocking.js +29 -24
  183. package/models/trace/insights/RenderBlocking.js.map +1 -1
  184. package/models/trace/insights/SlowCSSSelector.d.ts +11 -0
  185. package/models/trace/insights/SlowCSSSelector.js +67 -0
  186. package/models/trace/insights/SlowCSSSelector.js.map +1 -0
  187. package/models/trace/insights/ThirdPartyWeb.d.ts +18 -0
  188. package/models/trace/insights/ThirdPartyWeb.js +174 -0
  189. package/models/trace/insights/ThirdPartyWeb.js.map +1 -0
  190. package/models/trace/insights/Viewport.d.ts +5 -2
  191. package/models/trace/insights/Viewport.js +14 -9
  192. package/models/trace/insights/Viewport.js.map +1 -1
  193. package/models/trace/insights/insights-tsconfig.json +9 -0
  194. package/models/trace/insights/insights.d.ts +1 -0
  195. package/models/trace/insights/insights.js +1 -0
  196. package/models/trace/insights/insights.js.map +1 -1
  197. package/models/trace/insights/types.d.ts +43 -25
  198. package/models/trace/insights/types.js.map +1 -1
  199. package/models/trace/lantern/core/NetworkAnalyzer.d.ts +6 -6
  200. package/models/trace/lantern/core/NetworkAnalyzer.js +12 -12
  201. package/models/trace/lantern/core/NetworkAnalyzer.js.map +1 -1
  202. package/models/trace/lantern/graph/BaseNode.d.ts +4 -4
  203. package/models/trace/lantern/graph/BaseNode.js +21 -21
  204. package/models/trace/lantern/graph/BaseNode.js.map +1 -1
  205. package/models/trace/lantern/graph/CPUNode.d.ts +1 -1
  206. package/models/trace/lantern/graph/CPUNode.js +5 -5
  207. package/models/trace/lantern/graph/CPUNode.js.map +1 -1
  208. package/models/trace/lantern/graph/PageDependencyGraph.d.ts +4 -4
  209. package/models/trace/lantern/graph/PageDependencyGraph.js +5 -5
  210. package/models/trace/lantern/graph/PageDependencyGraph.js.map +1 -1
  211. package/models/trace/lantern/simulation/ConnectionPool.d.ts +7 -7
  212. package/models/trace/lantern/simulation/ConnectionPool.js +26 -26
  213. package/models/trace/lantern/simulation/ConnectionPool.js.map +1 -1
  214. package/models/trace/lantern/simulation/DNSCache.d.ts +3 -3
  215. package/models/trace/lantern/simulation/DNSCache.js +11 -11
  216. package/models/trace/lantern/simulation/DNSCache.js.map +1 -1
  217. package/models/trace/lantern/simulation/SimulationTimingMap.d.ts +1 -1
  218. package/models/trace/lantern/simulation/SimulationTimingMap.js +15 -15
  219. package/models/trace/lantern/simulation/SimulationTimingMap.js.map +1 -1
  220. package/models/trace/lantern/simulation/Simulator.d.ts +28 -28
  221. package/models/trace/lantern/simulation/Simulator.js +113 -113
  222. package/models/trace/lantern/simulation/Simulator.js.map +1 -1
  223. package/models/trace/lantern/simulation/TCPConnection.d.ts +9 -9
  224. package/models/trace/lantern/simulation/TCPConnection.js +36 -36
  225. package/models/trace/lantern/simulation/TCPConnection.js.map +1 -1
  226. package/models/trace/root-causes/LayoutShift.d.ts +13 -13
  227. package/models/trace/root-causes/LayoutShift.js +7 -25
  228. package/models/trace/root-causes/LayoutShift.js.map +1 -1
  229. package/models/trace/types/Configuration.d.ts +16 -0
  230. package/models/trace/types/Configuration.js +1 -0
  231. package/models/trace/types/Configuration.js.map +1 -1
  232. package/models/trace/types/Extensions.d.ts +9 -12
  233. package/models/trace/types/Extensions.js +2 -1
  234. package/models/trace/types/Extensions.js.map +1 -1
  235. package/models/trace/types/File.d.ts +68 -25
  236. package/models/trace/types/File.js +15 -3
  237. package/models/trace/types/File.js.map +1 -1
  238. package/models/trace/types/TraceEvents.d.ts +819 -730
  239. package/models/trace/types/TraceEvents.js +270 -280
  240. package/models/trace/types/TraceEvents.js.map +1 -1
  241. package/models/trace/types/types.d.ts +1 -1
  242. package/models/trace/types/types.js +1 -1
  243. package/models/trace/types/types.js.map +1 -1
  244. package/package.json +4 -2
  245. package/test/test-trace-engine.mjs +47 -2
  246. package/third_party/third-party-web/third-party-web.js +1 -0
  247. package/core/platform/PromiseUtilities.d.ts +0 -10
  248. package/core/platform/PromiseUtilities.js +0 -18
  249. package/core/platform/PromiseUtilities.js.map +0 -1
  250. package/core/platform/SetUtilities.d.ts +0 -2
  251. package/core/platform/SetUtilities.js +0 -23
  252. package/core/platform/SetUtilities.js.map +0 -1
  253. package/models/trace/EntriesFilter.d.ts +0 -72
  254. package/models/trace/EntriesFilter.js +0 -296
  255. package/models/trace/EntriesFilter.js.map +0 -1
  256. package/models/trace/LegacyTracingModel.js.map +0 -1
  257. package/models/trace/handlers/EnhancedTracesHandler.d.ts +0 -48
  258. package/models/trace/handlers/EnhancedTracesHandler.js +0 -165
  259. package/models/trace/handlers/EnhancedTracesHandler.js.map +0 -1
  260. package/models/trace/lantern/BaseNode.d.ts +0 -91
  261. package/models/trace/lantern/BaseNode.js +0 -268
  262. package/models/trace/lantern/BaseNode.js.map +0 -1
  263. package/models/trace/lantern/CPUNode.d.ts +0 -24
  264. package/models/trace/lantern/CPUNode.js +0 -64
  265. package/models/trace/lantern/CPUNode.js.map +0 -1
  266. package/models/trace/lantern/LanternError.d.ts +0 -3
  267. package/models/trace/lantern/LanternError.js +0 -7
  268. package/models/trace/lantern/LanternError.js.map +0 -1
  269. package/models/trace/lantern/MetricsModule.d.ts +0 -11
  270. package/models/trace/lantern/MetricsModule.js +0 -14
  271. package/models/trace/lantern/MetricsModule.js.map +0 -1
  272. package/models/trace/lantern/NetworkNode.d.ts +0 -22
  273. package/models/trace/lantern/NetworkNode.js +0 -83
  274. package/models/trace/lantern/NetworkNode.js.map +0 -1
  275. package/models/trace/lantern/PageDependencyGraph.d.ts +0 -43
  276. package/models/trace/lantern/PageDependencyGraph.js +0 -509
  277. package/models/trace/lantern/PageDependencyGraph.js.map +0 -1
  278. package/models/trace/lantern/SimulationModule.d.ts +0 -17
  279. package/models/trace/lantern/SimulationModule.js +0 -13
  280. package/models/trace/lantern/SimulationModule.js.map +0 -1
  281. package/models/trace/lantern/simulation/NetworkAnalyzer.d.ts +0 -112
  282. package/models/trace/lantern/simulation/NetworkAnalyzer.js +0 -486
  283. package/models/trace/lantern/simulation/NetworkAnalyzer.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"LegacyTracingModel.js","sourceRoot":"","sources":["../../../../../../front_end/models/trace/LegacyTracingModel.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2014 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n//\n// This is what was SDK.TracingModel moved into models/trace to avoid circular\n// dependency issues. Our ultimate goal is to remove this model entirely once\n// the migration to the new model is done\n\nimport * as Helpers from './helpers/helpers.js';\nimport {type EventPayload} from './TracingManager.js';\nimport * as Types from './types/types.js';\n\ntype IgnoreListArgs = {\n [key: string]: string|number|ObjectSnapshot,\n};\n\nexport class TracingModel {\n readonly #title: string|undefined;\n readonly #processById: Map<string|number, Process>;\n readonly #processByName: Map<string, Process>;\n #minimumRecordTimeInternal: number;\n #maximumRecordTimeInternal: number;\n readonly #devToolsMetadataEventsInternal: Event[];\n #asyncEvents: AsyncEvent[];\n readonly #openAsyncEvents: Map<string, AsyncEvent>;\n readonly #openNestableAsyncEvents: Map<string, AsyncEvent[]>;\n readonly #profileGroups: Map<string, ProfileEventsGroup>;\n readonly #parsedCategories: Map<string, Set<string>>;\n readonly #allEventsPayload: EventPayload[] = [];\n\n constructor(title?: string) {\n this.#title = title;\n this.#processById = new Map();\n this.#processByName = new Map();\n this.#minimumRecordTimeInternal = Number(Infinity);\n this.#maximumRecordTimeInternal = Number(-Infinity);\n this.#devToolsMetadataEventsInternal = [];\n this.#asyncEvents = [];\n this.#openAsyncEvents = new Map();\n this.#openNestableAsyncEvents = new Map();\n this.#profileGroups = new Map();\n this.#parsedCategories = new Map();\n }\n\n static isTopLevelEvent(event: CompatibleTraceEvent): boolean {\n return eventHasCategory(event, DevToolsTimelineEventCategory) && event.name === 'RunTask' ||\n eventHasCategory(event, LegacyTopLevelEventCategory) ||\n eventHasCategory(event, DevToolsMetadataEventCategory) &&\n event.name === 'Program'; // Older timelines may have this instead of toplevel.\n }\n\n static extractId(payload: EventPayload): string|undefined {\n const scope = payload.scope || '';\n if (typeof payload.id2 === 'undefined') {\n return scope && payload.id ? `${scope}@${payload.id}` : payload.id;\n }\n const id2 = payload.id2;\n if (typeof id2 === 'object' && ('global' in id2) !== ('local' in id2)) {\n return typeof id2['global'] !== 'undefined' ? `:${scope}:${id2['global']}` :\n `:${scope}:${payload.pid}:${id2['local']}`;\n }\n console.error(\n `Unexpected id2 field at ${payload.ts / 1000}, one and only one of 'local' and 'global' should be present.`);\n return undefined;\n }\n\n static browserMainThread(tracingModel: TracingModel): Thread|null {\n const processes = tracingModel.sortedProcesses();\n // Avoid warning for an empty #model.\n if (!processes.length) {\n return null;\n }\n const browserMainThreadName = 'CrBrowserMain';\n const browserProcesses = [];\n const browserMainThreads = [];\n for (const process of processes) {\n if (process.name().toLowerCase().endsWith('browser')) {\n browserProcesses.push(process);\n }\n browserMainThreads.push(...process.sortedThreads().filter(t => t.name() === browserMainThreadName));\n }\n if (browserMainThreads.length === 1) {\n return browserMainThreads[0];\n }\n if (browserProcesses.length === 1) {\n return browserProcesses[0].threadByName(browserMainThreadName);\n }\n const tracingStartedInBrowser =\n tracingModel.devToolsMetadataEvents().filter(e => e.name === 'TracingStartedInBrowser');\n if (tracingStartedInBrowser.length === 1) {\n return tracingStartedInBrowser[0].thread;\n }\n console.error(\n 'Failed to find browser main thread in trace, some timeline features may be unavailable');\n return null;\n }\n\n allRawEvents(): readonly EventPayload[] {\n return this.#allEventsPayload;\n }\n\n devToolsMetadataEvents(): Event[] {\n return this.#devToolsMetadataEventsInternal;\n }\n\n addEvents(events: readonly EventPayload[]): void {\n for (let i = 0; i < events.length; ++i) {\n this.addEvent(events[i]);\n }\n }\n\n tracingComplete(): void {\n this.processPendingAsyncEvents();\n for (const process of this.#processById.values()) {\n for (const thread of process.threads.values()) {\n thread.tracingComplete();\n }\n }\n }\n\n private addEvent(payload: EventPayload): void {\n this.#allEventsPayload.push(payload);\n let process = this.#processById.get(payload.pid);\n if (!process) {\n process = new Process(this, payload.pid);\n this.#processById.set(payload.pid, process);\n }\n\n const timestamp = payload.ts / 1000;\n // We do allow records for unrelated threads to arrive out-of-order,\n // so there's a chance we're getting records from the past.\n if (timestamp && timestamp < this.#minimumRecordTimeInternal &&\n eventPhasesOfInterestForTraceBounds.has(payload.ph as Types.TraceEvents.Phase) &&\n // UMA related events are ignored when calculating the minimumRecordTime because they might\n // be related to previous navigations that happened before the current trace started and\n // will currently not be displayed anyways.\n // See crbug.com/1201198\n (!payload.name.endsWith('::UMA'))) {\n this.#minimumRecordTimeInternal = timestamp;\n }\n\n if (payload.name === 'TracingStartedInBrowser') {\n // If we received a timestamp for tracing start, use that for minimumRecordTime.\n this.#minimumRecordTimeInternal = timestamp;\n }\n\n if (eventPhasesOfInterestForTraceBounds.has(payload.ph as Types.TraceEvents.Phase)) {\n const endTimeStamp = (payload.ts + (payload.dur || 0)) / 1000;\n this.#maximumRecordTimeInternal = Math.max(this.#maximumRecordTimeInternal, endTimeStamp);\n }\n const event = process.addEvent(payload);\n if (!event) {\n return;\n }\n if (payload.ph === Types.TraceEvents.Phase.SAMPLE) {\n this.addSampleEvent(event);\n return;\n }\n // Build async event when we've got events from all threads & processes, so we can sort them and process in the\n // chronological order. However, also add individual async events to the thread flow (above), so we can easily\n // display them on the same chart as other events, should we choose so.\n if (Types.TraceEvents.isAsyncPhase(payload.ph)) {\n this.#asyncEvents.push((event as AsyncEvent));\n }\n if (event.hasCategory(DevToolsMetadataEventCategory)) {\n this.#devToolsMetadataEventsInternal.push(event);\n }\n\n if (payload.ph !== Types.TraceEvents.Phase.METADATA) {\n return;\n }\n\n switch (payload.name) {\n case MetadataEvent.ProcessSortIndex: {\n process.setSortIndex(payload.args['sort_index']);\n break;\n }\n case MetadataEvent.ProcessName: {\n const processName = payload.args['name'];\n process.setName(processName);\n this.#processByName.set(processName, process);\n break;\n }\n case MetadataEvent.ThreadSortIndex: {\n process.threadById(payload.tid).setSortIndex(payload.args['sort_index']);\n break;\n }\n case MetadataEvent.ThreadName: {\n process.threadById(payload.tid).setName(payload.args['name']);\n break;\n }\n }\n }\n\n private addSampleEvent(event: Event): void {\n const id = `${event.thread.process().id()}:${event.id}`;\n const group = this.#profileGroups.get(id);\n if (group) {\n group.addChild(event);\n } else {\n this.#profileGroups.set(id, new ProfileEventsGroup(event));\n }\n }\n\n profileGroup(event: Event): ProfileEventsGroup|null {\n return this.#profileGroups.get(`${event.thread.process().id()}:${event.id}`) || null;\n }\n\n minimumRecordTime(): number {\n return this.#minimumRecordTimeInternal;\n }\n\n sortedProcesses(): Process[] {\n return NamedObject.sort([...this.#processById.values()]);\n }\n\n getProcessByName(name: string): Process|null {\n return this.#processByName.get(name) ?? null;\n }\n\n getProcessById(pid: number): Process|null {\n return this.#processById.get(pid) || null;\n }\n\n getThreadByName(processName: string, threadName: string): Thread|null {\n const process = this.getProcessByName(processName);\n return process && process.threadByName(threadName);\n }\n\n private processPendingAsyncEvents(): void {\n this.#asyncEvents.sort(Event.compareStartTime);\n for (let i = 0; i < this.#asyncEvents.length; ++i) {\n const event = this.#asyncEvents[i];\n if (Types.TraceEvents.isNestableAsyncPhase(event.phase)) {\n this.addNestableAsyncEvent(event);\n } else {\n this.addAsyncEvent(event);\n }\n }\n this.#asyncEvents = [];\n this.closeOpenAsyncEvents();\n }\n\n private closeOpenAsyncEvents(): void {\n for (const event of this.#openAsyncEvents.values()) {\n event.setEndTime(this.#maximumRecordTimeInternal);\n // FIXME: remove this once we figure a better way to convert async console\n // events to sync [waterfall] timeline records.\n event.steps[0].setEndTime(this.#maximumRecordTimeInternal);\n }\n this.#openAsyncEvents.clear();\n\n for (const eventStack of this.#openNestableAsyncEvents.values()) {\n while (eventStack.length) {\n const event = eventStack.pop();\n if (!event) {\n continue;\n }\n event.setEndTime(this.#maximumRecordTimeInternal);\n }\n }\n this.#openNestableAsyncEvents.clear();\n }\n\n private addNestableAsyncEvent(event: Event): void {\n const key = event.categoriesString + '.' + event.id;\n let openEventsStack = this.#openNestableAsyncEvents.get(key);\n\n switch (event.phase) {\n case Types.TraceEvents.Phase.ASYNC_NESTABLE_START: {\n if (!openEventsStack) {\n openEventsStack = [];\n this.#openNestableAsyncEvents.set(key, openEventsStack);\n }\n const asyncEvent = new AsyncEvent(event);\n openEventsStack.push(asyncEvent);\n event.thread.addAsyncEvent(asyncEvent);\n break;\n }\n\n case Types.TraceEvents.Phase.ASYNC_NESTABLE_INSTANT: {\n if (openEventsStack && openEventsStack.length) {\n const event = openEventsStack[openEventsStack.length - 1];\n if (event) {\n event.addStep(event);\n }\n }\n break;\n }\n\n case Types.TraceEvents.Phase.ASYNC_NESTABLE_END: {\n if (!openEventsStack || !openEventsStack.length) {\n break;\n }\n const top = openEventsStack.pop();\n if (!top) {\n break;\n }\n if (top.name !== event.name) {\n console.error(\n `Begin/end event mismatch for nestable async event, ${top.name} vs. ${event.name}, key: ${key}`);\n break;\n }\n top.addStep(event);\n }\n }\n }\n\n private addAsyncEvent(event: Event): void {\n const key = event.categoriesString + '.' + event.name + '.' + event.id;\n let asyncEvent = this.#openAsyncEvents.get(key);\n\n if (event.phase === Types.TraceEvents.Phase.ASYNC_BEGIN) {\n if (asyncEvent) {\n console.error(`Event ${event.name} has already been started`);\n return;\n }\n asyncEvent = new AsyncEvent(event);\n this.#openAsyncEvents.set(key, asyncEvent);\n event.thread.addAsyncEvent(asyncEvent);\n return;\n }\n if (!asyncEvent) {\n // Quietly ignore stray async events, we're probably too late for the start.\n return;\n }\n if (event.phase === Types.TraceEvents.Phase.ASYNC_END) {\n asyncEvent.addStep(event);\n this.#openAsyncEvents.delete(key);\n return;\n }\n if (event.phase === Types.TraceEvents.Phase.ASYNC_STEP_INTO ||\n event.phase === Types.TraceEvents.Phase.ASYNC_STEP_PAST) {\n const lastStep = asyncEvent.steps[asyncEvent.steps.length - 1];\n if (lastStep && lastStep.phase !== Types.TraceEvents.Phase.ASYNC_BEGIN && lastStep.phase !== event.phase) {\n console.assert(\n false,\n 'Async event step phase mismatch: ' + lastStep.phase + ' at ' + lastStep.startTime + ' vs. ' + event.phase +\n ' at ' + event.startTime);\n return;\n }\n asyncEvent.addStep(event);\n return;\n }\n console.assert(false, 'Invalid async event phase');\n }\n\n title(): string|undefined {\n return this.#title;\n }\n\n parsedCategoriesForString(str: string): Set<string> {\n let parsedCategories = this.#parsedCategories.get(str);\n if (!parsedCategories) {\n parsedCategories = new Set(str ? str.split(',') : []);\n this.#parsedCategories.set(str, parsedCategories);\n }\n return parsedCategories;\n }\n}\n\nexport const eventPhasesOfInterestForTraceBounds: Set<Types.TraceEvents.Phase> = new Set([\n Types.TraceEvents.Phase.BEGIN,\n Types.TraceEvents.Phase.END,\n Types.TraceEvents.Phase.COMPLETE,\n Types.TraceEvents.Phase.INSTANT,\n]);\n\nexport const MetadataEvent = {\n ProcessSortIndex: 'process_sort_index',\n ProcessName: 'process_name',\n ThreadSortIndex: 'thread_sort_index',\n ThreadName: 'thread_name',\n};\n\n// TODO(alph): LegacyTopLevelEventCategory is not recorded since M74 and used for loading\n// legacy profiles. Drop at some point.\nexport const LegacyTopLevelEventCategory = 'toplevel';\n\nexport const DevToolsMetadataEventCategory = 'disabled-by-default-devtools.timeline';\nexport const DevToolsTimelineEventCategory = 'disabled-by-default-devtools.timeline';\n\nexport function eventHasPayload(event: Event): event is PayloadEvent {\n return 'rawPayload' in event;\n}\n\nexport class Event {\n categoriesString: string;\n readonly #parsedCategories: Set<string>;\n name: string;\n phase: Types.TraceEvents.Phase;\n startTime: number;\n thread: Thread;\n // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: any;\n id!: string|null;\n ordinal: number;\n selfTime: number;\n endTime?: number;\n duration?: number;\n\n // The constructor is protected so that we ensure that only classes or\n // subclasses can directly instantiate events. All other callers should\n // either create ConstructedEvent instances, which have a public constructor,\n // or use the static fromPayload method which can create an event instance\n // from the trace payload.\n protected constructor(\n categories: string|undefined, name: string, phase: Types.TraceEvents.Phase, startTime: number, thread: Thread) {\n this.categoriesString = categories || '';\n this.#parsedCategories = thread.getModel().parsedCategoriesForString(this.categoriesString);\n this.name = name;\n this.phase = phase;\n this.startTime = startTime;\n this.thread = thread;\n this.args = {};\n this.ordinal = 0;\n\n this.selfTime = 0;\n }\n\n static compareStartTime(a: Event|null, b: Event|null): number {\n if (!a || !b) {\n return 0;\n }\n\n return a.startTime - b.startTime;\n }\n\n static orderedCompareStartTime(a: Event, b: Event): number {\n // Array.mergeOrdered coalesces objects if comparator returns 0.\n // To change this behavior this comparator return -1 in the case events\n // startTime's are equal, so both events got placed into the result array.\n return a.startTime - b.startTime || a.ordinal - b.ordinal || -1;\n }\n\n hasCategory(categoryName: string): boolean {\n return this.#parsedCategories.has(categoryName);\n }\n\n setEndTime(endTime: number): void {\n if (endTime < this.startTime) {\n console.assert(false, 'Event out of order: ' + this.name);\n return;\n }\n this.endTime = endTime;\n this.duration = endTime - this.startTime;\n }\n\n // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addArgs(args: any): void {\n // Shallow copy args to avoid modifying original #payload which may be saved to file.\n for (const name in args) {\n if (name in this.args) {\n console.error('Same argument name (' + name + ') is used for begin and end phases of ' + this.name);\n }\n\n (this.args as IgnoreListArgs)[name] = (args as IgnoreListArgs)[name];\n }\n }\n\n complete(endEvent: Event): void {\n if (endEvent.args) {\n this.addArgs(endEvent.args);\n } else {\n console.error('Missing mandatory event argument \\'args\\' at ' + endEvent.startTime);\n }\n this.setEndTime(endEvent.startTime);\n }\n}\n\n/**\n * Represents a tracing event that is not directly linked to an individual\n * object in the trace. We construct these events at times, particularly when\n * building up the CPU profile data for JS Profiling.\n **/\nexport class ConstructedEvent extends Event {\n // Because the constructor of Event is marked as protected, but we want\n // people to be able to create constructed events, we override the\n // constructor here, even though we are only calling super, in order to mark\n // it as public.\n constructor(\n categories: string|undefined, name: string, phase: Types.TraceEvents.Phase, startTime: number, thread: Thread) {\n super(categories, name, phase, startTime, thread);\n }\n}\n\n/**\n * Represents a tracing event that has been created directly from an object in\n * the trace file and therefore is guaranteed to have a payload associated with\n * it. The only way to create these events is to use the static fromPayload\n * method, which you must call with a payload.\n **/\nexport class PayloadEvent extends Event {\n #rawPayload: EventPayload;\n\n /**\n * Returns the raw payload that was used to create this event instance.\n **/\n rawLegacyPayload(): EventPayload {\n return this.#rawPayload;\n }\n\n /**\n * Returns the raw payload that was used to create this event instance, but\n * returns it typed as the new engine's TraceEventArgs option.\n **/\n rawPayload(): Types.TraceEvents.TraceEventData {\n return this.#rawPayload as unknown as Types.TraceEvents.TraceEventData;\n }\n\n protected constructor(\n categories: string|undefined, name: string, phase: Types.TraceEvents.Phase, startTime: number, thread: Thread,\n rawPayload: EventPayload) {\n super(categories, name, phase, startTime, thread);\n this.#rawPayload = rawPayload;\n }\n\n static fromPayload(payload: EventPayload, thread: Thread): PayloadEvent {\n const event = new PayloadEvent(payload.cat, payload.name, payload.ph, payload.ts / 1000, thread, payload);\n event.#rawPayload = payload;\n if (payload.args) {\n event.addArgs(payload.args);\n }\n if (typeof payload.dur === 'number') {\n event.setEndTime((payload.ts + payload.dur) / 1000);\n }\n const id = TracingModel.extractId(payload);\n if (typeof id !== 'undefined') {\n event.id = id;\n }\n\n return event;\n }\n}\n\nexport class ObjectSnapshot extends PayloadEvent {\n private constructor(\n category: string|undefined, name: string, startTime: number, thread: Thread, rawPayload: EventPayload) {\n super(category, name, Types.TraceEvents.Phase.OBJECT_SNAPSHOT, startTime, thread, rawPayload);\n }\n\n static override fromPayload(payload: EventPayload, thread: Thread): ObjectSnapshot {\n const snapshot = new ObjectSnapshot(payload.cat, payload.name, payload.ts / 1000, thread, payload);\n const id = TracingModel.extractId(payload);\n if (typeof id !== 'undefined') {\n snapshot.id = id;\n }\n if (!payload.args || !payload.args['snapshot']) {\n console.error('Missing mandatory \\'snapshot\\' argument at ' + payload.ts / 1000);\n return snapshot;\n }\n if (payload.args) {\n snapshot.addArgs(payload.args);\n }\n return snapshot;\n }\n\n getSnapshot(): ObjectSnapshot {\n const snapshot = this.args['snapshot'];\n if (!snapshot) {\n throw new Error('ObjectSnapshot has no snapshot argument.');\n }\n return snapshot;\n }\n}\n\nexport class AsyncEvent extends ConstructedEvent {\n steps: Event[];\n causedFrame: boolean;\n\n constructor(startEvent: Event) {\n super(startEvent.categoriesString, startEvent.name, startEvent.phase, startEvent.startTime, startEvent.thread);\n this.addArgs(startEvent.args);\n this.steps = [startEvent];\n this.causedFrame = false;\n }\n\n addStep(event: Event): void {\n this.steps.push(event);\n if (event.phase === Types.TraceEvents.Phase.ASYNC_END ||\n event.phase === Types.TraceEvents.Phase.ASYNC_NESTABLE_END) {\n this.setEndTime(event.startTime);\n // FIXME: ideally, we shouldn't do this, but this makes the logic of converting\n // async console events to sync ones much simpler.\n this.steps[0].setEndTime(event.startTime);\n }\n }\n}\n\nclass ProfileEventsGroup {\n children: Event[];\n constructor(event: Event) {\n this.children = [event];\n }\n\n addChild(event: Event): void {\n this.children.push(event);\n }\n}\n\nclass NamedObject {\n model: TracingModel;\n readonly idInternal: number;\n #nameInternal: string;\n #sortIndex: number;\n constructor(model: TracingModel, id: number) {\n this.model = model;\n this.idInternal = id;\n this.#nameInternal = '';\n this.#sortIndex = 0;\n }\n\n static sort<Item extends NamedObject>(array: Item[]): Item[] {\n return array.sort((a, b) => {\n return a.#sortIndex !== b.#sortIndex ? a.#sortIndex - b.#sortIndex : a.name().localeCompare(b.name());\n });\n }\n\n setName(name: string): void {\n this.#nameInternal = name;\n }\n\n name(): string {\n return this.#nameInternal;\n }\n\n id(): number {\n return this.idInternal;\n }\n\n setSortIndex(sortIndex: number): void {\n this.#sortIndex = sortIndex;\n }\n\n getModel(): TracingModel {\n return this.model;\n }\n}\n\nexport class Process extends NamedObject {\n readonly threads: Map<number, Thread>;\n readonly #threadByNameInternal: Map<string, Thread|null>;\n constructor(model: TracingModel, id: number) {\n super(model, id);\n this.threads = new Map();\n this.#threadByNameInternal = new Map();\n }\n\n threadById(id: number): Thread {\n let thread = this.threads.get(id);\n if (!thread) {\n thread = new Thread(this, id);\n this.threads.set(id, thread);\n }\n return thread;\n }\n\n threadByName(name: string): Thread|null {\n return this.#threadByNameInternal.get(name) || null;\n }\n\n setThreadByName(name: string, thread: Thread): void {\n this.#threadByNameInternal.set(name, thread);\n }\n\n addEvent(payload: EventPayload): Event|null {\n return this.threadById(payload.tid).addEvent(payload);\n }\n\n sortedThreads(): Thread[] {\n return NamedObject.sort([...this.threads.values()]);\n }\n}\n\nexport class Thread extends NamedObject {\n readonly #processInternal: Process;\n #eventsInternal: Event[];\n readonly #asyncEventsInternal: AsyncEvent[];\n #lastTopLevelEvent: Event|null;\n constructor(process: Process, id: number) {\n super(process.getModel(), id);\n this.#processInternal = process;\n\n this.#eventsInternal = [];\n this.#asyncEventsInternal = [];\n this.#lastTopLevelEvent = null;\n }\n\n /**\n * Whilst we are in the middle of migrating to the new Phase enum, we need to\n * be able to compare events with the legacy phase to the new enum. This method\n * does this by casting the event phase to a string, ensuring we can compare it\n * against either enum. Once the migration is complete (crbug.com/1417587), we\n * will be able to use === to compare with no TS errors and this method can be\n * removed.\n */\n #eventMatchesPhase(event: Event, phase: Types.TraceEvents.Phase): boolean {\n return (event.phase as string) === phase;\n }\n\n tracingComplete(): void {\n this.#asyncEventsInternal.sort(Event.compareStartTime);\n this.#eventsInternal.sort(Event.compareStartTime);\n const stack: Event[] = [];\n const toDelete = new Set<number>();\n for (let i = 0; i < this.#eventsInternal.length; ++i) {\n const e = this.#eventsInternal[i];\n e.ordinal = i;\n if (this.#eventMatchesPhase(e, Types.TraceEvents.Phase.END)) {\n toDelete.add(i); // Mark for removal.\n // Quietly ignore unbalanced close events, they're legit (we could have missed start one).\n if (!stack.length) {\n continue;\n }\n const top = stack.pop();\n if (!top) {\n continue;\n }\n if (top.name !== e.name || top.categoriesString !== e.categoriesString) {\n console.error(\n 'B/E events mismatch at ' + top.startTime + ' (' + top.name + ') vs. ' + e.startTime + ' (' + e.name +\n ')');\n } else {\n top.complete(e);\n }\n } else if (this.#eventMatchesPhase(e, Types.TraceEvents.Phase.BEGIN)) {\n stack.push(e);\n }\n }\n\n // Handle Begin events with no matching End.\n // This commonly happens due to a bug in the trace machinery. See crbug.com/982252\n while (stack.length) {\n const event = stack.pop();\n if (event) {\n // Masquerade the event as Instant, so it's rendered to the user.\n // The ideal fix is resolving crbug.com/1021571, but handling that without a perfetto migration appears prohibitive\n event.phase = Types.TraceEvents.Phase.INSTANT;\n }\n }\n this.#eventsInternal = this.#eventsInternal.filter((_, idx) => !toDelete.has(idx));\n }\n\n addEvent(payload: EventPayload): Event|null {\n const event = payload.ph === Types.TraceEvents.Phase.OBJECT_SNAPSHOT ? ObjectSnapshot.fromPayload(payload, this) :\n PayloadEvent.fromPayload(payload, this);\n if (TracingModel.isTopLevelEvent(event)) {\n // Discard nested \"top-level\" events.\n const lastTopLevelEvent = this.#lastTopLevelEvent;\n if (lastTopLevelEvent && (lastTopLevelEvent.endTime || 0) > event.startTime) {\n return null;\n }\n this.#lastTopLevelEvent = event;\n }\n this.#eventsInternal.push(event);\n return event;\n }\n\n addAsyncEvent(asyncEvent: AsyncEvent): void {\n this.#asyncEventsInternal.push(asyncEvent);\n }\n\n override setName(name: string): void {\n super.setName(name);\n this.#processInternal.setThreadByName(name, this);\n }\n\n process(): Process {\n return this.#processInternal;\n }\n\n events(): Event[] {\n return this.#eventsInternal;\n }\n\n asyncEvents(): AsyncEvent[] {\n return this.#asyncEventsInternal;\n }\n\n removeEventsByName(name: string): Event[] {\n const extracted: Event[] = [];\n this.#eventsInternal = this.#eventsInternal.filter(e => {\n if (!e) {\n return false;\n }\n\n if (e.name !== name) {\n return true;\n }\n\n extracted.push(e);\n return false;\n });\n\n return extracted;\n }\n}\n\nexport interface TimesForEventMs {\n startTime: Types.Timing.MilliSeconds;\n endTime?: Types.Timing.MilliSeconds;\n selfTime: Types.Timing.MilliSeconds;\n duration: Types.Timing.MilliSeconds;\n}\n\nexport function timesForEventInMilliseconds(event: Event|Types.TraceEvents.TraceEventData): TimesForEventMs {\n if (event instanceof Event) {\n return {\n startTime: Types.Timing.MilliSeconds(event.startTime),\n endTime: event.endTime ? Types.Timing.MilliSeconds(event.endTime) : undefined,\n duration: Types.Timing.MilliSeconds(event.duration || 0),\n selfTime: Types.Timing.MilliSeconds(event.selfTime),\n };\n }\n return Helpers.Timing.eventTimingsMilliSeconds(event);\n}\n// Parsed categories are cached to prevent calling cat.split() multiple\n// times on the same categories string.\nconst parsedCategories = new Map<string, Set<string>>();\nexport function eventHasCategory(event: CompatibleTraceEvent, category: string): boolean {\n if (event instanceof Event) {\n return event.hasCategory(category);\n }\n let parsedCategoriesForEvent = parsedCategories.get(event.cat);\n if (!parsedCategoriesForEvent) {\n parsedCategoriesForEvent = new Set(event.cat.split(',') || []);\n }\n return parsedCategoriesForEvent.has(category);\n}\n\nexport function phaseForEvent(event: Event|Types.TraceEvents.TraceEventData): Types.TraceEvents.Phase {\n if (event instanceof Event) {\n return event.phase;\n }\n return event.ph;\n}\n\nexport function threadIDForEvent(event: Event|Types.TraceEvents.TraceEventData): Types.TraceEvents.ThreadID {\n if (event instanceof Event) {\n return event.thread.idInternal as Types.TraceEvents.ThreadID;\n }\n return event.tid;\n}\n\nexport function eventIsFromNewEngine(event: CompatibleTraceEvent|null): event is Types.TraceEvents.TraceEventData {\n return event !== null && !(event instanceof Event);\n}\n\nexport type CompatibleTraceEvent = Event|Types.TraceEvents.TraceEventData;\n"]}
@@ -1,48 +0,0 @@
1
- import * as Types from '../types/types.js';
2
- export declare const EnhancedTracesVersion: number;
3
- export interface Script {
4
- scriptId: number;
5
- isolate: string;
6
- url: string;
7
- executionContextId: number;
8
- startLine: number;
9
- startColumn: number;
10
- endLine: number;
11
- endColumn: number;
12
- hash: string;
13
- isModule?: boolean;
14
- hasSourceUrl?: boolean;
15
- sourceMapUrl?: string;
16
- length?: number;
17
- sourceText?: string;
18
- auxData?: ExecutionContextAuxData;
19
- }
20
- export interface ExecutionContextAuxData {
21
- frameId?: string;
22
- isDefault?: boolean;
23
- type?: string;
24
- }
25
- export interface ExecutionContext {
26
- id: number;
27
- origin: string;
28
- v8Context?: string;
29
- auxData?: ExecutionContextAuxData;
30
- isolate?: string;
31
- }
32
- export interface Target {
33
- targetId: string;
34
- type: string;
35
- url: string;
36
- pid?: number;
37
- isolate?: string;
38
- }
39
- export interface EnhancedTracesData {
40
- targets: Target[];
41
- executionContexts: ExecutionContext[];
42
- scripts: Script[];
43
- }
44
- export declare function initialize(): void;
45
- export declare function reset(): void;
46
- export declare function handleEvent(event: Types.TraceEvents.TraceEventData): void;
47
- export declare function finalize(): Promise<void>;
48
- export declare function data(): EnhancedTracesData;
@@ -1,165 +0,0 @@
1
- // Copyright 2024 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
- import * as Types from '../types/types.js';
5
- export const EnhancedTracesVersion = 1;
6
- let handlerState = 1 /* HandlerState.UNINITIALIZED */;
7
- const scriptRundownEvents = [];
8
- const scriptToV8Context = new Map();
9
- const scriptToScriptSource = new Map();
10
- const largeScriptToScriptSource = new Map();
11
- const scriptToSourceLength = new Map();
12
- const targets = [];
13
- const executionContexts = [];
14
- const scripts = [];
15
- function getScriptIsolateId(isolate, scriptId) {
16
- return scriptId + '@' + isolate;
17
- }
18
- export function initialize() {
19
- if (handlerState !== 1 /* HandlerState.UNINITIALIZED */) {
20
- throw new Error('Enhanced Traces Handler was not reset');
21
- }
22
- handlerState = 2 /* HandlerState.INITIALIZED */;
23
- }
24
- export function reset() {
25
- scriptRundownEvents.length = 0;
26
- scriptToV8Context.clear();
27
- scriptToScriptSource.clear();
28
- largeScriptToScriptSource.clear();
29
- scriptToSourceLength.clear();
30
- targets.length = 0;
31
- executionContexts.length = 0;
32
- scripts.length = 0;
33
- handlerState = 1 /* HandlerState.UNINITIALIZED */;
34
- }
35
- export function handleEvent(event) {
36
- if (handlerState !== 2 /* HandlerState.INITIALIZED */) {
37
- throw new Error('Enhanced Traces Handler is not initialized while handling event');
38
- }
39
- if (Types.TraceEvents.isTraceEventTargetRundown(event)) {
40
- // Set up script to v8 context mapping
41
- const data = event.args?.data;
42
- scriptToV8Context.set(getScriptIsolateId(data.isolate, data.scriptId), data.v8context);
43
- // Add target
44
- if (!targets.find(target => target.targetId === data.frame)) {
45
- targets.push({
46
- targetId: data.frame,
47
- type: data.frameType,
48
- isolate: data.isolate,
49
- pid: event.pid,
50
- url: data.url,
51
- });
52
- }
53
- // Add execution context, need to put back execution context id with info from other traces
54
- if (!executionContexts.find(executionContext => executionContext.v8Context === data.v8context)) {
55
- executionContexts.push({
56
- id: -1,
57
- origin: data.origin,
58
- v8Context: data.v8context,
59
- auxData: {
60
- frameId: data.frame,
61
- isDefault: data.isDefault,
62
- type: data.contextType,
63
- },
64
- isolate: data.isolate,
65
- });
66
- }
67
- }
68
- else if (Types.TraceEvents.isTraceEventScriptRundown(event)) {
69
- scriptRundownEvents.push(event);
70
- const data = event.args.data;
71
- // Add script
72
- if (!scripts.find(script => script.scriptId === data.scriptId && script.isolate === data.isolate)) {
73
- scripts.push({
74
- scriptId: data.scriptId,
75
- isolate: data.isolate,
76
- executionContextId: data.executionContextId,
77
- startLine: data.startLine,
78
- startColumn: data.startColumn,
79
- endLine: data.endLine,
80
- endColumn: data.endColumn,
81
- hash: data.hash,
82
- isModule: data.isModule,
83
- url: data.url,
84
- hasSourceUrl: data.hasSourceUrl,
85
- sourceMapUrl: data.sourceMapUrl,
86
- });
87
- }
88
- }
89
- else if (Types.TraceEvents.isTraceEventScriptRundownSource(event)) {
90
- // Set up script to source text and length mapping
91
- const data = event.args.data;
92
- const scriptIsolateId = getScriptIsolateId(data.isolate, data.scriptId);
93
- if ('splitIndex' in data && 'splitCount' in data) {
94
- if (!largeScriptToScriptSource.has(scriptIsolateId)) {
95
- largeScriptToScriptSource.set(scriptIsolateId, new Array(data.splitCount).fill(''));
96
- }
97
- const splittedSource = largeScriptToScriptSource.get(scriptIsolateId);
98
- if (splittedSource && data.sourceText) {
99
- splittedSource[data.splitIndex] = data.sourceText;
100
- }
101
- }
102
- else {
103
- if (data.sourceText) {
104
- scriptToScriptSource.set(scriptIsolateId, data.sourceText);
105
- }
106
- if (data.length) {
107
- scriptToSourceLength.set(scriptIsolateId, data.length);
108
- }
109
- }
110
- }
111
- }
112
- export async function finalize() {
113
- if (handlerState !== 2 /* HandlerState.INITIALIZED */) {
114
- throw new Error('Enhanced Traces Handler is not initialized while being finalized');
115
- }
116
- // Put back execution context id
117
- const v8ContextToExecutionContextId = new Map();
118
- scriptRundownEvents.forEach(scriptRundownEvent => {
119
- const data = scriptRundownEvent.args.data;
120
- const v8Context = scriptToV8Context.get(getScriptIsolateId(data.isolate, data.scriptId));
121
- if (v8Context) {
122
- v8ContextToExecutionContextId.set(v8Context, data.executionContextId);
123
- }
124
- });
125
- executionContexts.forEach(executionContext => {
126
- if (executionContext.v8Context) {
127
- const id = v8ContextToExecutionContextId.get(executionContext.v8Context);
128
- if (id) {
129
- executionContext.id = id;
130
- }
131
- }
132
- });
133
- // Put back script source text and length
134
- scripts.forEach(script => {
135
- const scriptIsolateId = getScriptIsolateId(script.isolate, script.scriptId);
136
- if (scriptToScriptSource.has(scriptIsolateId)) {
137
- script.sourceText = scriptToScriptSource.get(scriptIsolateId);
138
- script.length = scriptToSourceLength.get(scriptIsolateId);
139
- }
140
- else if (largeScriptToScriptSource.has(scriptIsolateId)) {
141
- const splittedSources = largeScriptToScriptSource.get(scriptIsolateId);
142
- if (splittedSources) {
143
- script.sourceText = splittedSources.join('');
144
- script.length = script.sourceText.length;
145
- }
146
- }
147
- // put in the aux data
148
- script.auxData =
149
- executionContexts
150
- .find(context => context.id === script.executionContextId && context.isolate === script.isolate)
151
- ?.auxData;
152
- });
153
- handlerState = 3 /* HandlerState.FINALIZED */;
154
- }
155
- export function data() {
156
- if (handlerState !== 3 /* HandlerState.FINALIZED */) {
157
- throw new Error('Enhanced Traces Handler is not finalized');
158
- }
159
- return {
160
- targets: targets,
161
- executionContexts: executionContexts,
162
- scripts: scripts,
163
- };
164
- }
165
- //# sourceMappingURL=EnhancedTracesHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EnhancedTracesHandler.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/handlers/EnhancedTracesHandler.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport * as Types from '../types/types.js';\n\nimport {HandlerState} from './types.js';\n\nexport const EnhancedTracesVersion: number = 1;\n\nexport interface Script {\n scriptId: number;\n isolate: string;\n url: string;\n executionContextId: number;\n startLine: number;\n startColumn: number;\n endLine: number;\n endColumn: number;\n hash: string;\n isModule?: boolean;\n hasSourceUrl?: boolean;\n sourceMapUrl?: string;\n length?: number;\n sourceText?: string;\n auxData?: ExecutionContextAuxData;\n}\n\nexport interface ExecutionContextAuxData {\n frameId?: string;\n isDefault?: boolean;\n type?: string;\n}\n\nexport interface ExecutionContext {\n id: number;\n origin: string;\n v8Context?: string;\n auxData?: ExecutionContextAuxData;\n isolate?: string;\n}\n\nexport interface Target {\n targetId: string;\n type: string;\n url: string;\n pid?: number;\n isolate?: string;\n}\n\nexport interface EnhancedTracesData {\n targets: Target[];\n executionContexts: ExecutionContext[];\n scripts: Script[];\n}\n\nlet handlerState = HandlerState.UNINITIALIZED;\n\nconst scriptRundownEvents: Types.TraceEvents.TraceEventScriptRundown[] = [];\nconst scriptToV8Context: Map<string, string> = new Map<string, string>();\nconst scriptToScriptSource: Map<string, string> = new Map<string, string>();\nconst largeScriptToScriptSource: Map<string, string[]> = new Map<string, string[]>();\nconst scriptToSourceLength: Map<string, number> = new Map<string, number>();\nconst targets: Target[] = [];\nconst executionContexts: ExecutionContext[] = [];\nconst scripts: Script[] = [];\n\nfunction getScriptIsolateId(isolate: string, scriptId: number): string {\n return scriptId + '@' + isolate;\n}\n\nexport function initialize(): void {\n if (handlerState !== HandlerState.UNINITIALIZED) {\n throw new Error('Enhanced Traces Handler was not reset');\n }\n\n handlerState = HandlerState.INITIALIZED;\n}\n\nexport function reset(): void {\n scriptRundownEvents.length = 0;\n scriptToV8Context.clear();\n scriptToScriptSource.clear();\n largeScriptToScriptSource.clear();\n scriptToSourceLength.clear();\n targets.length = 0;\n executionContexts.length = 0;\n scripts.length = 0;\n handlerState = HandlerState.UNINITIALIZED;\n}\n\nexport function handleEvent(event: Types.TraceEvents.TraceEventData): void {\n if (handlerState !== HandlerState.INITIALIZED) {\n throw new Error('Enhanced Traces Handler is not initialized while handling event');\n }\n if (Types.TraceEvents.isTraceEventTargetRundown(event)) {\n // Set up script to v8 context mapping\n const data = event.args?.data;\n scriptToV8Context.set(getScriptIsolateId(data.isolate, data.scriptId), data.v8context);\n // Add target\n if (!targets.find(target => target.targetId === data.frame)) {\n targets.push({\n targetId: data.frame,\n type: data.frameType,\n isolate: data.isolate,\n pid: event.pid,\n url: data.url,\n });\n }\n // Add execution context, need to put back execution context id with info from other traces\n if (!executionContexts.find(executionContext => executionContext.v8Context === data.v8context)) {\n executionContexts.push({\n id: -1,\n origin: data.origin,\n v8Context: data.v8context,\n auxData: {\n frameId: data.frame,\n isDefault: data.isDefault,\n type: data.contextType,\n },\n isolate: data.isolate,\n });\n }\n } else if (Types.TraceEvents.isTraceEventScriptRundown(event)) {\n scriptRundownEvents.push(event);\n const data = event.args.data;\n // Add script\n if (!scripts.find(script => script.scriptId === data.scriptId && script.isolate === data.isolate)) {\n scripts.push({\n scriptId: data.scriptId,\n isolate: data.isolate,\n executionContextId: data.executionContextId,\n startLine: data.startLine,\n startColumn: data.startColumn,\n endLine: data.endLine,\n endColumn: data.endColumn,\n hash: data.hash,\n isModule: data.isModule,\n url: data.url,\n hasSourceUrl: data.hasSourceUrl,\n sourceMapUrl: data.sourceMapUrl,\n });\n }\n } else if (Types.TraceEvents.isTraceEventScriptRundownSource(event)) {\n // Set up script to source text and length mapping\n const data = event.args.data;\n const scriptIsolateId = getScriptIsolateId(data.isolate, data.scriptId);\n if ('splitIndex' in data && 'splitCount' in data) {\n if (!largeScriptToScriptSource.has(scriptIsolateId)) {\n largeScriptToScriptSource.set(scriptIsolateId, new Array(data.splitCount).fill('') as string[]);\n }\n const splittedSource = largeScriptToScriptSource.get(scriptIsolateId);\n if (splittedSource && data.sourceText) {\n splittedSource[data.splitIndex as number] = data.sourceText;\n }\n } else {\n if (data.sourceText) {\n scriptToScriptSource.set(scriptIsolateId, data.sourceText);\n }\n if (data.length) {\n scriptToSourceLength.set(scriptIsolateId, data.length);\n }\n }\n }\n}\n\nexport async function finalize(): Promise<void> {\n if (handlerState !== HandlerState.INITIALIZED) {\n throw new Error('Enhanced Traces Handler is not initialized while being finalized');\n }\n // Put back execution context id\n const v8ContextToExecutionContextId: Map<string, number> = new Map<string, number>();\n scriptRundownEvents.forEach(scriptRundownEvent => {\n const data = scriptRundownEvent.args.data;\n const v8Context = scriptToV8Context.get(getScriptIsolateId(data.isolate, data.scriptId));\n if (v8Context) {\n v8ContextToExecutionContextId.set(v8Context, data.executionContextId);\n }\n });\n executionContexts.forEach(executionContext => {\n if (executionContext.v8Context) {\n const id = v8ContextToExecutionContextId.get(executionContext.v8Context);\n if (id) {\n executionContext.id = id;\n }\n }\n });\n\n // Put back script source text and length\n scripts.forEach(script => {\n const scriptIsolateId = getScriptIsolateId(script.isolate, script.scriptId);\n if (scriptToScriptSource.has(scriptIsolateId)) {\n script.sourceText = scriptToScriptSource.get(scriptIsolateId);\n script.length = scriptToSourceLength.get(scriptIsolateId);\n } else if (largeScriptToScriptSource.has(scriptIsolateId)) {\n const splittedSources = largeScriptToScriptSource.get(scriptIsolateId);\n if (splittedSources) {\n script.sourceText = splittedSources.join('');\n script.length = script.sourceText.length;\n }\n }\n // put in the aux data\n script.auxData =\n executionContexts\n .find(context => context.id === script.executionContextId && context.isolate === script.isolate)\n ?.auxData;\n });\n handlerState = HandlerState.FINALIZED;\n}\n\nexport function data(): EnhancedTracesData {\n if (handlerState !== HandlerState.FINALIZED) {\n throw new Error('Enhanced Traces Handler is not finalized');\n }\n\n return {\n targets: targets,\n executionContexts: executionContexts,\n scripts: scripts,\n };\n}\n"]}
@@ -1,91 +0,0 @@
1
- import { type CPUNode } from './CPUNode.js';
2
- import { type NetworkNode } from './NetworkNode.js';
3
- import type * as Lantern from './types/lantern.js';
4
- /**
5
- * A union of all types derived from BaseNode, allowing type check discrimination
6
- * based on `node.type`. If a new node type is created, it should be added here.
7
- */
8
- export type Node<T = Lantern.AnyNetworkObject> = CPUNode<T> | NetworkNode<T>;
9
- /**
10
- * @fileoverview This class encapsulates logic for handling resources and tasks used to model the
11
- * execution dependency graph of the page. A node has a unique identifier and can depend on other
12
- * nodes/be depended on. The construction of the graph maintains some important invariants that are
13
- * inherent to the model:
14
- *
15
- * 1. The graph is a DAG, there are no cycles.
16
- * 2. There is always a root node upon which all other nodes eventually depend.
17
- *
18
- * This allows particular optimizations in this class so that we do no need to check for cycles as
19
- * these methods are called and we can always start traversal at the root node.
20
- */
21
- declare class BaseNode<T = Lantern.AnyNetworkObject> {
22
- static types: {
23
- readonly NETWORK: "network";
24
- readonly CPU: "cpu";
25
- };
26
- _id: string;
27
- _isMainDocument: boolean;
28
- _dependents: Node[];
29
- _dependencies: Node[];
30
- constructor(id: string);
31
- get id(): string;
32
- get type(): 'network' | 'cpu';
33
- /**
34
- * In microseconds
35
- */
36
- get startTime(): number;
37
- /**
38
- * In microseconds
39
- */
40
- get endTime(): number;
41
- setIsMainDocument(value: boolean): void;
42
- isMainDocument(): boolean;
43
- getDependents(): Node[];
44
- getNumberOfDependents(): number;
45
- getDependencies(): Node[];
46
- getNumberOfDependencies(): number;
47
- getRootNode(): Node<T>;
48
- addDependent(node: Node): void;
49
- addDependency(node: Node): void;
50
- removeDependent(node: Node): void;
51
- removeDependency(node: Node): void;
52
- removeAllDependencies(): void;
53
- /**
54
- * Computes whether the given node is anywhere in the dependency graph of this node.
55
- * While this method can prevent cycles, it walks the graph and should be used sparingly.
56
- * Nodes are always considered dependent on themselves for the purposes of cycle detection.
57
- */
58
- isDependentOn(node: BaseNode<T>): boolean;
59
- /**
60
- * Clones the node's information without adding any dependencies/dependents.
61
- */
62
- cloneWithoutRelationships(): Node<T>;
63
- /**
64
- * Clones the entire graph connected to this node filtered by the optional predicate. If a node is
65
- * included by the predicate, all nodes along the paths between the node and the root will be included. If the
66
- * node this was called on is not included in the resulting filtered graph, the method will throw.
67
- */
68
- cloneWithRelationships(predicate?: (arg0: Node) => boolean): Node;
69
- /**
70
- * Traverses all connected nodes in BFS order, calling `callback` exactly once
71
- * on each. `traversalPath` is the shortest (though not necessarily unique)
72
- * path from `node` to the root of the iteration.
73
- *
74
- * The `getNextNodes` function takes a visited node and returns which nodes to
75
- * visit next. It defaults to returning the node's dependents.
76
- */
77
- traverse(callback: (node: Node<T>, traversalPath: Node<T>[]) => void, getNextNodes?: (arg0: Node<T>) => Node<T>[]): void;
78
- /**
79
- * @see BaseNode.traverse
80
- */
81
- traverseGenerator(getNextNodes?: (arg0: Node) => Node[]): Generator<{
82
- node: Node;
83
- traversalPath: Node[];
84
- }, void, unknown>;
85
- /**
86
- * Returns whether the given node has a cycle in its dependent graph by performing a DFS.
87
- */
88
- static hasCycle(node: Node, direction?: 'dependents' | 'dependencies' | 'both'): boolean;
89
- canDependOn(node: Node): boolean;
90
- }
91
- export { BaseNode };