@paulirish/trace_engine 0.0.52 → 0.0.54

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 (305) hide show
  1. package/.tmp/tsbuildinfo/analyze-inspector-issues.d.mts +13 -0
  2. package/.tmp/tsbuildinfo/analyze-inspector-issues.d.mts.map +1 -0
  3. package/.tmp/tsbuildinfo/tsconfig.tsbuildinfo +1 -1
  4. package/analyze-inspector-issues.mjs +60 -0
  5. package/core/common/common.d.ts +1 -0
  6. package/core/common/common.js +1 -0
  7. package/core/host/host.d.ts +1 -0
  8. package/core/host/host.js +1 -0
  9. package/core/platform/DOMUtilities.d.ts +8 -0
  10. package/core/platform/DOMUtilities.js +14 -0
  11. package/core/platform/DOMUtilities.js.map +1 -1
  12. package/core/platform/ServerTiming.d.ts +31 -0
  13. package/core/platform/ServerTiming.js +212 -0
  14. package/core/platform/ServerTiming.js.map +1 -0
  15. package/core/platform/StringUtilities.d.ts +1 -5
  16. package/core/platform/StringUtilities.js.map +1 -1
  17. package/core/platform/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  18. package/core/platform/platform-tsconfig.json +2 -2
  19. package/core/root/root.d.ts +1 -0
  20. package/core/root/root.js +1 -0
  21. package/core/sdk/sdk.d.ts +1 -0
  22. package/core/sdk/sdk.js +1 -0
  23. package/generated/protocol.d.ts +202 -20
  24. package/locales/af.json +11 -5
  25. package/locales/am.json +7 -1
  26. package/locales/ar.json +7 -1
  27. package/locales/as.json +7 -1
  28. package/locales/az.json +7 -1
  29. package/locales/be.json +7 -1
  30. package/locales/bg.json +7 -1
  31. package/locales/bn.json +7 -1
  32. package/locales/bs.json +7 -1
  33. package/locales/ca.json +7 -1
  34. package/locales/cs.json +7 -1
  35. package/locales/cy.json +7 -1
  36. package/locales/da.json +7 -1
  37. package/locales/de.json +7 -1
  38. package/locales/el.json +7 -1
  39. package/locales/en-GB.json +7 -1
  40. package/locales/en-US.json +49 -7
  41. package/locales/en-XL.json +49 -7
  42. package/locales/es-419.json +7 -1
  43. package/locales/es.json +7 -1
  44. package/locales/et.json +7 -1
  45. package/locales/eu.json +7 -1
  46. package/locales/fa.json +7 -1
  47. package/locales/fi.json +7 -1
  48. package/locales/fil.json +7 -1
  49. package/locales/fr-CA.json +7 -1
  50. package/locales/fr.json +7 -1
  51. package/locales/gl.json +7 -1
  52. package/locales/gu.json +7 -1
  53. package/locales/he.json +7 -1
  54. package/locales/hi.json +7 -1
  55. package/locales/hr.json +7 -1
  56. package/locales/hu.json +7 -1
  57. package/locales/hy.json +7 -1
  58. package/locales/id.json +7 -1
  59. package/locales/is.json +7 -1
  60. package/locales/it.json +7 -1
  61. package/locales/ja.json +7 -1
  62. package/locales/ka.json +7 -1
  63. package/locales/kk.json +7 -1
  64. package/locales/km.json +7 -1
  65. package/locales/kn.json +7 -1
  66. package/locales/ko.json +7 -1
  67. package/locales/ky.json +7 -1
  68. package/locales/lo.json +7 -1
  69. package/locales/lt.json +7 -1
  70. package/locales/lv.json +7 -1
  71. package/locales/mk.json +7 -1
  72. package/locales/ml.json +7 -1
  73. package/locales/mn.json +7 -1
  74. package/locales/mr.json +7 -1
  75. package/locales/ms.json +7 -1
  76. package/locales/my.json +7 -1
  77. package/locales/ne.json +7 -1
  78. package/locales/nl.json +7 -1
  79. package/locales/no.json +7 -1
  80. package/locales/or.json +7 -1
  81. package/locales/pa.json +7 -1
  82. package/locales/pl.json +7 -1
  83. package/locales/pt-PT.json +7 -1
  84. package/locales/pt.json +7 -1
  85. package/locales/ro.json +7 -1
  86. package/locales/ru.json +7 -1
  87. package/locales/si.json +7 -1
  88. package/locales/sk.json +7 -1
  89. package/locales/sl.json +7 -1
  90. package/locales/sq.json +7 -1
  91. package/locales/sr-Latn.json +7 -1
  92. package/locales/sr.json +7 -1
  93. package/locales/sv.json +7 -1
  94. package/locales/sw.json +7 -1
  95. package/locales/ta.json +7 -1
  96. package/locales/te.json +7 -1
  97. package/locales/th.json +7 -1
  98. package/locales/tr.json +7 -1
  99. package/locales/uk.json +7 -1
  100. package/locales/ur.json +7 -1
  101. package/locales/uz.json +7 -1
  102. package/locales/vi.json +7 -1
  103. package/locales/zh-HK.json +7 -1
  104. package/locales/zh-TW.json +7 -1
  105. package/locales/zh.json +7 -1
  106. package/locales/zu.json +7 -1
  107. package/models/cpu_profile/cpu_profile-tsconfig.json +2 -2
  108. package/models/cpu_profile/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  109. package/models/issues_manager/CheckFormsIssuesTrigger.d.ts +1 -0
  110. package/models/issues_manager/CheckFormsIssuesTrigger.js +1 -0
  111. package/models/issues_manager/ContrastCheckTrigger.d.ts +1 -0
  112. package/models/issues_manager/ContrastCheckTrigger.js +1 -0
  113. package/models/issues_manager/DeprecationIssue.d.ts +1 -0
  114. package/models/issues_manager/DeprecationIssue.js +1 -0
  115. package/models/issues_manager/IssueResolver.d.ts +1 -0
  116. package/models/issues_manager/IssueResolver.js +1 -0
  117. package/models/issues_manager/RelatedIssue.d.ts +1 -0
  118. package/models/issues_manager/RelatedIssue.js +1 -0
  119. package/models/issues_manager/SourceFrameIssuesManager.d.ts +1 -0
  120. package/models/issues_manager/SourceFrameIssuesManager.js +1 -0
  121. package/models/trace/LanternComputationData.js +5 -5
  122. package/models/trace/LanternComputationData.js.map +1 -1
  123. package/models/trace/ModelImpl.js +1 -1
  124. package/models/trace/ModelImpl.js.map +1 -1
  125. package/models/trace/Processor.d.ts +1 -3
  126. package/models/trace/Processor.js +1 -1
  127. package/models/trace/Processor.js.map +1 -1
  128. package/models/trace/TracingManager.js.map +1 -1
  129. package/models/trace/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  130. package/models/trace/extras/Metadata.js +2 -2
  131. package/models/trace/extras/Metadata.js.map +1 -1
  132. package/models/trace/extras/StackTraceForEvent.js +24 -16
  133. package/models/trace/extras/StackTraceForEvent.js.map +1 -1
  134. package/models/trace/extras/ThirdParties.js +1 -1
  135. package/models/trace/extras/ThirdParties.js.map +1 -1
  136. package/models/trace/extras/TimelineJSProfile.d.ts +13 -0
  137. package/models/trace/extras/TimelineJSProfile.js +55 -0
  138. package/models/trace/extras/TimelineJSProfile.js.map +1 -0
  139. package/models/trace/extras/TraceFilter.js +2 -2
  140. package/models/trace/extras/TraceFilter.js.map +1 -1
  141. package/models/trace/extras/URLForEntry.d.ts +12 -0
  142. package/models/trace/extras/URLForEntry.js +43 -0
  143. package/models/trace/extras/URLForEntry.js.map +1 -0
  144. package/models/trace/extras/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  145. package/models/trace/extras/extras-tsconfig.json +2 -2
  146. package/models/trace/extras/extras.d.ts +4 -1
  147. package/models/trace/extras/extras.js +4 -1
  148. package/models/trace/handlers/AuctionWorkletsHandler.js +5 -5
  149. package/models/trace/handlers/AuctionWorkletsHandler.js.map +1 -1
  150. package/models/trace/handlers/ExtensionTraceDataHandler.js +4 -4
  151. package/models/trace/handlers/ExtensionTraceDataHandler.js.map +1 -1
  152. package/models/trace/handlers/FlowsHandler.js +3 -3
  153. package/models/trace/handlers/FlowsHandler.js.map +1 -1
  154. package/models/trace/handlers/FramesHandler.js +7 -7
  155. package/models/trace/handlers/FramesHandler.js.map +1 -1
  156. package/models/trace/handlers/LargestImagePaintHandler.js +2 -2
  157. package/models/trace/handlers/LargestImagePaintHandler.js.map +1 -1
  158. package/models/trace/handlers/LayoutShiftsHandler.d.ts +1 -1
  159. package/models/trace/handlers/LayoutShiftsHandler.js +18 -10
  160. package/models/trace/handlers/LayoutShiftsHandler.js.map +1 -1
  161. package/models/trace/handlers/MetaHandler.js +7 -7
  162. package/models/trace/handlers/MetaHandler.js.map +1 -1
  163. package/models/trace/handlers/NetworkRequestsHandler.d.ts +1 -0
  164. package/models/trace/handlers/NetworkRequestsHandler.js +40 -26
  165. package/models/trace/handlers/NetworkRequestsHandler.js.map +1 -1
  166. package/models/trace/handlers/PageLoadMetricsHandler.d.ts +2 -2
  167. package/models/trace/handlers/PageLoadMetricsHandler.js +54 -25
  168. package/models/trace/handlers/PageLoadMetricsHandler.js.map +1 -1
  169. package/models/trace/handlers/RendererHandler.js +1 -1
  170. package/models/trace/handlers/RendererHandler.js.map +1 -1
  171. package/models/trace/handlers/ScreenshotsHandler.js +0 -1
  172. package/models/trace/handlers/ScreenshotsHandler.js.map +1 -1
  173. package/models/trace/handlers/ScriptsHandler.d.ts +5 -1
  174. package/models/trace/handlers/ScriptsHandler.js +51 -20
  175. package/models/trace/handlers/ScriptsHandler.js.map +1 -1
  176. package/models/trace/handlers/ServerTimingsHandler.d.ts +9 -0
  177. package/models/trace/handlers/ServerTimingsHandler.js +106 -0
  178. package/models/trace/handlers/ServerTimingsHandler.js.map +1 -0
  179. package/models/trace/handlers/Threads.d.ts +1 -1
  180. package/models/trace/handlers/Threads.js +17 -7
  181. package/models/trace/handlers/Threads.js.map +1 -1
  182. package/models/trace/handlers/UserInteractionsHandler.js +4 -3
  183. package/models/trace/handlers/UserInteractionsHandler.js.map +1 -1
  184. package/models/trace/handlers/WarningsHandler.js +16 -4
  185. package/models/trace/handlers/WarningsHandler.js.map +1 -1
  186. package/models/trace/handlers/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  187. package/models/trace/handlers/handlers-tsconfig.json +2 -2
  188. package/models/trace/handlers/helpers.js +3 -0
  189. package/models/trace/handlers/helpers.js.map +1 -1
  190. package/models/trace/handlers/types.d.ts +2 -6
  191. package/models/trace/handlers/types.js.map +1 -1
  192. package/models/trace/helpers/SamplesIntegrator.d.ts +1 -1
  193. package/models/trace/helpers/SamplesIntegrator.js +19 -12
  194. package/models/trace/helpers/SamplesIntegrator.js.map +1 -1
  195. package/models/trace/helpers/Trace.js +111 -111
  196. package/models/trace/helpers/Trace.js.map +1 -1
  197. package/models/trace/helpers/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  198. package/models/trace/helpers/helpers-tsconfig.json +2 -2
  199. package/models/trace/insights/CLSCulprits.d.ts +1 -1
  200. package/models/trace/insights/CLSCulprits.js +43 -22
  201. package/models/trace/insights/CLSCulprits.js.map +1 -1
  202. package/models/trace/insights/Cache.js +7 -6
  203. package/models/trace/insights/Cache.js.map +1 -1
  204. package/models/trace/insights/Common.js +7 -3
  205. package/models/trace/insights/Common.js.map +1 -1
  206. package/models/trace/insights/CumulativeLayoutShift.d.ts +57 -0
  207. package/models/trace/insights/CumulativeLayoutShift.js +335 -0
  208. package/models/trace/insights/CumulativeLayoutShift.js.map +1 -0
  209. package/models/trace/insights/DOMSize.js +3 -3
  210. package/models/trace/insights/DOMSize.js.map +1 -1
  211. package/models/trace/insights/DocumentLatency.d.ts +7 -3
  212. package/models/trace/insights/DocumentLatency.js +26 -10
  213. package/models/trace/insights/DocumentLatency.js.map +1 -1
  214. package/models/trace/insights/DuplicatedJavaScript.js +2 -2
  215. package/models/trace/insights/DuplicatedJavaScript.js.map +1 -1
  216. package/models/trace/insights/FontDisplay.js +2 -2
  217. package/models/trace/insights/FontDisplay.js.map +1 -1
  218. package/models/trace/insights/ForcedReflow.js +2 -2
  219. package/models/trace/insights/ForcedReflow.js.map +1 -1
  220. package/models/trace/insights/ImageDelivery.js +2 -2
  221. package/models/trace/insights/ImageDelivery.js.map +1 -1
  222. package/models/trace/insights/InsightRunners.d.ts +9 -0
  223. package/models/trace/insights/InsightRunners.js +13 -0
  224. package/models/trace/insights/InsightRunners.js.map +1 -0
  225. package/models/trace/insights/InteractionToNextPaint.js +3 -3
  226. package/models/trace/insights/InteractionToNextPaint.js.map +1 -1
  227. package/models/trace/insights/LCPDiscovery.js +3 -3
  228. package/models/trace/insights/LCPDiscovery.js.map +1 -1
  229. package/models/trace/insights/LCPPhases.d.ts +1 -1
  230. package/models/trace/insights/LCPPhases.js +4 -4
  231. package/models/trace/insights/LCPPhases.js.map +1 -1
  232. package/models/trace/insights/LargestContentfulPaint.d.ts +38 -0
  233. package/models/trace/insights/LargestContentfulPaint.js +113 -0
  234. package/models/trace/insights/LargestContentfulPaint.js.map +1 -0
  235. package/models/trace/insights/LegacyJavaScript.d.ts +1 -1
  236. package/models/trace/insights/LegacyJavaScript.js +3 -3
  237. package/models/trace/insights/LegacyJavaScript.js.map +1 -1
  238. package/models/trace/insights/ModernHTTP.js +2 -2
  239. package/models/trace/insights/ModernHTTP.js.map +1 -1
  240. package/models/trace/insights/NetworkDependencyTree.d.ts +151 -3
  241. package/models/trace/insights/NetworkDependencyTree.js +650 -12
  242. package/models/trace/insights/NetworkDependencyTree.js.map +1 -1
  243. package/models/trace/insights/RenderBlocking.js +4 -4
  244. package/models/trace/insights/RenderBlocking.js.map +1 -1
  245. package/models/trace/insights/SlowCSSSelector.js +2 -2
  246. package/models/trace/insights/SlowCSSSelector.js.map +1 -1
  247. package/models/trace/insights/ThirdParties.d.ts +1 -1
  248. package/models/trace/insights/ThirdParties.js +3 -3
  249. package/models/trace/insights/ThirdParties.js.map +1 -1
  250. package/models/trace/insights/ThirdPartyWeb.d.ts +13 -0
  251. package/models/trace/insights/ThirdPartyWeb.js +42 -0
  252. package/models/trace/insights/ThirdPartyWeb.js.map +1 -0
  253. package/models/trace/insights/Viewport.js +2 -2
  254. package/models/trace/insights/Viewport.js.map +1 -1
  255. package/models/trace/insights/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  256. package/models/trace/insights/insights-tsconfig.json +2 -2
  257. package/models/trace/insights/types.d.ts +3 -1
  258. package/models/trace/insights/types.js +19 -0
  259. package/models/trace/insights/types.js.map +1 -1
  260. package/models/trace/lantern/core/core-tsconfig.json +2 -2
  261. package/models/trace/lantern/core/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  262. package/models/trace/lantern/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  263. package/models/trace/lantern/graph/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  264. package/models/trace/lantern/graph/graph-tsconfig.json +2 -2
  265. package/models/trace/lantern/lantern-tsconfig.json +2 -2
  266. package/models/trace/lantern/metrics/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  267. package/models/trace/lantern/metrics/metrics-tsconfig.json +2 -2
  268. package/models/trace/lantern/simulation/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  269. package/models/trace/lantern/simulation/simulation-tsconfig.json +2 -2
  270. package/models/trace/lantern/types/Lantern.d.ts +4 -7
  271. package/models/trace/lantern/types/Lantern.js +1 -0
  272. package/models/trace/lantern/types/Lantern.js.map +1 -1
  273. package/models/trace/lantern/types/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  274. package/models/trace/lantern/types/types-tsconfig.json +2 -2
  275. package/models/trace/root-causes/LayoutShift.d.ts +125 -0
  276. package/models/trace/root-causes/LayoutShift.js +519 -0
  277. package/models/trace/root-causes/LayoutShift.js.map +1 -0
  278. package/models/trace/root-causes/RootCauses.d.ts +15 -0
  279. package/models/trace/root-causes/RootCauses.js +12 -0
  280. package/models/trace/root-causes/RootCauses.js.map +1 -0
  281. package/models/trace/root-causes/bundle-tsconfig.json +1 -0
  282. package/models/trace/root-causes/devtools_entrypoint-bundle-typescript-tsconfig.json +42 -0
  283. package/models/trace/root-causes/root-causes-tsconfig.json +55 -0
  284. package/models/trace/root-causes/root-causes.d.ts +1 -0
  285. package/models/trace/root-causes/root-causes.js +5 -0
  286. package/models/trace/root-causes/root-causes.js.map +1 -0
  287. package/models/trace/trace-tsconfig.json +2 -2
  288. package/models/trace/types/Configuration.d.ts +2 -0
  289. package/models/trace/types/Configuration.js.map +1 -1
  290. package/models/trace/types/Extensions.d.ts +1 -3
  291. package/models/trace/types/Extensions.js.map +1 -1
  292. package/models/trace/types/File.d.ts +5 -4
  293. package/models/trace/types/File.js +28 -4
  294. package/models/trace/types/File.js.map +1 -1
  295. package/models/trace/types/TraceEvents.d.ts +55 -28
  296. package/models/trace/types/TraceEvents.js +377 -103
  297. package/models/trace/types/TraceEvents.js.map +1 -1
  298. package/models/trace/types/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
  299. package/models/trace/types/types-tsconfig.json +2 -2
  300. package/package.json +1 -1
  301. package/test/test-trace-engine.mjs +77 -0
  302. package/third_party/marked/marked.d.ts +1 -0
  303. package/third_party/marked/marked.js +1 -0
  304. package/.tmp/tsbuildinfo/models/trace/extras/polyfills.d.ts +0 -4
  305. package/.tmp/tsbuildinfo/models/trace/extras/polyfills.d.ts.map +0 -1
@@ -32,15 +32,21 @@ export function get(event, parsedTrace) {
32
32
  }
33
33
  else {
34
34
  result = getForEvent(event, parsedTrace);
35
- const maybeProtocolCallFrame = getPayloadStackAsProtocolCallFrame(event);
36
- if (result && maybeProtocolCallFrame && !isNativeJSFunction(maybeProtocolCallFrame)) {
37
- // If the event has a payload stack trace, replace the top frame
38
- // of the calculated stack with the top frame of the payload stack
39
- // because trace payload call frames contain call locations, unlike
40
- // profile call frames (which contain function declaration locations).
41
- // This way the user knows which exact JS location triggered an
42
- // event.
43
- result.callFrames[0] = maybeProtocolCallFrame;
35
+ const payloadCallFrames = getTraceEventPayloadStackAsProtocolCallFrame(event).filter(callFrame => !isNativeJSFunction(callFrame));
36
+ // If the event has a payload stack trace, replace the synchronous
37
+ // portion of the calculated stack with the payload's call frames.
38
+ // We do this because trace payload call frames contain call
39
+ // locations, unlike profile call frames obtained with getForEvent
40
+ // (which contain function declaration locations).
41
+ // This way the user knows which exact JS location triggered an
42
+ // event.
43
+ if (!result.callFrames.length) {
44
+ result.callFrames = payloadCallFrames;
45
+ }
46
+ else {
47
+ for (let i = 0; i < payloadCallFrames.length && i < result.callFrames.length; i++) {
48
+ result.callFrames[i] = payloadCallFrames[i];
49
+ }
44
50
  }
45
51
  }
46
52
  if (result) {
@@ -172,13 +178,15 @@ function isNativeJSFunction({ columnNumber, lineNumber, url, scriptId }) {
172
178
  return lineNumber === -1 && columnNumber === -1 && url === '' && scriptId === '0';
173
179
  }
174
180
  /**
175
- * Extracts the top frame in the stack contained in a trace event's payload
176
- * (if any) and casts it as a Protocol.Runtime.CallFrame.
181
+ * Converts a stack trace from a trace event's payload into an array of
182
+ * Protocol.Runtime.CallFrame.
177
183
  */
178
- function getPayloadStackAsProtocolCallFrame(event) {
179
- const maybeCallStack = Helpers.Trace.getZeroIndexedStackTraceInEventPayload(event);
180
- const maybeCallFrame = maybeCallStack?.at(0);
181
- const maybeProtocolCallFrame = maybeCallFrame && { ...maybeCallFrame, scriptId: String(maybeCallFrame.scriptId) };
182
- return maybeProtocolCallFrame || null;
184
+ function getTraceEventPayloadStackAsProtocolCallFrame(event) {
185
+ const payloadCallStack = Helpers.Trace.getZeroIndexedStackTraceInEventPayload(event) || [];
186
+ const callFrames = [];
187
+ for (const frame of payloadCallStack) {
188
+ callFrames.push({ ...frame, scriptId: String(frame.scriptId) });
189
+ }
190
+ return callFrames;
183
191
  }
184
192
  //# sourceMappingURL=StackTraceForEvent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StackTraceForEvent.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/extras/StackTraceForEvent.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 type * as Protocol from '../../../generated/protocol.js';\nimport type * as Handlers from '../handlers/handlers.js';\nimport * as Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\nexport const stackTraceForEventInTrace =\n new Map<Handlers.Types.ParsedTrace, Map<Types.Events.Event, Protocol.Runtime.StackTrace>>();\n\nexport function clearCacheForTrace(parsedTrace: Handlers.Types.ParsedTrace): void {\n stackTraceForEventInTrace.delete(parsedTrace);\n}\n/**\n * This util builds a stack trace that includes async calls for a given\n * event. It leverages data we collect from sampling to deduce sync\n * stacks and trace event instrumentation on the V8 debugger to stitch\n * them together.\n */\nexport function get(event: Types.Events.Event, parsedTrace: Handlers.Types.ParsedTrace): Protocol.Runtime.StackTrace|\n null {\n let cacheForTrace = stackTraceForEventInTrace.get(parsedTrace);\n if (!cacheForTrace) {\n cacheForTrace = new Map();\n stackTraceForEventInTrace.set(parsedTrace, cacheForTrace);\n }\n const resultFromCache = cacheForTrace.get(event);\n if (resultFromCache) {\n return resultFromCache;\n }\n let result: Protocol.Runtime.StackTrace|null = null;\n if (Types.Extensions.isSyntheticExtensionEntry(event)) {\n result = getForExtensionEntry(event, parsedTrace);\n } else if (Types.Events.isPerformanceMeasureBegin(event)) {\n result = getForPerformanceMeasure(event, parsedTrace);\n } else {\n result = getForEvent(event, parsedTrace);\n const maybeProtocolCallFrame = getPayloadStackAsProtocolCallFrame(event);\n if (result && maybeProtocolCallFrame && !isNativeJSFunction(maybeProtocolCallFrame)) {\n // If the event has a payload stack trace, replace the top frame\n // of the calculated stack with the top frame of the payload stack\n // because trace payload call frames contain call locations, unlike\n // profile call frames (which contain function declaration locations).\n // This way the user knows which exact JS location triggered an\n // event.\n result.callFrames[0] = maybeProtocolCallFrame;\n }\n }\n if (result) {\n cacheForTrace.set(event, result);\n }\n return result;\n}\n\n/**\n * Fallback method to obtain a stack trace using the parsed event tree\n * hierarchy. This shouldn't be called outside of this file, use `get`\n * instead to ensure the correct event in the tree hierarchy is used.\n */\nfunction getForEvent(event: Types.Events.Event, parsedTrace: Handlers.Types.ParsedTrace): Protocol.Runtime.StackTrace {\n // When working with a CPU profile the renderer handler won't have\n // entries in its tree.\n const entryToNode =\n parsedTrace.Renderer.entryToNode.size > 0 ? parsedTrace.Renderer.entryToNode : parsedTrace.Samples.entryToNode;\n const topStackTrace: Protocol.Runtime.StackTrace = {callFrames: []};\n let stackTrace: Protocol.Runtime.StackTrace = topStackTrace;\n let currentEntry: Types.Events.SyntheticProfileCall;\n let node: Helpers.TreeHelpers.TraceEntryNode|null|undefined = entryToNode.get(event);\n const traceCache =\n stackTraceForEventInTrace.get(parsedTrace) || new Map<Types.Events.Event, Protocol.Runtime.StackTrace>();\n stackTraceForEventInTrace.set(parsedTrace, traceCache);\n // Move up this node's ancestor tree appending JS frames to its\n // stack trace. If an async caller is detected, move up in the async\n // stack instead.\n while (node) {\n if (!Types.Events.isProfileCall(node.entry)) {\n const maybeAsyncParent = parsedTrace.AsyncJSCalls.runEntryPointToScheduler.get(node.entry);\n if (!maybeAsyncParent) {\n node = node.parent;\n continue;\n }\n const maybeAsyncParentNode = maybeAsyncParent && entryToNode.get(maybeAsyncParent.scheduler);\n if (maybeAsyncParentNode) {\n stackTrace = addAsyncParentToStack(stackTrace, maybeAsyncParent.taskName);\n node = maybeAsyncParentNode;\n }\n continue;\n }\n currentEntry = node.entry;\n // First check if this entry was processed before.\n const stackTraceFromCache = traceCache.get(node.entry);\n if (stackTraceFromCache) {\n stackTrace.callFrames.push(...stackTraceFromCache.callFrames.filter(callFrame => !isNativeJSFunction(callFrame)));\n stackTrace.parent = stackTraceFromCache.parent;\n // Only set the description to the cache value if we didn't\n // compute it in the previous iteration, since the async stack\n // trace descriptions / taskNames is only extracted when jumping\n // to the async parent, and that might not have happened when\n // the cached value was computed (e.g. the cached value\n // computation started at some point inside the parent stack\n // trace).\n stackTrace.description = stackTrace.description || stackTraceFromCache.description;\n break;\n }\n\n if (!isNativeJSFunction(currentEntry.callFrame)) {\n stackTrace.callFrames.push(currentEntry.callFrame);\n }\n const maybeAsyncParentEvent = parsedTrace.AsyncJSCalls.asyncCallToScheduler.get(currentEntry);\n const maybeAsyncParentNode = maybeAsyncParentEvent && entryToNode.get(maybeAsyncParentEvent.scheduler);\n if (maybeAsyncParentNode) {\n stackTrace = addAsyncParentToStack(stackTrace, maybeAsyncParentEvent.taskName);\n node = maybeAsyncParentNode;\n continue;\n }\n node = node.parent;\n }\n return topStackTrace;\n}\n\nfunction addAsyncParentToStack(stackTrace: Protocol.Runtime.StackTrace, taskName: string): Protocol.Runtime.StackTrace {\n const parent: Protocol.Runtime.StackTrace = {callFrames: []};\n // The Protocol.Runtime.StackTrace type is recursive, so we\n // move one level deeper in it as we walk up the ancestor tree.\n stackTrace.parent = parent;\n // Note: this description effectively corresponds to the name\n // of the task that scheduled the stack trace we are jumping\n // FROM, so it would make sense that it was set to that stack\n // trace instead of the one we are jumping TO. However, the\n // JS presentation utils we use to present async stack traces\n // assume the description is added to the stack trace that\n // scheduled the async task, so we build the data that way.\n parent.description = taskName;\n return parent;\n}\n\n/**\n * Finds the JS call in which an extension entry was injected (the\n * code location that called the extension API), and returns its stack\n * trace.\n */\nfunction getForExtensionEntry(event: Types.Extensions.SyntheticExtensionEntry, parsedTrace: Handlers.Types.ParsedTrace):\n Protocol.Runtime.StackTrace|null {\n const rawEvent: Types.Events.Event = event.rawSourceEvent;\n if (Types.Events.isPerformanceMeasureBegin(rawEvent)) {\n return getForPerformanceMeasure(rawEvent, parsedTrace);\n }\n if (!rawEvent) {\n return null;\n }\n return get(rawEvent, parsedTrace);\n}\n\n/**\n * Gets the raw event for a user timing and obtains its stack trace.\n */\nfunction getForPerformanceMeasure(event: Types.Events.PerformanceMeasureBegin, parsedTrace: Handlers.Types.ParsedTrace):\n Protocol.Runtime.StackTrace|null {\n let rawEvent: Types.Events.Event|undefined = event;\n if (event.args.traceId === undefined) {\n return null;\n }\n // performance.measure calls dispatch 2 events: one for the call\n // itself and another to represent the measured entry in the trace\n // timeline. They are connected via a common traceId. At this\n // point `rawEvent` corresponds to the second case, we must\n // encounter the event for the call itself to obtain its callstack.\n rawEvent = parsedTrace.UserTimings.measureTraceByTraceId.get(event.args.traceId);\n if (!rawEvent) {\n return null;\n }\n return get(rawEvent, parsedTrace);\n}\n/**\n * Determines if a function is a native JS API (like setTimeout,\n * requestAnimationFrame, consoleTask.run. etc.). This is useful to\n * discard stack frames corresponding to the JS scheduler function\n * itself, since it's already being used as title of async stack traces\n * taken from the async `taskName`. This is also consistent with the\n * behaviour of the stack trace in the sources\n * panel.\n */\nfunction isNativeJSFunction({columnNumber, lineNumber, url, scriptId}: Protocol.Runtime.CallFrame): boolean {\n return lineNumber === -1 && columnNumber === -1 && url === '' && scriptId === '0';\n}\n\n/**\n * Extracts the top frame in the stack contained in a trace event's payload\n * (if any) and casts it as a Protocol.Runtime.CallFrame.\n */\nfunction getPayloadStackAsProtocolCallFrame(event: Types.Events.Event): Protocol.Runtime.CallFrame|null {\n const maybeCallStack = Helpers.Trace.getZeroIndexedStackTraceInEventPayload(event);\n const maybeCallFrame = maybeCallStack?.at(0);\n const maybeProtocolCallFrame =\n maybeCallFrame && {...maybeCallFrame, scriptId: String(maybeCallFrame.scriptId) as Protocol.Runtime.ScriptId};\n return maybeProtocolCallFrame || null;\n}\n"]}
1
+ {"version":3,"file":"StackTraceForEvent.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/extras/StackTraceForEvent.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 type * as Protocol from '../../../generated/protocol.js';\nimport type * as Handlers from '../handlers/handlers.js';\nimport * as Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\nexport const stackTraceForEventInTrace =\n new Map<Handlers.Types.ParsedTrace, Map<Types.Events.Event, Protocol.Runtime.StackTrace>>();\n\nexport function clearCacheForTrace(parsedTrace: Handlers.Types.ParsedTrace): void {\n stackTraceForEventInTrace.delete(parsedTrace);\n}\n/**\n * This util builds a stack trace that includes async calls for a given\n * event. It leverages data we collect from sampling to deduce sync\n * stacks and trace event instrumentation on the V8 debugger to stitch\n * them together.\n */\nexport function get(event: Types.Events.Event, parsedTrace: Handlers.Types.ParsedTrace): Protocol.Runtime.StackTrace|\n null {\n let cacheForTrace = stackTraceForEventInTrace.get(parsedTrace);\n if (!cacheForTrace) {\n cacheForTrace = new Map();\n stackTraceForEventInTrace.set(parsedTrace, cacheForTrace);\n }\n const resultFromCache = cacheForTrace.get(event);\n if (resultFromCache) {\n return resultFromCache;\n }\n let result: Protocol.Runtime.StackTrace|null = null;\n if (Types.Extensions.isSyntheticExtensionEntry(event)) {\n result = getForExtensionEntry(event, parsedTrace);\n } else if (Types.Events.isPerformanceMeasureBegin(event)) {\n result = getForPerformanceMeasure(event, parsedTrace);\n } else {\n result = getForEvent(event, parsedTrace);\n const payloadCallFrames =\n getTraceEventPayloadStackAsProtocolCallFrame(event).filter(callFrame => !isNativeJSFunction(callFrame));\n // If the event has a payload stack trace, replace the synchronous\n // portion of the calculated stack with the payload's call frames.\n // We do this because trace payload call frames contain call\n // locations, unlike profile call frames obtained with getForEvent\n // (which contain function declaration locations).\n // This way the user knows which exact JS location triggered an\n // event.\n if (!result.callFrames.length) {\n result.callFrames = payloadCallFrames;\n } else {\n for (let i = 0; i < payloadCallFrames.length && i < result.callFrames.length; i++) {\n result.callFrames[i] = payloadCallFrames[i];\n }\n }\n }\n if (result) {\n cacheForTrace.set(event, result);\n }\n return result;\n}\n\n/**\n * Fallback method to obtain a stack trace using the parsed event tree\n * hierarchy. This shouldn't be called outside of this file, use `get`\n * instead to ensure the correct event in the tree hierarchy is used.\n */\nfunction getForEvent(event: Types.Events.Event, parsedTrace: Handlers.Types.ParsedTrace): Protocol.Runtime.StackTrace {\n // When working with a CPU profile the renderer handler won't have\n // entries in its tree.\n const entryToNode =\n parsedTrace.Renderer.entryToNode.size > 0 ? parsedTrace.Renderer.entryToNode : parsedTrace.Samples.entryToNode;\n const topStackTrace: Protocol.Runtime.StackTrace = {callFrames: []};\n let stackTrace: Protocol.Runtime.StackTrace = topStackTrace;\n let currentEntry: Types.Events.SyntheticProfileCall;\n let node: Helpers.TreeHelpers.TraceEntryNode|null|undefined = entryToNode.get(event);\n const traceCache =\n stackTraceForEventInTrace.get(parsedTrace) || new Map<Types.Events.Event, Protocol.Runtime.StackTrace>();\n stackTraceForEventInTrace.set(parsedTrace, traceCache);\n // Move up this node's ancestor tree appending JS frames to its\n // stack trace. If an async caller is detected, move up in the async\n // stack instead.\n while (node) {\n if (!Types.Events.isProfileCall(node.entry)) {\n const maybeAsyncParent = parsedTrace.AsyncJSCalls.runEntryPointToScheduler.get(node.entry);\n if (!maybeAsyncParent) {\n node = node.parent;\n continue;\n }\n const maybeAsyncParentNode = maybeAsyncParent && entryToNode.get(maybeAsyncParent.scheduler);\n if (maybeAsyncParentNode) {\n stackTrace = addAsyncParentToStack(stackTrace, maybeAsyncParent.taskName);\n node = maybeAsyncParentNode;\n }\n continue;\n }\n currentEntry = node.entry;\n // First check if this entry was processed before.\n const stackTraceFromCache = traceCache.get(node.entry);\n if (stackTraceFromCache) {\n stackTrace.callFrames.push(...stackTraceFromCache.callFrames.filter(callFrame => !isNativeJSFunction(callFrame)));\n stackTrace.parent = stackTraceFromCache.parent;\n // Only set the description to the cache value if we didn't\n // compute it in the previous iteration, since the async stack\n // trace descriptions / taskNames is only extracted when jumping\n // to the async parent, and that might not have happened when\n // the cached value was computed (e.g. the cached value\n // computation started at some point inside the parent stack\n // trace).\n stackTrace.description = stackTrace.description || stackTraceFromCache.description;\n break;\n }\n\n if (!isNativeJSFunction(currentEntry.callFrame)) {\n stackTrace.callFrames.push(currentEntry.callFrame);\n }\n const maybeAsyncParentEvent = parsedTrace.AsyncJSCalls.asyncCallToScheduler.get(currentEntry);\n const maybeAsyncParentNode = maybeAsyncParentEvent && entryToNode.get(maybeAsyncParentEvent.scheduler);\n if (maybeAsyncParentNode) {\n stackTrace = addAsyncParentToStack(stackTrace, maybeAsyncParentEvent.taskName);\n node = maybeAsyncParentNode;\n continue;\n }\n node = node.parent;\n }\n return topStackTrace;\n}\n\nfunction addAsyncParentToStack(stackTrace: Protocol.Runtime.StackTrace, taskName: string): Protocol.Runtime.StackTrace {\n const parent: Protocol.Runtime.StackTrace = {callFrames: []};\n // The Protocol.Runtime.StackTrace type is recursive, so we\n // move one level deeper in it as we walk up the ancestor tree.\n stackTrace.parent = parent;\n // Note: this description effectively corresponds to the name\n // of the task that scheduled the stack trace we are jumping\n // FROM, so it would make sense that it was set to that stack\n // trace instead of the one we are jumping TO. However, the\n // JS presentation utils we use to present async stack traces\n // assume the description is added to the stack trace that\n // scheduled the async task, so we build the data that way.\n parent.description = taskName;\n return parent;\n}\n\n/**\n * Finds the JS call in which an extension entry was injected (the\n * code location that called the extension API), and returns its stack\n * trace.\n */\nfunction getForExtensionEntry(event: Types.Extensions.SyntheticExtensionEntry, parsedTrace: Handlers.Types.ParsedTrace):\n Protocol.Runtime.StackTrace|null {\n const rawEvent: Types.Events.Event = event.rawSourceEvent;\n if (Types.Events.isPerformanceMeasureBegin(rawEvent)) {\n return getForPerformanceMeasure(rawEvent, parsedTrace);\n }\n if (!rawEvent) {\n return null;\n }\n return get(rawEvent, parsedTrace);\n}\n\n/**\n * Gets the raw event for a user timing and obtains its stack trace.\n */\nfunction getForPerformanceMeasure(event: Types.Events.PerformanceMeasureBegin, parsedTrace: Handlers.Types.ParsedTrace):\n Protocol.Runtime.StackTrace|null {\n let rawEvent: Types.Events.Event|undefined = event;\n if (event.args.traceId === undefined) {\n return null;\n }\n // performance.measure calls dispatch 2 events: one for the call\n // itself and another to represent the measured entry in the trace\n // timeline. They are connected via a common traceId. At this\n // point `rawEvent` corresponds to the second case, we must\n // encounter the event for the call itself to obtain its callstack.\n rawEvent = parsedTrace.UserTimings.measureTraceByTraceId.get(event.args.traceId);\n if (!rawEvent) {\n return null;\n }\n return get(rawEvent, parsedTrace);\n}\n/**\n * Determines if a function is a native JS API (like setTimeout,\n * requestAnimationFrame, consoleTask.run. etc.). This is useful to\n * discard stack frames corresponding to the JS scheduler function\n * itself, since it's already being used as title of async stack traces\n * taken from the async `taskName`. This is also consistent with the\n * behaviour of the stack trace in the sources\n * panel.\n */\nfunction isNativeJSFunction({columnNumber, lineNumber, url, scriptId}: Protocol.Runtime.CallFrame): boolean {\n return lineNumber === -1 && columnNumber === -1 && url === '' && scriptId === '0';\n}\n\n/**\n * Converts a stack trace from a trace event's payload into an array of\n * Protocol.Runtime.CallFrame.\n */\nfunction getTraceEventPayloadStackAsProtocolCallFrame(event: Types.Events.Event): Protocol.Runtime.CallFrame[] {\n const payloadCallStack = Helpers.Trace.getZeroIndexedStackTraceInEventPayload(event) || [];\n const callFrames: Protocol.Runtime.CallFrame[] = [];\n for (const frame of payloadCallStack) {\n callFrames.push({...frame, scriptId: String(frame.scriptId) as Protocol.Runtime.ScriptId});\n }\n return callFrames;\n}\n"]}
@@ -101,7 +101,7 @@ function summarizeBottomUpByURL(root, parsedTrace) {
101
101
  function getBottomUpTree(mainThreadEvents, tracebounds, groupingFunction) {
102
102
  // Use the same filtering as front_end/panels/timeline/TimelineTreeView.ts.
103
103
  const visibleEvents = Helpers.Trace.VISIBLE_TRACE_EVENT_TYPES.values().toArray();
104
- const filter = new TraceFilter.VisibleEventsFilter(visibleEvents.concat(["SyntheticNetworkRequest" /* Types.Events.Name.SYNTHETIC_NETWORK_REQUEST */]));
104
+ const filter = new TraceFilter.VisibleEventsFilter(visibleEvents.concat([Types.Events.Name.SYNTHETIC_NETWORK_REQUEST]));
105
105
  // The bottom up root node handles all the "in Tracebounds" checks we need for the insight.
106
106
  const startTime = Helpers.Timing.microToMilli(tracebounds.min);
107
107
  const endTime = Helpers.Timing.microToMilli(tracebounds.max);
@@ -1 +1 @@
1
- {"version":3,"file":"ThirdParties.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/extras/ThirdParties.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 type * as ThirdPartyWeb from '../../../third_party/third-party-web/third-party-web.js';\nimport * as Handlers from '../handlers/handlers.js';\nimport * as Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\nimport * as TraceFilter from './TraceFilter.js';\nimport * as TraceTree from './TraceTree.js';\n\nexport type Entity = typeof ThirdPartyWeb.ThirdPartyWeb.entities[number];\n\ninterface BaseSummary {\n entity: Entity;\n transferSize: number;\n mainThreadTime: Types.Timing.Milli;\n}\n\nexport interface EntitySummary extends BaseSummary {\n relatedEvents: Types.Events.Event[];\n}\n\nexport interface URLSummary extends BaseSummary {\n url: string;\n request?: Types.Events.SyntheticNetworkRequest;\n}\n\n/**\n *\n * Returns Main frame main thread events.\n * These events are inline with the ones used by selectedEvents() of TimelineTreeViews\n */\nfunction collectMainThreadActivity(parsedTrace: Handlers.Types.ParsedTrace): Types.Events.Event[] {\n // TODO: Note b/402658800 could be an issue here.\n const mainFrameMainThread = parsedTrace.Renderer.processes.values()\n .find(p => {\n const url = p.url ?? '';\n // Frame url checked a la CompatibilityTracksAppenders's addThreadAppenders\n return p.isOnMainFrame && !url.startsWith('about:') && !url.startsWith('chrome:');\n })\n ?.threads.values()\n .find(t => t.name === 'CrRendererMain');\n\n if (!mainFrameMainThread) {\n return [];\n }\n\n return mainFrameMainThread.entries;\n}\n\nexport function summarizeByThirdParty(\n parsedTrace: Handlers.Types.ParsedTrace, traceBounds: Types.Timing.TraceWindowMicro): EntitySummary[] {\n const mainThreadEvents = collectMainThreadActivity(parsedTrace).sort(Helpers.Trace.eventTimeComparator);\n const groupingFunction = (event: Types.Events.Event): string => {\n const entity = parsedTrace.Renderer.entityMappings.entityByEvent.get(event);\n return entity?.name ?? '';\n };\n const node = getBottomUpTree(mainThreadEvents, traceBounds, groupingFunction);\n const summaries = summarizeBottomUpByEntity(node, parsedTrace);\n\n return summaries;\n}\n\n/**\n * Used only by Lighthouse.\n */\nexport function summarizeByURL(\n parsedTrace: Handlers.Types.ParsedTrace, traceBounds: Types.Timing.TraceWindowMicro): URLSummary[] {\n const mainThreadEvents = collectMainThreadActivity(parsedTrace).sort(Helpers.Trace.eventTimeComparator);\n const groupingFunction = (event: Types.Events.Event): string => {\n return Handlers.Helpers.getNonResolvedURL(event, parsedTrace) ?? '';\n };\n const node = getBottomUpTree(mainThreadEvents, traceBounds, groupingFunction);\n const summaries = summarizeBottomUpByURL(node, parsedTrace);\n\n return summaries;\n}\n\nfunction summarizeBottomUpByEntity(\n root: TraceTree.BottomUpRootNode, parsedTrace: Handlers.Types.ParsedTrace): EntitySummary[] {\n const summaries: EntitySummary[] = [];\n\n // Top nodes are the 3P entities.\n const topNodes = [...root.children().values()].flat();\n for (const node of topNodes) {\n if (node.id === '') {\n continue;\n }\n\n const entity = parsedTrace.Renderer.entityMappings.entityByEvent.get(node.event);\n if (!entity) {\n continue;\n }\n\n // Lets use the mapper events as our source of events, since we use the main thread to construct\n // the bottom up tree. The mapper will give us all related events.\n const summary: EntitySummary = {\n transferSize: node.transferSize,\n mainThreadTime: Types.Timing.Milli(node.selfTime),\n entity,\n relatedEvents: parsedTrace.Renderer.entityMappings.eventsByEntity.get(entity) ?? [],\n };\n summaries.push(summary);\n }\n\n return summaries;\n}\n\nfunction summarizeBottomUpByURL(\n root: TraceTree.BottomUpRootNode, parsedTrace: Handlers.Types.ParsedTrace): URLSummary[] {\n const summaries: URLSummary[] = [];\n const allRequests = parsedTrace.NetworkRequests.byTime;\n\n // Top nodes are URLs.\n const topNodes = [...root.children().values()].flat();\n for (const node of topNodes) {\n if (node.id === '' || typeof node.id !== 'string') {\n continue;\n }\n\n const entity = parsedTrace.Renderer.entityMappings.entityByEvent.get(node.event);\n if (!entity) {\n continue;\n }\n\n const url = node.id;\n const request = allRequests.find(r => r.args.data.url === url);\n\n const summary: URLSummary = {\n request,\n url,\n entity,\n transferSize: node.transferSize,\n mainThreadTime: Types.Timing.Milli(node.selfTime),\n };\n summaries.push(summary);\n }\n\n return summaries;\n}\n\nfunction getBottomUpTree(\n mainThreadEvents: Types.Events.Event[], tracebounds: Types.Timing.TraceWindowMicro,\n groupingFunction: ((arg0: Types.Events.Event) => string)|null): TraceTree.BottomUpRootNode {\n // Use the same filtering as front_end/panels/timeline/TimelineTreeView.ts.\n const visibleEvents = Helpers.Trace.VISIBLE_TRACE_EVENT_TYPES.values().toArray();\n const filter =\n new TraceFilter.VisibleEventsFilter(visibleEvents.concat([Types.Events.Name.SYNTHETIC_NETWORK_REQUEST]));\n\n // The bottom up root node handles all the \"in Tracebounds\" checks we need for the insight.\n const startTime = Helpers.Timing.microToMilli(tracebounds.min);\n const endTime = Helpers.Timing.microToMilli(tracebounds.max);\n const node = new TraceTree.BottomUpRootNode(mainThreadEvents, {\n textFilter: new TraceFilter.ExclusiveNameFilter([]),\n filters: [filter],\n startTime,\n endTime,\n eventGroupIdCallback: groupingFunction,\n calculateTransferSize: true,\n // Ensure we group by 3P alongside eventID for correct 3P grouping.\n forceGroupIdCallback: true,\n }) as TraceTree.BottomUpRootNode;\n return node;\n}\n"]}
1
+ {"version":3,"file":"ThirdParties.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/extras/ThirdParties.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 type * as ThirdPartyWeb from '../../../third_party/third-party-web/third-party-web.js';\nimport * as Handlers from '../handlers/handlers.js';\nimport * as Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\nimport * as TraceFilter from './TraceFilter.js';\nimport * as TraceTree from './TraceTree.js';\n\nexport type Entity = typeof ThirdPartyWeb.ThirdPartyWeb.entities[number];\n\ninterface BaseSummary {\n entity: Entity;\n transferSize: number;\n mainThreadTime: Types.Timing.Milli;\n}\n\nexport interface EntitySummary extends BaseSummary {\n relatedEvents: Types.Events.Event[];\n}\n\nexport interface URLSummary extends BaseSummary {\n url: string;\n request?: Types.Events.SyntheticNetworkRequest;\n}\n\n/**\n *\n * Returns Main frame main thread events.\n * These events are inline with the ones used by selectedEvents() of TimelineTreeViews\n */\nfunction collectMainThreadActivity(parsedTrace: Handlers.Types.ParsedTrace): Types.Events.Event[] {\n // TODO: Note b/402658800 could be an issue here.\n const mainFrameMainThread = parsedTrace.Renderer.processes.values()\n .find(p => {\n const url = p.url ?? '';\n // Frame url checked a la CompatibilityTracksAppenders's addThreadAppenders\n return p.isOnMainFrame && !url.startsWith('about:') && !url.startsWith('chrome:');\n })\n ?.threads.values()\n .find(t => t.name === 'CrRendererMain');\n\n if (!mainFrameMainThread) {\n return [];\n }\n\n return mainFrameMainThread.entries;\n}\n\nexport function summarizeByThirdParty(\n parsedTrace: Handlers.Types.ParsedTrace, traceBounds: Types.Timing.TraceWindowMicro): EntitySummary[] {\n const mainThreadEvents = collectMainThreadActivity(parsedTrace).sort(Helpers.Trace.eventTimeComparator);\n const groupingFunction = (event: Types.Events.Event): string => {\n const entity = parsedTrace.Renderer.entityMappings.entityByEvent.get(event);\n return entity?.name ?? '';\n };\n const node = getBottomUpTree(mainThreadEvents, traceBounds, groupingFunction);\n const summaries = summarizeBottomUpByEntity(node, parsedTrace);\n\n return summaries;\n}\n\n/**\n * Used only by Lighthouse.\n */\nexport function summarizeByURL(\n parsedTrace: Handlers.Types.ParsedTrace, traceBounds: Types.Timing.TraceWindowMicro): URLSummary[] {\n const mainThreadEvents = collectMainThreadActivity(parsedTrace).sort(Helpers.Trace.eventTimeComparator);\n const groupingFunction = (event: Types.Events.Event): string => {\n return Handlers.Helpers.getNonResolvedURL(event, parsedTrace) ?? '';\n };\n const node = getBottomUpTree(mainThreadEvents, traceBounds, groupingFunction);\n const summaries = summarizeBottomUpByURL(node, parsedTrace);\n\n return summaries;\n}\n\nfunction summarizeBottomUpByEntity(\n root: TraceTree.BottomUpRootNode, parsedTrace: Handlers.Types.ParsedTrace): EntitySummary[] {\n const summaries: EntitySummary[] = [];\n\n // Top nodes are the 3P entities.\n const topNodes = [...root.children().values()].flat();\n for (const node of topNodes) {\n if (node.id === '') {\n continue;\n }\n\n const entity = parsedTrace.Renderer.entityMappings.entityByEvent.get(node.event);\n if (!entity) {\n continue;\n }\n\n // Lets use the mapper events as our source of events, since we use the main thread to construct\n // the bottom up tree. The mapper will give us all related events.\n const summary: EntitySummary = {\n transferSize: node.transferSize,\n mainThreadTime: Types.Timing.Milli(node.selfTime),\n entity,\n relatedEvents: parsedTrace.Renderer.entityMappings.eventsByEntity.get(entity) ?? [],\n };\n summaries.push(summary);\n }\n\n return summaries;\n}\n\nfunction summarizeBottomUpByURL(\n root: TraceTree.BottomUpRootNode, parsedTrace: Handlers.Types.ParsedTrace): URLSummary[] {\n const summaries: URLSummary[] = [];\n const allRequests = parsedTrace.NetworkRequests.byTime;\n\n // Top nodes are URLs.\n const topNodes = [...root.children().values()].flat();\n for (const node of topNodes) {\n if (node.id === '' || typeof node.id !== 'string') {\n continue;\n }\n\n const entity = parsedTrace.Renderer.entityMappings.entityByEvent.get(node.event);\n if (!entity) {\n continue;\n }\n\n const url = node.id;\n const request = allRequests.find(r => r.args.data.url === url);\n\n const summary: URLSummary = {\n request,\n url,\n entity,\n transferSize: node.transferSize,\n mainThreadTime: Types.Timing.Milli(node.selfTime),\n };\n summaries.push(summary);\n }\n\n return summaries;\n}\n\nfunction getBottomUpTree(\n mainThreadEvents: Types.Events.Event[], tracebounds: Types.Timing.TraceWindowMicro,\n groupingFunction: ((arg0: Types.Events.Event) => string)|null): TraceTree.BottomUpRootNode {\n // Use the same filtering as front_end/panels/timeline/TimelineTreeView.ts.\n const visibleEvents = Helpers.Trace.VISIBLE_TRACE_EVENT_TYPES.values().toArray();\n const filter =\n new TraceFilter.VisibleEventsFilter(visibleEvents.concat([Types.Events.Name.SYNTHETIC_NETWORK_REQUEST]));\n\n // The bottom up root node handles all the \"in Tracebounds\" checks we need for the insight.\n const startTime = Helpers.Timing.microToMilli(tracebounds.min);\n const endTime = Helpers.Timing.microToMilli(tracebounds.max);\n const node = new TraceTree.BottomUpRootNode(mainThreadEvents, {\n textFilter: new TraceFilter.ExclusiveNameFilter([]),\n filters: [filter],\n startTime,\n endTime,\n eventGroupIdCallback: groupingFunction,\n calculateTransferSize: true,\n // Ensure we group by 3P alongside eventID for correct 3P grouping.\n forceGroupIdCallback: true,\n }) as TraceTree.BottomUpRootNode;\n return node;\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import type * as Protocol from '../../../generated/protocol.js';
2
+ import * as Types from '../types/types.js';
3
+ export declare class TimelineJSProfileProcessor {
4
+ static isNativeRuntimeFrame(frame: Protocol.Runtime.CallFrame): boolean;
5
+ static nativeGroup(nativeName: string): string | null;
6
+ static createFakeTraceFromCpuProfile(profile: Protocol.Profiler.Profile, tid: Types.Events.ThreadID): Types.Events.Event[];
7
+ }
8
+ export declare namespace TimelineJSProfileProcessor {
9
+ const enum NativeGroups {
10
+ COMPILE = "Compile",
11
+ PARSE = "Parse"
12
+ }
13
+ }
@@ -0,0 +1,55 @@
1
+ // Copyright 2014 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
+ // TODO(paulirish): Delete this file.
6
+ // - Move isNativeRuntimeFrame and nativeGroup to TraceEvents.d.ts (or TraceTree)
7
+ // - Move createFakeTraceFromCpuProfile to TimelineLoader
8
+ export class TimelineJSProfileProcessor {
9
+ static isNativeRuntimeFrame(frame) {
10
+ return frame.url === 'native V8Runtime';
11
+ }
12
+ static nativeGroup(nativeName) {
13
+ if (nativeName.startsWith('Parse')) {
14
+ return "Parse" /* TimelineJSProfileProcessor.NativeGroups.PARSE */;
15
+ }
16
+ if (nativeName.startsWith('Compile') || nativeName.startsWith('Recompile')) {
17
+ return "Compile" /* TimelineJSProfileProcessor.NativeGroups.COMPILE */;
18
+ }
19
+ return null;
20
+ }
21
+ static createFakeTraceFromCpuProfile(profile, tid) {
22
+ const events = [];
23
+ const threadName = `Thread ${tid}`;
24
+ appendEvent('TracingStartedInPage', { data: { sessionId: '1' } }, 0, 0, "M" /* Types.Events.Phase.METADATA */);
25
+ appendEvent("thread_name" /* Types.Events.Name.THREAD_NAME */, { name: threadName }, 0, 0, "M" /* Types.Events.Phase.METADATA */, '__metadata');
26
+ if (!profile) {
27
+ return events;
28
+ }
29
+ // Append a root to show the start time of the profile (which is earlier than first sample), so the Performance
30
+ // panel won't truncate this time period.
31
+ // 'JSRoot' doesn't exist in the new engine and is not the name of an actual trace event, but changing it might break other trace processing tools that rely on this, so we stick with this name.
32
+ // TODO(crbug.com/341234884): consider removing this or clarify why it's required.
33
+ appendEvent('JSRoot', {}, profile.startTime, profile.endTime - profile.startTime, "X" /* Types.Events.Phase.COMPLETE */, 'toplevel');
34
+ // TODO: create a `Profile` event instead, as `cpuProfile` is legacy
35
+ appendEvent('CpuProfile', { data: { cpuProfile: profile } }, profile.endTime, 0, "X" /* Types.Events.Phase.COMPLETE */);
36
+ return events;
37
+ function appendEvent(name, args, ts, dur, ph, cat) {
38
+ const event = {
39
+ cat: cat || 'disabled-by-default-devtools.timeline',
40
+ name,
41
+ ph: ph || "X" /* Types.Events.Phase.COMPLETE */,
42
+ pid: Types.Events.ProcessID(1),
43
+ tid,
44
+ ts: Types.Timing.MicroSeconds(ts),
45
+ args,
46
+ };
47
+ if (dur) {
48
+ event.dur = Types.Timing.MicroSeconds(dur);
49
+ }
50
+ events.push(event);
51
+ return event;
52
+ }
53
+ }
54
+ }
55
+ //# sourceMappingURL=TimelineJSProfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineJSProfile.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/extras/TimelineJSProfile.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yEAAyE;AACzE,6BAA6B;AAK7B,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAE3C,qCAAqC;AACrC,mFAAmF;AACnF,2DAA2D;AAC3D,MAAM,OAAO,0BAA0B;IACrC,MAAM,CAAC,oBAAoB,CAAC,KAAiC;QAC3D,OAAO,KAAK,CAAC,GAAG,KAAK,kBAAkB,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,UAAkB;QACnC,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,mEAAqD;QACvD,CAAC;QACD,IAAI,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3E,uEAAuD;QACzD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,6BAA6B,CAAC,OAAkC,EAAE,GAA0B;QAEjG,MAAM,MAAM,GAAyB,EAAE,CAAC;QAExC,MAAM,UAAU,GAAG,UAAU,GAAG,EAAE,CAAC;QACnC,WAAW,CAAC,sBAAsB,EAAE,EAAC,IAAI,EAAE,EAAC,SAAS,EAAE,GAAG,EAAC,EAAC,EAAE,CAAC,EAAE,CAAC,wCAA8B,CAAC;QACjG,WAAW,oDAAgC,EAAC,IAAI,EAAE,UAAU,EAAC,EAAE,CAAC,EAAE,CAAC,yCAA+B,YAAY,CAAC,CAAC;QAChH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,+GAA+G;QAC/G,yCAAyC;QACzC,iMAAiM;QACjM,kFAAkF;QAClF,WAAW,CACP,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,SAAS,yCAA+B,UAAU,CAAC,CAAC;QAEnH,oEAAoE;QACpE,WAAW,CAAC,YAAY,EAAE,EAAC,IAAI,EAAE,EAAC,UAAU,EAAE,OAAO,EAAC,EAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,wCAA8B,CAAC;QAC1G,OAAO,MAAM,CAAC;QAEd,SAAS,WAAW,CAChB,IAAY,EAAE,IAAS,EAAE,EAAU,EAAE,GAAY,EAAE,EAAuB,EAAE,GAAY;YAC1F,MAAM,KAAK,GAAuB;gBAChC,GAAG,EAAE,GAAG,IAAI,uCAAuC;gBACnD,IAAI;gBACJ,EAAE,EAAE,EAAE,yCAA+B;gBACrC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC9B,GAAG;gBACH,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBACjC,IAAI;aACL,CAAC;YAEF,IAAI,GAAG,EAAE,CAAC;gBACR,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF","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/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type * as Protocol from '../../../generated/protocol.js';\nimport * as Types from '../types/types.js';\n\n// TODO(paulirish): Delete this file.\n// - Move isNativeRuntimeFrame and nativeGroup to TraceEvents.d.ts (or TraceTree)\n// - Move createFakeTraceFromCpuProfile to TimelineLoader\nexport class TimelineJSProfileProcessor {\n static isNativeRuntimeFrame(frame: Protocol.Runtime.CallFrame): boolean {\n return frame.url === 'native V8Runtime';\n }\n\n static nativeGroup(nativeName: string): string|null {\n if (nativeName.startsWith('Parse')) {\n return TimelineJSProfileProcessor.NativeGroups.PARSE;\n }\n if (nativeName.startsWith('Compile') || nativeName.startsWith('Recompile')) {\n return TimelineJSProfileProcessor.NativeGroups.COMPILE;\n }\n return null;\n }\n\n static createFakeTraceFromCpuProfile(profile: Protocol.Profiler.Profile, tid: Types.Events.ThreadID):\n Types.Events.Event[] {\n const events: Types.Events.Event[] = [];\n\n const threadName = `Thread ${tid}`;\n appendEvent('TracingStartedInPage', {data: {sessionId: '1'}}, 0, 0, Types.Events.Phase.METADATA);\n appendEvent(Types.Events.Name.THREAD_NAME, {name: threadName}, 0, 0, Types.Events.Phase.METADATA, '__metadata');\n if (!profile) {\n return events;\n }\n\n // Append a root to show the start time of the profile (which is earlier than first sample), so the Performance\n // panel won't truncate this time period.\n // 'JSRoot' doesn't exist in the new engine and is not the name of an actual trace event, but changing it might break other trace processing tools that rely on this, so we stick with this name.\n // TODO(crbug.com/341234884): consider removing this or clarify why it's required.\n appendEvent(\n 'JSRoot', {}, profile.startTime, profile.endTime - profile.startTime, Types.Events.Phase.COMPLETE, 'toplevel');\n\n // TODO: create a `Profile` event instead, as `cpuProfile` is legacy\n appendEvent('CpuProfile', {data: {cpuProfile: profile}}, profile.endTime, 0, Types.Events.Phase.COMPLETE);\n return events;\n\n function appendEvent(\n name: string, args: any, ts: number, dur?: number, ph?: Types.Events.Phase, cat?: string): Types.Events.Event {\n const event: Types.Events.Event = {\n cat: cat || 'disabled-by-default-devtools.timeline',\n name,\n ph: ph || Types.Events.Phase.COMPLETE,\n pid: Types.Events.ProcessID(1),\n tid,\n ts: Types.Timing.MicroSeconds(ts),\n args,\n };\n\n if (dur) {\n event.dur = Types.Timing.MicroSeconds(dur);\n }\n events.push(event);\n return event;\n }\n }\n}\n\nexport namespace TimelineJSProfileProcessor {\n export const enum NativeGroups {\n COMPILE = 'Compile',\n PARSE = 'Parse',\n }\n}\n"]}
@@ -19,11 +19,11 @@ export class VisibleEventsFilter extends TraceFilter {
19
19
  static eventType(event) {
20
20
  // Any blink.console category events are treated as ConsoleTime events
21
21
  if (event.cat.includes('blink.console')) {
22
- return "ConsoleTime" /* Types.Events.Name.CONSOLE_TIME */;
22
+ return Types.Events.Name.CONSOLE_TIME;
23
23
  }
24
24
  // Any blink.user_timing egory events are treated as UserTiming events
25
25
  if (event.cat.includes('blink.user_timing')) {
26
- return "UserTiming" /* Types.Events.Name.USER_TIMING */;
26
+ return Types.Events.Name.USER_TIMING;
27
27
  }
28
28
  return event.name;
29
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TraceFilter.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/extras/TraceFilter.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yEAAyE;AACzE,6BAA6B;AAG7B,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAE3C,MAAM,OAAgB,WAAW;CAEhC;AAED,MAAM,OAAO,mBAAoB,SAAQ,WAAW;IACjC,YAAY,CAAc;IAC3C,YAAY,YAAsB;QAChC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,KAAyB;QAC9B,IAAI,KAAK,CAAC,UAAU,CAAC,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,KAAyB;QACxC,sEAAsE;QACtE,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACxC,0DAAsC;QACxC,CAAC;QACD,sEAAsE;QACtE,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC5C,wDAAqC;QACvC,CAAC;QACD,OAAO,KAAK,CAAC,IAAyB,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,WAAW;IACpD,eAAe,CAAyB;IAExC,YAAY,cAAmC;QAC7C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,KAAyB;QAC9B,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,WAAW;IAClD,aAAa,CAAyB;IACtC,YAAY,YAAiC;QAC3C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,KAAyB;QAC9B,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAyB,CAAC,CAAC;IAClE,CAAC;CACF","sourcesContent":["// Copyright 2017 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 type * as Handlers from '../handlers/handlers.js';\nimport * as Types from '../types/types.js';\n\nexport abstract class TraceFilter {\n abstract accept(_event: Types.Events.Event, parsedTrace?: Handlers.Types.ParsedTrace): boolean;\n}\n\nexport class VisibleEventsFilter extends TraceFilter {\n private readonly visibleTypes: Set<string>;\n constructor(visibleTypes: string[]) {\n super();\n this.visibleTypes = new Set(visibleTypes);\n }\n\n accept(event: Types.Events.Event): boolean {\n if (Types.Extensions.isSyntheticExtensionEntry(event)) {\n return true;\n }\n return this.visibleTypes.has(VisibleEventsFilter.eventType(event));\n }\n\n static eventType(event: Types.Events.Event): Types.Events.Name {\n // Any blink.console category events are treated as ConsoleTime events\n if (event.cat.includes('blink.console')) {\n return Types.Events.Name.CONSOLE_TIME;\n }\n // Any blink.user_timing egory events are treated as UserTiming events\n if (event.cat.includes('blink.user_timing')) {\n return Types.Events.Name.USER_TIMING;\n }\n return event.name as Types.Events.Name;\n }\n}\n\nexport class InvisibleEventsFilter extends TraceFilter {\n #invisibleTypes: Set<Types.Events.Name>;\n\n constructor(invisibleTypes: Types.Events.Name[]) {\n super();\n this.#invisibleTypes = new Set(invisibleTypes);\n }\n\n accept(event: Types.Events.Event): boolean {\n return !this.#invisibleTypes.has(VisibleEventsFilter.eventType(event));\n }\n}\n\nexport class ExclusiveNameFilter extends TraceFilter {\n #excludeNames: Set<Types.Events.Name>;\n constructor(excludeNames: Types.Events.Name[]) {\n super();\n this.#excludeNames = new Set(excludeNames);\n }\n\n accept(event: Types.Events.Event): boolean {\n return !this.#excludeNames.has(event.name as Types.Events.Name);\n }\n}\n"]}
1
+ {"version":3,"file":"TraceFilter.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/extras/TraceFilter.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yEAAyE;AACzE,6BAA6B;AAG7B,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAE3C,MAAM,OAAgB,WAAW;CAEhC;AAED,MAAM,OAAO,mBAAoB,SAAQ,WAAW;IACjC,YAAY,CAAc;IAC3C,YAAY,YAAsB;QAChC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,KAAyB;QAC9B,IAAI,KAAK,CAAC,UAAU,CAAC,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,KAAyB;QACxC,sEAAsE;QACtE,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;QACxC,CAAC;QACD,sEAAsE;QACtE,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;QACvC,CAAC;QACD,OAAO,KAAK,CAAC,IAAyB,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,WAAW;IACpD,eAAe,CAAyB;IAExC,YAAY,cAAmC;QAC7C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,KAAyB;QAC9B,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,WAAW;IAClD,aAAa,CAAyB;IACtC,YAAY,YAAiC;QAC3C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,KAAyB;QAC9B,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAyB,CAAC,CAAC;IAClE,CAAC;CACF","sourcesContent":["// Copyright 2017 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 type * as Handlers from '../handlers/handlers.js';\nimport * as Types from '../types/types.js';\n\nexport abstract class TraceFilter {\n abstract accept(_event: Types.Events.Event, parsedTrace?: Handlers.Types.ParsedTrace): boolean;\n}\n\nexport class VisibleEventsFilter extends TraceFilter {\n private readonly visibleTypes: Set<string>;\n constructor(visibleTypes: string[]) {\n super();\n this.visibleTypes = new Set(visibleTypes);\n }\n\n accept(event: Types.Events.Event): boolean {\n if (Types.Extensions.isSyntheticExtensionEntry(event)) {\n return true;\n }\n return this.visibleTypes.has(VisibleEventsFilter.eventType(event));\n }\n\n static eventType(event: Types.Events.Event): Types.Events.Name {\n // Any blink.console category events are treated as ConsoleTime events\n if (event.cat.includes('blink.console')) {\n return Types.Events.Name.CONSOLE_TIME;\n }\n // Any blink.user_timing egory events are treated as UserTiming events\n if (event.cat.includes('blink.user_timing')) {\n return Types.Events.Name.USER_TIMING;\n }\n return event.name as Types.Events.Name;\n }\n}\n\nexport class InvisibleEventsFilter extends TraceFilter {\n #invisibleTypes: Set<Types.Events.Name>;\n\n constructor(invisibleTypes: Types.Events.Name[]) {\n super();\n this.#invisibleTypes = new Set(invisibleTypes);\n }\n\n accept(event: Types.Events.Event): boolean {\n return !this.#invisibleTypes.has(VisibleEventsFilter.eventType(event));\n }\n}\n\nexport class ExclusiveNameFilter extends TraceFilter {\n #excludeNames: Set<Types.Events.Name>;\n constructor(excludeNames: Types.Events.Name[]) {\n super();\n this.#excludeNames = new Set(excludeNames);\n }\n\n accept(event: Types.Events.Event): boolean {\n return !this.#excludeNames.has(event.name as Types.Events.Name);\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import type * as Platform from '../../../core/platform/platform.js';
2
+ import type * as Handlers from '../handlers/handlers.js';
3
+ import * as Types from '../types/types.js';
4
+ /**
5
+ * Use this helper whenever resolving an URL's source mapping is not an
6
+ * option. For example when processing non-ui data. Otherwise use the
7
+ * helper SourceMapsResolver::resolvedURLForEntry
8
+ *
9
+ * If an URL will be displayed in the UI, it's likely you should not use
10
+ * this helper and prefer the other option instead.
11
+ */
12
+ export declare function getNonResolved(parsedTrace: Handlers.Types.ParsedTrace, entry: Types.Events.Event): Platform.DevToolsPath.UrlString | null;
@@ -0,0 +1,43 @@
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
+ /**
6
+ * Use this helper whenever resolving an URL's source mapping is not an
7
+ * option. For example when processing non-ui data. Otherwise use the
8
+ * helper SourceMapsResolver::resolvedURLForEntry
9
+ *
10
+ * If an URL will be displayed in the UI, it's likely you should not use
11
+ * this helper and prefer the other option instead.
12
+ */
13
+ export function getNonResolved(parsedTrace, entry) {
14
+ if (Types.Events.isProfileCall(entry)) {
15
+ return entry.callFrame.url;
16
+ }
17
+ if (entry.args?.data?.stackTrace && entry.args.data.stackTrace.length > 0) {
18
+ return entry.args.data.stackTrace[0].url;
19
+ }
20
+ if (Types.Events.isSyntheticNetworkRequest(entry)) {
21
+ return entry.args.data.url;
22
+ }
23
+ // DecodeImage events use the URL from the relevant PaintImage event.
24
+ if (Types.Events.isDecodeImage(entry)) {
25
+ const paintEvent = parsedTrace.ImagePainting.paintImageForEvent.get(entry);
26
+ return paintEvent ? getNonResolved(parsedTrace, paintEvent) : null;
27
+ }
28
+ // DrawLazyPixelRef events use the URL from the relevant PaintImage event.
29
+ if (Types.Events.isDrawLazyPixelRef(entry) && entry.args?.LazyPixelRef) {
30
+ const paintEvent = parsedTrace.ImagePainting.paintImageByDrawLazyPixelRef.get(entry.args.LazyPixelRef);
31
+ return paintEvent ? getNonResolved(parsedTrace, paintEvent) : null;
32
+ }
33
+ // ParseHTML events store the URL under beginData, not data.
34
+ if (Types.Events.isParseHTML(entry)) {
35
+ return entry.args.beginData.url;
36
+ }
37
+ // For all other events, try to see if the URL is provided, else return null.
38
+ if (entry.args?.data?.url) {
39
+ return entry.args.data.url;
40
+ }
41
+ return null;
42
+ }
43
+ //# sourceMappingURL=URLForEntry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"URLForEntry.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/extras/URLForEntry.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yEAAyE;AACzE,6BAA6B;AAI7B,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAE3C;;;;;;;GAOG;AAEH,MAAM,UAAU,cAAc,CAC1B,WAAuC,EAAE,KAAyB;IACpE,IAAI,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC,SAAS,CAAC,GAAsC,CAAC;IAChE,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAsC,CAAC;IAC9E,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAsC,CAAC;IAChE,CAAC;IAED,qEAAqE;IACrE,IAAI,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3E,OAAO,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,CAAC;IAED,0EAA0E;IAC1E,IAAI,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC;QACvE,MAAM,UAAU,GAAG,WAAW,CAAC,aAAa,CAAC,4BAA4B,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvG,OAAO,UAAU,CAAC,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,CAAC;IAED,4DAA4D;IAC5D,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAsC,CAAC;IACrE,CAAC;IAED,6EAA6E;IAC7E,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAsC,CAAC;IAChE,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC","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 type * as Platform from '../../../core/platform/platform.js';\nimport type * as Handlers from '../handlers/handlers.js';\nimport * as Types from '../types/types.js';\n\n/**\n * Use this helper whenever resolving an URL's source mapping is not an\n * option. For example when processing non-ui data. Otherwise use the\n * helper SourceMapsResolver::resolvedURLForEntry\n *\n * If an URL will be displayed in the UI, it's likely you should not use\n * this helper and prefer the other option instead.\n */\n\nexport function getNonResolved(\n parsedTrace: Handlers.Types.ParsedTrace, entry: Types.Events.Event): Platform.DevToolsPath.UrlString|null {\n if (Types.Events.isProfileCall(entry)) {\n return entry.callFrame.url as Platform.DevToolsPath.UrlString;\n }\n\n if (entry.args?.data?.stackTrace && entry.args.data.stackTrace.length > 0) {\n return entry.args.data.stackTrace[0].url as Platform.DevToolsPath.UrlString;\n }\n\n if (Types.Events.isSyntheticNetworkRequest(entry)) {\n return entry.args.data.url as Platform.DevToolsPath.UrlString;\n }\n\n // DecodeImage events use the URL from the relevant PaintImage event.\n if (Types.Events.isDecodeImage(entry)) {\n const paintEvent = parsedTrace.ImagePainting.paintImageForEvent.get(entry);\n return paintEvent ? getNonResolved(parsedTrace, paintEvent) : null;\n }\n\n // DrawLazyPixelRef events use the URL from the relevant PaintImage event.\n if (Types.Events.isDrawLazyPixelRef(entry) && entry.args?.LazyPixelRef) {\n const paintEvent = parsedTrace.ImagePainting.paintImageByDrawLazyPixelRef.get(entry.args.LazyPixelRef);\n return paintEvent ? getNonResolved(parsedTrace, paintEvent) : null;\n }\n\n // ParseHTML events store the URL under beginData, not data.\n if (Types.Events.isParseHTML(entry)) {\n return entry.args.beginData.url as Platform.DevToolsPath.UrlString;\n }\n\n // For all other events, try to see if the URL is provided, else return null.\n if (entry.args?.data?.url) {\n return entry.args.data.url as Platform.DevToolsPath.UrlString;\n }\n\n return null;\n}\n"]}
@@ -17,8 +17,8 @@
17
17
  "noFallthroughCasesInSwitch": true,
18
18
  "noImplicitOverride": true,
19
19
  "noImplicitReturns": true,
20
- "noUnusedLocals": true,
21
- "noUnusedParameters": true,
20
+ "noUnusedLocals": false,
21
+ "noUnusedParameters": false,
22
22
  "outDir": ".",
23
23
  "rootDir": "../../../../../../../front_end/models/trace/extras",
24
24
  "skipLibCheck": true,
@@ -17,8 +17,8 @@
17
17
  "noFallthroughCasesInSwitch": true,
18
18
  "noImplicitOverride": true,
19
19
  "noImplicitReturns": true,
20
- "noUnusedLocals": true,
21
- "noUnusedParameters": true,
20
+ "noUnusedLocals": false,
21
+ "noUnusedParameters": false,
22
22
  "outDir": ".",
23
23
  "rootDir": "../../../../../../../front_end/models/trace/extras",
24
24
  "skipLibCheck": true,
@@ -6,9 +6,12 @@
6
6
  // found in the LICENSE file.
7
7
 
8
8
  // Exclude the parts of extras.ts that have painful dependencies. Include these cuz they don't and are needed.
9
- export * as ThirdParties from './ThirdParties.js';
10
9
  export * as ScriptDuplication from './ScriptDuplication.js';
11
10
  export * as StackTraceForEvent from './StackTraceForEvent.js';
11
+ export * as ThirdParties from './ThirdParties.js';
12
+ export * as TraceFilter from './TraceFilter.js';
13
+ export * as TraceTree from './TraceTree.js';
14
+
12
15
 
13
16
  // The rest of this file is a polyfill :)
14
17
  // Remove once Lighthouse drops Node 18 support.
@@ -6,9 +6,12 @@
6
6
  // found in the LICENSE file.
7
7
 
8
8
  // Exclude the parts of extras.ts that have painful dependencies. Include these cuz they don't and are needed.
9
- export * as ThirdParties from './ThirdParties.js';
10
9
  export * as ScriptDuplication from './ScriptDuplication.js';
11
10
  export * as StackTraceForEvent from './StackTraceForEvent.js';
11
+ export * as ThirdParties from './ThirdParties.js';
12
+ export * as TraceFilter from './TraceFilter.js';
13
+ export * as TraceTree from './TraceTree.js';
14
+
12
15
 
13
16
  // The rest of this file is a polyfill :)
14
17
  // Remove once Lighthouse drops Node 18 support.
@@ -71,11 +71,11 @@ export function handleEvent(event) {
71
71
  function workletType(input) {
72
72
  switch (input) {
73
73
  case 'seller':
74
- return "seller" /* Types.Events.AuctionWorkletType.SELLER */;
74
+ return Types.Events.AuctionWorkletType.SELLER;
75
75
  case 'bidder':
76
- return "bidder" /* Types.Events.AuctionWorkletType.BIDDER */;
76
+ return Types.Events.AuctionWorkletType.BIDDER;
77
77
  default:
78
- return "unknown" /* Types.Events.AuctionWorkletType.UNKNOWN */;
78
+ return Types.Events.AuctionWorkletType.UNKNOWN;
79
79
  }
80
80
  }
81
81
  /**
@@ -88,11 +88,11 @@ function makeSyntheticEventBase(event) {
88
88
  .registerSyntheticEvent({
89
89
  rawSourceEvent: event,
90
90
  name: 'SyntheticAuctionWorklet',
91
- s: "t" /* Types.Events.Scope.THREAD */,
91
+ s: Types.Events.Scope.THREAD,
92
92
  cat: event.cat,
93
93
  tid: event.tid,
94
94
  ts: event.ts,
95
- ph: "I" /* Types.Events.Phase.INSTANT */,
95
+ ph: Types.Events.Phase.INSTANT,
96
96
  pid: event.args.data.pid,
97
97
  host: event.args.data.host,
98
98
  target: event.args.data.target,
@@ -1 +1 @@
1
- {"version":3,"file":"AuctionWorkletsHandler.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/handlers/AuctionWorkletsHandler.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2023 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 Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\n/**\n * There are two metadata events that we care about.\n * => AuctionWorkletRunningInProcess tells us which process the Auction Worklet\n * has taken to run in.\n * => AuctionWorkletDoneWithProcess tells us when the worklet is done with that\n * process. This is less useful - but in the future we might want to surface\n * this information so we still parse and return the event.\n *\n * It is important to note that the top level PID on these events is NOT the\n * PID that the worklet is running on; instead we have to look at its\n * args.data.pid property, which is the PID of the process that it is running\n * on.\n *\n * For any given RunningInProcess event, we would typically expect to see a\n * DoneWithProcess event, however this is not guaranteed, especially as users\n * can record any chunk of time in DevTools.\n *\n * Similarly, it is also possible to see a DoneWithProcess event without a\n * RunningInProcess event, if the user started recording after the auction\n * worklets started. Therefore we are happy to create\n * SyntheticAuctionWorklets as long as we see just one of these events.\n *\n * If we do get two events and need to pair them, we can use the\n * args.data.target property, which is a string ID shared by both\n * events.\n */\nconst runningInProcessEvents = new Map<Types.Events.ProcessID, Types.Events.AuctionWorkletRunningInProcess>();\nconst doneWithProcessEvents = new Map<Types.Events.ProcessID, Types.Events.AuctionWorkletDoneWithProcess>();\n\n// Keyed by the PID defined in `args.data.pid` on AuctionWorklet trace events..\nconst createdSyntheticEvents = new Map<Types.Events.ProcessID, Types.Events.SyntheticAuctionWorklet>();\n\n// Each AuctonWorklet takes over a process and has 2 threads (that we care\n// about and want to show as tracks):\n// 1. A CrUtilityMain thread which is known as the \"control process\".\n// 2. A AuctionV8HelperThread which is the actual auction worklet and will be\n// either a \"Seller\" or a \"Bidder\"\n// To detect these we look for the metadata thread_name events. We key these by\n// PID so that we can easily look them up later without having to loop through.\nconst utilityThreads = new Map<Types.Events.ProcessID, Types.Events.ThreadName>();\nconst v8HelperThreads = new Map<Types.Events.ProcessID, Types.Events.ThreadName>();\n\nexport function reset(): void {\n runningInProcessEvents.clear();\n doneWithProcessEvents.clear();\n createdSyntheticEvents.clear();\n utilityThreads.clear();\n v8HelperThreads.clear();\n}\n\nexport function handleEvent(event: Types.Events.Event): void {\n if (Types.Events.isAuctionWorkletRunningInProcess(event)) {\n runningInProcessEvents.set(event.args.data.pid, event);\n return;\n }\n\n if (Types.Events.isAuctionWorkletDoneWithProcess(event)) {\n doneWithProcessEvents.set(event.args.data.pid, event);\n return;\n }\n\n if (Types.Events.isThreadName(event)) {\n if (event.args.name === 'auction_worklet.CrUtilityMain') {\n utilityThreads.set(event.pid, event);\n return;\n }\n if (event.args.name === 'AuctionV8HelperThread') {\n v8HelperThreads.set(event.pid, event);\n }\n }\n}\n\nfunction workletType(input: string): Types.Events.AuctionWorkletType {\n switch (input) {\n case 'seller':\n return Types.Events.AuctionWorkletType.SELLER;\n case 'bidder':\n return Types.Events.AuctionWorkletType.BIDDER;\n default:\n return Types.Events.AuctionWorkletType.UNKNOWN;\n }\n}\n\n/**\n * We cannot make the full event without knowing the type of event, but we can\n * create everything other than the `args` field, as those are identical\n * regardless of the type of event.\n */\nfunction makeSyntheticEventBase(event: Types.Events.AuctionWorkletDoneWithProcess|\n Types.Events.AuctionWorkletRunningInProcess):\n Omit<Types.Events.SyntheticAuctionWorklet, 'args'> {\n return Helpers.SyntheticEvents.SyntheticEventsManager\n .registerSyntheticEvent<Omit<Types.Events.SyntheticAuctionWorklet, 'args'>>({\n rawSourceEvent: event,\n name: 'SyntheticAuctionWorklet',\n s: Types.Events.Scope.THREAD,\n cat: event.cat,\n tid: event.tid,\n ts: event.ts,\n ph: Types.Events.Phase.INSTANT,\n pid: event.args.data.pid,\n host: event.args.data.host,\n target: event.args.data.target,\n type: workletType(event.args.data.type),\n });\n}\n\nexport async function finalize(): Promise<void> {\n // Loop through the utility threads we found to create the worklet events. We\n // expect each worklet to have a utility thread, so we can use them as the\n // root of our list of worklets.\n for (const [pid, utilityThreadNameEvent] of utilityThreads) {\n const v8HelperEvent = v8HelperThreads.get(pid);\n if (!v8HelperEvent) {\n // Bad trace data - AuctionWorklets are expected to always have both threads.\n continue;\n }\n\n const runningEvent = runningInProcessEvents.get(pid);\n const doneWithEvent = doneWithProcessEvents.get(pid);\n\n // We can create a worklet from either the runningEvent or doneWithEvent -\n // we do not need both. We cannot express that to TypeScript with an early\n // return here, so instead we set the event initially to null, and then\n // create it from either the running event or the doneWith event. If it is\n // still null after this, that means neither event was found, and we drop\n // the worklet as we do not have enough information to create the synthetic\n // event.\n\n let syntheticEvent: Types.Events.SyntheticAuctionWorklet|null = null;\n\n if (runningEvent) {\n syntheticEvent = {\n ...makeSyntheticEventBase(runningEvent),\n args: {\n data: {\n runningInProcessEvent: runningEvent,\n utilityThread: utilityThreadNameEvent,\n v8HelperThread: v8HelperEvent,\n },\n },\n };\n if (doneWithEvent) {\n syntheticEvent.args.data.doneWithProcessEvent = doneWithEvent;\n }\n } else if (doneWithEvent) {\n syntheticEvent = {\n ...makeSyntheticEventBase(doneWithEvent),\n args: {\n data: {\n doneWithProcessEvent: doneWithEvent,\n utilityThread: utilityThreadNameEvent,\n v8HelperThread: v8HelperEvent,\n },\n },\n };\n if (runningEvent) {\n syntheticEvent.args.data.runningInProcessEvent = runningEvent;\n }\n }\n if (syntheticEvent === null) {\n continue;\n }\n createdSyntheticEvents.set(pid, syntheticEvent);\n }\n}\n\nexport interface AuctionWorkletsData {\n worklets: Map<Types.Events.ProcessID, Types.Events.SyntheticAuctionWorklet>;\n}\n\nexport function data(): AuctionWorkletsData {\n return {\n worklets: new Map(createdSyntheticEvents),\n };\n}\n"]}
1
+ {"version":3,"file":"AuctionWorkletsHandler.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/handlers/AuctionWorkletsHandler.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2023 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 Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\n/**\n * There are two metadata events that we care about.\n * => AuctionWorkletRunningInProcess tells us which process the Auction Worklet\n * has taken to run in.\n * => AuctionWorkletDoneWithProcess tells us when the worklet is done with that\n * process. This is less useful - but in the future we might want to surface\n * this information so we still parse and return the event.\n *\n * It is important to note that the top level PID on these events is NOT the\n * PID that the worklet is running on; instead we have to look at its\n * args.data.pid property, which is the PID of the process that it is running\n * on.\n *\n * For any given RunningInProcess event, we would typically expect to see a\n * DoneWithProcess event, however this is not guaranteed, especially as users\n * can record any chunk of time in DevTools.\n *\n * Similarly, it is also possible to see a DoneWithProcess event without a\n * RunningInProcess event, if the user started recording after the auction\n * worklets started. Therefore we are happy to create\n * SyntheticAuctionWorklets as long as we see just one of these events.\n *\n * If we do get two events and need to pair them, we can use the\n * args.data.target property, which is a string ID shared by both\n * events.\n */\nconst runningInProcessEvents = new Map<Types.Events.ProcessID, Types.Events.AuctionWorkletRunningInProcess>();\nconst doneWithProcessEvents = new Map<Types.Events.ProcessID, Types.Events.AuctionWorkletDoneWithProcess>();\n\n// Keyed by the PID defined in `args.data.pid` on AuctionWorklet trace events..\nconst createdSyntheticEvents = new Map<Types.Events.ProcessID, Types.Events.SyntheticAuctionWorklet>();\n\n// Each AuctonWorklet takes over a process and has 2 threads (that we care\n// about and want to show as tracks):\n// 1. A CrUtilityMain thread which is known as the \"control process\".\n// 2. A AuctionV8HelperThread which is the actual auction worklet and will be\n// either a \"Seller\" or a \"Bidder\"\n// To detect these we look for the metadata thread_name events. We key these by\n// PID so that we can easily look them up later without having to loop through.\nconst utilityThreads = new Map<Types.Events.ProcessID, Types.Events.ThreadName>();\nconst v8HelperThreads = new Map<Types.Events.ProcessID, Types.Events.ThreadName>();\n\nexport function reset(): void {\n runningInProcessEvents.clear();\n doneWithProcessEvents.clear();\n createdSyntheticEvents.clear();\n utilityThreads.clear();\n v8HelperThreads.clear();\n}\n\nexport function handleEvent(event: Types.Events.Event): void {\n if (Types.Events.isAuctionWorkletRunningInProcess(event)) {\n runningInProcessEvents.set(event.args.data.pid, event);\n return;\n }\n\n if (Types.Events.isAuctionWorkletDoneWithProcess(event)) {\n doneWithProcessEvents.set(event.args.data.pid, event);\n return;\n }\n\n if (Types.Events.isThreadName(event)) {\n if (event.args.name === 'auction_worklet.CrUtilityMain') {\n utilityThreads.set(event.pid, event);\n return;\n }\n if (event.args.name === 'AuctionV8HelperThread') {\n v8HelperThreads.set(event.pid, event);\n }\n }\n}\n\nfunction workletType(input: string): Types.Events.AuctionWorkletType {\n switch (input) {\n case 'seller':\n return Types.Events.AuctionWorkletType.SELLER;\n case 'bidder':\n return Types.Events.AuctionWorkletType.BIDDER;\n default:\n return Types.Events.AuctionWorkletType.UNKNOWN;\n }\n}\n\n/**\n * We cannot make the full event without knowing the type of event, but we can\n * create everything other than the `args` field, as those are identical\n * regardless of the type of event.\n */\nfunction makeSyntheticEventBase(event: Types.Events.AuctionWorkletDoneWithProcess|\n Types.Events.AuctionWorkletRunningInProcess):\n Omit<Types.Events.SyntheticAuctionWorklet, 'args'> {\n return Helpers.SyntheticEvents.SyntheticEventsManager\n .registerSyntheticEvent<Omit<Types.Events.SyntheticAuctionWorklet, 'args'>>({\n rawSourceEvent: event,\n name: 'SyntheticAuctionWorklet',\n s: Types.Events.Scope.THREAD,\n cat: event.cat,\n tid: event.tid,\n ts: event.ts,\n ph: Types.Events.Phase.INSTANT,\n pid: event.args.data.pid,\n host: event.args.data.host,\n target: event.args.data.target,\n type: workletType(event.args.data.type),\n });\n}\n\nexport async function finalize(): Promise<void> {\n // Loop through the utility threads we found to create the worklet events. We\n // expect each worklet to have a utility thread, so we can use them as the\n // root of our list of worklets.\n for (const [pid, utilityThreadNameEvent] of utilityThreads) {\n const v8HelperEvent = v8HelperThreads.get(pid);\n if (!v8HelperEvent) {\n // Bad trace data - AuctionWorklets are expected to always have both threads.\n continue;\n }\n\n const runningEvent = runningInProcessEvents.get(pid);\n const doneWithEvent = doneWithProcessEvents.get(pid);\n\n // We can create a worklet from either the runningEvent or doneWithEvent -\n // we do not need both. We cannot express that to TypeScript with an early\n // return here, so instead we set the event initially to null, and then\n // create it from either the running event or the doneWith event. If it is\n // still null after this, that means neither event was found, and we drop\n // the worklet as we do not have enough information to create the synthetic\n // event.\n\n let syntheticEvent: Types.Events.SyntheticAuctionWorklet|null = null;\n\n if (runningEvent) {\n syntheticEvent = {\n ...makeSyntheticEventBase(runningEvent),\n args: {\n data: {\n runningInProcessEvent: runningEvent,\n utilityThread: utilityThreadNameEvent,\n v8HelperThread: v8HelperEvent,\n },\n },\n };\n if (doneWithEvent) {\n syntheticEvent.args.data.doneWithProcessEvent = doneWithEvent;\n }\n } else if (doneWithEvent) {\n syntheticEvent = {\n ...makeSyntheticEventBase(doneWithEvent),\n args: {\n data: {\n doneWithProcessEvent: doneWithEvent,\n utilityThread: utilityThreadNameEvent,\n v8HelperThread: v8HelperEvent,\n },\n },\n };\n if (runningEvent) {\n syntheticEvent.args.data.runningInProcessEvent = runningEvent;\n }\n }\n if (syntheticEvent === null) {\n continue;\n }\n createdSyntheticEvents.set(pid, syntheticEvent);\n }\n}\n\nexport interface AuctionWorkletsData {\n worklets: Map<Types.Events.ProcessID, Types.Events.SyntheticAuctionWorklet>;\n}\n\nexport function data(): AuctionWorkletsData {\n return {\n worklets: new Map(createdSyntheticEvents),\n };\n}\n"]}
@@ -95,7 +95,7 @@ export function extractConsoleAPIExtensionEntries() {
95
95
  rawSourceEvent: currentTimeStamp,
96
96
  dur: Types.Timing.Micro(entryEndTime - entryStartTime),
97
97
  ts: entryStartTime,
98
- ph: "X" /* Types.Events.Phase.COMPLETE */,
98
+ ph: Types.Events.Phase.COMPLETE,
99
99
  };
100
100
  const extensionEntry = Helpers.SyntheticEvents.SyntheticEventsManager.getActiveManager()
101
101
  .registerSyntheticEvent(unregisteredExtensionEntry);
@@ -110,7 +110,7 @@ export function extractConsoleAPIExtensionEntries() {
110
110
  ...currentTimeStamp,
111
111
  name: timeStampName,
112
112
  cat: 'disabled-by-default-v8.inspector',
113
- ph: "X" /* Types.Events.Phase.COMPLETE */,
113
+ ph: Types.Events.Phase.COMPLETE,
114
114
  ts: entryStartTime,
115
115
  dur: Types.Timing.Micro(entryEndTime - entryStartTime),
116
116
  rawSourceEvent: currentTimeStamp
@@ -158,8 +158,8 @@ export function extractPerformanceAPIExtensionEntries(timings) {
158
158
  }
159
159
  const extensionSyntheticEntry = {
160
160
  name: timing.name,
161
- ph: Types.Extensions.isExtensionPayloadMarker(extensionPayload) ? "I" /* Types.Events.Phase.INSTANT */ :
162
- "X" /* Types.Events.Phase.COMPLETE */,
161
+ ph: Types.Extensions.isExtensionPayloadMarker(extensionPayload) ? Types.Events.Phase.INSTANT :
162
+ Types.Events.Phase.COMPLETE,
163
163
  pid: timing.pid,
164
164
  tid: timing.tid,
165
165
  ts: timing.ts,