@paulirish/trace_engine 0.0.35 → 0.0.37

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 (126) hide show
  1. package/.tmp/tsbuildinfo/tsconfig.tsbuildinfo +1 -1
  2. package/README.md +0 -1
  3. package/generated/protocol.d.ts +26 -4
  4. package/models/trace/Processor.d.ts +2 -1
  5. package/models/trace/Processor.js +6 -10
  6. package/models/trace/Processor.js.map +1 -1
  7. package/models/trace/extras/TimelineJSProfile.d.ts +13 -0
  8. package/models/trace/extras/TimelineJSProfile.js +55 -0
  9. package/models/trace/extras/TimelineJSProfile.js.map +1 -0
  10. package/models/trace/extras/TraceFilter.d.ts +21 -0
  11. package/models/trace/extras/TraceFilter.js +51 -0
  12. package/models/trace/extras/TraceFilter.js.map +1 -0
  13. package/models/trace/extras/TraceTree.d.ts +91 -0
  14. package/models/trace/extras/TraceTree.js +515 -0
  15. package/models/trace/extras/TraceTree.js.map +1 -0
  16. package/models/trace/extras/extras-tsconfig.json +3 -0
  17. package/models/trace/extras/extras.js.map +1 -1
  18. package/models/trace/handlers/AnimationHandler.js +0 -5
  19. package/models/trace/handlers/AnimationHandler.js.map +1 -1
  20. package/models/trace/handlers/ExtensionTraceDataHandler.d.ts +1 -1
  21. package/models/trace/handlers/ExtensionTraceDataHandler.js +0 -9
  22. package/models/trace/handlers/ExtensionTraceDataHandler.js.map +1 -1
  23. package/models/trace/handlers/FramesHandler.d.ts +1 -2
  24. package/models/trace/handlers/FramesHandler.js +0 -11
  25. package/models/trace/handlers/FramesHandler.js.map +1 -1
  26. package/models/trace/handlers/GPUHandler.d.ts +1 -2
  27. package/models/trace/handlers/GPUHandler.js +0 -18
  28. package/models/trace/handlers/GPUHandler.js.map +1 -1
  29. package/models/trace/handlers/ImagePaintingHandler.d.ts +1 -0
  30. package/models/trace/handlers/ImagePaintingHandler.js +2 -0
  31. package/models/trace/handlers/ImagePaintingHandler.js.map +1 -1
  32. package/models/trace/handlers/InitiatorsHandler.d.ts +0 -1
  33. package/models/trace/handlers/InitiatorsHandler.js +0 -12
  34. package/models/trace/handlers/InitiatorsHandler.js.map +1 -1
  35. package/models/trace/handlers/InvalidationsHandler.d.ts +0 -1
  36. package/models/trace/handlers/InvalidationsHandler.js +0 -12
  37. package/models/trace/handlers/InvalidationsHandler.js.map +1 -1
  38. package/models/trace/handlers/LargestImagePaintHandler.d.ts +9 -2
  39. package/models/trace/handlers/LargestImagePaintHandler.js +45 -1
  40. package/models/trace/handlers/LargestImagePaintHandler.js.map +1 -1
  41. package/models/trace/handlers/LargestTextPaintHandler.d.ts +1 -0
  42. package/models/trace/handlers/LargestTextPaintHandler.js +2 -0
  43. package/models/trace/handlers/LargestTextPaintHandler.js.map +1 -1
  44. package/models/trace/handlers/LayerTreeHandler.d.ts +1 -2
  45. package/models/trace/handlers/LayerTreeHandler.js +0 -12
  46. package/models/trace/handlers/LayerTreeHandler.js.map +1 -1
  47. package/models/trace/handlers/LayoutShiftsHandler.d.ts +1 -2
  48. package/models/trace/handlers/LayoutShiftsHandler.js +0 -15
  49. package/models/trace/handlers/LayoutShiftsHandler.js.map +1 -1
  50. package/models/trace/handlers/MemoryHandler.d.ts +1 -0
  51. package/models/trace/handlers/MemoryHandler.js +2 -0
  52. package/models/trace/handlers/MemoryHandler.js.map +1 -1
  53. package/models/trace/handlers/MetaHandler.d.ts +0 -1
  54. package/models/trace/handlers/MetaHandler.js +2 -21
  55. package/models/trace/handlers/MetaHandler.js.map +1 -1
  56. package/models/trace/handlers/NetworkRequestsHandler.d.ts +1 -2
  57. package/models/trace/handlers/NetworkRequestsHandler.js +2 -15
  58. package/models/trace/handlers/NetworkRequestsHandler.js.map +1 -1
  59. package/models/trace/handlers/PageFramesHandler.d.ts +1 -0
  60. package/models/trace/handlers/PageFramesHandler.js +2 -0
  61. package/models/trace/handlers/PageFramesHandler.js.map +1 -1
  62. package/models/trace/handlers/RendererHandler.d.ts +1 -2
  63. package/models/trace/handlers/RendererHandler.js +0 -18
  64. package/models/trace/handlers/RendererHandler.js.map +1 -1
  65. package/models/trace/handlers/SamplesHandler.d.ts +0 -1
  66. package/models/trace/handlers/SamplesHandler.js +0 -18
  67. package/models/trace/handlers/SamplesHandler.js.map +1 -1
  68. package/models/trace/handlers/SelectorStatsHandler.d.ts +1 -0
  69. package/models/trace/handlers/SelectorStatsHandler.js +2 -0
  70. package/models/trace/handlers/SelectorStatsHandler.js.map +1 -1
  71. package/models/trace/handlers/ServerTimingsHandler.d.ts +1 -2
  72. package/models/trace/handlers/ServerTimingsHandler.js +0 -12
  73. package/models/trace/handlers/ServerTimingsHandler.js.map +1 -1
  74. package/models/trace/handlers/UserInteractionsHandler.d.ts +2 -2
  75. package/models/trace/handlers/UserInteractionsHandler.js +13 -21
  76. package/models/trace/handlers/UserInteractionsHandler.js.map +1 -1
  77. package/models/trace/handlers/UserTimingsHandler.js +0 -12
  78. package/models/trace/handlers/UserTimingsHandler.js.map +1 -1
  79. package/models/trace/handlers/WorkersHandler.d.ts +0 -1
  80. package/models/trace/handlers/WorkersHandler.js +0 -18
  81. package/models/trace/handlers/WorkersHandler.js.map +1 -1
  82. package/models/trace/handlers/types.d.ts +1 -7
  83. package/models/trace/handlers/types.js.map +1 -1
  84. package/models/trace/insights/CLSCulprits.d.ts +57 -0
  85. package/models/trace/insights/CLSCulprits.js +335 -0
  86. package/models/trace/insights/CLSCulprits.js.map +1 -0
  87. package/models/trace/insights/Common.d.ts +2 -10
  88. package/models/trace/insights/Common.js +1 -36
  89. package/models/trace/insights/Common.js.map +1 -1
  90. package/models/trace/insights/DocumentLatency.d.ts +3 -3
  91. package/models/trace/insights/DocumentLatency.js.map +1 -1
  92. package/models/trace/insights/FontDisplay.d.ts +3 -3
  93. package/models/trace/insights/FontDisplay.js.map +1 -1
  94. package/models/trace/insights/InteractionToNextPaint.d.ts +3 -3
  95. package/models/trace/insights/InteractionToNextPaint.js.map +1 -1
  96. package/models/trace/insights/LCPDiscovery.d.ts +13 -0
  97. package/models/trace/insights/LCPDiscovery.js +60 -0
  98. package/models/trace/insights/LCPDiscovery.js.map +1 -0
  99. package/models/trace/insights/LCPPhases.d.ts +34 -0
  100. package/models/trace/insights/LCPPhases.js +97 -0
  101. package/models/trace/insights/LCPPhases.js.map +1 -0
  102. package/models/trace/insights/Models.d.ts +10 -0
  103. package/models/trace/insights/Models.js +14 -0
  104. package/models/trace/insights/Models.js.map +1 -0
  105. package/models/trace/insights/RenderBlocking.d.ts +4 -4
  106. package/models/trace/insights/RenderBlocking.js +1 -16
  107. package/models/trace/insights/RenderBlocking.js.map +1 -1
  108. package/models/trace/insights/SlowCSSSelector.d.ts +3 -3
  109. package/models/trace/insights/SlowCSSSelector.js.map +1 -1
  110. package/models/trace/insights/ThirdParties.d.ts +13 -0
  111. package/models/trace/insights/ThirdParties.js +42 -0
  112. package/models/trace/insights/ThirdParties.js.map +1 -0
  113. package/models/trace/insights/Viewport.d.ts +3 -3
  114. package/models/trace/insights/Viewport.js.map +1 -1
  115. package/models/trace/insights/insights-tsconfig.json +5 -4
  116. package/models/trace/insights/insights.d.ts +1 -1
  117. package/models/trace/insights/insights.js +1 -1
  118. package/models/trace/insights/insights.js.map +1 -1
  119. package/models/trace/insights/types.d.ts +9 -9
  120. package/models/trace/insights/types.js.map +1 -1
  121. package/models/trace/trace-tsconfig.json +6 -0
  122. package/models/trace/types/TraceEvents.d.ts +42 -19
  123. package/models/trace/types/TraceEvents.js +5 -3
  124. package/models/trace/types/TraceEvents.js.map +1 -1
  125. package/package.json +1 -1
  126. package/test/test-trace-engine.mjs +12 -16
@@ -0,0 +1,515 @@
1
+ // Copyright 2016 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 Helpers from '../helpers/helpers.js';
5
+ import * as Types from '../types/types.js';
6
+ import { TimelineJSProfileProcessor } from './TimelineJSProfile.js';
7
+ export class Node {
8
+ totalTime;
9
+ selfTime;
10
+ id;
11
+ event;
12
+ parent;
13
+ groupId;
14
+ isGroupNodeInternal;
15
+ depth;
16
+ constructor(id, event) {
17
+ this.totalTime = 0;
18
+ this.selfTime = 0;
19
+ this.id = id;
20
+ this.event = event;
21
+ this.groupId = '';
22
+ this.isGroupNodeInternal = false;
23
+ this.depth = 0;
24
+ }
25
+ isGroupNode() {
26
+ return this.isGroupNodeInternal;
27
+ }
28
+ hasChildren() {
29
+ throw 'Not implemented';
30
+ }
31
+ setHasChildren(_value) {
32
+ throw 'Not implemented';
33
+ }
34
+ /**
35
+ * Returns the direct descendants of this node.
36
+ * @returns a map with ordered <nodeId, Node> tuples.
37
+ */
38
+ children() {
39
+ throw 'Not implemented';
40
+ }
41
+ searchTree(matchFunction, results) {
42
+ results = results || [];
43
+ if (this.event && matchFunction(this.event)) {
44
+ results.push(this);
45
+ }
46
+ for (const child of this.children().values()) {
47
+ child.searchTree(matchFunction, results);
48
+ }
49
+ return results;
50
+ }
51
+ }
52
+ export class TopDownNode extends Node {
53
+ root;
54
+ hasChildrenInternal;
55
+ childrenInternal;
56
+ parent;
57
+ constructor(id, event, parent) {
58
+ super(id, event);
59
+ this.root = parent && parent.root;
60
+ this.hasChildrenInternal = false;
61
+ this.childrenInternal = null;
62
+ this.parent = parent;
63
+ }
64
+ hasChildren() {
65
+ return this.hasChildrenInternal;
66
+ }
67
+ setHasChildren(value) {
68
+ this.hasChildrenInternal = value;
69
+ }
70
+ children() {
71
+ return this.childrenInternal || this.buildChildren();
72
+ }
73
+ buildChildren() {
74
+ // Tracks the ancestor path of this node, includes the current node.
75
+ const path = [];
76
+ for (let node = this; node.parent && !node.isGroupNode(); node = node.parent) {
77
+ path.push(node);
78
+ }
79
+ path.reverse();
80
+ const children = new Map();
81
+ const self = this;
82
+ const root = this.root;
83
+ if (!root) {
84
+ this.childrenInternal = children;
85
+ return this.childrenInternal;
86
+ }
87
+ const startTime = root.startTime;
88
+ const endTime = root.endTime;
89
+ const instantEventCallback = (root.doNotAggregate || root.includeInstantEvents) ? onInstantEvent : undefined;
90
+ const eventIdCallback = root.doNotAggregate ? undefined : generateEventID;
91
+ const eventGroupIdCallback = root.getEventGroupIdCallback();
92
+ let depth = 0;
93
+ // The amount of ancestors found to match this node's ancestors
94
+ // during the event tree walk.
95
+ let matchedDepth = 0;
96
+ let currentDirectChild = null;
97
+ // Walk on the full event tree to find this node's children.
98
+ Helpers.Trace.forEachEvent(root.events, {
99
+ onStartEvent,
100
+ onEndEvent,
101
+ onInstantEvent: instantEventCallback,
102
+ startTime: Helpers.Timing.millisecondsToMicroseconds(startTime),
103
+ endTime: Helpers.Timing.millisecondsToMicroseconds(endTime),
104
+ eventFilter: root.filter,
105
+ ignoreAsyncEvents: false,
106
+ });
107
+ function onStartEvent(e) {
108
+ const { startTime: currentStartTime, endTime: currentEndTime } = Helpers.Timing.eventTimingsMilliSeconds(e);
109
+ ++depth;
110
+ if (depth > path.length + 2) {
111
+ return;
112
+ }
113
+ if (!matchPath(e)) {
114
+ return;
115
+ }
116
+ const actualEndTime = currentEndTime !== undefined ? Math.min(currentEndTime, endTime) : endTime;
117
+ const duration = actualEndTime - Math.max(startTime, currentStartTime);
118
+ if (duration < 0) {
119
+ console.error('Negative event duration');
120
+ }
121
+ processEvent(e, duration);
122
+ }
123
+ function onInstantEvent(e) {
124
+ ++depth;
125
+ if (matchedDepth === path.length && depth <= path.length + 2) {
126
+ processEvent(e, 0);
127
+ }
128
+ --depth;
129
+ }
130
+ /**
131
+ * Creates a child node.
132
+ */
133
+ function processEvent(e, duration) {
134
+ if (depth === path.length + 2) {
135
+ if (!currentDirectChild) {
136
+ return;
137
+ }
138
+ currentDirectChild.setHasChildren(true);
139
+ currentDirectChild.selfTime -= duration;
140
+ return;
141
+ }
142
+ let id;
143
+ let groupId = '';
144
+ if (!eventIdCallback) {
145
+ id = Symbol('uniqueId');
146
+ }
147
+ else {
148
+ id = eventIdCallback(e);
149
+ groupId = eventGroupIdCallback ? eventGroupIdCallback(e) : '';
150
+ if (groupId) {
151
+ id += '/' + groupId;
152
+ }
153
+ }
154
+ let node = children.get(id);
155
+ if (!node) {
156
+ node = new TopDownNode(id, e, self);
157
+ node.groupId = groupId;
158
+ children.set(id, node);
159
+ }
160
+ node.selfTime += duration;
161
+ node.totalTime += duration;
162
+ currentDirectChild = node;
163
+ }
164
+ /**
165
+ * Checks if the path of ancestors of an event matches the path of
166
+ * ancestors of the current node. In other words, checks if an event
167
+ * is a child of this node. As the check is done, the partial result
168
+ * is cached on `matchedDepth`, for future checks.
169
+ */
170
+ function matchPath(e) {
171
+ const { endTime } = Helpers.Timing.eventTimingsMilliSeconds(e);
172
+ if (matchedDepth === path.length) {
173
+ return true;
174
+ }
175
+ if (matchedDepth !== depth - 1) {
176
+ return false;
177
+ }
178
+ if (!endTime) {
179
+ return false;
180
+ }
181
+ if (!eventIdCallback) {
182
+ if (e === path[matchedDepth].event) {
183
+ ++matchedDepth;
184
+ }
185
+ return false;
186
+ }
187
+ let id = eventIdCallback(e);
188
+ const groupId = eventGroupIdCallback ? eventGroupIdCallback(e) : '';
189
+ if (groupId) {
190
+ id += '/' + groupId;
191
+ }
192
+ if (id === path[matchedDepth].id) {
193
+ ++matchedDepth;
194
+ }
195
+ return false;
196
+ }
197
+ function onEndEvent() {
198
+ --depth;
199
+ if (matchedDepth > depth) {
200
+ matchedDepth = depth;
201
+ }
202
+ }
203
+ this.childrenInternal = children;
204
+ return children;
205
+ }
206
+ getRoot() {
207
+ return this.root;
208
+ }
209
+ }
210
+ export class TopDownRootNode extends TopDownNode {
211
+ filter;
212
+ /** This is all events passed in to create the tree, and it's very likely that it included events outside of the passed startTime/endTime as that filtering is done in `Helpers.Trace.forEachEvent` */
213
+ events;
214
+ startTime;
215
+ endTime;
216
+ eventGroupIdCallback;
217
+ /** Default behavior is to aggregate similar trace events into one Node based on generateEventID(), eventGroupIdCallback(), etc. Set true to keep nodes 1:1 with events. */
218
+ doNotAggregate;
219
+ includeInstantEvents;
220
+ totalTime;
221
+ selfTime;
222
+ constructor(events, filters, startTime, endTime, doNotAggregate, eventGroupIdCallback, includeInstantEvents) {
223
+ super('', null, null);
224
+ this.root = this;
225
+ this.events = events;
226
+ this.filter = (e) => filters.every(f => f.accept(e));
227
+ this.startTime = startTime;
228
+ this.endTime = endTime;
229
+ this.eventGroupIdCallback = eventGroupIdCallback;
230
+ this.doNotAggregate = doNotAggregate;
231
+ this.includeInstantEvents = includeInstantEvents;
232
+ this.totalTime = endTime - startTime;
233
+ this.selfTime = this.totalTime;
234
+ }
235
+ children() {
236
+ return this.childrenInternal || this.grouppedTopNodes();
237
+ }
238
+ grouppedTopNodes() {
239
+ const flatNodes = super.children();
240
+ for (const node of flatNodes.values()) {
241
+ this.selfTime -= node.totalTime;
242
+ }
243
+ if (!this.eventGroupIdCallback) {
244
+ return flatNodes;
245
+ }
246
+ const groupNodes = new Map();
247
+ for (const node of flatNodes.values()) {
248
+ if (!node.event) {
249
+ continue;
250
+ }
251
+ const groupId = this.eventGroupIdCallback(node.event);
252
+ let groupNode = groupNodes.get(groupId);
253
+ if (!groupNode) {
254
+ groupNode = new GroupNode(groupId, this, node.event);
255
+ groupNodes.set(groupId, groupNode);
256
+ }
257
+ groupNode.addChild(node, node.selfTime, node.totalTime);
258
+ }
259
+ this.childrenInternal = groupNodes;
260
+ return groupNodes;
261
+ }
262
+ getEventGroupIdCallback() {
263
+ return this.eventGroupIdCallback;
264
+ }
265
+ }
266
+ export class BottomUpRootNode extends Node {
267
+ childrenInternal;
268
+ events;
269
+ textFilter;
270
+ filter;
271
+ startTime;
272
+ endTime;
273
+ eventGroupIdCallback;
274
+ totalTime;
275
+ constructor(events, textFilter, filters, startTime, endTime, eventGroupIdCallback) {
276
+ super('', null);
277
+ this.childrenInternal = null;
278
+ this.events = events;
279
+ this.textFilter = textFilter;
280
+ this.filter = (e) => filters.every(f => f.accept(e));
281
+ this.startTime = startTime;
282
+ this.endTime = endTime;
283
+ this.eventGroupIdCallback = eventGroupIdCallback;
284
+ this.totalTime = endTime - startTime;
285
+ }
286
+ hasChildren() {
287
+ return true;
288
+ }
289
+ filterChildren(children) {
290
+ for (const [id, child] of children) {
291
+ // to provide better context to user only filter first (top) level.
292
+ if (child.event && child.depth <= 1 && !this.textFilter.accept(child.event)) {
293
+ children.delete(id);
294
+ }
295
+ }
296
+ return children;
297
+ }
298
+ children() {
299
+ if (!this.childrenInternal) {
300
+ this.childrenInternal = this.filterChildren(this.grouppedTopNodes());
301
+ }
302
+ return this.childrenInternal;
303
+ }
304
+ ungrouppedTopNodes() {
305
+ const root = this;
306
+ const startTime = this.startTime;
307
+ const endTime = this.endTime;
308
+ const nodeById = new Map();
309
+ const selfTimeStack = [endTime - startTime];
310
+ const firstNodeStack = [];
311
+ const totalTimeById = new Map();
312
+ Helpers.Trace.forEachEvent(this.events, {
313
+ onStartEvent,
314
+ onEndEvent,
315
+ startTime: Helpers.Timing.millisecondsToMicroseconds(this.startTime),
316
+ endTime: Helpers.Timing.millisecondsToMicroseconds(this.endTime),
317
+ eventFilter: this.filter,
318
+ ignoreAsyncEvents: false,
319
+ });
320
+ function onStartEvent(e) {
321
+ const { startTime: currentStartTime, endTime: currentEndTime } = Helpers.Timing.eventTimingsMilliSeconds(e);
322
+ const actualEndTime = currentEndTime !== undefined ? Math.min(currentEndTime, endTime) : endTime;
323
+ const duration = actualEndTime - Math.max(currentStartTime, startTime);
324
+ selfTimeStack[selfTimeStack.length - 1] -= duration;
325
+ selfTimeStack.push(duration);
326
+ const id = generateEventID(e);
327
+ const noNodeOnStack = !totalTimeById.has(id);
328
+ if (noNodeOnStack) {
329
+ totalTimeById.set(id, duration);
330
+ }
331
+ firstNodeStack.push(noNodeOnStack);
332
+ }
333
+ function onEndEvent(event) {
334
+ const id = generateEventID(event);
335
+ let node = nodeById.get(id);
336
+ if (!node) {
337
+ node = new BottomUpNode(root, id, event, false, root);
338
+ nodeById.set(id, node);
339
+ }
340
+ node.selfTime += selfTimeStack.pop() || 0;
341
+ if (firstNodeStack.pop()) {
342
+ node.totalTime += totalTimeById.get(id) || 0;
343
+ totalTimeById.delete(id);
344
+ }
345
+ if (firstNodeStack.length) {
346
+ node.setHasChildren(true);
347
+ }
348
+ }
349
+ this.selfTime = selfTimeStack.pop() || 0;
350
+ for (const pair of nodeById) {
351
+ if (pair[1].selfTime <= 0) {
352
+ nodeById.delete(pair[0]);
353
+ }
354
+ }
355
+ return nodeById;
356
+ }
357
+ grouppedTopNodes() {
358
+ const flatNodes = this.ungrouppedTopNodes();
359
+ if (!this.eventGroupIdCallback) {
360
+ return flatNodes;
361
+ }
362
+ const groupNodes = new Map();
363
+ for (const node of flatNodes.values()) {
364
+ if (!node.event) {
365
+ continue;
366
+ }
367
+ const groupId = this.eventGroupIdCallback(node.event);
368
+ let groupNode = groupNodes.get(groupId);
369
+ if (!groupNode) {
370
+ groupNode = new GroupNode(groupId, this, node.event);
371
+ groupNodes.set(groupId, groupNode);
372
+ }
373
+ groupNode.addChild(node, node.selfTime, node.selfTime);
374
+ }
375
+ return groupNodes;
376
+ }
377
+ }
378
+ export class GroupNode extends Node {
379
+ childrenInternal;
380
+ isGroupNodeInternal;
381
+ constructor(id, parent, event) {
382
+ super(id, event);
383
+ this.childrenInternal = new Map();
384
+ this.parent = parent;
385
+ this.isGroupNodeInternal = true;
386
+ }
387
+ addChild(child, selfTime, totalTime) {
388
+ this.childrenInternal.set(child.id, child);
389
+ this.selfTime += selfTime;
390
+ this.totalTime += totalTime;
391
+ child.parent = this;
392
+ }
393
+ hasChildren() {
394
+ return true;
395
+ }
396
+ children() {
397
+ return this.childrenInternal;
398
+ }
399
+ }
400
+ export class BottomUpNode extends Node {
401
+ parent;
402
+ root;
403
+ depth;
404
+ cachedChildren;
405
+ hasChildrenInternal;
406
+ constructor(root, id, event, hasChildren, parent) {
407
+ super(id, event);
408
+ this.parent = parent;
409
+ this.root = root;
410
+ this.depth = (parent.depth || 0) + 1;
411
+ this.cachedChildren = null;
412
+ this.hasChildrenInternal = hasChildren;
413
+ }
414
+ hasChildren() {
415
+ return this.hasChildrenInternal;
416
+ }
417
+ setHasChildren(value) {
418
+ this.hasChildrenInternal = value;
419
+ }
420
+ children() {
421
+ if (this.cachedChildren) {
422
+ return this.cachedChildren;
423
+ }
424
+ const selfTimeStack = [0];
425
+ const eventIdStack = [];
426
+ const eventStack = [];
427
+ const nodeById = new Map();
428
+ const startTime = this.root.startTime;
429
+ const endTime = this.root.endTime;
430
+ let lastTimeMarker = startTime;
431
+ const self = this;
432
+ Helpers.Trace.forEachEvent(this.root.events, {
433
+ onStartEvent,
434
+ onEndEvent,
435
+ startTime: Helpers.Timing.millisecondsToMicroseconds(startTime),
436
+ endTime: Helpers.Timing.millisecondsToMicroseconds(endTime),
437
+ eventFilter: this.root.filter,
438
+ ignoreAsyncEvents: false,
439
+ });
440
+ function onStartEvent(e) {
441
+ const { startTime: currentStartTime, endTime: currentEndTime } = Helpers.Timing.eventTimingsMilliSeconds(e);
442
+ const actualEndTime = currentEndTime !== undefined ? Math.min(currentEndTime, endTime) : endTime;
443
+ const duration = actualEndTime - Math.max(currentStartTime, startTime);
444
+ if (duration < 0) {
445
+ console.assert(false, 'Negative duration of an event');
446
+ }
447
+ selfTimeStack[selfTimeStack.length - 1] -= duration;
448
+ selfTimeStack.push(duration);
449
+ const id = generateEventID(e);
450
+ eventIdStack.push(id);
451
+ eventStack.push(e);
452
+ }
453
+ function onEndEvent(e) {
454
+ const { startTime: currentStartTime, endTime: currentEndTime } = Helpers.Timing.eventTimingsMilliSeconds(e);
455
+ const selfTime = selfTimeStack.pop();
456
+ const id = eventIdStack.pop();
457
+ eventStack.pop();
458
+ let node;
459
+ for (node = self; node.depth > 1; node = node.parent) {
460
+ if (node.id !== eventIdStack[eventIdStack.length + 1 - node.depth]) {
461
+ return;
462
+ }
463
+ }
464
+ if (node.id !== id || eventIdStack.length < self.depth) {
465
+ return;
466
+ }
467
+ const childId = eventIdStack[eventIdStack.length - self.depth];
468
+ node = nodeById.get(childId);
469
+ if (!node) {
470
+ const event = eventStack[eventStack.length - self.depth];
471
+ const hasChildren = eventStack.length > self.depth;
472
+ node = new BottomUpNode(self.root, childId, event, hasChildren, self);
473
+ nodeById.set(childId, node);
474
+ }
475
+ const actualEndTime = currentEndTime !== undefined ? Math.min(currentEndTime, endTime) : endTime;
476
+ const totalTime = actualEndTime - Math.max(currentStartTime, lastTimeMarker);
477
+ node.selfTime += selfTime || 0;
478
+ node.totalTime += totalTime;
479
+ lastTimeMarker = actualEndTime;
480
+ }
481
+ this.cachedChildren = this.root.filterChildren(nodeById);
482
+ return this.cachedChildren;
483
+ }
484
+ searchTree(matchFunction, results) {
485
+ results = results || [];
486
+ if (this.event && matchFunction(this.event)) {
487
+ results.push(this);
488
+ }
489
+ return results;
490
+ }
491
+ }
492
+ export function eventStackFrame(event) {
493
+ if (Types.Events.isProfileCall(event)) {
494
+ return event.callFrame;
495
+ }
496
+ const topFrame = event.args?.data?.stackTrace?.[0];
497
+ if (!topFrame) {
498
+ return null;
499
+ }
500
+ return { ...topFrame, scriptId: String(topFrame.scriptId) };
501
+ }
502
+ export function generateEventID(event) {
503
+ if (Types.Events.isProfileCall(event)) {
504
+ const name = TimelineJSProfileProcessor.isNativeRuntimeFrame(event.callFrame) ?
505
+ TimelineJSProfileProcessor.nativeGroup(event.callFrame.functionName) :
506
+ event.callFrame.functionName;
507
+ const location = event.callFrame.scriptId || event.callFrame.url || '';
508
+ return `f:${name}@${location}`;
509
+ }
510
+ if (Types.Events.isTimeStamp(event)) {
511
+ return `${event.name}:${event.args.data.message}`;
512
+ }
513
+ return event.name;
514
+ }
515
+ //# sourceMappingURL=TraceTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TraceTree.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/extras/TraceTree.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2016 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 * as Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\nimport {TimelineJSProfileProcessor} from './TimelineJSProfile.js';\nimport type {TraceFilter} from './TraceFilter.js';\n\nexport class Node {\n totalTime: number;\n selfTime: number;\n id: string|symbol;\n event: Types.Events.Event|null;\n parent!: Node|null;\n groupId: string;\n isGroupNodeInternal: boolean;\n depth: number;\n\n constructor(id: string|symbol, event: Types.Events.Event|null) {\n this.totalTime = 0;\n this.selfTime = 0;\n this.id = id;\n this.event = event;\n\n this.groupId = '';\n this.isGroupNodeInternal = false;\n this.depth = 0;\n }\n\n isGroupNode(): boolean {\n return this.isGroupNodeInternal;\n }\n\n hasChildren(): boolean {\n throw 'Not implemented';\n }\n\n setHasChildren(_value: boolean): void {\n throw 'Not implemented';\n }\n /**\n * Returns the direct descendants of this node.\n * @returns a map with ordered <nodeId, Node> tuples.\n */\n children(): ChildrenCache {\n throw 'Not implemented';\n }\n\n searchTree(matchFunction: (arg0: Types.Events.Event) => boolean, results?: Node[]): Node[] {\n results = results || [];\n if (this.event && matchFunction(this.event)) {\n results.push(this);\n }\n for (const child of this.children().values()) {\n child.searchTree(matchFunction, results);\n }\n return results;\n }\n}\n\nexport class TopDownNode extends Node {\n root: TopDownRootNode|null;\n private hasChildrenInternal: boolean;\n childrenInternal: ChildrenCache|null;\n override parent: TopDownNode|null;\n\n constructor(id: string|symbol, event: Types.Events.Event|null, parent: TopDownNode|null) {\n super(id, event);\n this.root = parent && parent.root;\n this.hasChildrenInternal = false;\n this.childrenInternal = null;\n this.parent = parent;\n }\n\n override hasChildren(): boolean {\n return this.hasChildrenInternal;\n }\n\n override setHasChildren(value: boolean): void {\n this.hasChildrenInternal = value;\n }\n\n override children(): ChildrenCache {\n return this.childrenInternal || this.buildChildren();\n }\n\n private buildChildren(): ChildrenCache {\n // Tracks the ancestor path of this node, includes the current node.\n const path: TopDownNode[] = [];\n for (let node: TopDownNode = (this as TopDownNode); node.parent && !node.isGroupNode(); node = node.parent) {\n path.push((node as TopDownNode));\n }\n path.reverse();\n const children: ChildrenCache = new Map();\n const self = this;\n const root = this.root;\n if (!root) {\n this.childrenInternal = children;\n return this.childrenInternal;\n }\n const startTime = root.startTime;\n const endTime = root.endTime;\n const instantEventCallback = (root.doNotAggregate || root.includeInstantEvents) ? onInstantEvent : undefined;\n const eventIdCallback = root.doNotAggregate ? undefined : generateEventID;\n const eventGroupIdCallback = root.getEventGroupIdCallback();\n let depth = 0;\n // The amount of ancestors found to match this node's ancestors\n // during the event tree walk.\n let matchedDepth = 0;\n let currentDirectChild: Node|null = null;\n\n // Walk on the full event tree to find this node's children.\n Helpers.Trace.forEachEvent(\n root.events,\n {\n onStartEvent,\n onEndEvent,\n onInstantEvent: instantEventCallback,\n startTime: Helpers.Timing.millisecondsToMicroseconds(startTime),\n endTime: Helpers.Timing.millisecondsToMicroseconds(endTime),\n eventFilter: root.filter,\n ignoreAsyncEvents: false,\n },\n );\n\n function onStartEvent(e: Types.Events.Event): void {\n const {startTime: currentStartTime, endTime: currentEndTime} = Helpers.Timing.eventTimingsMilliSeconds(e);\n\n ++depth;\n if (depth > path.length + 2) {\n return;\n }\n if (!matchPath(e)) {\n return;\n }\n const actualEndTime = currentEndTime !== undefined ? Math.min(currentEndTime, endTime) : endTime;\n const duration = actualEndTime - Math.max(startTime, currentStartTime);\n if (duration < 0) {\n console.error('Negative event duration');\n }\n processEvent(e, duration);\n }\n\n function onInstantEvent(e: Types.Events.Event): void {\n ++depth;\n if (matchedDepth === path.length && depth <= path.length + 2) {\n processEvent(e, 0);\n }\n --depth;\n }\n\n /**\n * Creates a child node.\n */\n function processEvent(e: Types.Events.Event, duration: number): void {\n if (depth === path.length + 2) {\n if (!currentDirectChild) {\n return;\n }\n currentDirectChild.setHasChildren(true);\n currentDirectChild.selfTime -= duration;\n return;\n }\n let id;\n let groupId = '';\n if (!eventIdCallback) {\n id = Symbol('uniqueId');\n } else {\n id = eventIdCallback(e);\n groupId = eventGroupIdCallback ? eventGroupIdCallback(e) : '';\n if (groupId) {\n id += '/' + groupId;\n }\n }\n let node = children.get(id);\n if (!node) {\n node = new TopDownNode(id, e, self);\n node.groupId = groupId;\n children.set(id, node);\n }\n node.selfTime += duration;\n node.totalTime += duration;\n currentDirectChild = node;\n }\n\n /**\n * Checks if the path of ancestors of an event matches the path of\n * ancestors of the current node. In other words, checks if an event\n * is a child of this node. As the check is done, the partial result\n * is cached on `matchedDepth`, for future checks.\n */\n function matchPath(e: Types.Events.Event): boolean {\n const {endTime} = Helpers.Timing.eventTimingsMilliSeconds(e);\n if (matchedDepth === path.length) {\n return true;\n }\n if (matchedDepth !== depth - 1) {\n return false;\n }\n if (!endTime) {\n return false;\n }\n if (!eventIdCallback) {\n if (e === path[matchedDepth].event) {\n ++matchedDepth;\n }\n return false;\n }\n let id = eventIdCallback(e);\n const groupId = eventGroupIdCallback ? eventGroupIdCallback(e) : '';\n if (groupId) {\n id += '/' + groupId;\n }\n if (id === path[matchedDepth].id) {\n ++matchedDepth;\n }\n return false;\n }\n\n function onEndEvent(): void {\n --depth;\n if (matchedDepth > depth) {\n matchedDepth = depth;\n }\n }\n\n this.childrenInternal = children;\n return children;\n }\n\n getRoot(): TopDownRootNode|null {\n return this.root;\n }\n}\n\nexport class TopDownRootNode extends TopDownNode {\n readonly filter: (e: Types.Events.Event) => boolean;\n /** This is all events passed in to create the tree, and it's very likely that it included events outside of the passed startTime/endTime as that filtering is done in `Helpers.Trace.forEachEvent` */\n readonly events: Types.Events.Event[];\n readonly startTime: Types.Timing.MilliSeconds;\n readonly endTime: Types.Timing.MilliSeconds;\n eventGroupIdCallback: ((arg0: Types.Events.Event) => string)|null|undefined;\n /** Default behavior is to aggregate similar trace events into one Node based on generateEventID(), eventGroupIdCallback(), etc. Set true to keep nodes 1:1 with events. */\n readonly doNotAggregate: boolean|undefined;\n readonly includeInstantEvents?: boolean;\n override totalTime: number;\n override selfTime: number;\n\n constructor(\n events: Types.Events.Event[], filters: TraceFilter[], startTime: Types.Timing.MilliSeconds,\n endTime: Types.Timing.MilliSeconds, doNotAggregate?: boolean,\n eventGroupIdCallback?: ((arg0: Types.Events.Event) => string)|null, includeInstantEvents?: boolean) {\n super('', null, null);\n this.root = this;\n this.events = events;\n this.filter = (e: Types.Events.Event): boolean => filters.every(f => f.accept(e));\n this.startTime = startTime;\n this.endTime = endTime;\n this.eventGroupIdCallback = eventGroupIdCallback;\n this.doNotAggregate = doNotAggregate;\n this.includeInstantEvents = includeInstantEvents;\n\n this.totalTime = endTime - startTime;\n this.selfTime = this.totalTime;\n }\n\n override children(): ChildrenCache {\n return this.childrenInternal || this.grouppedTopNodes();\n }\n\n private grouppedTopNodes(): ChildrenCache {\n const flatNodes = super.children();\n for (const node of flatNodes.values()) {\n this.selfTime -= node.totalTime;\n }\n if (!this.eventGroupIdCallback) {\n return flatNodes;\n }\n const groupNodes = new Map<string, GroupNode>();\n for (const node of flatNodes.values()) {\n if (!node.event) {\n continue;\n }\n const groupId = this.eventGroupIdCallback(node.event);\n let groupNode = groupNodes.get(groupId);\n if (!groupNode) {\n groupNode = new GroupNode(groupId, this, node.event);\n groupNodes.set(groupId, groupNode);\n }\n groupNode.addChild(node as BottomUpNode, node.selfTime, node.totalTime);\n }\n this.childrenInternal = groupNodes;\n return groupNodes;\n }\n\n getEventGroupIdCallback(): ((arg0: Types.Events.Event) => string)|null|undefined {\n return this.eventGroupIdCallback;\n }\n}\n\nexport class BottomUpRootNode extends Node {\n private childrenInternal: ChildrenCache|null;\n readonly events: Types.Events.Event[];\n private textFilter: TraceFilter;\n readonly filter: (e: Types.Events.Event) => boolean;\n readonly startTime: Types.Timing.MilliSeconds;\n readonly endTime: Types.Timing.MilliSeconds;\n private eventGroupIdCallback: ((arg0: Types.Events.Event) => string)|null;\n override totalTime: number;\n\n constructor(\n events: Types.Events.Event[], textFilter: TraceFilter, filters: TraceFilter[],\n startTime: Types.Timing.MilliSeconds, endTime: Types.Timing.MilliSeconds,\n eventGroupIdCallback: ((arg0: Types.Events.Event) => string)|null) {\n super('', null);\n this.childrenInternal = null;\n this.events = events;\n this.textFilter = textFilter;\n this.filter = (e: Types.Events.Event): boolean => filters.every(f => f.accept(e));\n this.startTime = startTime;\n this.endTime = endTime;\n this.eventGroupIdCallback = eventGroupIdCallback;\n this.totalTime = endTime - startTime;\n }\n\n override hasChildren(): boolean {\n return true;\n }\n\n filterChildren(children: ChildrenCache): ChildrenCache {\n for (const [id, child] of children) {\n // to provide better context to user only filter first (top) level.\n if (child.event && child.depth <= 1 && !this.textFilter.accept(child.event)) {\n children.delete((id as string | symbol));\n }\n }\n return children;\n }\n\n override children(): ChildrenCache {\n if (!this.childrenInternal) {\n this.childrenInternal = this.filterChildren(this.grouppedTopNodes());\n }\n return this.childrenInternal;\n }\n\n private ungrouppedTopNodes(): ChildrenCache {\n const root = this;\n const startTime = this.startTime;\n const endTime = this.endTime;\n const nodeById = new Map<string, Node>();\n const selfTimeStack: number[] = [endTime - startTime];\n const firstNodeStack: boolean[] = [];\n const totalTimeById = new Map<string, number>();\n Helpers.Trace.forEachEvent(\n this.events,\n {\n onStartEvent,\n onEndEvent,\n startTime: Helpers.Timing.millisecondsToMicroseconds(this.startTime),\n endTime: Helpers.Timing.millisecondsToMicroseconds(this.endTime),\n eventFilter: this.filter,\n ignoreAsyncEvents: false,\n },\n );\n\n function onStartEvent(e: Types.Events.Event): void {\n const {startTime: currentStartTime, endTime: currentEndTime} = Helpers.Timing.eventTimingsMilliSeconds(e);\n\n const actualEndTime = currentEndTime !== undefined ? Math.min(currentEndTime, endTime) : endTime;\n const duration = actualEndTime - Math.max(currentStartTime, startTime);\n selfTimeStack[selfTimeStack.length - 1] -= duration;\n selfTimeStack.push(duration);\n const id = generateEventID(e);\n const noNodeOnStack = !totalTimeById.has(id);\n if (noNodeOnStack) {\n totalTimeById.set(id, duration);\n }\n firstNodeStack.push(noNodeOnStack);\n }\n\n function onEndEvent(event: Types.Events.Event): void {\n const id = generateEventID(event);\n let node = nodeById.get(id);\n if (!node) {\n node = new BottomUpNode(root, id, event, false, root);\n nodeById.set(id, node);\n }\n node.selfTime += selfTimeStack.pop() || 0;\n if (firstNodeStack.pop()) {\n node.totalTime += totalTimeById.get(id) || 0;\n totalTimeById.delete(id);\n }\n if (firstNodeStack.length) {\n node.setHasChildren(true);\n }\n }\n\n this.selfTime = selfTimeStack.pop() || 0;\n for (const pair of nodeById) {\n if (pair[1].selfTime <= 0) {\n nodeById.delete((pair[0] as string));\n }\n }\n return nodeById;\n }\n\n private grouppedTopNodes(): ChildrenCache {\n const flatNodes = this.ungrouppedTopNodes();\n if (!this.eventGroupIdCallback) {\n return flatNodes;\n }\n const groupNodes = new Map<string, GroupNode>();\n for (const node of flatNodes.values()) {\n if (!node.event) {\n continue;\n }\n const groupId = this.eventGroupIdCallback(node.event);\n let groupNode = groupNodes.get(groupId);\n if (!groupNode) {\n groupNode = new GroupNode(groupId, this, node.event);\n groupNodes.set(groupId, groupNode);\n }\n groupNode.addChild(node as BottomUpNode, node.selfTime, node.selfTime);\n }\n return groupNodes;\n }\n}\n\nexport class GroupNode extends Node {\n private readonly childrenInternal: ChildrenCache;\n override isGroupNodeInternal: boolean;\n\n constructor(id: string, parent: BottomUpRootNode|TopDownRootNode, event: Types.Events.Event) {\n super(id, event);\n this.childrenInternal = new Map();\n this.parent = parent;\n this.isGroupNodeInternal = true;\n }\n\n addChild(child: BottomUpNode, selfTime: number, totalTime: number): void {\n this.childrenInternal.set(child.id, child);\n this.selfTime += selfTime;\n this.totalTime += totalTime;\n child.parent = this;\n }\n\n override hasChildren(): boolean {\n return true;\n }\n\n override children(): ChildrenCache {\n return this.childrenInternal;\n }\n}\n\nexport class BottomUpNode extends Node {\n override parent: Node;\n private root: BottomUpRootNode;\n override depth: number;\n private cachedChildren: ChildrenCache|null;\n private hasChildrenInternal: boolean;\n\n constructor(root: BottomUpRootNode, id: string, event: Types.Events.Event, hasChildren: boolean, parent: Node) {\n super(id, event);\n this.parent = parent;\n this.root = root;\n this.depth = (parent.depth || 0) + 1;\n this.cachedChildren = null;\n this.hasChildrenInternal = hasChildren;\n }\n\n override hasChildren(): boolean {\n return this.hasChildrenInternal;\n }\n\n override setHasChildren(value: boolean): void {\n this.hasChildrenInternal = value;\n }\n\n override children(): ChildrenCache {\n if (this.cachedChildren) {\n return this.cachedChildren;\n }\n const selfTimeStack: number[] = [0];\n const eventIdStack: string[] = [];\n const eventStack: Types.Events.Event[] = [];\n const nodeById = new Map<string, BottomUpNode>();\n const startTime = this.root.startTime;\n const endTime = this.root.endTime;\n let lastTimeMarker: number = startTime;\n const self = this;\n Helpers.Trace.forEachEvent(\n this.root.events,\n {\n onStartEvent,\n onEndEvent,\n startTime: Helpers.Timing.millisecondsToMicroseconds(startTime),\n endTime: Helpers.Timing.millisecondsToMicroseconds(endTime),\n eventFilter: this.root.filter,\n ignoreAsyncEvents: false,\n },\n );\n function onStartEvent(e: Types.Events.Event): void {\n const {startTime: currentStartTime, endTime: currentEndTime} = Helpers.Timing.eventTimingsMilliSeconds(e);\n const actualEndTime = currentEndTime !== undefined ? Math.min(currentEndTime, endTime) : endTime;\n const duration = actualEndTime - Math.max(currentStartTime, startTime);\n if (duration < 0) {\n console.assert(false, 'Negative duration of an event');\n }\n selfTimeStack[selfTimeStack.length - 1] -= duration;\n selfTimeStack.push(duration);\n const id = generateEventID(e);\n eventIdStack.push(id);\n eventStack.push(e);\n }\n\n function onEndEvent(e: Types.Events.Event): void {\n const {startTime: currentStartTime, endTime: currentEndTime} = Helpers.Timing.eventTimingsMilliSeconds(e);\n const selfTime = selfTimeStack.pop();\n const id = eventIdStack.pop();\n eventStack.pop();\n let node;\n for (node = self; node.depth > 1; node = node.parent) {\n if (node.id !== eventIdStack[eventIdStack.length + 1 - node.depth]) {\n return;\n }\n }\n if (node.id !== id || eventIdStack.length < self.depth) {\n return;\n }\n const childId = eventIdStack[eventIdStack.length - self.depth];\n node = nodeById.get(childId);\n if (!node) {\n const event = eventStack[eventStack.length - self.depth];\n const hasChildren = eventStack.length > self.depth;\n node = new BottomUpNode(self.root, childId, event, hasChildren, self);\n nodeById.set(childId, node);\n }\n const actualEndTime = currentEndTime !== undefined ? Math.min(currentEndTime, endTime) : endTime;\n const totalTime = actualEndTime - Math.max(currentStartTime, lastTimeMarker);\n node.selfTime += selfTime || 0;\n node.totalTime += totalTime;\n lastTimeMarker = actualEndTime;\n }\n\n this.cachedChildren = this.root.filterChildren(nodeById);\n return this.cachedChildren;\n }\n\n override searchTree(matchFunction: (arg0: Types.Events.Event) => boolean, results?: Node[]): Node[] {\n results = results || [];\n if (this.event && matchFunction(this.event)) {\n results.push(this);\n }\n return results;\n }\n}\n\nexport function eventStackFrame(event: Types.Events.Event): Protocol.Runtime.CallFrame|null {\n if (Types.Events.isProfileCall(event)) {\n return event.callFrame;\n }\n const topFrame = event.args?.data?.stackTrace?.[0];\n if (!topFrame) {\n return null;\n }\n return {...topFrame, scriptId: String(topFrame.scriptId) as Protocol.Runtime.ScriptId};\n}\n\nexport function generateEventID(event: Types.Events.Event): string {\n if (Types.Events.isProfileCall(event)) {\n const name = TimelineJSProfileProcessor.isNativeRuntimeFrame(event.callFrame) ?\n TimelineJSProfileProcessor.nativeGroup(event.callFrame.functionName) :\n event.callFrame.functionName;\n const location = event.callFrame.scriptId || event.callFrame.url || '';\n return `f:${name}@${location}`;\n }\n\n if (Types.Events.isTimeStamp(event)) {\n return `${event.name}:${event.args.data.message}`;\n }\n\n return event.name;\n}\n\nexport type ChildrenCache = Map<string|symbol, Node>;\n"]}
@@ -34,6 +34,9 @@
34
34
  "../../../../../../../front_end/models/trace/extras/MainThreadActivity.ts",
35
35
  "../../../../../../../front_end/models/trace/extras/Metadata.ts",
36
36
  "../../../../../../../front_end/models/trace/extras/ThirdParties.ts",
37
+ "../../../../../../../front_end/models/trace/extras/TimelineJSProfile.ts",
38
+ "../../../../../../../front_end/models/trace/extras/TraceFilter.ts",
39
+ "../../../../../../../front_end/models/trace/extras/TraceTree.ts",
37
40
  "../../../../../../../front_end/models/trace/extras/URLForEntry.ts",
38
41
  "../../../../../../../front_end/legacy/legacy-defs.d.ts",
39
42
  "../../../../../../../front_end/global_typings/global_defs.d.ts",
@@ -1 +1 @@
1
- {"version":3,"file":"extras.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/extras/extras.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yEAAyE;AACzE,6BAA6B;AAE7B,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,kBAAkB,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC","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\nexport * as FetchNodes from './FetchNodes.js';\nexport * as FilmStrip from './FilmStrip.js';\nexport * as MainThreadActivity from './MainThreadActivity.js';\nexport * as Metadata from './Metadata.js';\nexport * as ThirdParties from './ThirdParties.js';\nexport * as URLForEntry from './URLForEntry.js';\n"]}
1
+ {"version":3,"file":"extras.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/extras/extras.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yEAAyE;AACzE,6BAA6B;AAE7B,OAAO,KAAK,UAAU,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,kBAAkB,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,iBAAiB,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC","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\nexport * as FetchNodes from './FetchNodes.js';\nexport * as FilmStrip from './FilmStrip.js';\nexport * as MainThreadActivity from './MainThreadActivity.js';\nexport * as Metadata from './Metadata.js';\nexport * as ThirdParties from './ThirdParties.js';\nexport * as TimelineJSProfile from './TimelineJSProfile.js';\nexport * as TraceFilter from './TraceFilter.js';\nexport * as TraceTree from './TraceTree.js';\nexport * as URLForEntry from './URLForEntry.js';\n"]}
@@ -5,7 +5,6 @@ import * as Helpers from '../helpers/helpers.js';
5
5
  import * as Types from '../types/types.js';
6
6
  const animations = [];
7
7
  const animationsSyntheticEvents = [];
8
- let handlerState = 1 /* HandlerState.UNINITIALIZED */;
9
8
  export function reset() {
10
9
  animations.length = 0;
11
10
  animationsSyntheticEvents.length = 0;
@@ -19,12 +18,8 @@ export function handleEvent(event) {
19
18
  export async function finalize() {
20
19
  const syntheticEvents = Helpers.Trace.createMatchedSortedSyntheticEvents(animations);
21
20
  animationsSyntheticEvents.push(...syntheticEvents);
22
- handlerState = 3 /* HandlerState.FINALIZED */;
23
21
  }
24
22
  export function data() {
25
- if (handlerState !== 3 /* HandlerState.FINALIZED */) {
26
- throw new Error('Animation handler is not finalized');
27
- }
28
23
  return {
29
24
  animations: animationsSyntheticEvents,
30
25
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AnimationHandler.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/handlers/AnimationHandler.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yEAAyE;AACzE,6BAA6B;AAE7B,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAI3C,MAAM,UAAU,GAA6B,EAAE,CAAC;AAChD,MAAM,yBAAyB,GAA0C,EAAE,CAAC;AAK5E,IAAI,YAAY,qCAA6B,CAAC;AAE9C,MAAM,UAAU,KAAK;IACnB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACtB,yBAAyB,CAAC,MAAM,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAyB;IACnD,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,UAAU,CAAC,CAAC;IACrF,yBAAyB,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;IACnD,YAAY,iCAAyB,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,IAAI;IAClB,IAAI,YAAY,mCAA2B,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,OAAO;QACL,UAAU,EAAE,yBAAyB;KACtC,CAAC;AACJ,CAAC","sourcesContent":["// Copyright 2022 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\nimport {HandlerState} from './types.js';\n\nconst animations: Types.Events.Animation[] = [];\nconst animationsSyntheticEvents: Types.Events.SyntheticAnimationPair[] = [];\n\nexport interface AnimationData {\n animations: readonly Types.Events.SyntheticAnimationPair[];\n}\nlet handlerState = HandlerState.UNINITIALIZED;\n\nexport function reset(): void {\n animations.length = 0;\n animationsSyntheticEvents.length = 0;\n}\n\nexport function handleEvent(event: Types.Events.Event): void {\n if (Types.Events.isAnimation(event)) {\n animations.push(event);\n return;\n }\n}\n\nexport async function finalize(): Promise<void> {\n const syntheticEvents = Helpers.Trace.createMatchedSortedSyntheticEvents(animations);\n animationsSyntheticEvents.push(...syntheticEvents);\n handlerState = HandlerState.FINALIZED;\n}\n\nexport function data(): AnimationData {\n if (handlerState !== HandlerState.FINALIZED) {\n throw new Error('Animation handler is not finalized');\n }\n\n return {\n animations: animationsSyntheticEvents,\n };\n}\n"]}
1
+ {"version":3,"file":"AnimationHandler.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/handlers/AnimationHandler.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yEAAyE;AACzE,6BAA6B;AAE7B,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAE3C,MAAM,UAAU,GAA6B,EAAE,CAAC;AAChD,MAAM,yBAAyB,GAA0C,EAAE,CAAC;AAM5E,MAAM,UAAU,KAAK;IACnB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACtB,yBAAyB,CAAC,MAAM,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAyB;IACnD,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,UAAU,CAAC,CAAC;IACrF,yBAAyB,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,IAAI;IAClB,OAAO;QACL,UAAU,EAAE,yBAAyB;KACtC,CAAC;AACJ,CAAC","sourcesContent":["// Copyright 2022 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\nconst animations: Types.Events.Animation[] = [];\nconst animationsSyntheticEvents: Types.Events.SyntheticAnimationPair[] = [];\n\nexport interface AnimationData {\n animations: readonly Types.Events.SyntheticAnimationPair[];\n}\n\nexport function reset(): void {\n animations.length = 0;\n animationsSyntheticEvents.length = 0;\n}\n\nexport function handleEvent(event: Types.Events.Event): void {\n if (Types.Events.isAnimation(event)) {\n animations.push(event);\n return;\n }\n}\n\nexport async function finalize(): Promise<void> {\n const syntheticEvents = Helpers.Trace.createMatchedSortedSyntheticEvents(animations);\n animationsSyntheticEvents.push(...syntheticEvents);\n}\n\nexport function data(): AnimationData {\n return {\n animations: animationsSyntheticEvents,\n };\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import * as Helpers from '../helpers/helpers.js';
2
2
  import * as Types from '../types/types.js';
3
- import { type HandlerName } from './types.js';
3
+ import type { HandlerName } from './types.js';
4
4
  export interface ExtensionTraceData {
5
5
  extensionTrackData: readonly Types.Extensions.ExtensionTrackData[];
6
6
  extensionMarkers: readonly Types.Extensions.SyntheticExtensionMarker[];