@paulirish/trace_engine 0.0.50 → 0.0.51
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.
- package/.tmp/tsbuildinfo/tsconfig.tsbuildinfo +1 -1
- package/core/platform/Constructor.d.ts +2 -2
- package/core/platform/Constructor.js.map +1 -1
- package/core/platform/StringUtilities.d.ts +2 -5
- package/core/platform/StringUtilities.js +0 -3
- package/core/platform/StringUtilities.js.map +1 -1
- package/core/platform/TypescriptUtilities.d.ts +1 -1
- package/core/platform/TypescriptUtilities.js +1 -1
- package/core/platform/TypescriptUtilities.js.map +1 -1
- package/core/platform/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
- package/core/platform/platform-tsconfig.json +2 -3
- package/core/platform/platform.d.ts +1 -2
- package/core/platform/platform.js +1 -2
- package/core/platform/platform.js.map +1 -1
- package/generated/protocol.d.ts +156 -31
- package/locales/af.json +63 -3
- package/locales/am.json +63 -3
- package/locales/ar.json +63 -3
- package/locales/as.json +63 -3
- package/locales/az.json +63 -3
- package/locales/be.json +64 -4
- package/locales/bg.json +62 -2
- package/locales/bn.json +63 -3
- package/locales/bs.json +63 -3
- package/locales/ca.json +62 -2
- package/locales/cs.json +62 -2
- package/locales/cy.json +63 -3
- package/locales/da.json +63 -3
- package/locales/de.json +63 -3
- package/locales/el.json +62 -2
- package/locales/en-GB.json +63 -3
- package/locales/en-US.json +55 -22
- package/locales/en-XL.json +55 -22
- package/locales/es-419.json +63 -3
- package/locales/es.json +64 -4
- package/locales/et.json +64 -4
- package/locales/eu.json +79 -19
- package/locales/fa.json +62 -2
- package/locales/fi.json +63 -3
- package/locales/fil.json +63 -3
- package/locales/fr-CA.json +63 -3
- package/locales/fr.json +63 -3
- package/locales/gl.json +62 -2
- package/locales/gu.json +63 -3
- package/locales/he.json +63 -3
- package/locales/hi.json +62 -2
- package/locales/hr.json +63 -3
- package/locales/hu.json +62 -2
- package/locales/hy.json +63 -3
- package/locales/id.json +62 -2
- package/locales/is.json +64 -4
- package/locales/it.json +64 -4
- package/locales/ja.json +63 -3
- package/locales/ka.json +63 -3
- package/locales/kk.json +62 -2
- package/locales/km.json +62 -2
- package/locales/kn.json +63 -3
- package/locales/ko.json +63 -3
- package/locales/ky.json +63 -3
- package/locales/lo.json +63 -3
- package/locales/lt.json +62 -2
- package/locales/lv.json +62 -2
- package/locales/mk.json +62 -2
- package/locales/ml.json +63 -3
- package/locales/mn.json +63 -3
- package/locales/mr.json +64 -4
- package/locales/ms.json +63 -3
- package/locales/my.json +63 -3
- package/locales/ne.json +64 -4
- package/locales/nl.json +63 -3
- package/locales/no.json +62 -2
- package/locales/or.json +63 -3
- package/locales/pa.json +62 -2
- package/locales/pl.json +62 -2
- package/locales/pt-PT.json +62 -2
- package/locales/pt.json +63 -3
- package/locales/ro.json +63 -3
- package/locales/ru.json +63 -3
- package/locales/si.json +63 -3
- package/locales/sk.json +63 -3
- package/locales/sl.json +62 -2
- package/locales/sq.json +63 -3
- package/locales/sr-Latn.json +62 -2
- package/locales/sr.json +62 -2
- package/locales/sv.json +62 -2
- package/locales/sw.json +63 -3
- package/locales/ta.json +66 -6
- package/locales/te.json +63 -3
- package/locales/th.json +63 -3
- package/locales/tr.json +63 -3
- package/locales/uk.json +63 -3
- package/locales/ur.json +64 -4
- package/locales/uz.json +62 -2
- package/locales/vi.json +62 -2
- package/locales/zh-HK.json +63 -3
- package/locales/zh-TW.json +63 -3
- package/locales/zh.json +62 -2
- package/locales/zu.json +63 -3
- package/models/cpu_profile/CPUProfileDataModel.d.ts +8 -0
- package/models/cpu_profile/CPUProfileDataModel.js.map +1 -1
- package/models/cpu_profile/cpu_profile-tsconfig.json +2 -2
- package/models/cpu_profile/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
- package/models/trace/Processor.d.ts +1 -1
- package/models/trace/Processor.js +94 -74
- package/models/trace/Processor.js.map +1 -1
- package/models/trace/TracingManager.js.map +1 -1
- package/models/trace/bundle-tsconfig.json +1 -1
- package/models/trace/devtools_entrypoint-bundle-typescript-tsconfig.json +20 -2
- package/models/trace/extras/ScriptDuplication.d.ts +11 -15
- package/models/trace/extras/ScriptDuplication.js +59 -77
- package/models/trace/extras/ScriptDuplication.js.map +1 -1
- package/models/trace/extras/ThirdParties.d.ts +6 -13
- package/models/trace/extras/ThirdParties.js +69 -133
- package/models/trace/extras/ThirdParties.js.map +1 -1
- package/models/trace/extras/TraceTree.d.ts +15 -3
- package/models/trace/extras/TraceTree.js +36 -8
- package/models/trace/extras/TraceTree.js.map +1 -1
- package/models/trace/extras/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
- package/models/trace/extras/extras-tsconfig.json +2 -2
- package/models/trace/extras/extras.d.ts +880 -787
- package/models/trace/extras/extras.js +880 -787
- package/models/trace/handlers/AsyncJSCallsHandler.js +36 -4
- package/models/trace/handlers/AsyncJSCallsHandler.js.map +1 -1
- package/models/trace/handlers/InvalidationsHandler.js +1 -0
- package/models/trace/handlers/InvalidationsHandler.js.map +1 -1
- package/models/trace/handlers/ModelHandlers.d.ts +0 -1
- package/models/trace/handlers/ModelHandlers.js +0 -1
- package/models/trace/handlers/ModelHandlers.js.map +1 -1
- package/models/trace/handlers/NetworkRequestsHandler.js +1 -1
- package/models/trace/handlers/NetworkRequestsHandler.js.map +1 -1
- package/models/trace/handlers/RendererHandler.d.ts +1 -1
- package/models/trace/handlers/RendererHandler.js +2 -2
- package/models/trace/handlers/RendererHandler.js.map +1 -1
- package/models/trace/handlers/ScreenshotsHandler.js +3 -1
- package/models/trace/handlers/ScreenshotsHandler.js.map +1 -1
- package/models/trace/handlers/ScriptsHandler.d.ts +12 -0
- package/models/trace/handlers/ScriptsHandler.js +93 -1
- package/models/trace/handlers/ScriptsHandler.js.map +1 -1
- package/models/trace/handlers/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
- package/models/trace/handlers/handlers-tsconfig.json +2 -3
- package/models/trace/helpers/Network.d.ts +5 -0
- package/models/trace/helpers/Network.js +17 -0
- package/models/trace/helpers/Network.js.map +1 -1
- package/models/trace/helpers/SamplesIntegrator.js +19 -23
- package/models/trace/helpers/SamplesIntegrator.js.map +1 -1
- package/models/trace/helpers/SyntheticEvents.d.ts +0 -1
- package/models/trace/helpers/SyntheticEvents.js +0 -4
- package/models/trace/helpers/SyntheticEvents.js.map +1 -1
- package/models/trace/helpers/Trace.d.ts +2 -1
- package/models/trace/helpers/Trace.js +101 -1
- package/models/trace/helpers/Trace.js.map +1 -1
- package/models/trace/helpers/TreeHelpers.d.ts +2 -5
- package/models/trace/helpers/TreeHelpers.js +0 -4
- package/models/trace/helpers/TreeHelpers.js.map +1 -1
- package/models/trace/helpers/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
- package/models/trace/helpers/helpers-tsconfig.json +2 -2
- package/models/trace/insights/{UseCache.d.ts → Cache.d.ts} +2 -2
- package/models/trace/insights/{UseCache.js → Cache.js} +11 -5
- package/models/trace/insights/Cache.js.map +1 -0
- package/models/trace/insights/Common.d.ts +21 -2
- package/models/trace/insights/Common.js +86 -2
- package/models/trace/insights/Common.js.map +1 -1
- package/models/trace/insights/DocumentLatency.js +2 -8
- package/models/trace/insights/DocumentLatency.js.map +1 -1
- package/models/trace/insights/DuplicatedJavaScript.d.ts +7 -4
- package/models/trace/insights/DuplicatedJavaScript.js +25 -5
- package/models/trace/insights/DuplicatedJavaScript.js.map +1 -1
- package/models/trace/insights/ForcedReflow.d.ts +5 -1
- package/models/trace/insights/ForcedReflow.js +6 -2
- package/models/trace/insights/ForcedReflow.js.map +1 -1
- package/models/trace/insights/InteractionToNextPaint.d.ts +1 -0
- package/models/trace/insights/InteractionToNextPaint.js +3 -0
- package/models/trace/insights/InteractionToNextPaint.js.map +1 -1
- package/models/trace/insights/LegacyJavaScript.d.ts +32 -0
- package/models/trace/insights/LegacyJavaScript.js +77 -0
- package/models/trace/insights/LegacyJavaScript.js.map +1 -0
- package/models/trace/insights/Models.d.ts +3 -1
- package/models/trace/insights/Models.js +3 -1
- package/models/trace/insights/Models.js.map +1 -1
- package/models/trace/insights/ModernHTTP.d.ts +51 -0
- package/models/trace/insights/ModernHTTP.js +187 -0
- package/models/trace/insights/ModernHTTP.js.map +1 -0
- package/models/trace/insights/NetworkDependencyTree.js +1 -1
- package/models/trace/insights/NetworkDependencyTree.js.map +1 -1
- package/models/trace/insights/ThirdParties.d.ts +1 -5
- package/models/trace/insights/ThirdParties.js +8 -21
- package/models/trace/insights/ThirdParties.js.map +1 -1
- package/models/trace/insights/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
- package/models/trace/insights/insights-tsconfig.json +8 -3
- package/models/trace/insights/types.d.ts +1 -0
- package/models/trace/insights/types.js.map +1 -1
- package/models/trace/lantern/core/core-tsconfig.json +2 -2
- package/models/trace/lantern/core/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
- package/models/trace/lantern/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
- package/models/trace/lantern/graph/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
- package/models/trace/lantern/graph/graph-tsconfig.json +2 -2
- package/models/trace/lantern/lantern-tsconfig.json +2 -2
- package/models/trace/lantern/metrics/Metric.d.ts +4 -4
- package/models/trace/lantern/metrics/Metric.js +4 -6
- package/models/trace/lantern/metrics/Metric.js.map +1 -1
- package/models/trace/lantern/metrics/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
- package/models/trace/lantern/metrics/metrics-tsconfig.json +2 -2
- package/models/trace/lantern/simulation/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
- package/models/trace/lantern/simulation/simulation-tsconfig.json +2 -2
- package/models/trace/lantern/types/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
- package/models/trace/lantern/types/types-tsconfig.json +2 -2
- package/models/trace/trace-tsconfig.json +2 -2
- package/models/trace/types/Configuration.d.ts +2 -0
- package/models/trace/types/Configuration.js.map +1 -1
- package/models/trace/types/TraceEvents.d.ts +28 -50
- package/models/trace/types/TraceEvents.js +8 -23
- package/models/trace/types/TraceEvents.js.map +1 -1
- package/models/trace/types/devtools_entrypoint-bundle-typescript-tsconfig.json +2 -2
- package/models/trace/types/types-tsconfig.json +2 -2
- package/package.json +3 -2
- package/test/test-trace-engine.mjs +19 -17
- package/third_party/legacy-javascript/legacy-javascript.d.ts +1 -0
- package/third_party/legacy-javascript/legacy-javascript.js +1 -0
- package/core/platform/ServerTiming.d.ts +0 -31
- package/core/platform/ServerTiming.js +0 -212
- package/core/platform/ServerTiming.js.map +0 -1
- package/models/trace/handlers/ServerTimingsHandler.d.ts +0 -9
- package/models/trace/handlers/ServerTimingsHandler.js +0 -106
- package/models/trace/handlers/ServerTimingsHandler.js.map +0 -1
- package/models/trace/insights/UseCache.js.map +0 -1
|
@@ -283,10 +283,11 @@ export class BottomUpRootNode extends Node {
|
|
|
283
283
|
filter;
|
|
284
284
|
startTime;
|
|
285
285
|
endTime;
|
|
286
|
-
eventGroupIdCallback;
|
|
287
286
|
totalTime;
|
|
287
|
+
eventGroupIdCallback;
|
|
288
288
|
calculateTransferSize;
|
|
289
|
-
|
|
289
|
+
forceGroupIdCallback;
|
|
290
|
+
constructor(events, { textFilter, filters, startTime, endTime, eventGroupIdCallback, calculateTransferSize, forceGroupIdCallback, }) {
|
|
290
291
|
super('', events[0]);
|
|
291
292
|
this.childrenInternal = null;
|
|
292
293
|
this.events = events;
|
|
@@ -297,6 +298,7 @@ export class BottomUpRootNode extends Node {
|
|
|
297
298
|
this.eventGroupIdCallback = eventGroupIdCallback;
|
|
298
299
|
this.totalTime = endTime - startTime;
|
|
299
300
|
this.calculateTransferSize = calculateTransferSize;
|
|
301
|
+
this.forceGroupIdCallback = forceGroupIdCallback;
|
|
300
302
|
}
|
|
301
303
|
hasChildren() {
|
|
302
304
|
return true;
|
|
@@ -320,7 +322,7 @@ export class BottomUpRootNode extends Node {
|
|
|
320
322
|
// If no grouping is applied, the nodes returned here are what's initially shown in the bottom-up view.
|
|
321
323
|
// "No grouping" == no grouping in UI dropdown == no groupingFunction…
|
|
322
324
|
// … HOWEVER, nodes are still aggregated via `generateEventID`, which is ~= the event name.
|
|
323
|
-
|
|
325
|
+
ungroupedTopNodes() {
|
|
324
326
|
const root = this;
|
|
325
327
|
const startTime = this.startTime;
|
|
326
328
|
const endTime = this.endTime;
|
|
@@ -328,10 +330,16 @@ export class BottomUpRootNode extends Node {
|
|
|
328
330
|
const selfTimeStack = [endTime - startTime];
|
|
329
331
|
const firstNodeStack = [];
|
|
330
332
|
const totalTimeById = new Map();
|
|
333
|
+
// TODO(paulirish): rename to getGroupNodeId
|
|
334
|
+
const eventGroupIdCallback = this.eventGroupIdCallback;
|
|
335
|
+
const forceGroupIdCallback = this.forceGroupIdCallback;
|
|
331
336
|
// encodedDataLength is provided solely on instant events.
|
|
332
337
|
const sumTransferSizeOfInstantEvent = (e) => {
|
|
333
338
|
if (Types.Events.isReceivedDataEvent(e)) {
|
|
334
|
-
|
|
339
|
+
let id = generateEventID(e);
|
|
340
|
+
if (this.forceGroupIdCallback && this.eventGroupIdCallback) {
|
|
341
|
+
id = `${id}-${this.eventGroupIdCallback(e)}`;
|
|
342
|
+
}
|
|
335
343
|
let node = nodeById.get(id);
|
|
336
344
|
if (!node) {
|
|
337
345
|
node = new BottomUpNode(root, id, e, false, root);
|
|
@@ -340,7 +348,20 @@ export class BottomUpRootNode extends Node {
|
|
|
340
348
|
else {
|
|
341
349
|
node.events.push(e);
|
|
342
350
|
}
|
|
343
|
-
|
|
351
|
+
// ResourceReceivedData events tally up the transfer size over time, but the
|
|
352
|
+
// ResourceReceiveResponse / ResourceFinish events hold the final result.
|
|
353
|
+
if (e.name === 'ResourceReceivedData') {
|
|
354
|
+
node.transferSize += e.args.data.encodedDataLength;
|
|
355
|
+
}
|
|
356
|
+
else if (e.args.data.encodedDataLength > 0) {
|
|
357
|
+
// For some reason, ResourceFinish can be zero even if data was sent.
|
|
358
|
+
// Ignore that case.
|
|
359
|
+
// Note: this will count the entire resource size if just the last bit of a
|
|
360
|
+
// request is in view. If it isn't in view, the transfer size is counted
|
|
361
|
+
// gradually, in proportion with the ResourceReceivedData events in the
|
|
362
|
+
// current view.
|
|
363
|
+
node.transferSize = e.args.data.encodedDataLength;
|
|
364
|
+
}
|
|
344
365
|
}
|
|
345
366
|
};
|
|
346
367
|
Helpers.Trace.forEachEvent(this.events, {
|
|
@@ -358,7 +379,10 @@ export class BottomUpRootNode extends Node {
|
|
|
358
379
|
const duration = actualEndTime - Math.max(currentStartTime, startTime);
|
|
359
380
|
selfTimeStack[selfTimeStack.length - 1] -= duration;
|
|
360
381
|
selfTimeStack.push(duration);
|
|
361
|
-
|
|
382
|
+
let id = generateEventID(e);
|
|
383
|
+
if (forceGroupIdCallback && eventGroupIdCallback) {
|
|
384
|
+
id = `${id}-${eventGroupIdCallback(e)}`;
|
|
385
|
+
}
|
|
362
386
|
const noNodeOnStack = !totalTimeById.has(id);
|
|
363
387
|
if (noNodeOnStack) {
|
|
364
388
|
totalTimeById.set(id, duration);
|
|
@@ -366,7 +390,10 @@ export class BottomUpRootNode extends Node {
|
|
|
366
390
|
firstNodeStack.push(noNodeOnStack);
|
|
367
391
|
}
|
|
368
392
|
function onEndEvent(event) {
|
|
369
|
-
|
|
393
|
+
let id = generateEventID(event);
|
|
394
|
+
if (forceGroupIdCallback && eventGroupIdCallback) {
|
|
395
|
+
id = `${id}-${eventGroupIdCallback(event)}`;
|
|
396
|
+
}
|
|
370
397
|
let node = nodeById.get(id);
|
|
371
398
|
if (!node) {
|
|
372
399
|
node = new BottomUpNode(root, id, event, false, root);
|
|
@@ -394,7 +421,7 @@ export class BottomUpRootNode extends Node {
|
|
|
394
421
|
return nodeById;
|
|
395
422
|
}
|
|
396
423
|
grouppedTopNodes() {
|
|
397
|
-
const flatNodes = this.
|
|
424
|
+
const flatNodes = this.ungroupedTopNodes();
|
|
398
425
|
if (!this.eventGroupIdCallback) {
|
|
399
426
|
return flatNodes;
|
|
400
427
|
}
|
|
@@ -544,6 +571,7 @@ export function eventStackFrame(event) {
|
|
|
544
571
|
}
|
|
545
572
|
return { ...topFrame, scriptId: String(topFrame.scriptId) };
|
|
546
573
|
}
|
|
574
|
+
// TODO(paulirish): rename to generateNodeId
|
|
547
575
|
export function generateEventID(event) {
|
|
548
576
|
if (Types.Events.isProfileCall(event)) {
|
|
549
577
|
const name = SamplesIntegrator.isNativeRuntimeFrame(event.callFrame) ?
|
|
@@ -1 +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 {SamplesIntegrator} from '../helpers/SamplesIntegrator.js';\nimport * as Types from '../types/types.js';\n\nimport type {TraceFilter} from './TraceFilter.js';\n\nexport class Node {\n totalTime: number;\n selfTime: number;\n transferSize: number;\n id: string|symbol;\n /** The first trace event encountered that necessitated the creation of this tree node. */\n event: Types.Events.Event;\n /** All of the trace events associated with this aggregate node.\n * Minor: In the case of Event Log (EventsTimelineTreeView), the node is not aggregate and this will only hold 1 event, the same that's in this.event\n */\n events: Types.Events.Event[];\n parent!: Node|null;\n groupId: string;\n isGroupNodeInternal: boolean;\n depth: number;\n\n constructor(id: string|symbol, event: Types.Events.Event) {\n this.totalTime = 0;\n this.selfTime = 0;\n this.transferSize = 0;\n this.id = id;\n this.event = event;\n this.events = [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 new Error('Not implemented');\n }\n\n setHasChildren(_value: boolean): void {\n throw new Error('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 new Error('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, parent: TopDownNode|null) {\n super(id, event);\n this.root = parent?.root ?? null;\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));\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.milliToMicro(startTime),\n endTime: Helpers.Timing.milliToMicro(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 } else {\n node.events.push(e);\n }\n node.selfTime += duration;\n node.totalTime += duration;\n if (Types.Events.isReceivedDataEvent(e)) {\n node.transferSize += e.args.data.encodedDataLength;\n }\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 readonly startTime: Types.Timing.Milli;\n readonly endTime: Types.Timing.Milli;\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[],\n {filters, startTime, endTime, doNotAggregate, eventGroupIdCallback, includeInstantEvents}: {\n filters: TraceFilter[],\n startTime: Types.Timing.Milli,\n endTime: Types.Timing.Milli,\n doNotAggregate?: boolean,\n eventGroupIdCallback?: ((arg0: Types.Events.Event) => string)|null,\n includeInstantEvents?: boolean,\n }) {\n super('', events[0], null);\n this.event = events[0];\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 override children(): ChildrenCache {\n // FYI tree nodes are built lazily. https://codereview.chromium.org/2674283003\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 const groupId = this.eventGroupIdCallback(node.event);\n let groupNode = groupNodes.get(groupId);\n if (!groupNode) {\n groupNode = new GroupNode(groupId, this, node.events);\n groupNodes.set(groupId, groupNode);\n } else {\n groupNode.events.push(...node.events);\n }\n groupNode.addChild(node as BottomUpNode, node.selfTime, node.totalTime, node.transferSize);\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 private textFilter: TraceFilter;\n readonly filter: (e: Types.Events.Event) => boolean;\n readonly startTime: Types.Timing.Milli;\n readonly endTime: Types.Timing.Milli;\n private eventGroupIdCallback: ((arg0: Types.Events.Event) => string)|null|undefined;\n override totalTime: number;\n private calculateTransferSize?: boolean;\n\n constructor(events: Types.Events.Event[], {\n textFilter,\n filters,\n startTime,\n endTime,\n eventGroupIdCallback,\n calculateTransferSize,\n }: {\n textFilter: TraceFilter,\n filters: readonly TraceFilter[],\n startTime: Types.Timing.Milli,\n endTime: Types.Timing.Milli,\n eventGroupIdCallback?: ((arg0: Types.Events.Event) => string)|null,\n calculateTransferSize?: boolean,\n }) {\n super('', events[0]);\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 this.calculateTransferSize = calculateTransferSize;\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));\n }\n }\n return children;\n }\n\n override children(): ChildrenCache {\n // FYI tree nodes are built lazily. https://codereview.chromium.org/2674283003\n if (!this.childrenInternal) {\n this.childrenInternal = this.filterChildren(this.grouppedTopNodes());\n }\n return this.childrenInternal;\n }\n\n // If no grouping is applied, the nodes returned here are what's initially shown in the bottom-up view.\n // \"No grouping\" == no grouping in UI dropdown == no groupingFunction…\n // … HOWEVER, nodes are still aggregated via `generateEventID`, which is ~= the event name.\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\n // encodedDataLength is provided solely on instant events.\n const sumTransferSizeOfInstantEvent = (e: Types.Events.Event): void => {\n if (Types.Events.isReceivedDataEvent(e)) {\n const id = generateEventID(e);\n let node = nodeById.get(id);\n if (!node) {\n node = new BottomUpNode(root, id, e, false, root);\n nodeById.set(id, node);\n } else {\n node.events.push(e);\n }\n node.transferSize += e.args.data.encodedDataLength;\n }\n };\n\n Helpers.Trace.forEachEvent(\n this.events,\n {\n onStartEvent,\n onEndEvent,\n onInstantEvent: this.calculateTransferSize ? sumTransferSizeOfInstantEvent : undefined,\n startTime: Helpers.Timing.milliToMicro(this.startTime),\n endTime: Helpers.Timing.milliToMicro(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 } else {\n node.events.push(event);\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 // Delete any nodes that have no selfTime (or transferSize, if it's being calculated)\n for (const pair of nodeById) {\n if (pair[1].selfTime <= 0 && (!this.calculateTransferSize || pair[1].transferSize <= 0)) {\n nodeById.delete((pair[0]));\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 const groupId = this.eventGroupIdCallback(node.event);\n let groupNode = groupNodes.get(groupId);\n if (!groupNode) {\n groupNode = new GroupNode(groupId, this, node.events);\n groupNodes.set(groupId, groupNode);\n } else {\n groupNode.events.push(...node.events);\n }\n groupNode.addChild(node as BottomUpNode, node.selfTime, node.selfTime, node.transferSize);\n }\n return groupNodes;\n }\n}\n\nexport class GroupNode extends Node {\n private readonly childrenInternal: ChildrenCache;\n override isGroupNodeInternal: boolean;\n override events: Types.Events.Event[];\n\n constructor(id: string, parent: BottomUpRootNode|TopDownRootNode, events: Types.Events.Event[]) {\n super(id, events[0]);\n this.events = events;\n this.childrenInternal = new Map();\n this.parent = parent;\n this.isGroupNodeInternal = true;\n }\n\n addChild(child: BottomUpNode, selfTime: number, totalTime: number, transferSize: number): void {\n this.childrenInternal.set(child.id, child);\n this.selfTime += selfTime;\n this.totalTime += totalTime;\n this.transferSize += transferSize;\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.milliToMicro(startTime),\n endTime: Helpers.Timing.milliToMicro(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 } else {\n node.events.push(e);\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 = SamplesIntegrator.isNativeRuntimeFrame(event.callFrame) ?\n SamplesIntegrator.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.isConsoleTimeStamp(event) && event.args.data) {\n return `${event.name}:${event.args.data.name}`;\n }\n if (Types.Events.isSyntheticNetworkRequest(event) || Types.Events.isReceivedDataEvent(event)) {\n return `req:${event.args.data.requestId}`;\n }\n\n return event.name;\n}\n\nexport type ChildrenCache = Map<string|symbol, Node>;\n"]}
|
|
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 {SamplesIntegrator} from '../helpers/SamplesIntegrator.js';\nimport * as Types from '../types/types.js';\n\nimport type {TraceFilter} from './TraceFilter.js';\n\nexport class Node {\n totalTime: number;\n selfTime: number;\n transferSize: number;\n id: string|symbol;\n /** The first trace event encountered that necessitated the creation of this tree node. */\n event: Types.Events.Event;\n /** All of the trace events associated with this aggregate node.\n * Minor: In the case of Event Log (EventsTimelineTreeView), the node is not aggregate and this will only hold 1 event, the same that's in this.event\n */\n events: Types.Events.Event[];\n parent!: Node|null;\n groupId: string;\n isGroupNodeInternal: boolean;\n depth: number;\n\n constructor(id: string|symbol, event: Types.Events.Event) {\n this.totalTime = 0;\n this.selfTime = 0;\n this.transferSize = 0;\n this.id = id;\n this.event = event;\n this.events = [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 new Error('Not implemented');\n }\n\n setHasChildren(_value: boolean): void {\n throw new Error('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 new Error('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, parent: TopDownNode|null) {\n super(id, event);\n this.root = parent?.root ?? null;\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; node.parent && !node.isGroupNode(); node = node.parent) {\n path.push((node));\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.milliToMicro(startTime),\n endTime: Helpers.Timing.milliToMicro(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 } else {\n node.events.push(e);\n }\n node.selfTime += duration;\n node.totalTime += duration;\n if (Types.Events.isReceivedDataEvent(e)) {\n node.transferSize += e.args.data.encodedDataLength;\n }\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 readonly startTime: Types.Timing.Milli;\n readonly endTime: Types.Timing.Milli;\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[],\n {filters, startTime, endTime, doNotAggregate, eventGroupIdCallback, includeInstantEvents}: {\n filters: TraceFilter[],\n startTime: Types.Timing.Milli,\n endTime: Types.Timing.Milli,\n doNotAggregate?: boolean,\n eventGroupIdCallback?: ((arg0: Types.Events.Event) => string)|null,\n includeInstantEvents?: boolean,\n }) {\n super('', events[0], null);\n this.event = events[0];\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 override children(): ChildrenCache {\n // FYI tree nodes are built lazily. https://codereview.chromium.org/2674283003\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 const groupId = this.eventGroupIdCallback(node.event);\n let groupNode = groupNodes.get(groupId);\n if (!groupNode) {\n groupNode = new GroupNode(groupId, this, node.events);\n groupNodes.set(groupId, groupNode);\n } else {\n groupNode.events.push(...node.events);\n }\n groupNode.addChild(node as BottomUpNode, node.selfTime, node.totalTime, node.transferSize);\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 private textFilter: TraceFilter;\n readonly filter: (e: Types.Events.Event) => boolean;\n readonly startTime: Types.Timing.Milli;\n readonly endTime: Types.Timing.Milli;\n override totalTime: number;\n eventGroupIdCallback: ((arg0: Types.Events.Event) => string)|null|undefined;\n private calculateTransferSize?: boolean;\n private forceGroupIdCallback?: boolean;\n\n constructor(events: Types.Events.Event[], {\n textFilter,\n filters,\n startTime,\n endTime,\n eventGroupIdCallback,\n calculateTransferSize,\n forceGroupIdCallback,\n }: {\n textFilter: TraceFilter,\n filters: readonly TraceFilter[],\n startTime: Types.Timing.Milli,\n endTime: Types.Timing.Milli,\n eventGroupIdCallback?: ((arg0: Types.Events.Event) => string)|null,\n calculateTransferSize?: boolean,\n /**\n * This forces using `eventGroupIdCallback` in combination with generateEventID\n * to generate the ID of the node.\n *\n * This is used in the ThirdPartyTreeView and BottomUpTreeView, where we want to group all events\n * related to a specific 3P entity together, regardless of the specific event name/type.\n * There are cases where events under the same event name belong to different entities. But, because\n * they get grouped first by event name/type, it throws off the 3P groupBy - grouping events of different\n * 3P entities together.\n */\n forceGroupIdCallback?: boolean,\n }) {\n super('', events[0]);\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 this.calculateTransferSize = calculateTransferSize;\n this.forceGroupIdCallback = forceGroupIdCallback;\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));\n }\n }\n return children;\n }\n\n override children(): ChildrenCache {\n // FYI tree nodes are built lazily. https://codereview.chromium.org/2674283003\n if (!this.childrenInternal) {\n this.childrenInternal = this.filterChildren(this.grouppedTopNodes());\n }\n return this.childrenInternal;\n }\n\n // If no grouping is applied, the nodes returned here are what's initially shown in the bottom-up view.\n // \"No grouping\" == no grouping in UI dropdown == no groupingFunction…\n // … HOWEVER, nodes are still aggregated via `generateEventID`, which is ~= the event name.\n private ungroupedTopNodes(): 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 // TODO(paulirish): rename to getGroupNodeId\n const eventGroupIdCallback = this.eventGroupIdCallback;\n const forceGroupIdCallback = this.forceGroupIdCallback;\n\n // encodedDataLength is provided solely on instant events.\n const sumTransferSizeOfInstantEvent = (e: Types.Events.Event): void => {\n if (Types.Events.isReceivedDataEvent(e)) {\n let id = generateEventID(e);\n if (this.forceGroupIdCallback && this.eventGroupIdCallback) {\n id = `${id}-${this.eventGroupIdCallback(e)}`;\n }\n let node = nodeById.get(id);\n if (!node) {\n node = new BottomUpNode(root, id, e, false, root);\n nodeById.set(id, node);\n } else {\n node.events.push(e);\n }\n\n // ResourceReceivedData events tally up the transfer size over time, but the\n // ResourceReceiveResponse / ResourceFinish events hold the final result.\n if (e.name === 'ResourceReceivedData') {\n node.transferSize += e.args.data.encodedDataLength;\n } else if (e.args.data.encodedDataLength > 0) {\n // For some reason, ResourceFinish can be zero even if data was sent.\n // Ignore that case.\n // Note: this will count the entire resource size if just the last bit of a\n // request is in view. If it isn't in view, the transfer size is counted\n // gradually, in proportion with the ResourceReceivedData events in the\n // current view.\n node.transferSize = e.args.data.encodedDataLength;\n }\n }\n };\n\n Helpers.Trace.forEachEvent(\n this.events,\n {\n onStartEvent,\n onEndEvent,\n onInstantEvent: this.calculateTransferSize ? sumTransferSizeOfInstantEvent : undefined,\n startTime: Helpers.Timing.milliToMicro(this.startTime),\n endTime: Helpers.Timing.milliToMicro(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 let id = generateEventID(e);\n if (forceGroupIdCallback && eventGroupIdCallback) {\n id = `${id}-${eventGroupIdCallback(e)}`;\n }\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 let id = generateEventID(event);\n if (forceGroupIdCallback && eventGroupIdCallback) {\n id = `${id}-${eventGroupIdCallback(event)}`;\n }\n let node = nodeById.get(id);\n if (!node) {\n node = new BottomUpNode(root, id, event, false, root);\n nodeById.set(id, node);\n } else {\n node.events.push(event);\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 // Delete any nodes that have no selfTime (or transferSize, if it's being calculated)\n for (const pair of nodeById) {\n if (pair[1].selfTime <= 0 && (!this.calculateTransferSize || pair[1].transferSize <= 0)) {\n nodeById.delete((pair[0]));\n }\n }\n return nodeById;\n }\n\n private grouppedTopNodes(): ChildrenCache {\n const flatNodes = this.ungroupedTopNodes();\n if (!this.eventGroupIdCallback) {\n return flatNodes;\n }\n const groupNodes = new Map<string, GroupNode>();\n for (const node of flatNodes.values()) {\n const groupId = this.eventGroupIdCallback(node.event);\n let groupNode = groupNodes.get(groupId);\n if (!groupNode) {\n groupNode = new GroupNode(groupId, this, node.events);\n groupNodes.set(groupId, groupNode);\n } else {\n groupNode.events.push(...node.events);\n }\n groupNode.addChild(node as BottomUpNode, node.selfTime, node.selfTime, node.transferSize);\n }\n return groupNodes;\n }\n}\n\nexport class GroupNode extends Node {\n private readonly childrenInternal: ChildrenCache;\n override isGroupNodeInternal: boolean;\n override events: Types.Events.Event[];\n\n constructor(id: string, parent: BottomUpRootNode|TopDownRootNode, events: Types.Events.Event[]) {\n super(id, events[0]);\n this.events = events;\n this.childrenInternal = new Map();\n this.parent = parent;\n this.isGroupNodeInternal = true;\n }\n\n addChild(child: BottomUpNode, selfTime: number, totalTime: number, transferSize: number): void {\n this.childrenInternal.set(child.id, child);\n this.selfTime += selfTime;\n this.totalTime += totalTime;\n this.transferSize += transferSize;\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.milliToMicro(startTime),\n endTime: Helpers.Timing.milliToMicro(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 } else {\n node.events.push(e);\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\n// TODO(paulirish): rename to generateNodeId\nexport function generateEventID(event: Types.Events.Event): string {\n if (Types.Events.isProfileCall(event)) {\n const name = SamplesIntegrator.isNativeRuntimeFrame(event.callFrame) ?\n SamplesIntegrator.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.isConsoleTimeStamp(event) && event.args.data) {\n return `${event.name}:${event.args.data.name}`;\n }\n if (Types.Events.isSyntheticNetworkRequest(event) || Types.Events.isReceivedDataEvent(event)) {\n return `req:${event.args.data.requestId}`;\n }\n\n return event.name;\n}\n\nexport type ChildrenCache = Map<string|symbol, Node>;\n"]}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"noImplicitOverride": true,
|
|
19
19
|
"noImplicitReturns": true,
|
|
20
20
|
"noUnusedLocals": false,
|
|
21
|
+
"noUnusedParameters": true,
|
|
21
22
|
"outDir": ".",
|
|
22
23
|
"rootDir": "../../../../../../../front_end/models/trace/extras",
|
|
23
24
|
"skipLibCheck": true,
|
|
@@ -32,8 +33,7 @@
|
|
|
32
33
|
"../../../../../../../front_end/models/trace/extras/extras.ts",
|
|
33
34
|
"../../../../../../../front_end/legacy/legacy-defs.d.ts",
|
|
34
35
|
"../../../../../../../front_end/global_typings/global_defs.d.ts",
|
|
35
|
-
"../../../../../../../node_modules/@types/filesystem/index.d.ts"
|
|
36
|
-
"../../../../../../../node_modules/@types/wicg-task-scheduling/index.d.ts"
|
|
36
|
+
"../../../../../../../node_modules/@types/filesystem/index.d.ts"
|
|
37
37
|
],
|
|
38
38
|
"references": [
|
|
39
39
|
{
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"noImplicitOverride": true,
|
|
19
19
|
"noImplicitReturns": true,
|
|
20
20
|
"noUnusedLocals": false,
|
|
21
|
+
"noUnusedParameters": true,
|
|
21
22
|
"outDir": ".",
|
|
22
23
|
"rootDir": "../../../../../../../front_end/models/trace/extras",
|
|
23
24
|
"skipLibCheck": true,
|
|
@@ -40,8 +41,7 @@
|
|
|
40
41
|
"../../../../../../../front_end/models/trace/extras/TraceTree.ts",
|
|
41
42
|
"../../../../../../../front_end/legacy/legacy-defs.d.ts",
|
|
42
43
|
"../../../../../../../front_end/global_typings/global_defs.d.ts",
|
|
43
|
-
"../../../../../../../node_modules/@types/filesystem/index.d.ts"
|
|
44
|
-
"../../../../../../../node_modules/@types/wicg-task-scheduling/index.d.ts"
|
|
44
|
+
"../../../../../../../node_modules/@types/filesystem/index.d.ts"
|
|
45
45
|
],
|
|
46
46
|
"references": [
|
|
47
47
|
{
|