@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,388 +1,457 @@
1
- import * as Platform from "../../../core/platform/platform.js";
2
- import * as Helpers from "../helpers/helpers.js";
3
- import * as Types from "../types/types.js";
4
- import { data as auctionWorkletsData } from "./AuctionWorkletsHandler.js";
5
- import { data as layerTreeHandlerData } from "./LayerTreeHandler.js";
6
- import { data as metaHandlerData } from "./MetaHandler.js";
7
- import { data as rendererHandlerData } from "./RendererHandler.js";
8
- import * as Threads from "./Threads.js";
9
- import { HandlerState } from "./types.js";
10
- let handlerState = HandlerState.UNINITIALIZED;
1
+ // Copyright 2023 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
+ import { data as auctionWorkletsData } from './AuctionWorkletsHandler.js';
8
+ import { data as layerTreeHandlerData } from './LayerTreeHandler.js';
9
+ import { data as metaHandlerData } from './MetaHandler.js';
10
+ import { data as rendererHandlerData } from './RendererHandler.js';
11
+ import * as Threads from './Threads.js';
12
+ /**
13
+ * IMPORTANT: this handler is slightly different to the rest. This is because
14
+ * it is an adaptation of the TimelineFrameModel that has been used in DevTools
15
+ * for many years. Rather than re-implement all the logic from scratch, instead
16
+ * this handler gathers up the events and instantitates the class in the
17
+ * finalize() method. Once the class has parsed all events, it is used to then
18
+ * return the array of frames.
19
+ *
20
+ * In time we expect to migrate this code to a more "typical" handler.
21
+ */
22
+ let handlerState = 1 /* HandlerState.UNINITIALIZED */;
11
23
  const allEvents = [];
12
24
  let model = null;
13
25
  export function reset() {
14
- handlerState = HandlerState.UNINITIALIZED;
15
- allEvents.length = 0;
26
+ handlerState = 1 /* HandlerState.UNINITIALIZED */;
27
+ allEvents.length = 0;
16
28
  }
17
29
  export function initialize() {
18
- if (handlerState !== HandlerState.UNINITIALIZED) {
19
- throw new Error("FramesHandler was not reset before being initialized");
20
- }
21
- handlerState = HandlerState.INITIALIZED;
30
+ if (handlerState !== 1 /* HandlerState.UNINITIALIZED */) {
31
+ throw new Error('FramesHandler was not reset before being initialized');
32
+ }
33
+ handlerState = 2 /* HandlerState.INITIALIZED */;
22
34
  }
23
35
  export function handleEvent(event) {
24
- allEvents.push(event);
36
+ allEvents.push(event);
25
37
  }
26
38
  export async function finalize() {
27
- if (handlerState !== HandlerState.INITIALIZED) {
28
- throw new Error("FramesHandler is not initialized");
29
- }
30
- Helpers.Trace.sortTraceEventsInPlace(allEvents);
31
- const modelForTrace = new TimelineFrameModel(allEvents, rendererHandlerData(), auctionWorkletsData(), metaHandlerData(), layerTreeHandlerData());
32
- model = modelForTrace;
39
+ if (handlerState !== 2 /* HandlerState.INITIALIZED */) {
40
+ throw new Error('FramesHandler is not initialized');
41
+ }
42
+ // Snapshot events can be emitted out of order, so we need to sort before
43
+ // building the frames model.
44
+ Helpers.Trace.sortTraceEventsInPlace(allEvents);
45
+ const modelForTrace = new TimelineFrameModel(allEvents, rendererHandlerData(), auctionWorkletsData(), metaHandlerData(), layerTreeHandlerData());
46
+ model = modelForTrace;
33
47
  }
34
48
  export function data() {
35
- return {
36
- frames: model ? Array.from(model.frames()) : [],
37
- framesById: model ? { ...model.framesById() } : {}
38
- };
49
+ return {
50
+ frames: model ? Array.from(model.frames()) : [],
51
+ framesById: model ? { ...model.framesById() } : {},
52
+ };
39
53
  }
40
54
  export function deps() {
41
- return ["Meta", "Renderer", "AuctionWorklets", "LayerTree"];
55
+ return ['Meta', 'Renderer', 'AuctionWorklets', 'LayerTree'];
42
56
  }
43
57
  function isFrameEvent(event) {
44
- return Types.TraceEvents.isTraceEventSetLayerId(event) || Types.TraceEvents.isTraceEventBeginFrame(event) || Types.TraceEvents.isTraceEventDroppedFrame(event) || Types.TraceEvents.isTraceEventRequestMainThreadFrame(event) || Types.TraceEvents.isTraceEventBeginMainThreadFrame(event) || Types.TraceEvents.isTraceEventNeedsBeginFrameChanged(event) || Types.TraceEvents.isTraceEventCommit(event) || Types.TraceEvents.isTraceEventCompositeLayers(event) || Types.TraceEvents.isTraceEventActivateLayerTree(event) || Types.TraceEvents.isTraceEventDrawFrame(event);
58
+ return (Types.TraceEvents.isTraceEventSetLayerId(event) || Types.TraceEvents.isTraceEventBeginFrame(event) ||
59
+ Types.TraceEvents.isTraceEventDroppedFrame(event) ||
60
+ Types.TraceEvents.isTraceEventRequestMainThreadFrame(event) ||
61
+ Types.TraceEvents.isTraceEventBeginMainThreadFrame(event) ||
62
+ Types.TraceEvents.isTraceEventNeedsBeginFrameChanged(event) ||
63
+ // Note that "Commit" is the replacement for "CompositeLayers" so in a trace
64
+ // we wouldn't expect to see a combination of these. All "new" trace
65
+ // recordings use "Commit", but we can easily support "CompositeLayers" too
66
+ // to not break older traces being imported.
67
+ Types.TraceEvents.isTraceEventCommit(event) || Types.TraceEvents.isTraceEventCompositeLayers(event) ||
68
+ Types.TraceEvents.isTraceEventActivateLayerTree(event) || Types.TraceEvents.isTraceEventDrawFrame(event));
45
69
  }
46
70
  function entryIsTopLevel(entry) {
47
- const devtoolsTimelineCategory = "disabled-by-default-devtools.timeline";
48
- return entry.name === Types.TraceEvents.KnownEventName.RunTask && entry.cat.includes(devtoolsTimelineCategory);
71
+ const devtoolsTimelineCategory = 'disabled-by-default-devtools.timeline';
72
+ return entry.name === "RunTask" /* Types.TraceEvents.KnownEventName.RunTask */ && entry.cat.includes(devtoolsTimelineCategory);
49
73
  }
50
74
  export class TimelineFrameModel {
51
- #frames = [];
52
- #frameById = {};
53
- #beginFrameQueue = new TimelineFrameBeginFrameQueue();
54
- #lastFrame = null;
55
- #mainFrameCommitted = false;
56
- #mainFrameRequested = false;
57
- #lastLayerTree = null;
58
- #framePendingActivation = null;
59
- #framePendingCommit = null;
60
- #lastBeginFrame = null;
61
- #lastNeedsBeginFrame = null;
62
- #lastTaskBeginTime = null;
63
- #layerTreeId = null;
64
- #activeProcessId = null;
65
- #activeThreadId = null;
66
- #layerTreeData;
67
- constructor(allEvents2, rendererData, auctionWorkletsData2, metaData, layerTreeData) {
68
- const mainThreads = Threads.threadsInRenderer(rendererData, auctionWorkletsData2).filter((thread) => {
69
- return thread.type === Threads.ThreadType.MAIN_THREAD && thread.processIsOnMainFrame;
70
- });
71
- const threadData = mainThreads.map((thread) => {
72
- return {
73
- tid: thread.tid,
74
- pid: thread.pid,
75
- startTime: thread.entries[0].ts
76
- };
77
- });
78
- this.#layerTreeData = layerTreeData;
79
- this.#addTraceEvents(allEvents2, threadData, metaData.mainFrameId);
80
- }
81
- framesById() {
82
- return this.#frameById;
83
- }
84
- frames() {
85
- return this.#frames;
86
- }
87
- #handleBeginFrame(startTime, seqId) {
88
- if (!this.#lastFrame) {
89
- this.#startFrame(startTime, seqId);
90
- }
91
- this.#lastBeginFrame = startTime;
92
- this.#beginFrameQueue.addFrameIfNotExists(seqId, startTime, false, false);
93
- }
94
- #handleDroppedFrame(startTime, seqId, isPartial) {
95
- if (!this.#lastFrame) {
96
- this.#startFrame(startTime, seqId);
97
- }
98
- this.#beginFrameQueue.addFrameIfNotExists(seqId, startTime, true, isPartial);
99
- this.#beginFrameQueue.setDropped(seqId, true);
100
- this.#beginFrameQueue.setPartial(seqId, isPartial);
101
- }
102
- #handleDrawFrame(startTime, seqId) {
103
- if (!this.#lastFrame) {
104
- this.#startFrame(startTime, seqId);
105
- return;
106
- }
107
- if (this.#mainFrameCommitted || !this.#mainFrameRequested) {
108
- if (this.#lastNeedsBeginFrame) {
109
- const idleTimeEnd = this.#framePendingActivation ? this.#framePendingActivation.triggerTime : this.#lastBeginFrame || this.#lastNeedsBeginFrame;
110
- if (idleTimeEnd > this.#lastFrame.startTime) {
111
- this.#lastFrame.idle = true;
112
- this.#lastBeginFrame = null;
113
- }
114
- this.#lastNeedsBeginFrame = null;
115
- }
116
- const framesToVisualize = this.#beginFrameQueue.processPendingBeginFramesOnDrawFrame(seqId);
117
- for (const frame of framesToVisualize) {
118
- const isLastFrameIdle = this.#lastFrame.idle;
119
- this.#startFrame(frame.startTime, seqId);
120
- if (isLastFrameIdle && this.#framePendingActivation) {
121
- this.#commitPendingFrame();
122
- }
123
- if (frame.isDropped) {
124
- this.#lastFrame.dropped = true;
125
- }
126
- if (frame.isPartial) {
127
- this.#lastFrame.isPartial = true;
128
- }
129
- }
130
- }
131
- this.#mainFrameCommitted = false;
132
- }
133
- #handleActivateLayerTree() {
134
- if (!this.#lastFrame) {
135
- return;
136
- }
137
- if (this.#framePendingActivation && !this.#lastNeedsBeginFrame) {
138
- this.#commitPendingFrame();
139
- }
140
- }
141
- #handleRequestMainThreadFrame() {
142
- if (!this.#lastFrame) {
143
- return;
144
- }
145
- this.#mainFrameRequested = true;
146
- }
147
- #handleCommit() {
148
- if (!this.#framePendingCommit) {
149
- return;
150
- }
151
- this.#framePendingActivation = this.#framePendingCommit;
152
- this.#framePendingCommit = null;
153
- this.#mainFrameRequested = false;
154
- this.#mainFrameCommitted = true;
155
- }
156
- #handleLayerTreeSnapshot(layerTree) {
157
- this.#lastLayerTree = layerTree;
158
- }
159
- #handleNeedFrameChanged(startTime, needsBeginFrame) {
160
- if (needsBeginFrame) {
161
- this.#lastNeedsBeginFrame = startTime;
162
- }
163
- }
164
- #startFrame(startTime, seqId) {
165
- if (this.#lastFrame) {
166
- this.#flushFrame(this.#lastFrame, startTime);
167
- }
168
- this.#lastFrame = new TimelineFrame(seqId, startTime, Types.Timing.MicroSeconds(startTime - metaHandlerData().traceBounds.min));
169
- }
170
- #flushFrame(frame, endTime) {
171
- frame.setLayerTree(this.#lastLayerTree);
172
- frame.setEndTime(endTime);
173
- if (this.#lastLayerTree) {
174
- this.#lastLayerTree.paints = frame.paints;
175
- }
176
- const lastFrame = this.#frames[this.#frames.length - 1];
177
- if (this.#frames.length && lastFrame && (frame.startTime !== lastFrame.endTime || frame.startTime > frame.endTime)) {
178
- console.assert(false, `Inconsistent frame time for frame ${this.#frames.length} (${frame.startTime} - ${frame.endTime})`);
179
- }
180
- this.#frames.push(frame);
181
- if (typeof frame.mainFrameId === "number") {
182
- this.#frameById[frame.mainFrameId] = frame;
183
- }
184
- }
185
- #commitPendingFrame() {
186
- if (!this.#framePendingActivation || !this.#lastFrame) {
187
- return;
188
- }
189
- this.#lastFrame.paints = this.#framePendingActivation.paints;
190
- this.#lastFrame.mainFrameId = this.#framePendingActivation.mainFrameId;
191
- this.#framePendingActivation = null;
192
- }
193
- #addTraceEvents(events, threadData, mainFrameId) {
194
- let j = 0;
195
- this.#activeThreadId = threadData.length && threadData[0].tid || null;
196
- this.#activeProcessId = threadData.length && threadData[0].pid || null;
197
- for (let i = 0; i < events.length; ++i) {
198
- while (j + 1 < threadData.length && threadData[j + 1].startTime <= events[i].ts) {
199
- this.#activeThreadId = threadData[++j].tid;
200
- this.#activeProcessId = threadData[j].pid;
201
- }
202
- this.#addTraceEvent(events[i], mainFrameId);
203
- }
204
- this.#activeThreadId = null;
205
- this.#activeProcessId = null;
206
- }
207
- #addTraceEvent(event, mainFrameId) {
208
- if (Types.TraceEvents.isTraceEventSetLayerId(event) && event.args.data.frame === mainFrameId) {
209
- this.#layerTreeId = event.args.data.layerTreeId;
210
- } else if (Types.TraceEvents.isTraceEventLayerTreeHostImplSnapshot(event) && Number(event.id) === this.#layerTreeId) {
211
- this.#handleLayerTreeSnapshot({
212
- entry: event,
213
- paints: []
214
- });
215
- } else {
216
- if (isFrameEvent(event)) {
217
- this.#processCompositorEvents(event);
218
- }
219
- if (event.tid === this.#activeThreadId && event.pid === this.#activeProcessId) {
220
- this.#addMainThreadTraceEvent(event);
221
- }
222
- }
223
- }
224
- #processCompositorEvents(entry) {
225
- if (entry.args["layerTreeId"] !== this.#layerTreeId) {
226
- return;
227
- }
228
- if (Types.TraceEvents.isTraceEventBeginFrame(entry)) {
229
- this.#handleBeginFrame(entry.ts, entry.args["frameSeqId"]);
230
- } else if (Types.TraceEvents.isTraceEventDrawFrame(entry)) {
231
- this.#handleDrawFrame(entry.ts, entry.args["frameSeqId"]);
232
- } else if (Types.TraceEvents.isTraceEventActivateLayerTree(entry)) {
233
- this.#handleActivateLayerTree();
234
- } else if (Types.TraceEvents.isTraceEventRequestMainThreadFrame(entry)) {
235
- this.#handleRequestMainThreadFrame();
236
- } else if (Types.TraceEvents.isTraceEventNeedsBeginFrameChanged(entry)) {
237
- this.#handleNeedFrameChanged(entry.ts, entry.args["data"] && Boolean(entry.args["data"]["needsBeginFrame"]));
238
- } else if (Types.TraceEvents.isTraceEventDroppedFrame(entry)) {
239
- this.#handleDroppedFrame(entry.ts, entry.args["frameSeqId"], Boolean(entry.args["hasPartialUpdate"]));
240
- }
241
- }
242
- #addMainThreadTraceEvent(entry) {
243
- if (entryIsTopLevel(entry)) {
244
- this.#lastTaskBeginTime = entry.ts;
245
- }
246
- if (!this.#framePendingCommit && MAIN_FRAME_MARKERS.has(entry.name)) {
247
- this.#framePendingCommit = new PendingFrame(this.#lastTaskBeginTime || entry.ts);
248
- }
249
- if (!this.#framePendingCommit) {
250
- return;
251
- }
252
- if (Types.TraceEvents.isTraceEventBeginMainThreadFrame(entry) && entry.args.data.frameId) {
253
- this.#framePendingCommit.mainFrameId = entry.args.data.frameId;
254
- }
255
- if (Types.TraceEvents.isTraceEventPaint(entry)) {
256
- const snapshot = this.#layerTreeData.paintsToSnapshots.get(entry);
257
- if (snapshot) {
258
- this.#framePendingCommit.paints.push(new LayerPaintEvent(entry, snapshot));
259
- }
260
- }
261
- if ((Types.TraceEvents.isTraceEventCompositeLayers(entry) || Types.TraceEvents.isTraceEventCommit(entry)) && entry.args["layerTreeId"] === this.#layerTreeId) {
262
- this.#handleCommit();
263
- }
264
- }
75
+ #frames = [];
76
+ #frameById = {};
77
+ #beginFrameQueue = new TimelineFrameBeginFrameQueue();
78
+ #lastFrame = null;
79
+ #mainFrameCommitted = false;
80
+ #mainFrameRequested = false;
81
+ #lastLayerTree = null;
82
+ #framePendingActivation = null;
83
+ #framePendingCommit = null;
84
+ #lastBeginFrame = null;
85
+ #lastNeedsBeginFrame = null;
86
+ #lastTaskBeginTime = null;
87
+ #layerTreeId = null;
88
+ #activeProcessId = null;
89
+ #activeThreadId = null;
90
+ #layerTreeData;
91
+ constructor(allEvents, rendererData, auctionWorkletsData, metaData, layerTreeData) {
92
+ // We only care about getting threads from the Renderer, not Samples,
93
+ // because Frames don't exist in a CPU Profile (which won't have Renderer
94
+ // threads.)
95
+ const mainThreads = Threads.threadsInRenderer(rendererData, auctionWorkletsData).filter(thread => {
96
+ return thread.type === "MAIN_THREAD" /* Threads.ThreadType.MAIN_THREAD */ && thread.processIsOnMainFrame;
97
+ });
98
+ const threadData = mainThreads.map(thread => {
99
+ return {
100
+ tid: thread.tid,
101
+ pid: thread.pid,
102
+ startTime: thread.entries[0].ts,
103
+ };
104
+ });
105
+ this.#layerTreeData = layerTreeData;
106
+ this.#addTraceEvents(allEvents, threadData, metaData.mainFrameId);
107
+ }
108
+ framesById() {
109
+ return this.#frameById;
110
+ }
111
+ frames() {
112
+ return this.#frames;
113
+ }
114
+ #handleBeginFrame(startTime, seqId) {
115
+ if (!this.#lastFrame) {
116
+ this.#startFrame(startTime, seqId);
117
+ }
118
+ this.#lastBeginFrame = startTime;
119
+ this.#beginFrameQueue.addFrameIfNotExists(seqId, startTime, false, false);
120
+ }
121
+ #handleDroppedFrame(startTime, seqId, isPartial) {
122
+ if (!this.#lastFrame) {
123
+ this.#startFrame(startTime, seqId);
124
+ }
125
+ // This line handles the case where no BeginFrame event is issued for
126
+ // the dropped frame. In this situation, add a BeginFrame to the queue
127
+ // as if it actually occurred.
128
+ this.#beginFrameQueue.addFrameIfNotExists(seqId, startTime, true, isPartial);
129
+ this.#beginFrameQueue.setDropped(seqId, true);
130
+ this.#beginFrameQueue.setPartial(seqId, isPartial);
131
+ }
132
+ #handleDrawFrame(startTime, seqId) {
133
+ if (!this.#lastFrame) {
134
+ this.#startFrame(startTime, seqId);
135
+ return;
136
+ }
137
+ // - if it wasn't drawn, it didn't happen!
138
+ // - only show frames that either did not wait for the main thread frame or had one committed.
139
+ if (this.#mainFrameCommitted || !this.#mainFrameRequested) {
140
+ if (this.#lastNeedsBeginFrame) {
141
+ const idleTimeEnd = this.#framePendingActivation ? this.#framePendingActivation.triggerTime :
142
+ (this.#lastBeginFrame || this.#lastNeedsBeginFrame);
143
+ if (idleTimeEnd > this.#lastFrame.startTime) {
144
+ this.#lastFrame.idle = true;
145
+ this.#lastBeginFrame = null;
146
+ }
147
+ this.#lastNeedsBeginFrame = null;
148
+ }
149
+ const framesToVisualize = this.#beginFrameQueue.processPendingBeginFramesOnDrawFrame(seqId);
150
+ // Visualize the current frame and all pending frames before it.
151
+ for (const frame of framesToVisualize) {
152
+ const isLastFrameIdle = this.#lastFrame.idle;
153
+ // If |frame| is the first frame after an idle period, the CPU time
154
+ // will be logged ("committed") under |frame| if applicable.
155
+ this.#startFrame(frame.startTime, seqId);
156
+ if (isLastFrameIdle && this.#framePendingActivation) {
157
+ this.#commitPendingFrame();
158
+ }
159
+ if (frame.isDropped) {
160
+ this.#lastFrame.dropped = true;
161
+ }
162
+ if (frame.isPartial) {
163
+ this.#lastFrame.isPartial = true;
164
+ }
165
+ }
166
+ }
167
+ this.#mainFrameCommitted = false;
168
+ }
169
+ #handleActivateLayerTree() {
170
+ if (!this.#lastFrame) {
171
+ return;
172
+ }
173
+ if (this.#framePendingActivation && !this.#lastNeedsBeginFrame) {
174
+ this.#commitPendingFrame();
175
+ }
176
+ }
177
+ #handleRequestMainThreadFrame() {
178
+ if (!this.#lastFrame) {
179
+ return;
180
+ }
181
+ this.#mainFrameRequested = true;
182
+ }
183
+ #handleCommit() {
184
+ if (!this.#framePendingCommit) {
185
+ return;
186
+ }
187
+ this.#framePendingActivation = this.#framePendingCommit;
188
+ this.#framePendingCommit = null;
189
+ this.#mainFrameRequested = false;
190
+ this.#mainFrameCommitted = true;
191
+ }
192
+ #handleLayerTreeSnapshot(layerTree) {
193
+ this.#lastLayerTree = layerTree;
194
+ }
195
+ #handleNeedFrameChanged(startTime, needsBeginFrame) {
196
+ if (needsBeginFrame) {
197
+ this.#lastNeedsBeginFrame = startTime;
198
+ }
199
+ }
200
+ #startFrame(startTime, seqId) {
201
+ if (this.#lastFrame) {
202
+ this.#flushFrame(this.#lastFrame, startTime);
203
+ }
204
+ this.#lastFrame =
205
+ new TimelineFrame(seqId, startTime, Types.Timing.MicroSeconds(startTime - metaHandlerData().traceBounds.min));
206
+ }
207
+ #flushFrame(frame, endTime) {
208
+ frame.setLayerTree(this.#lastLayerTree);
209
+ frame.setEndTime(endTime);
210
+ if (this.#lastLayerTree) {
211
+ this.#lastLayerTree.paints = frame.paints;
212
+ }
213
+ const lastFrame = this.#frames[this.#frames.length - 1];
214
+ if (this.#frames.length && lastFrame &&
215
+ (frame.startTime !== lastFrame.endTime || frame.startTime > frame.endTime)) {
216
+ console.assert(false, `Inconsistent frame time for frame ${this.#frames.length} (${frame.startTime} - ${frame.endTime})`);
217
+ }
218
+ this.#frames.push(frame);
219
+ if (typeof frame.mainFrameId === 'number') {
220
+ this.#frameById[frame.mainFrameId] = frame;
221
+ }
222
+ }
223
+ #commitPendingFrame() {
224
+ if (!this.#framePendingActivation || !this.#lastFrame) {
225
+ return;
226
+ }
227
+ this.#lastFrame.paints = this.#framePendingActivation.paints;
228
+ this.#lastFrame.mainFrameId = this.#framePendingActivation.mainFrameId;
229
+ this.#framePendingActivation = null;
230
+ }
231
+ #addTraceEvents(events, threadData, mainFrameId) {
232
+ let j = 0;
233
+ this.#activeThreadId = threadData.length && threadData[0].tid || null;
234
+ this.#activeProcessId = threadData.length && threadData[0].pid || null;
235
+ for (let i = 0; i < events.length; ++i) {
236
+ while (j + 1 < threadData.length && threadData[j + 1].startTime <= events[i].ts) {
237
+ this.#activeThreadId = threadData[++j].tid;
238
+ this.#activeProcessId = threadData[j].pid;
239
+ }
240
+ this.#addTraceEvent(events[i], mainFrameId);
241
+ }
242
+ this.#activeThreadId = null;
243
+ this.#activeProcessId = null;
244
+ }
245
+ #addTraceEvent(event, mainFrameId) {
246
+ if (Types.TraceEvents.isTraceEventSetLayerId(event) && event.args.data.frame === mainFrameId) {
247
+ this.#layerTreeId = event.args.data.layerTreeId;
248
+ }
249
+ else if (Types.TraceEvents.isTraceEventLayerTreeHostImplSnapshot(event) && Number(event.id) === this.#layerTreeId) {
250
+ this.#handleLayerTreeSnapshot({
251
+ entry: event,
252
+ paints: [],
253
+ });
254
+ }
255
+ else {
256
+ if (isFrameEvent(event)) {
257
+ this.#processCompositorEvents(event);
258
+ }
259
+ // Make sure we only use events from the main thread: we check the PID as
260
+ // well in case two processes have a thread with the same TID.
261
+ if (event.tid === this.#activeThreadId && event.pid === this.#activeProcessId) {
262
+ this.#addMainThreadTraceEvent(event);
263
+ }
264
+ }
265
+ }
266
+ #processCompositorEvents(entry) {
267
+ if (entry.args['layerTreeId'] !== this.#layerTreeId) {
268
+ return;
269
+ }
270
+ if (Types.TraceEvents.isTraceEventBeginFrame(entry)) {
271
+ this.#handleBeginFrame(entry.ts, entry.args['frameSeqId']);
272
+ }
273
+ else if (Types.TraceEvents.isTraceEventDrawFrame(entry)) {
274
+ this.#handleDrawFrame(entry.ts, entry.args['frameSeqId']);
275
+ }
276
+ else if (Types.TraceEvents.isTraceEventActivateLayerTree(entry)) {
277
+ this.#handleActivateLayerTree();
278
+ }
279
+ else if (Types.TraceEvents.isTraceEventRequestMainThreadFrame(entry)) {
280
+ this.#handleRequestMainThreadFrame();
281
+ }
282
+ else if (Types.TraceEvents.isTraceEventNeedsBeginFrameChanged(entry)) {
283
+ // needsBeginFrame property will either be 0 or 1, which represents
284
+ // true/false in this case, hence the Boolean() wrapper.
285
+ this.#handleNeedFrameChanged(entry.ts, entry.args['data'] && Boolean(entry.args['data']['needsBeginFrame']));
286
+ }
287
+ else if (Types.TraceEvents.isTraceEventDroppedFrame(entry)) {
288
+ this.#handleDroppedFrame(entry.ts, entry.args['frameSeqId'], Boolean(entry.args['hasPartialUpdate']));
289
+ }
290
+ }
291
+ #addMainThreadTraceEvent(entry) {
292
+ if (entryIsTopLevel(entry)) {
293
+ this.#lastTaskBeginTime = entry.ts;
294
+ }
295
+ if (!this.#framePendingCommit && MAIN_FRAME_MARKERS.has(entry.name)) {
296
+ this.#framePendingCommit = new PendingFrame(this.#lastTaskBeginTime || entry.ts);
297
+ }
298
+ if (!this.#framePendingCommit) {
299
+ return;
300
+ }
301
+ if (Types.TraceEvents.isTraceEventBeginMainThreadFrame(entry) && entry.args.data.frameId) {
302
+ this.#framePendingCommit.mainFrameId = entry.args.data.frameId;
303
+ }
304
+ if (Types.TraceEvents.isTraceEventPaint(entry)) {
305
+ const snapshot = this.#layerTreeData.paintsToSnapshots.get(entry);
306
+ if (snapshot) {
307
+ this.#framePendingCommit.paints.push(new LayerPaintEvent(entry, snapshot));
308
+ }
309
+ }
310
+ // Commit will be replacing CompositeLayers but CompositeLayers is kept
311
+ // around for backwards compatibility.
312
+ if ((Types.TraceEvents.isTraceEventCompositeLayers(entry) || Types.TraceEvents.isTraceEventCommit(entry)) &&
313
+ entry.args['layerTreeId'] === this.#layerTreeId) {
314
+ this.#handleCommit();
315
+ }
316
+ }
265
317
  }
266
- const MAIN_FRAME_MARKERS = /* @__PURE__ */ new Set([
267
- Types.TraceEvents.KnownEventName.ScheduleStyleRecalculation,
268
- Types.TraceEvents.KnownEventName.InvalidateLayout,
269
- Types.TraceEvents.KnownEventName.BeginMainThreadFrame,
270
- Types.TraceEvents.KnownEventName.ScrollLayer
318
+ const MAIN_FRAME_MARKERS = new Set([
319
+ "ScheduleStyleRecalculation" /* Types.TraceEvents.KnownEventName.ScheduleStyleRecalculation */,
320
+ "InvalidateLayout" /* Types.TraceEvents.KnownEventName.InvalidateLayout */,
321
+ "BeginMainThreadFrame" /* Types.TraceEvents.KnownEventName.BeginMainThreadFrame */,
322
+ "ScrollLayer" /* Types.TraceEvents.KnownEventName.ScrollLayer */,
271
323
  ]);
272
324
  export class TimelineFrame {
273
- startTime;
274
- startTimeOffset;
275
- endTime;
276
- duration;
277
- idle;
278
- dropped;
279
- isPartial;
280
- layerTree;
281
- paints;
282
- mainFrameId;
283
- seqId;
284
- constructor(seqId, startTime, startTimeOffset) {
285
- this.seqId = seqId;
286
- this.startTime = startTime;
287
- this.startTimeOffset = startTimeOffset;
288
- this.endTime = this.startTime;
289
- this.duration = Types.Timing.MicroSeconds(0);
290
- this.idle = false;
291
- this.dropped = false;
292
- this.isPartial = false;
293
- this.layerTree = null;
294
- this.paints = [];
295
- this.mainFrameId = void 0;
296
- }
297
- setEndTime(endTime) {
298
- this.endTime = endTime;
299
- this.duration = Types.Timing.MicroSeconds(this.endTime - this.startTime);
300
- }
301
- setLayerTree(layerTree) {
302
- this.layerTree = layerTree;
303
- }
325
+ startTime;
326
+ startTimeOffset;
327
+ endTime;
328
+ duration;
329
+ idle;
330
+ dropped;
331
+ isPartial;
332
+ layerTree;
333
+ paints;
334
+ mainFrameId;
335
+ seqId;
336
+ constructor(seqId, startTime, startTimeOffset) {
337
+ this.seqId = seqId;
338
+ this.startTime = startTime;
339
+ this.startTimeOffset = startTimeOffset;
340
+ this.endTime = this.startTime;
341
+ this.duration = Types.Timing.MicroSeconds(0);
342
+ this.idle = false;
343
+ this.dropped = false;
344
+ this.isPartial = false;
345
+ this.layerTree = null;
346
+ this.paints = [];
347
+ this.mainFrameId = undefined;
348
+ }
349
+ setEndTime(endTime) {
350
+ this.endTime = endTime;
351
+ this.duration = Types.Timing.MicroSeconds(this.endTime - this.startTime);
352
+ }
353
+ setLayerTree(layerTree) {
354
+ this.layerTree = layerTree;
355
+ }
304
356
  }
305
357
  export class LayerPaintEvent {
306
- #event;
307
- #snapshot;
308
- constructor(event, snapshot) {
309
- this.#event = event;
310
- this.#snapshot = snapshot;
311
- }
312
- layerId() {
313
- return this.#event.args.data.layerId;
314
- }
315
- event() {
316
- return this.#event;
317
- }
318
- picture() {
319
- const rect = this.#snapshot.args.snapshot.params?.layer_rect;
320
- const pictureData = this.#snapshot.args.snapshot.skp64;
321
- return rect && pictureData ? { rect, serializedPicture: pictureData } : null;
322
- }
358
+ #event;
359
+ #snapshot;
360
+ constructor(event, snapshot) {
361
+ this.#event = event;
362
+ this.#snapshot = snapshot;
363
+ }
364
+ layerId() {
365
+ return this.#event.args.data.layerId;
366
+ }
367
+ event() {
368
+ return this.#event;
369
+ }
370
+ picture() {
371
+ const rect = this.#snapshot.args.snapshot.params?.layer_rect;
372
+ const pictureData = this.#snapshot.args.snapshot.skp64;
373
+ return rect && pictureData ? { rect: rect, serializedPicture: pictureData } : null;
374
+ }
323
375
  }
324
376
  export class PendingFrame {
325
- paints;
326
- mainFrameId;
327
- triggerTime;
328
- constructor(triggerTime) {
329
- this.paints = [];
330
- this.mainFrameId = void 0;
331
- this.triggerTime = triggerTime;
332
- }
377
+ paints;
378
+ mainFrameId;
379
+ triggerTime;
380
+ constructor(triggerTime) {
381
+ this.paints = [];
382
+ this.mainFrameId = undefined;
383
+ this.triggerTime = triggerTime;
384
+ }
333
385
  }
386
+ // The parameters of an impl-side BeginFrame.
334
387
  class BeginFrameInfo {
335
- seqId;
336
- startTime;
337
- isDropped;
338
- isPartial;
339
- constructor(seqId, startTime, isDropped, isPartial) {
340
- this.seqId = seqId;
341
- this.startTime = startTime;
342
- this.isDropped = isDropped;
343
- this.isPartial = isPartial;
344
- }
388
+ seqId;
389
+ startTime;
390
+ isDropped;
391
+ isPartial;
392
+ constructor(seqId, startTime, isDropped, isPartial) {
393
+ this.seqId = seqId;
394
+ this.startTime = startTime;
395
+ this.isDropped = isDropped;
396
+ this.isPartial = isPartial;
397
+ }
345
398
  }
399
+ // A queue of BeginFrames pending visualization.
400
+ // BeginFrames are added into this queue as they occur; later when their
401
+ // corresponding DrawFrames occur (or lack thereof), the BeginFrames are removed
402
+ // from the queue and their timestamps are used for visualization.
346
403
  export class TimelineFrameBeginFrameQueue {
347
- queueFrames = [];
348
- mapFrames = {};
349
- addFrameIfNotExists(seqId, startTime, isDropped, isPartial) {
350
- if (!(seqId in this.mapFrames)) {
351
- this.mapFrames[seqId] = new BeginFrameInfo(seqId, startTime, isDropped, isPartial);
352
- this.queueFrames.push(seqId);
353
- }
354
- }
355
- setDropped(seqId, isDropped) {
356
- if (seqId in this.mapFrames) {
357
- this.mapFrames[seqId].isDropped = isDropped;
358
- }
359
- }
360
- setPartial(seqId, isPartial) {
361
- if (seqId in this.mapFrames) {
362
- this.mapFrames[seqId].isPartial = isPartial;
363
- }
364
- }
365
- processPendingBeginFramesOnDrawFrame(seqId) {
366
- const framesToVisualize = [];
367
- if (seqId in this.mapFrames) {
368
- while (this.queueFrames[0] !== seqId) {
369
- const currentSeqId = this.queueFrames[0];
370
- if (this.mapFrames[currentSeqId].isDropped) {
371
- framesToVisualize.push(this.mapFrames[currentSeqId]);
372
- }
373
- delete this.mapFrames[currentSeqId];
374
- this.queueFrames.shift();
375
- }
376
- framesToVisualize.push(this.mapFrames[seqId]);
377
- delete this.mapFrames[seqId];
378
- this.queueFrames.shift();
379
- }
380
- return framesToVisualize;
381
- }
404
+ queueFrames = [];
405
+ // Maps frameSeqId to BeginFrameInfo.
406
+ mapFrames = {};
407
+ // Add a BeginFrame to the queue, if it does not already exit.
408
+ addFrameIfNotExists(seqId, startTime, isDropped, isPartial) {
409
+ if (!(seqId in this.mapFrames)) {
410
+ this.mapFrames[seqId] = new BeginFrameInfo(seqId, startTime, isDropped, isPartial);
411
+ this.queueFrames.push(seqId);
412
+ }
413
+ }
414
+ // Set a BeginFrame in queue as dropped.
415
+ setDropped(seqId, isDropped) {
416
+ if (seqId in this.mapFrames) {
417
+ this.mapFrames[seqId].isDropped = isDropped;
418
+ }
419
+ }
420
+ setPartial(seqId, isPartial) {
421
+ if (seqId in this.mapFrames) {
422
+ this.mapFrames[seqId].isPartial = isPartial;
423
+ }
424
+ }
425
+ processPendingBeginFramesOnDrawFrame(seqId) {
426
+ const framesToVisualize = [];
427
+ // Do not visualize this frame in the rare case where the current DrawFrame
428
+ // does not have a corresponding BeginFrame.
429
+ if (seqId in this.mapFrames) {
430
+ // Pop all BeginFrames before the current frame, and add only the dropped
431
+ // ones in |frames_to_visualize|.
432
+ // Non-dropped frames popped here are BeginFrames that are never
433
+ // drawn (but not considered dropped either for some reason).
434
+ // Those frames do not require an proactive visualization effort and will
435
+ // be naturally presented as continuationss of other frames.
436
+ while (this.queueFrames[0] !== seqId) {
437
+ const currentSeqId = this.queueFrames[0];
438
+ if (this.mapFrames[currentSeqId].isDropped) {
439
+ framesToVisualize.push(this.mapFrames[currentSeqId]);
440
+ }
441
+ delete this.mapFrames[currentSeqId];
442
+ this.queueFrames.shift();
443
+ }
444
+ // Pop the BeginFrame associated with the current DrawFrame.
445
+ framesToVisualize.push(this.mapFrames[seqId]);
446
+ delete this.mapFrames[seqId];
447
+ this.queueFrames.shift();
448
+ }
449
+ return framesToVisualize;
450
+ }
382
451
  }
383
452
  export function framesWithinWindow(frames, startTime, endTime) {
384
- const firstFrame = Platform.ArrayUtilities.lowerBound(frames, startTime || 0, (time, frame) => time - frame.endTime);
385
- const lastFrame = Platform.ArrayUtilities.lowerBound(frames, endTime || Infinity, (time, frame) => time - frame.startTime);
386
- return frames.slice(firstFrame, lastFrame);
453
+ const firstFrame = Platform.ArrayUtilities.lowerBound(frames, startTime || 0, (time, frame) => time - frame.endTime);
454
+ const lastFrame = Platform.ArrayUtilities.lowerBound(frames, endTime || Infinity, (time, frame) => time - frame.startTime);
455
+ return frames.slice(firstFrame, lastFrame);
387
456
  }
388
- //# sourceMappingURL=FramesHandler.js.map
457
+ //# sourceMappingURL=FramesHandler.js.map