@paulirish/trace_engine 0.0.10 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/README.md +1 -1
  2. package/analyze-trace.mjs +1 -1
  3. package/core/platform/DevToolsPath.d.ts +4 -13
  4. package/core/platform/DevToolsPath.js +7 -4
  5. package/core/platform/DevToolsPath.js.map +1 -7
  6. package/core/platform/MimeType.d.ts +27 -0
  7. package/core/platform/MimeType.js +119 -86
  8. package/core/platform/MimeType.js.map +1 -7
  9. package/core/platform/Timing.d.ts +7 -0
  10. package/core/platform/Timing.js +7 -4
  11. package/core/platform/Timing.js.map +1 -7
  12. package/core/platform/UIString.d.ts +2 -5
  13. package/core/platform/UIString.js +5 -2
  14. package/core/platform/UIString.js.map +1 -7
  15. package/core/platform/UserVisibleError.js +19 -10
  16. package/core/platform/UserVisibleError.js.map +1 -7
  17. package/core/platform/array-utilities.d.ts +48 -10
  18. package/core/platform/array-utilities.js +160 -124
  19. package/core/platform/array-utilities.js.map +1 -7
  20. package/core/platform/brand.d.ts +14 -0
  21. package/core/platform/brand.js +5 -1
  22. package/core/platform/brand.js.map +1 -7
  23. package/core/platform/date-utilities.js +10 -6
  24. package/core/platform/date-utilities.js.map +1 -7
  25. package/core/platform/dom-utilities.d.ts +3 -1
  26. package/core/platform/dom-utilities.js +94 -83
  27. package/core/platform/dom-utilities.js.map +1 -7
  28. package/core/platform/keyboard-utilities.d.ts +2 -0
  29. package/core/platform/keyboard-utilities.js +15 -24
  30. package/core/platform/keyboard-utilities.js.map +1 -7
  31. package/core/platform/map-utilities.d.ts +4 -0
  32. package/core/platform/map-utilities.js +66 -60
  33. package/core/platform/map-utilities.js.map +1 -7
  34. package/core/platform/number-utilities.js +66 -55
  35. package/core/platform/number-utilities.js.map +1 -7
  36. package/core/platform/platform.d.ts +5 -1
  37. package/core/platform/platform.js +54 -37
  38. package/core/platform/platform.js.map +1 -7
  39. package/core/platform/promise-utilities.d.ts +10 -0
  40. package/core/platform/promise-utilities.js +16 -8
  41. package/core/platform/promise-utilities.js.map +1 -7
  42. package/core/platform/set-utilities.js +20 -17
  43. package/core/platform/set-utilities.js.map +1 -7
  44. package/core/platform/string-utilities.d.ts +32 -1
  45. package/core/platform/string-utilities.js +453 -379
  46. package/core/platform/string-utilities.js.map +1 -7
  47. package/core/platform/typescript-utilities.d.ts +5 -5
  48. package/core/platform/typescript-utilities.js +19 -7
  49. package/core/platform/typescript-utilities.js.map +1 -7
  50. package/generated/protocol.d.ts +2081 -347
  51. package/generated/protocol.js +5 -2230
  52. package/models/cpu_profile/CPUProfileDataModel.d.ts +77 -0
  53. package/models/cpu_profile/CPUProfileDataModel.js +492 -359
  54. package/models/cpu_profile/CPUProfileDataModel.js.map +1 -7
  55. package/models/cpu_profile/ProfileTreeModel.d.ts +29 -0
  56. package/models/cpu_profile/ProfileTreeModel.js +87 -82
  57. package/models/cpu_profile/ProfileTreeModel.js.map +1 -7
  58. package/models/cpu_profile/cpu_profile.d.ts +3 -0
  59. package/models/cpu_profile/cpu_profile.js +7 -7
  60. package/models/cpu_profile/cpu_profile.js.map +1 -7
  61. package/models/trace/EntriesFilter.d.ts +55 -0
  62. package/models/trace/EntriesFilter.js +227 -166
  63. package/models/trace/EntriesFilter.js.map +1 -7
  64. package/models/trace/LegacyTracingModel.js.map +1 -7
  65. package/models/trace/ModelImpl.d.ts +110 -0
  66. package/models/trace/ModelImpl.js +161 -102
  67. package/models/trace/ModelImpl.js.map +1 -7
  68. package/models/trace/Processor.d.ts +36 -0
  69. package/models/trace/Processor.js +197 -163
  70. package/models/trace/Processor.js.map +1 -7
  71. package/models/trace/TracingManager.js.map +1 -7
  72. package/models/trace/extras/FetchNodes.d.ts +46 -0
  73. package/models/trace/extras/FetchNodes.js +132 -91
  74. package/models/trace/extras/FetchNodes.js.map +1 -7
  75. package/models/trace/extras/FilmStrip.d.ts +19 -0
  76. package/models/trace/extras/FilmStrip.js +38 -31
  77. package/models/trace/extras/FilmStrip.js.map +1 -7
  78. package/models/trace/extras/MainThreadActivity.d.ts +2 -0
  79. package/models/trace/extras/MainThreadActivity.js +72 -56
  80. package/models/trace/extras/MainThreadActivity.js.map +1 -7
  81. package/models/trace/extras/Metadata.d.ts +2 -0
  82. package/models/trace/extras/Metadata.js +42 -26
  83. package/models/trace/extras/Metadata.js.map +1 -7
  84. package/models/trace/extras/extras.js.map +1 -7
  85. package/models/trace/handlers/AnimationHandler.d.ts +8 -0
  86. package/models/trace/handlers/AnimationHandler.js +22 -20
  87. package/models/trace/handlers/AnimationHandler.js.map +1 -7
  88. package/models/trace/handlers/AuctionWorkletsHandler.d.ts +8 -0
  89. package/models/trace/handlers/AuctionWorkletsHandler.js +143 -89
  90. package/models/trace/handlers/AuctionWorkletsHandler.js.map +1 -7
  91. package/models/trace/handlers/FramesHandler.d.ts +76 -0
  92. package/models/trace/handlers/FramesHandler.js +424 -355
  93. package/models/trace/handlers/FramesHandler.js.map +1 -7
  94. package/models/trace/handlers/GPUHandler.d.ts +11 -0
  95. package/models/trace/handlers/GPUHandler.js +41 -37
  96. package/models/trace/handlers/GPUHandler.js.map +1 -7
  97. package/models/trace/handlers/InitiatorsHandler.d.ts +10 -0
  98. package/models/trace/handlers/InitiatorsHandler.js +164 -113
  99. package/models/trace/handlers/InitiatorsHandler.js.map +1 -7
  100. package/models/trace/handlers/InvalidationsHandler.d.ts +10 -0
  101. package/models/trace/handlers/InvalidationsHandler.js +101 -79
  102. package/models/trace/handlers/InvalidationsHandler.js.map +1 -7
  103. package/models/trace/handlers/LargestImagePaintHandler.d.ts +5 -0
  104. package/models/trace/handlers/LargestImagePaintHandler.js +32 -12
  105. package/models/trace/handlers/LargestImagePaintHandler.js.map +1 -7
  106. package/models/trace/handlers/LargestTextPaintHandler.d.ts +5 -0
  107. package/models/trace/handlers/LargestTextPaintHandler.js +20 -12
  108. package/models/trace/handlers/LargestTextPaintHandler.js.map +1 -7
  109. package/models/trace/handlers/LayerTreeHandler.d.ts +13 -0
  110. package/models/trace/handlers/LayerTreeHandler.js +96 -70
  111. package/models/trace/handlers/LayerTreeHandler.js.map +1 -7
  112. package/models/trace/handlers/LayoutShiftsHandler.d.ts +44 -0
  113. package/models/trace/handlers/LayoutShiftsHandler.js +304 -227
  114. package/models/trace/handlers/LayoutShiftsHandler.js.map +1 -7
  115. package/models/trace/handlers/MemoryHandler.d.ts +7 -0
  116. package/models/trace/handlers/MemoryHandler.js +14 -11
  117. package/models/trace/handlers/MemoryHandler.js.map +1 -7
  118. package/models/trace/handlers/MetaHandler.d.ts +37 -0
  119. package/models/trace/handlers/MetaHandler.js +314 -226
  120. package/models/trace/handlers/MetaHandler.js.map +1 -7
  121. package/models/trace/handlers/ModelHandlers.d.ts +21 -0
  122. package/models/trace/handlers/ModelHandlers.js +25 -22
  123. package/models/trace/handlers/ModelHandlers.js.map +1 -7
  124. package/models/trace/handlers/NetworkRequestsHandler.d.ts +17 -0
  125. package/models/trace/handlers/NetworkRequestsHandler.js +342 -218
  126. package/models/trace/handlers/NetworkRequestsHandler.js.map +1 -7
  127. package/models/trace/handlers/PageLoadMetricsHandler.d.ts +67 -0
  128. package/models/trace/handlers/PageLoadMetricsHandler.js +357 -284
  129. package/models/trace/handlers/PageLoadMetricsHandler.js.map +1 -7
  130. package/models/trace/handlers/RendererHandler.d.ts +101 -0
  131. package/models/trace/handlers/RendererHandler.js +295 -191
  132. package/models/trace/handlers/RendererHandler.js.map +1 -7
  133. package/models/trace/handlers/SamplesHandler.d.ts +46 -0
  134. package/models/trace/handlers/SamplesHandler.js +195 -158
  135. package/models/trace/handlers/SamplesHandler.js.map +1 -7
  136. package/models/trace/handlers/ScreenshotsHandler.d.ts +7 -0
  137. package/models/trace/handlers/ScreenshotsHandler.js +63 -41
  138. package/models/trace/handlers/ScreenshotsHandler.js.map +1 -7
  139. package/models/trace/handlers/Threads.d.ts +33 -0
  140. package/models/trace/handlers/Threads.js +85 -67
  141. package/models/trace/handlers/Threads.js.map +1 -7
  142. package/models/trace/handlers/UserInteractionsHandler.d.ts +57 -0
  143. package/models/trace/handlers/UserInteractionsHandler.js +240 -141
  144. package/models/trace/handlers/UserInteractionsHandler.js.map +1 -7
  145. package/models/trace/handlers/UserTimingsHandler.d.ts +28 -0
  146. package/models/trace/handlers/UserTimingsHandler.js +91 -80
  147. package/models/trace/handlers/UserTimingsHandler.js.map +1 -7
  148. package/models/trace/handlers/WarningsHandler.d.ts +14 -0
  149. package/models/trace/handlers/WarningsHandler.js +100 -62
  150. package/models/trace/handlers/WarningsHandler.js.map +1 -7
  151. package/models/trace/handlers/WorkersHandler.d.ts +11 -0
  152. package/models/trace/handlers/WorkersHandler.js +40 -38
  153. package/models/trace/handlers/WorkersHandler.js.map +1 -7
  154. package/models/trace/handlers/handlers.d.ts +3 -0
  155. package/models/trace/handlers/handlers.js +7 -4
  156. package/models/trace/handlers/handlers.js.map +1 -7
  157. package/models/trace/handlers/types.d.ts +45 -0
  158. package/models/trace/handlers/types.js +15 -15
  159. package/models/trace/handlers/types.js.map +1 -7
  160. package/models/trace/helpers/SamplesIntegrator.d.ts +49 -0
  161. package/models/trace/helpers/SamplesIntegrator.js +381 -204
  162. package/models/trace/helpers/SamplesIntegrator.js.map +1 -7
  163. package/models/trace/helpers/Timing.d.ts +26 -0
  164. package/models/trace/helpers/Timing.js +131 -110
  165. package/models/trace/helpers/Timing.js.map +1 -7
  166. package/models/trace/helpers/Trace.d.ts +37 -0
  167. package/models/trace/helpers/Trace.js +200 -166
  168. package/models/trace/helpers/Trace.js.map +1 -7
  169. package/models/trace/helpers/TreeHelpers.d.ts +90 -0
  170. package/models/trace/helpers/TreeHelpers.js +203 -100
  171. package/models/trace/helpers/TreeHelpers.js.map +1 -7
  172. package/models/trace/helpers/helpers.d.ts +4 -0
  173. package/models/trace/helpers/helpers.js +8 -5
  174. package/models/trace/helpers/helpers.js.map +1 -7
  175. package/models/trace/root-causes/LayoutShift.d.ts +119 -0
  176. package/models/trace/root-causes/LayoutShift.js +470 -323
  177. package/models/trace/root-causes/LayoutShift.js.map +1 -7
  178. package/models/trace/root-causes/RootCauses.d.ts +14 -0
  179. package/models/trace/root-causes/RootCauses.js +9 -6
  180. package/models/trace/root-causes/RootCauses.js.map +1 -7
  181. package/models/trace/root-causes/root-causes.d.ts +1 -0
  182. package/models/trace/root-causes/root-causes.js +5 -2
  183. package/models/trace/root-causes/root-causes.js.map +1 -7
  184. package/models/trace/trace.d.ts +11 -0
  185. package/models/trace/trace.js +17 -23
  186. package/models/trace/trace.js.map +1 -7
  187. package/models/trace/types/Configuration.d.ts +33 -0
  188. package/models/trace/types/Configuration.js +25 -14
  189. package/models/trace/types/Configuration.js.map +1 -7
  190. package/models/trace/types/File.d.ts +23 -0
  191. package/models/trace/types/File.js +5 -6
  192. package/models/trace/types/File.js.map +1 -7
  193. package/models/trace/types/Timing.d.ts +25 -0
  194. package/models/trace/types/Timing.js +10 -11
  195. package/models/trace/types/Timing.js.map +1 -7
  196. package/models/trace/types/TraceEvents.d.ts +1571 -0
  197. package/models/trace/types/TraceEvents.js +174 -381
  198. package/models/trace/types/TraceEvents.js.map +1 -7
  199. package/models/trace/types/types.d.ts +4 -0
  200. package/models/trace/types/types.js +8 -5
  201. package/models/trace/types/types.js.map +1 -7
  202. package/package.json +1 -1
  203. package/TracingManager.js +0 -0
  204. package/core/platform/devtools_entrypoint-bundle-tsconfig-tsconfig.json +0 -40
  205. package/core/platform/platform.js.compressed +0 -0
  206. package/core/platform/platform.js.hash +0 -1
  207. package/core/platform/platform.prebundle.d.ts +0 -15
  208. package/core/platform/platform.prebundle.js +0 -50
  209. package/core/platform/platform.prebundle.js.map +0 -1
  210. package/core/platform/platform.prebundle.ts +0 -64
  211. package/extras/extras.js +0 -0
  212. package/models/trace/SDKServices.js +0 -104
  213. package/models/trace/SDKServices.js.map +0 -7
  214. package/models/trace/TraceProcessor.js +0 -133
  215. package/models/trace/TraceProcessor.js.map +0 -7
  216. package/models/trace/TreeManipulator.js +0 -85
  217. package/models/trace/TreeManipulator.js.map +0 -7
  218. package/models/trace/devtools_entrypoint-legacy-typescript-tsconfig.json +0 -43
  219. package/models/trace/frames/TimelineFrameModel.js +0 -392
  220. package/models/trace/frames/TimelineFrameModel.js.map +0 -7
  221. package/models/trace/frames/bundle-tsconfig.json +0 -1
  222. package/models/trace/frames/devtools_entrypoint-bundle-typescript-tsconfig.json +0 -43
  223. package/models/trace/frames/frames-tsconfig.json +0 -58
  224. package/models/trace/frames/frames.js +0 -5
  225. package/models/trace/frames/frames.js.map +0 -7
  226. package/models/trace/handlers/Migration.js +0 -27
  227. package/models/trace/handlers/Migration.js.map +0 -7
  228. package/models/trace/handlers/UberFramesHandler.js +0 -293
  229. package/models/trace/handlers/UberFramesHandler.js.map +0 -7
  230. package/models/trace/legacy-tsconfig.json +0 -1
  231. package/models/trace/sdk_services/DOMNodeLookup.js +0 -41
  232. package/models/trace/sdk_services/DOMNodeLookup.js.map +0 -7
  233. package/models/trace/sdk_services/LayoutShifts.js +0 -68
  234. package/models/trace/sdk_services/LayoutShifts.js.map +0 -7
  235. package/models/trace/sdk_services/bundle-tsconfig.json +0 -1
  236. package/models/trace/sdk_services/devtools_entrypoint-bundle-typescript-tsconfig.json +0 -41
  237. package/models/trace/sdk_services/sdk_services-tsconfig.json +0 -57
  238. package/models/trace/sdk_services/sdk_services.js +0 -7
  239. package/models/trace/sdk_services/sdk_services.js.map +0 -7
  240. package/models/trace/trace-legacy.js +0 -16
  241. package/models/trace/trace-legacy.js.map +0 -7
  242. package/models/trace/worker/Processor.js +0 -143
  243. package/models/trace/worker/Processor.js.map +0 -7
  244. package/models/trace/worker/Types.js +0 -1
  245. package/models/trace/worker/Types.js.map +0 -7
  246. package/models/trace/worker/bundle-tsconfig.json +0 -1
  247. package/models/trace/worker/devtools_entrypoint-bundle-typescript-tsconfig.json +0 -41
  248. package/models/trace/worker/devtools_entrypoint-worker_entrypoint-typescript-tsconfig.json +0 -41
  249. package/models/trace/worker/processor-tsconfig.json +0 -45
  250. package/models/trace/worker/worker.js +0 -7
  251. package/models/trace/worker/worker.js.map +0 -7
  252. package/models/trace/worker/worker_entrypoint-tsconfig.json +0 -1
  253. package/models/trace/worker/worker_entrypoint.js +0 -36
  254. package/models/trace/worker/worker_entrypoint.js.map +0 -7
  255. package/trace.mjs +0 -6980
  256. package/trace.mjs.map +0 -8
@@ -1,250 +1,338 @@
1
- import * as Platform from "../../../core/platform/platform.js";
2
- import * as Helpers from "../helpers/helpers.js";
3
- import * as Types from "../types/types.js";
4
- import { HandlerState } from "./types.js";
5
- const rendererProcessesByFrameId = /* @__PURE__ */ new Map();
6
- let mainFrameId = "";
7
- let mainFrameURL = "";
8
- const framesByProcessId = /* @__PURE__ */ new Map();
1
+ // Copyright 2022 The Chromium Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+ import * as Platform from '../../../core/platform/platform.js';
5
+ import * as Helpers from '../helpers/helpers.js';
6
+ import * as Types from '../types/types.js';
7
+ // We track the renderer processes we see in each frame on the way through the trace.
8
+ const rendererProcessesByFrameId = new Map();
9
+ // We will often want to key data by Frame IDs, and commonly we'll care most
10
+ // about the main frame's ID, so we store and expose that.
11
+ let mainFrameId = '';
12
+ let mainFrameURL = '';
13
+ const framesByProcessId = new Map();
14
+ // We will often want to key data by the browser process, GPU process and top
15
+ // level renderer IDs, so keep a track on those.
9
16
  let browserProcessId = Types.TraceEvents.ProcessID(-1);
10
17
  let browserThreadId = Types.TraceEvents.ThreadID(-1);
11
18
  let gpuProcessId = Types.TraceEvents.ProcessID(-1);
12
19
  let gpuThreadId = Types.TraceEvents.ThreadID(-1);
13
20
  let viewportRect = null;
14
- const processNames = /* @__PURE__ */ new Map();
15
- const topLevelRendererIds = /* @__PURE__ */ new Set();
21
+ const processNames = new Map();
22
+ const topLevelRendererIds = new Set();
16
23
  const traceBounds = {
17
- min: Types.Timing.MicroSeconds(Number.POSITIVE_INFINITY),
18
- max: Types.Timing.MicroSeconds(Number.NEGATIVE_INFINITY),
19
- range: Types.Timing.MicroSeconds(Number.POSITIVE_INFINITY)
24
+ min: Types.Timing.MicroSeconds(Number.POSITIVE_INFINITY),
25
+ max: Types.Timing.MicroSeconds(Number.NEGATIVE_INFINITY),
26
+ range: Types.Timing.MicroSeconds(Number.POSITIVE_INFINITY),
20
27
  };
21
- const navigationsByFrameId = /* @__PURE__ */ new Map();
22
- const navigationsByNavigationId = /* @__PURE__ */ new Map();
28
+ /**
29
+ * These represent the user navigating. Values such as First Contentful Paint,
30
+ * etc, are relative to the navigation.
31
+ *
32
+ * We store navigation events both by the frame and navigation ID. This means
33
+ * when we need to look them up, we can use whichever ID we have.
34
+ *
35
+ * Note that these Maps will have the same values in them; these are just keyed
36
+ * differently to make look-ups easier.
37
+ *
38
+ * We also additionally maintain an array of only navigations that occured on
39
+ * the main frame. In many places in the UI we only care about highlighting
40
+ * main frame navigations, so calculating this list here is better than
41
+ * filtering either of the below maps over and over again at the UI layer.
42
+ */
43
+ const navigationsByFrameId = new Map();
44
+ const navigationsByNavigationId = new Map();
23
45
  const mainFrameNavigations = [];
24
- const threadsInProcess = /* @__PURE__ */ new Map();
46
+ // Represents all the threads in the trace, organized by process. This is mostly for internal
47
+ // bookkeeping so that during the finalize pass we can obtain the main and browser thread IDs.
48
+ const threadsInProcess = new Map();
25
49
  let traceStartedTimeFromTracingStartedEvent = Types.Timing.MicroSeconds(-1);
26
- const eventPhasesOfInterestForTraceBounds = /* @__PURE__ */ new Set([
27
- Types.TraceEvents.Phase.BEGIN,
28
- Types.TraceEvents.Phase.END,
29
- Types.TraceEvents.Phase.COMPLETE,
30
- Types.TraceEvents.Phase.INSTANT
50
+ const eventPhasesOfInterestForTraceBounds = new Set([
51
+ "B" /* Types.TraceEvents.Phase.BEGIN */,
52
+ "E" /* Types.TraceEvents.Phase.END */,
53
+ "X" /* Types.TraceEvents.Phase.COMPLETE */,
54
+ "I" /* Types.TraceEvents.Phase.INSTANT */,
31
55
  ]);
32
- let handlerState = HandlerState.UNINITIALIZED;
56
+ let handlerState = 1 /* HandlerState.UNINITIALIZED */;
57
+ // Tracks if the trace is a generic trace, which here means that it did not come from athe DevTools Performance Panel recording.
58
+ // We assume a trace is generic, and mark it as not generic if we see any of:
59
+ // - TracingStartedInPage
60
+ // - TracingStartedInBrowser
61
+ // - TracingSessionIdForWorker
62
+ // These are all events which indicate this is a Chrome browser trace.
33
63
  let traceIsGeneric = true;
34
- const CHROME_WEB_TRACE_EVENTS = /* @__PURE__ */ new Set([
35
- Types.TraceEvents.KnownEventName.TracingStartedInPage,
36
- Types.TraceEvents.KnownEventName.TracingSessionIdForWorker,
37
- Types.TraceEvents.KnownEventName.TracingStartedInBrowser
64
+ const CHROME_WEB_TRACE_EVENTS = new Set([
65
+ "TracingStartedInPage" /* Types.TraceEvents.KnownEventName.TracingStartedInPage */,
66
+ "TracingSessionIdForWorker" /* Types.TraceEvents.KnownEventName.TracingSessionIdForWorker */,
67
+ "TracingStartedInBrowser" /* Types.TraceEvents.KnownEventName.TracingStartedInBrowser */,
38
68
  ]);
39
69
  export function reset() {
40
- navigationsByFrameId.clear();
41
- navigationsByNavigationId.clear();
42
- processNames.clear();
43
- mainFrameNavigations.length = 0;
44
- browserProcessId = Types.TraceEvents.ProcessID(-1);
45
- browserThreadId = Types.TraceEvents.ThreadID(-1);
46
- gpuProcessId = Types.TraceEvents.ProcessID(-1);
47
- gpuThreadId = Types.TraceEvents.ThreadID(-1);
48
- viewportRect = null;
49
- topLevelRendererIds.clear();
50
- threadsInProcess.clear();
51
- rendererProcessesByFrameId.clear();
52
- framesByProcessId.clear();
53
- traceBounds.min = Types.Timing.MicroSeconds(Number.POSITIVE_INFINITY);
54
- traceBounds.max = Types.Timing.MicroSeconds(Number.NEGATIVE_INFINITY);
55
- traceBounds.range = Types.Timing.MicroSeconds(Number.POSITIVE_INFINITY);
56
- traceStartedTimeFromTracingStartedEvent = Types.Timing.MicroSeconds(-1);
57
- traceIsGeneric = true;
58
- handlerState = HandlerState.UNINITIALIZED;
70
+ navigationsByFrameId.clear();
71
+ navigationsByNavigationId.clear();
72
+ processNames.clear();
73
+ mainFrameNavigations.length = 0;
74
+ browserProcessId = Types.TraceEvents.ProcessID(-1);
75
+ browserThreadId = Types.TraceEvents.ThreadID(-1);
76
+ gpuProcessId = Types.TraceEvents.ProcessID(-1);
77
+ gpuThreadId = Types.TraceEvents.ThreadID(-1);
78
+ viewportRect = null;
79
+ topLevelRendererIds.clear();
80
+ threadsInProcess.clear();
81
+ rendererProcessesByFrameId.clear();
82
+ framesByProcessId.clear();
83
+ traceBounds.min = Types.Timing.MicroSeconds(Number.POSITIVE_INFINITY);
84
+ traceBounds.max = Types.Timing.MicroSeconds(Number.NEGATIVE_INFINITY);
85
+ traceBounds.range = Types.Timing.MicroSeconds(Number.POSITIVE_INFINITY);
86
+ traceStartedTimeFromTracingStartedEvent = Types.Timing.MicroSeconds(-1);
87
+ traceIsGeneric = true;
88
+ handlerState = 1 /* HandlerState.UNINITIALIZED */;
59
89
  }
60
90
  export function initialize() {
61
- if (handlerState !== HandlerState.UNINITIALIZED) {
62
- throw new Error("Meta Handler was not reset");
63
- }
64
- handlerState = HandlerState.INITIALIZED;
91
+ if (handlerState !== 1 /* HandlerState.UNINITIALIZED */) {
92
+ throw new Error('Meta Handler was not reset');
93
+ }
94
+ handlerState = 2 /* HandlerState.INITIALIZED */;
65
95
  }
66
96
  function updateRendererProcessByFrame(event, frame) {
67
- const framesInProcessById = Platform.MapUtilities.getWithDefault(framesByProcessId, frame.processId, () => /* @__PURE__ */ new Map());
68
- framesInProcessById.set(frame.frame, frame);
69
- const rendererProcessInFrame = Platform.MapUtilities.getWithDefault(rendererProcessesByFrameId, frame.frame, () => /* @__PURE__ */ new Map());
70
- const rendererProcessInfo = Platform.MapUtilities.getWithDefault(rendererProcessInFrame, frame.processId, () => {
71
- return [];
72
- });
73
- const lastProcessData = rendererProcessInfo.at(-1);
74
- if (lastProcessData && lastProcessData.frame.url === frame.url) {
75
- return;
76
- }
77
- rendererProcessInfo.push({
78
- frame,
79
- window: {
80
- min: event.ts,
81
- max: Types.Timing.MicroSeconds(0),
82
- range: Types.Timing.MicroSeconds(0)
83
- }
84
- });
97
+ const framesInProcessById = Platform.MapUtilities.getWithDefault(framesByProcessId, frame.processId, () => new Map());
98
+ framesInProcessById.set(frame.frame, frame);
99
+ const rendererProcessInFrame = Platform.MapUtilities.getWithDefault(rendererProcessesByFrameId, frame.frame, () => new Map());
100
+ const rendererProcessInfo = Platform.MapUtilities.getWithDefault(rendererProcessInFrame, frame.processId, () => {
101
+ return [];
102
+ });
103
+ const lastProcessData = rendererProcessInfo.at(-1);
104
+ // Only store a new entry if the URL changed, otherwise it's just
105
+ // redundant information.
106
+ if (lastProcessData && lastProcessData.frame.url === frame.url) {
107
+ return;
108
+ }
109
+ // For now we store the time of the event as the min. In the finalize we step
110
+ // through each of these windows and update their max and range values.
111
+ rendererProcessInfo.push({
112
+ frame,
113
+ window: {
114
+ min: event.ts,
115
+ max: Types.Timing.MicroSeconds(0),
116
+ range: Types.Timing.MicroSeconds(0),
117
+ },
118
+ });
85
119
  }
86
120
  export function handleEvent(event) {
87
- if (handlerState !== HandlerState.INITIALIZED) {
88
- throw new Error("Meta Handler is not initialized");
89
- }
90
- if (traceIsGeneric && CHROME_WEB_TRACE_EVENTS.has(event.name)) {
91
- traceIsGeneric = false;
92
- }
93
- if (Types.TraceEvents.isProcessName(event)) {
94
- processNames.set(event.pid, event);
95
- }
96
- if (event.ts !== 0 && !event.name.endsWith("::UMA") && eventPhasesOfInterestForTraceBounds.has(event.ph)) {
97
- traceBounds.min = Types.Timing.MicroSeconds(Math.min(event.ts, traceBounds.min));
98
- const eventDuration = event.dur || Types.Timing.MicroSeconds(0);
99
- traceBounds.max = Types.Timing.MicroSeconds(Math.max(event.ts + eventDuration, traceBounds.max));
100
- }
101
- if (Types.TraceEvents.isProcessName(event) && (event.args.name === "Browser" || event.args.name === "HeadlessBrowser")) {
102
- browserProcessId = event.pid;
103
- return;
104
- }
105
- if (Types.TraceEvents.isProcessName(event) && (event.args.name === "Gpu" || event.args.name === "GPU Process")) {
106
- gpuProcessId = event.pid;
107
- return;
108
- }
109
- if (Types.TraceEvents.isThreadName(event) && event.args.name === "CrGpuMain") {
110
- gpuThreadId = event.tid;
111
- return;
112
- }
113
- if (Types.TraceEvents.isThreadName(event) && event.args.name === "CrBrowserMain") {
114
- browserThreadId = event.tid;
115
- }
116
- if (Types.TraceEvents.isTraceEventMainFrameViewport(event) && viewportRect === null) {
117
- const rectAsArray = event.args.data.viewport_rect;
118
- const viewportX = rectAsArray[0];
119
- const viewportY = rectAsArray[1];
120
- const viewportWidth = rectAsArray[2];
121
- const viewportHeight = rectAsArray[5];
122
- viewportRect = new DOMRect(viewportX, viewportY, viewportWidth, viewportHeight);
123
- }
124
- if (Types.TraceEvents.isTraceEventTracingStartedInBrowser(event)) {
125
- traceStartedTimeFromTracingStartedEvent = event.ts;
126
- if (!event.args.data) {
127
- throw new Error("No frames found in trace data");
128
- }
129
- for (const frame of event.args.data.frames ?? []) {
130
- updateRendererProcessByFrame(event, frame);
131
- if (frame.parent) {
132
- continue;
133
- }
134
- mainFrameId = frame.frame;
135
- mainFrameURL = frame.url;
136
- topLevelRendererIds.add(frame.processId);
137
- }
138
- return;
139
- }
140
- if (Types.TraceEvents.isTraceEventFrameCommittedInBrowser(event)) {
141
- const frame = event.args.data;
142
- if (!frame) {
143
- return;
144
- }
145
- updateRendererProcessByFrame(event, frame);
146
- if (frame.parent) {
147
- return;
148
- }
149
- topLevelRendererIds.add(frame.processId);
150
- return;
151
- }
152
- if (Types.TraceEvents.isTraceEventCommitLoad(event)) {
153
- const frameData = event.args.data;
154
- if (!frameData) {
155
- return;
156
- }
157
- const { frame, name, url } = frameData;
158
- updateRendererProcessByFrame(event, { processId: event.pid, frame, name, url });
159
- return;
160
- }
161
- if (Types.TraceEvents.isThreadName(event)) {
162
- const threads = Platform.MapUtilities.getWithDefault(threadsInProcess, event.pid, () => /* @__PURE__ */ new Map());
163
- threads.set(event.tid, event);
164
- return;
165
- }
166
- if (Types.TraceEvents.isTraceEventNavigationStartWithURL(event) && event.args.data) {
167
- const navigationId = event.args.data.navigationId;
168
- if (navigationsByNavigationId.has(navigationId)) {
169
- return;
170
- }
171
- navigationsByNavigationId.set(navigationId, event);
172
- const frameId = event.args.frame;
173
- const existingFrameNavigations = navigationsByFrameId.get(frameId) || [];
174
- existingFrameNavigations.push(event);
175
- navigationsByFrameId.set(frameId, existingFrameNavigations);
176
- if (frameId === mainFrameId) {
177
- mainFrameNavigations.push(event);
178
- }
179
- return;
180
- }
121
+ if (handlerState !== 2 /* HandlerState.INITIALIZED */) {
122
+ throw new Error('Meta Handler is not initialized');
123
+ }
124
+ if (traceIsGeneric && CHROME_WEB_TRACE_EVENTS.has(event.name)) {
125
+ traceIsGeneric = false;
126
+ }
127
+ if (Types.TraceEvents.isProcessName(event)) {
128
+ processNames.set(event.pid, event);
129
+ }
130
+ // If there is a timestamp (which meta events do not have), and the event does
131
+ // not end with ::UMA then it, and the event is in the set of valid phases,
132
+ // then it should be included for the purposes of calculating the trace bounds.
133
+ // The UMA events in particular seem to be reported on page unloading, which
134
+ // often extends the bounds of the trace unhelpfully.
135
+ if (event.ts !== 0 && !event.name.endsWith('::UMA') && eventPhasesOfInterestForTraceBounds.has(event.ph)) {
136
+ traceBounds.min = Types.Timing.MicroSeconds(Math.min(event.ts, traceBounds.min));
137
+ const eventDuration = event.dur || Types.Timing.MicroSeconds(0);
138
+ traceBounds.max = Types.Timing.MicroSeconds(Math.max(event.ts + eventDuration, traceBounds.max));
139
+ }
140
+ if (Types.TraceEvents.isProcessName(event) &&
141
+ (event.args.name === 'Browser' || event.args.name === 'HeadlessBrowser')) {
142
+ browserProcessId = event.pid;
143
+ return;
144
+ }
145
+ if (Types.TraceEvents.isProcessName(event) && (event.args.name === 'Gpu' || event.args.name === 'GPU Process')) {
146
+ gpuProcessId = event.pid;
147
+ return;
148
+ }
149
+ if (Types.TraceEvents.isThreadName(event) && event.args.name === 'CrGpuMain') {
150
+ gpuThreadId = event.tid;
151
+ return;
152
+ }
153
+ if (Types.TraceEvents.isThreadName(event) && event.args.name === 'CrBrowserMain') {
154
+ browserThreadId = event.tid;
155
+ }
156
+ if (Types.TraceEvents.isTraceEventMainFrameViewport(event) && viewportRect === null) {
157
+ const rectAsArray = event.args.data.viewport_rect;
158
+ const viewportX = rectAsArray[0];
159
+ const viewportY = rectAsArray[1];
160
+ const viewportWidth = rectAsArray[2];
161
+ const viewportHeight = rectAsArray[5];
162
+ viewportRect = new DOMRect(viewportX, viewportY, viewportWidth, viewportHeight);
163
+ }
164
+ // The TracingStartedInBrowser event includes the data on which frames are
165
+ // in scope at the start of the trace. We use this to identify the frame with
166
+ // no parent, i.e. the top level frame.
167
+ if (Types.TraceEvents.isTraceEventTracingStartedInBrowser(event)) {
168
+ traceStartedTimeFromTracingStartedEvent = event.ts;
169
+ if (!event.args.data) {
170
+ throw new Error('No frames found in trace data');
171
+ }
172
+ for (const frame of (event.args.data.frames ?? [])) {
173
+ updateRendererProcessByFrame(event, frame);
174
+ if (frame.parent) {
175
+ continue;
176
+ }
177
+ mainFrameId = frame.frame;
178
+ mainFrameURL = frame.url;
179
+ topLevelRendererIds.add(frame.processId);
180
+ }
181
+ return;
182
+ }
183
+ // FrameCommittedInBrowser events tell us information about each frame
184
+ // and we use these to track how long each individual renderer is active
185
+ // for. We track all renderers here (top level and those in frames), but
186
+ // for convenience we also populate a set of top level renderer IDs.
187
+ if (Types.TraceEvents.isTraceEventFrameCommittedInBrowser(event)) {
188
+ const frame = event.args.data;
189
+ if (!frame) {
190
+ return;
191
+ }
192
+ updateRendererProcessByFrame(event, frame);
193
+ if (frame.parent) {
194
+ return;
195
+ }
196
+ topLevelRendererIds.add(frame.processId);
197
+ return;
198
+ }
199
+ if (Types.TraceEvents.isTraceEventCommitLoad(event)) {
200
+ const frameData = event.args.data;
201
+ if (!frameData) {
202
+ return;
203
+ }
204
+ const { frame, name, url } = frameData;
205
+ updateRendererProcessByFrame(event, { processId: event.pid, frame, name, url });
206
+ return;
207
+ }
208
+ // Track all threads based on the process & thread IDs.
209
+ if (Types.TraceEvents.isThreadName(event)) {
210
+ const threads = Platform.MapUtilities.getWithDefault(threadsInProcess, event.pid, () => new Map());
211
+ threads.set(event.tid, event);
212
+ return;
213
+ }
214
+ // Track all navigation events. Note that there can be navigation start events
215
+ // but where the documentLoaderURL is empty. As far as the trace rendering is
216
+ // concerned, these events are noise so we filter them out here.
217
+ // (The filtering of empty URLs is done in the
218
+ // isTraceEventNavigationStartWithURL check)
219
+ if (Types.TraceEvents.isTraceEventNavigationStartWithURL(event) && event.args.data) {
220
+ const navigationId = event.args.data.navigationId;
221
+ if (navigationsByNavigationId.has(navigationId)) {
222
+ // We have only ever seen this situation once, in crbug.com/1503982, where the user ran:
223
+ // window.location.href = 'javascript:console.log("foo")'
224
+ // In this situation two identical navigationStart events are emitted with the same data, URL and ID.
225
+ // So, in this situation we drop/ignore any subsequent navigations if we have already seen that ID.
226
+ return;
227
+ }
228
+ navigationsByNavigationId.set(navigationId, event);
229
+ const frameId = event.args.frame;
230
+ const existingFrameNavigations = navigationsByFrameId.get(frameId) || [];
231
+ existingFrameNavigations.push(event);
232
+ navigationsByFrameId.set(frameId, existingFrameNavigations);
233
+ if (frameId === mainFrameId) {
234
+ mainFrameNavigations.push(event);
235
+ }
236
+ return;
237
+ }
181
238
  }
182
239
  export async function finalize() {
183
- if (handlerState !== HandlerState.INITIALIZED) {
184
- throw new Error("Handler is not initialized");
185
- }
186
- if (traceStartedTimeFromTracingStartedEvent >= 0) {
187
- traceBounds.min = traceStartedTimeFromTracingStartedEvent;
188
- }
189
- traceBounds.range = Types.Timing.MicroSeconds(traceBounds.max - traceBounds.min);
190
- for (const [, processWindows] of rendererProcessesByFrameId) {
191
- const processWindowValues = [...processWindows.values()].flat();
192
- for (let i = 0; i < processWindowValues.length; i++) {
193
- const currentWindow = processWindowValues[i];
194
- const nextWindow = processWindowValues[i + 1];
195
- if (!nextWindow) {
196
- currentWindow.window.max = Types.Timing.MicroSeconds(traceBounds.max);
197
- currentWindow.window.range = Types.Timing.MicroSeconds(traceBounds.max - currentWindow.window.min);
198
- } else {
199
- currentWindow.window.max = Types.Timing.MicroSeconds(nextWindow.window.min - 1);
200
- currentWindow.window.range = Types.Timing.MicroSeconds(currentWindow.window.max - currentWindow.window.min);
201
- }
202
- }
203
- }
204
- for (const [frameId, navigations] of navigationsByFrameId) {
205
- if (rendererProcessesByFrameId.has(frameId)) {
206
- continue;
207
- }
208
- navigationsByFrameId.delete(frameId);
209
- for (const navigation of navigations) {
210
- if (!navigation.args.data) {
211
- continue;
212
- }
213
- navigationsByNavigationId.delete(navigation.args.data.navigationId);
214
- }
215
- }
216
- const firstMainFrameNav = mainFrameNavigations.at(0);
217
- const firstNavTimeThreshold = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(0.5));
218
- if (firstMainFrameNav) {
219
- const navigationIsWithinThreshold = firstMainFrameNav.ts - traceBounds.min < firstNavTimeThreshold;
220
- if (firstMainFrameNav.args.data?.isOutermostMainFrame && firstMainFrameNav.args.data?.documentLoaderURL && navigationIsWithinThreshold) {
221
- mainFrameURL = firstMainFrameNav.args.data.documentLoaderURL;
222
- }
223
- }
224
- handlerState = HandlerState.FINALIZED;
240
+ if (handlerState !== 2 /* HandlerState.INITIALIZED */) {
241
+ throw new Error('Handler is not initialized');
242
+ }
243
+ // We try to set the minimum time by finding the event with the smallest
244
+ // timestamp. However, if we also got a timestamp from the
245
+ // TracingStartedInBrowser event, we should always use that.
246
+ // But in some traces (for example, CPU profiles) we do not get that event,
247
+ // hence why we need to check we got a timestamp from it before setting it.
248
+ if (traceStartedTimeFromTracingStartedEvent >= 0) {
249
+ traceBounds.min = traceStartedTimeFromTracingStartedEvent;
250
+ }
251
+ traceBounds.range = Types.Timing.MicroSeconds(traceBounds.max - traceBounds.min);
252
+ // If we go from foo.com to example.com we will get a new renderer, and
253
+ // therefore the "top level renderer" will have a different PID as it has
254
+ // changed. Here we step through each renderer process and updated its window
255
+ // bounds, such that we end up with the time ranges in the trace for when
256
+ // each particular renderer started and stopped being the main renderer
257
+ // process.
258
+ for (const [, processWindows] of rendererProcessesByFrameId) {
259
+ const processWindowValues = [...processWindows.values()].flat();
260
+ for (let i = 0; i < processWindowValues.length; i++) {
261
+ const currentWindow = processWindowValues[i];
262
+ const nextWindow = processWindowValues[i + 1];
263
+ // For the last window we set its max to be positive infinity.
264
+ // TODO: Move the trace bounds handler into meta so we can clamp first and last windows.
265
+ if (!nextWindow) {
266
+ currentWindow.window.max = Types.Timing.MicroSeconds(traceBounds.max);
267
+ currentWindow.window.range = Types.Timing.MicroSeconds(traceBounds.max - currentWindow.window.min);
268
+ }
269
+ else {
270
+ currentWindow.window.max = Types.Timing.MicroSeconds(nextWindow.window.min - 1);
271
+ currentWindow.window.range = Types.Timing.MicroSeconds(currentWindow.window.max - currentWindow.window.min);
272
+ }
273
+ }
274
+ }
275
+ // Frame ids which we didn't register using either the TracingStartedInBrowser or
276
+ // the FrameCommittedInBrowser events are considered noise, so we filter them out, as well
277
+ // as the navigations that belong to such frames.
278
+ for (const [frameId, navigations] of navigationsByFrameId) {
279
+ // The frames in the rendererProcessesByFrameId map come only from the
280
+ // TracingStartedInBrowser and FrameCommittedInBrowser events, so we can use it as point
281
+ // of comparison to determine if a frameId should be discarded.
282
+ if (rendererProcessesByFrameId.has(frameId)) {
283
+ continue;
284
+ }
285
+ navigationsByFrameId.delete(frameId);
286
+ for (const navigation of navigations) {
287
+ if (!navigation.args.data) {
288
+ continue;
289
+ }
290
+ navigationsByNavigationId.delete(navigation.args.data.navigationId);
291
+ }
292
+ }
293
+ // Sometimes in traces the TracingStartedInBrowser event can give us an
294
+ // incorrect initial URL for the main frame's URL - about:blank or the URL of
295
+ // the previous page. This doesn't matter too much except we often use this
296
+ // URL as the visual name of the trace shown to the user (e.g. in the history
297
+ // dropdown). We can be more accurate by finding the first main frame
298
+ // navigaton, and using its URL, if we have it.
299
+ // However, to avoid doing this in a case where the first navigation is far
300
+ // into the trace's lifecycle, we only do this in situations where the first
301
+ // navigation happened very soon (0.5 seconds) after the trace started
302
+ // recording.
303
+ const firstMainFrameNav = mainFrameNavigations.at(0);
304
+ const firstNavTimeThreshold = Helpers.Timing.secondsToMicroseconds(Types.Timing.Seconds(0.5));
305
+ if (firstMainFrameNav) {
306
+ const navigationIsWithinThreshold = firstMainFrameNav.ts - traceBounds.min < firstNavTimeThreshold;
307
+ if (firstMainFrameNav.args.data?.isOutermostMainFrame && firstMainFrameNav.args.data?.documentLoaderURL &&
308
+ navigationIsWithinThreshold) {
309
+ mainFrameURL = firstMainFrameNav.args.data.documentLoaderURL;
310
+ }
311
+ }
312
+ handlerState = 3 /* HandlerState.FINALIZED */;
225
313
  }
226
314
  export function data() {
227
- if (handlerState !== HandlerState.FINALIZED) {
228
- throw new Error("Meta Handler is not finalized");
229
- }
230
- return {
231
- traceBounds: { ...traceBounds },
232
- browserProcessId,
233
- browserThreadId,
234
- processNames: new Map(processNames),
235
- gpuProcessId,
236
- gpuThreadId: gpuThreadId === Types.TraceEvents.ThreadID(-1) ? void 0 : gpuThreadId,
237
- viewportRect: viewportRect || void 0,
238
- mainFrameId,
239
- mainFrameURL,
240
- navigationsByFrameId: new Map(navigationsByFrameId),
241
- navigationsByNavigationId: new Map(navigationsByNavigationId),
242
- threadsInProcess: new Map(threadsInProcess),
243
- rendererProcessesByFrame: new Map(rendererProcessesByFrameId),
244
- topLevelRendererIds: new Set(topLevelRendererIds),
245
- frameByProcessId: new Map(framesByProcessId),
246
- mainFrameNavigations: [...mainFrameNavigations],
247
- traceIsGeneric
248
- };
315
+ if (handlerState !== 3 /* HandlerState.FINALIZED */) {
316
+ throw new Error('Meta Handler is not finalized');
317
+ }
318
+ return {
319
+ traceBounds: { ...traceBounds },
320
+ browserProcessId,
321
+ browserThreadId,
322
+ processNames: new Map(processNames),
323
+ gpuProcessId,
324
+ gpuThreadId: gpuThreadId === Types.TraceEvents.ThreadID(-1) ? undefined : gpuThreadId,
325
+ viewportRect: viewportRect || undefined,
326
+ mainFrameId,
327
+ mainFrameURL,
328
+ navigationsByFrameId: new Map(navigationsByFrameId),
329
+ navigationsByNavigationId: new Map(navigationsByNavigationId),
330
+ threadsInProcess: new Map(threadsInProcess),
331
+ rendererProcessesByFrame: new Map(rendererProcessesByFrameId),
332
+ topLevelRendererIds: new Set(topLevelRendererIds),
333
+ frameByProcessId: new Map(framesByProcessId),
334
+ mainFrameNavigations: [...mainFrameNavigations],
335
+ traceIsGeneric,
336
+ };
249
337
  }
250
- //# sourceMappingURL=MetaHandler.js.map
338
+ //# sourceMappingURL=MetaHandler.js.map