@paulirish/trace_engine 0.0.43 → 0.0.45
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/ArrayUtilities.d.ts +1 -1
- package/core/platform/ArrayUtilities.js.map +1 -1
- package/core/platform/DOMUtilities.js +1 -1
- package/core/platform/DOMUtilities.js.map +1 -1
- package/core/platform/MimeType.js.map +1 -1
- package/core/platform/NumberUtilities.js.map +1 -1
- package/core/platform/ServerTiming.d.ts +2 -2
- package/core/platform/ServerTiming.js.map +1 -1
- package/core/platform/StringUtilities.js +1 -1
- package/core/platform/StringUtilities.js.map +1 -1
- package/core/platform/Timing.d.ts +0 -1
- package/core/platform/Timing.js +0 -3
- package/core/platform/Timing.js.map +1 -1
- package/core/platform/TypedArrayUtilities.js +3 -2
- package/core/platform/TypedArrayUtilities.js.map +1 -1
- package/generated/protocol.d.ts +71 -4
- package/locales/af.json +184 -1
- package/locales/am.json +184 -1
- package/locales/ar.json +184 -1
- package/locales/as.json +184 -1
- package/locales/az.json +184 -1
- package/locales/be.json +184 -1
- package/locales/bg.json +184 -1
- package/locales/bn.json +184 -1
- package/locales/bs.json +184 -1
- package/locales/ca.json +184 -1
- package/locales/cs.json +184 -1
- package/locales/cy.json +184 -1
- package/locales/da.json +184 -1
- package/locales/de.json +184 -1
- package/locales/el.json +184 -1
- package/locales/en-GB.json +184 -1
- package/locales/en-US.json +206 -17
- package/locales/en-XL.json +206 -17
- package/locales/es-419.json +184 -1
- package/locales/es.json +184 -1
- package/locales/et.json +184 -1
- package/locales/eu.json +184 -1
- package/locales/fa.json +184 -1
- package/locales/fi.json +184 -1
- package/locales/fil.json +184 -1
- package/locales/fr-CA.json +184 -1
- package/locales/fr.json +184 -1
- package/locales/gl.json +184 -1
- package/locales/gu.json +184 -1
- package/locales/he.json +185 -2
- package/locales/hi.json +184 -1
- package/locales/hr.json +184 -1
- package/locales/hu.json +184 -1
- package/locales/hy.json +184 -1
- package/locales/id.json +184 -1
- package/locales/is.json +184 -1
- package/locales/it.json +184 -1
- package/locales/ja.json +184 -1
- package/locales/ka.json +184 -1
- package/locales/kk.json +184 -1
- package/locales/km.json +184 -1
- package/locales/kn.json +184 -1
- package/locales/ko.json +184 -1
- package/locales/ky.json +184 -1
- package/locales/lo.json +184 -1
- package/locales/lt.json +184 -1
- package/locales/lv.json +184 -1
- package/locales/mk.json +184 -1
- package/locales/ml.json +184 -1
- package/locales/mn.json +184 -1
- package/locales/mr.json +184 -1
- package/locales/ms.json +184 -1
- package/locales/my.json +184 -1
- package/locales/ne.json +184 -1
- package/locales/nl.json +184 -1
- package/locales/no.json +184 -1
- package/locales/or.json +184 -1
- package/locales/pa.json +184 -1
- package/locales/pl.json +184 -1
- package/locales/pt-PT.json +184 -1
- package/locales/pt.json +184 -1
- package/locales/ro.json +184 -1
- package/locales/ru.json +184 -1
- package/locales/si.json +184 -1
- package/locales/sk.json +184 -1
- package/locales/sl.json +184 -1
- package/locales/sq.json +184 -1
- package/locales/sr-Latn.json +184 -1
- package/locales/sr.json +184 -1
- package/locales/sv.json +184 -1
- package/locales/sw.json +184 -1
- package/locales/ta.json +184 -1
- package/locales/te.json +184 -1
- package/locales/th.json +184 -1
- package/locales/tr.json +184 -1
- package/locales/uk.json +184 -1
- package/locales/ur.json +184 -1
- package/locales/uz.json +184 -1
- package/locales/vi.json +184 -1
- package/locales/zh-HK.json +184 -1
- package/locales/zh-TW.json +184 -1
- package/locales/zh.json +184 -1
- package/locales/zu.json +184 -1
- package/models/cpu_profile/CPUProfileDataModel.js +10 -10
- package/models/cpu_profile/CPUProfileDataModel.js.map +1 -1
- package/models/trace/LanternComputationData.js.map +1 -1
- package/models/trace/ModelImpl.d.ts +1 -1
- package/models/trace/ModelImpl.js +1 -3
- package/models/trace/ModelImpl.js.map +1 -1
- package/models/trace/Processor.js +16 -11
- package/models/trace/Processor.js.map +1 -1
- package/models/trace/extras/FetchNodes.d.ts +1 -1
- package/models/trace/extras/FetchNodes.js +3 -3
- package/models/trace/extras/FetchNodes.js.map +1 -1
- package/models/trace/extras/ScriptDuplication.d.ts +34 -0
- package/models/trace/extras/ScriptDuplication.js +178 -0
- package/models/trace/extras/ScriptDuplication.js.map +1 -0
- package/models/trace/extras/StackTraceForEvent.js +25 -44
- package/models/trace/extras/StackTraceForEvent.js.map +1 -1
- package/models/trace/extras/ThirdParties.d.ts +2 -1
- package/models/trace/extras/ThirdParties.js +27 -7
- package/models/trace/extras/ThirdParties.js.map +1 -1
- package/models/trace/extras/TraceTree.d.ts +5 -2
- package/models/trace/extras/TraceTree.js +47 -17
- package/models/trace/extras/TraceTree.js.map +1 -1
- package/models/trace/extras/extras-tsconfig.json +1 -1
- package/models/trace/extras/extras.d.ts +1 -0
- package/models/trace/extras/extras.js +1 -0
- package/models/trace/extras/extras.js.map +1 -1
- package/models/trace/handlers/AnimationFramesHandler.js.map +1 -1
- package/models/trace/handlers/AsyncJSCallsHandler.js.map +1 -1
- package/models/trace/handlers/AuctionWorkletsHandler.js.map +1 -1
- package/models/trace/handlers/ExtensionTraceDataHandler.d.ts +1 -1
- package/models/trace/handlers/ExtensionTraceDataHandler.js +2 -1
- package/models/trace/handlers/ExtensionTraceDataHandler.js.map +1 -1
- package/models/trace/handlers/FramesHandler.js.map +1 -1
- package/models/trace/handlers/ImagePaintingHandler.js +1 -1
- package/models/trace/handlers/ImagePaintingHandler.js.map +1 -1
- package/models/trace/handlers/InitiatorsHandler.js +0 -46
- package/models/trace/handlers/InitiatorsHandler.js.map +1 -1
- package/models/trace/handlers/InvalidationsHandler.js.map +1 -1
- package/models/trace/handlers/LayoutShiftsHandler.js.map +1 -1
- package/models/trace/handlers/MetaHandler.d.ts +2 -2
- package/models/trace/handlers/MetaHandler.js +4 -6
- package/models/trace/handlers/MetaHandler.js.map +1 -1
- package/models/trace/handlers/ModelHandlers.d.ts +1 -0
- package/models/trace/handlers/ModelHandlers.js +1 -0
- package/models/trace/handlers/ModelHandlers.js.map +1 -1
- package/models/trace/handlers/NetworkRequestsHandler.d.ts +9 -0
- package/models/trace/handlers/NetworkRequestsHandler.js +6 -6
- package/models/trace/handlers/NetworkRequestsHandler.js.map +1 -1
- package/models/trace/handlers/PageLoadMetricsHandler.js +1 -1
- package/models/trace/handlers/PageLoadMetricsHandler.js.map +1 -1
- package/models/trace/handlers/RendererHandler.js +3 -4
- package/models/trace/handlers/RendererHandler.js.map +1 -1
- package/models/trace/handlers/ScriptsHandler.d.ts +22 -0
- package/models/trace/handlers/ScriptsHandler.js +116 -0
- package/models/trace/handlers/ScriptsHandler.js.map +1 -0
- package/models/trace/handlers/UserTimingsHandler.d.ts +5 -0
- package/models/trace/handlers/UserTimingsHandler.js +16 -0
- package/models/trace/handlers/UserTimingsHandler.js.map +1 -1
- package/models/trace/handlers/WorkersHandler.js.map +1 -1
- package/models/trace/handlers/handlers-tsconfig.json +1 -0
- package/models/trace/handlers/helpers.d.ts +5 -1
- package/models/trace/handlers/helpers.js +28 -4
- package/models/trace/handlers/helpers.js.map +1 -1
- package/models/trace/helpers/Network.d.ts +1 -0
- package/models/trace/helpers/Network.js +8 -3
- package/models/trace/helpers/Network.js.map +1 -1
- package/models/trace/helpers/SamplesIntegrator.d.ts +8 -1
- package/models/trace/helpers/SamplesIntegrator.js +42 -2
- package/models/trace/helpers/SamplesIntegrator.js.map +1 -1
- package/models/trace/helpers/Timing.d.ts +0 -1
- package/models/trace/helpers/Timing.js +0 -7
- package/models/trace/helpers/Timing.js.map +1 -1
- package/models/trace/helpers/Trace.d.ts +7 -11
- package/models/trace/helpers/Trace.js +25 -13
- package/models/trace/helpers/Trace.js.map +1 -1
- package/models/trace/insights/CLSCulprits.d.ts +12 -12
- package/models/trace/insights/CLSCulprits.js +16 -5
- package/models/trace/insights/CLSCulprits.js.map +1 -1
- package/models/trace/insights/Common.d.ts +7 -1
- package/models/trace/insights/Common.js +9 -3
- package/models/trace/insights/Common.js.map +1 -1
- package/models/trace/insights/DOMSize.d.ts +8 -8
- package/models/trace/insights/DOMSize.js +3 -2
- package/models/trace/insights/DOMSize.js.map +1 -1
- package/models/trace/insights/DocumentLatency.d.ts +11 -11
- package/models/trace/insights/DocumentLatency.js +3 -2
- package/models/trace/insights/DocumentLatency.js.map +1 -1
- package/models/trace/insights/DuplicateJavaScript.d.ts +18 -0
- package/models/trace/insights/DuplicateJavaScript.js +49 -0
- package/models/trace/insights/DuplicateJavaScript.js.map +1 -0
- package/models/trace/insights/FontDisplay.d.ts +4 -4
- package/models/trace/insights/FontDisplay.js +3 -2
- package/models/trace/insights/FontDisplay.js.map +1 -1
- package/models/trace/insights/ForcedReflow.d.ts +5 -5
- package/models/trace/insights/ForcedReflow.js +5 -2
- package/models/trace/insights/ForcedReflow.js.map +1 -1
- package/models/trace/insights/ImageDelivery.d.ts +20 -15
- package/models/trace/insights/ImageDelivery.js +34 -21
- package/models/trace/insights/ImageDelivery.js.map +1 -1
- package/models/trace/insights/InteractionToNextPaint.d.ts +8 -8
- package/models/trace/insights/InteractionToNextPaint.js +4 -3
- package/models/trace/insights/InteractionToNextPaint.js.map +1 -1
- package/models/trace/insights/LCPDiscovery.d.ts +12 -8
- package/models/trace/insights/LCPDiscovery.js +17 -5
- package/models/trace/insights/LCPDiscovery.js.map +1 -1
- package/models/trace/insights/LCPPhases.d.ts +15 -10
- package/models/trace/insights/LCPPhases.js +12 -5
- package/models/trace/insights/LCPPhases.js.map +1 -1
- package/models/trace/insights/Models.d.ts +2 -1
- package/models/trace/insights/Models.js +2 -1
- package/models/trace/insights/Models.js.map +1 -1
- package/models/trace/insights/NetworkDependencyTree.d.ts +33 -0
- package/models/trace/insights/NetworkDependencyTree.js +141 -0
- package/models/trace/insights/NetworkDependencyTree.js.map +1 -0
- package/models/trace/insights/RenderBlocking.d.ts +5 -5
- package/models/trace/insights/RenderBlocking.js +3 -2
- package/models/trace/insights/RenderBlocking.js.map +1 -1
- package/models/trace/insights/SlowCSSSelector.d.ts +8 -8
- package/models/trace/insights/SlowCSSSelector.js +5 -3
- package/models/trace/insights/SlowCSSSelector.js.map +1 -1
- package/models/trace/insights/ThirdParties.d.ts +9 -7
- package/models/trace/insights/ThirdParties.js +13 -8
- package/models/trace/insights/ThirdParties.js.map +1 -1
- package/models/trace/insights/Viewport.d.ts +2 -2
- package/models/trace/insights/Viewport.js +3 -2
- package/models/trace/insights/Viewport.js.map +1 -1
- package/models/trace/insights/insights-tsconfig.json +2 -1
- package/models/trace/insights/types.d.ts +28 -6
- package/models/trace/insights/types.js.map +1 -1
- package/models/trace/lantern/core/NetworkAnalyzer.d.ts +2 -2
- package/models/trace/lantern/core/NetworkAnalyzer.js +2 -2
- package/models/trace/lantern/core/NetworkAnalyzer.js.map +1 -1
- package/models/trace/lantern/graph/BaseNode.d.ts +1 -1
- package/models/trace/lantern/graph/BaseNode.js +1 -0
- package/models/trace/lantern/graph/BaseNode.js.map +1 -1
- package/models/trace/lantern/graph/CPUNode.js +1 -1
- package/models/trace/lantern/graph/CPUNode.js.map +1 -1
- package/models/trace/lantern/graph/NetworkNode.js +1 -1
- package/models/trace/lantern/graph/NetworkNode.js.map +1 -1
- package/models/trace/lantern/graph/PageDependencyGraph.d.ts +2 -2
- package/models/trace/lantern/graph/PageDependencyGraph.js +1 -0
- package/models/trace/lantern/graph/PageDependencyGraph.js.map +1 -1
- package/models/trace/lantern/metrics/Metric.js.map +1 -1
- package/models/trace/lantern/metrics/TotalBlockingTime.d.ts +2 -2
- package/models/trace/lantern/metrics/TotalBlockingTime.js.map +1 -1
- package/models/trace/lantern/simulation/Simulator.js +1 -0
- package/models/trace/lantern/simulation/Simulator.js.map +1 -1
- package/models/trace/lantern/simulation/TCPConnection.d.ts +0 -1
- package/models/trace/lantern/simulation/TCPConnection.js +0 -3
- package/models/trace/lantern/simulation/TCPConnection.js.map +1 -1
- package/models/trace/lantern/types/Lantern.d.ts +2 -2
- package/models/trace/lantern/types/Lantern.js.map +1 -1
- package/models/trace/trace-tsconfig.json +3 -3
- package/models/trace/trace.d.ts +1 -2
- package/models/trace/trace.js +1 -2
- package/models/trace/trace.js.map +1 -1
- package/models/trace/types/Configuration.d.ts +10 -0
- package/models/trace/types/Configuration.js.map +1 -1
- package/models/trace/types/Extensions.d.ts +1 -2
- package/models/trace/types/Extensions.js +0 -3
- package/models/trace/types/Extensions.js.map +1 -1
- package/models/trace/types/TraceEvents.d.ts +87 -13
- package/models/trace/types/TraceEvents.js +20 -3
- package/models/trace/types/TraceEvents.js.map +1 -1
- package/package.json +1 -1
- package/test/test-trace-engine.mjs +3 -2
- package/models/trace/extras/TimelineJSProfile.d.ts +0 -13
- package/models/trace/extras/TimelineJSProfile.js +0 -60
- package/models/trace/extras/TimelineJSProfile.js.map +0 -1
- package/models/trace/insights/LongCriticalNetworkTree.d.ts +0 -22
- package/models/trace/insights/LongCriticalNetworkTree.js +0 -40
- package/models/trace/insights/LongCriticalNetworkTree.js.map +0 -1
- package/models/trace/root-causes/LayoutShift.d.ts +0 -125
- package/models/trace/root-causes/LayoutShift.js +0 -519
- package/models/trace/root-causes/LayoutShift.js.map +0 -1
- package/models/trace/root-causes/RootCauses.d.ts +0 -15
- package/models/trace/root-causes/RootCauses.js +0 -12
- package/models/trace/root-causes/RootCauses.js.map +0 -1
- package/models/trace/root-causes/bundle-tsconfig.json +0 -1
- package/models/trace/root-causes/devtools_entrypoint-bundle-typescript-tsconfig.json +0 -43
- package/models/trace/root-causes/root-causes-tsconfig.json +0 -56
- package/models/trace/root-causes/root-causes.d.ts +0 -1
- package/models/trace/root-causes/root-causes.js +0 -5
- package/models/trace/root-causes/root-causes.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThirdParties.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/extras/ThirdParties.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport * as ThirdPartyWeb from '../../../third_party/third-party-web/third-party-web.js';\nimport * as Handlers from '../handlers/handlers.js';\nimport * as Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\nexport type Entity = typeof ThirdPartyWeb.ThirdPartyWeb.entities[number];\n\nexport interface Summary {\n transferSize: number;\n mainThreadTime: Types.Timing.Micro;\n}\n\nexport interface ThirdPartySummary {\n byEntity: Map<Entity, Summary>;\n byEvent: Map<Types.Events.Event, Summary>;\n eventsByEntity: Map<Entity, Types.Events.Event[]>;\n madeUpEntityCache: Map<string, Entity>;\n}\n\nfunction getOrMakeSummary(thirdPartySummary: ThirdPartySummary, event: Types.Events.Event, url: string): Summary|null {\n const entity = ThirdPartyWeb.ThirdPartyWeb.getEntity(url) ??\n Handlers.Helpers.makeUpEntity(thirdPartySummary.madeUpEntityCache, url);\n if (!entity) {\n return null;\n }\n\n const events = thirdPartySummary.eventsByEntity.get(entity) ?? [];\n events.push(event);\n thirdPartySummary.eventsByEntity.set(entity, events);\n\n let summary = thirdPartySummary.byEntity.get(entity);\n if (summary) {\n thirdPartySummary.byEvent.set(event, summary);\n return summary;\n }\n\n summary = {transferSize: 0, mainThreadTime: Types.Timing.Micro(0)};\n thirdPartySummary.byEntity.set(entity, summary);\n thirdPartySummary.byEvent.set(event, summary);\n return summary;\n}\n\nfunction collectMainThreadActivity(\n thirdPartySummary: ThirdPartySummary, parsedTrace: Handlers.Types.ParsedTrace,\n bounds: Types.Timing.TraceWindowMicro): void {\n for (const process of parsedTrace.Renderer.processes.values()) {\n if (!process.isOnMainFrame) {\n continue;\n }\n\n for (const thread of process.threads.values()) {\n if (thread.name === 'CrRendererMain') {\n if (!thread.tree) {\n break;\n }\n\n for (const event of thread.entries) {\n if (!Helpers.Timing.eventIsInBounds(event, bounds)) {\n continue;\n }\n\n const node = parsedTrace.Renderer.entryToNode.get(event);\n if (!node || !node.selfTime) {\n continue;\n }\n\n const url = Handlers.Helpers.getNonResolvedURL(event, parsedTrace as Handlers.Types.ParsedTrace);\n if (!url) {\n continue;\n }\n\n const summary = getOrMakeSummary(thirdPartySummary, event, url);\n if (summary) {\n summary.mainThreadTime = (summary.mainThreadTime + node.selfTime) as Types.Timing.Micro;\n }\n }\n }\n }\n }\n}\n\nfunction collectNetworkActivity(\n thirdPartySummary: ThirdPartySummary, requests: Types.Events.SyntheticNetworkRequest[]): void {\n for (const request of requests) {\n const url = request.args.data.url;\n const summary = getOrMakeSummary(thirdPartySummary, request, url);\n if (summary) {\n summary.transferSize += request.args.data.encodedDataLength;\n }\n }\n}\n\n/**\n * @param networkRequests Won't be filtered by trace bounds, so callers should ensure it is filtered.\n */\nexport function summarizeThirdParties(\n parsedTrace: Handlers.Types.ParsedTrace, traceBounds: Types.Timing.TraceWindowMicro,\n networkRequests: Types.Events.SyntheticNetworkRequest[]): ThirdPartySummary {\n const thirdPartySummary: ThirdPartySummary = {\n byEntity: new Map(),\n byEvent: new Map(),\n eventsByEntity: new Map(),\n madeUpEntityCache: new Map(),\n };\n\n collectMainThreadActivity(thirdPartySummary, parsedTrace, traceBounds);\n collectNetworkActivity(thirdPartySummary, networkRequests);\n\n return thirdPartySummary;\n}\n\nfunction getSummaryMapWithMapping(\n events: Types.Events.Event[], entityByEvent: Map<Types.Events.Event, Handlers.Helpers.Entity>,\n eventsByEntity: Map<Handlers.Helpers.Entity, Types.Events.Event[]>): ThirdPartySummary {\n const byEvent = new Map<Types.Events.Event, Summary>();\n const byEntity = new Map<Handlers.Helpers.Entity, Summary>();\n const defaultSummary: Summary = {transferSize: 0, mainThreadTime: Types.Timing.Micro(0)};\n\n for (const event of events) {\n const urlSummary = byEvent.get(event) || {...defaultSummary};\n if (Types.Events.isSyntheticNetworkRequest(event)) {\n urlSummary.transferSize += event.args.data.encodedDataLength;\n }\n byEvent.set(event, urlSummary);\n }\n\n // Map each request's stat to a particular entity.\n for (const [request, requestSummary] of byEvent.entries()) {\n const entity = entityByEvent.get(request);\n if (!entity) {\n byEvent.delete(request);\n continue;\n }\n\n const entitySummary = byEntity.get(entity) || {...defaultSummary};\n entitySummary.transferSize += requestSummary.transferSize;\n byEntity.set(entity, entitySummary);\n }\n\n return {byEntity, byEvent, eventsByEntity, madeUpEntityCache: new Map()};\n}\n\n// TODO(crbug.com/352244718): Remove or refactor to use summarizeThirdParties/collectMainThreadActivity/etc.\n/**\n * Note: unlike summarizeThirdParties, this does not calculate mainThreadTime. The reason is that it is not\n * needed for its one use case, and when dragging the trace bounds it takes a long time to calculate.\n * If it is ever needed, we need to make getSelfTimeByUrl (see deleted code/blame) much faster (cache + bucket?).\n */\nexport function getSummariesAndEntitiesWithMapping(\n parsedTrace: Handlers.Types.ParsedTrace, traceBounds: Types.Timing.TraceWindowMicro,\n entityMapping: Handlers.Helpers.EntityMappings): {\n summaries: ThirdPartySummary,\n entityByEvent: Map<Types.Events.Event, Handlers.Helpers.Entity>,\n} {\n const entityByEvent = new Map(entityMapping.entityByEvent);\n const eventsByEntity = new Map(entityMapping.eventsByEntity);\n\n // Consider events only in bounds.\n const entityByEventArr = Array.from(entityByEvent.entries());\n const filteredEntries = entityByEventArr.filter(([event]) => {\n return Helpers.Timing.eventIsInBounds(event, traceBounds);\n });\n const entityByEventFiltered = new Map(filteredEntries);\n\n // Consider events only in bounds.\n const eventsByEntityArr = Array.from(eventsByEntity.entries());\n const filtered = eventsByEntityArr.filter(([, events]) => {\n events.map(event => {\n return Helpers.Timing.eventIsInBounds(event, traceBounds);\n });\n return events.length > 0;\n });\n const eventsByEntityFiltered = new Map(filtered);\n\n const allEvents = Array.from(entityByEvent.keys());\n const summaries = getSummaryMapWithMapping(allEvents, entityByEventFiltered, eventsByEntityFiltered);\n\n return {summaries, entityByEvent: entityByEventFiltered};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ThirdParties.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/extras/ThirdParties.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport * as ThirdPartyWeb from '../../../third_party/third-party-web/third-party-web.js';\nimport * as Handlers from '../handlers/handlers.js';\nimport * as Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\nexport type Entity = typeof ThirdPartyWeb.ThirdPartyWeb.entities[number];\n\nexport interface Summary {\n transferSize: number;\n mainThreadTime: Types.Timing.Micro;\n}\n\nexport interface ThirdPartySummary {\n byEntity: Map<Entity, Summary>;\n byUrl: Map<string, Summary>;\n urlsByEntity: Map<Entity, Set<string>>;\n eventsByEntity: Map<Entity, Types.Events.Event[]>;\n madeUpEntityCache: Map<string, Entity>;\n}\n\nfunction getOrMakeSummaryByEntity(\n thirdPartySummary: ThirdPartySummary, event: Types.Events.Event, url: string): Summary|null {\n const entity = ThirdPartyWeb.ThirdPartyWeb.getEntity(url) ??\n Handlers.Helpers.makeUpEntity(thirdPartySummary.madeUpEntityCache, url);\n if (!entity) {\n return null;\n }\n\n const urls = thirdPartySummary.urlsByEntity.get(entity) ?? new Set();\n urls.add(url);\n thirdPartySummary.urlsByEntity.set(entity, urls);\n\n const events = thirdPartySummary.eventsByEntity.get(entity) ?? [];\n events.push(event);\n thirdPartySummary.eventsByEntity.set(entity, events);\n\n let summary = thirdPartySummary.byEntity.get(entity);\n if (summary) {\n return summary;\n }\n\n summary = {transferSize: 0, mainThreadTime: Types.Timing.Micro(0)};\n thirdPartySummary.byEntity.set(entity, summary);\n return summary;\n}\n\nfunction getOrMakeSummaryByURL(thirdPartySummary: ThirdPartySummary, url: string): Summary|null {\n let summary = thirdPartySummary.byUrl.get(url);\n if (summary) {\n return summary;\n }\n\n summary = {transferSize: 0, mainThreadTime: Types.Timing.Micro(0)};\n thirdPartySummary.byUrl.set(url, summary);\n return summary;\n}\n\n// TODO: Remove and use the the BottomUpRootNode defined in ThirdPartyTreeView instead.\nfunction collectMainThreadActivity(\n thirdPartySummary: ThirdPartySummary, parsedTrace: Handlers.Types.ParsedTrace,\n bounds: Types.Timing.TraceWindowMicro): void {\n for (const process of parsedTrace.Renderer.processes.values()) {\n if (!process.isOnMainFrame) {\n continue;\n }\n\n for (const thread of process.threads.values()) {\n if (thread.name === 'CrRendererMain') {\n if (!thread.tree) {\n break;\n }\n\n for (const event of thread.entries) {\n if (!Helpers.Timing.eventIsInBounds(event, bounds)) {\n continue;\n }\n\n const node = parsedTrace.Renderer.entryToNode.get(event);\n if (!node || !node.selfTime) {\n continue;\n }\n\n const url = Handlers.Helpers.getNonResolvedURL(event, parsedTrace);\n if (!url) {\n continue;\n }\n\n let summary = getOrMakeSummaryByEntity(thirdPartySummary, event, url);\n if (summary) {\n summary.mainThreadTime = (summary.mainThreadTime + node.selfTime) as Types.Timing.Micro;\n }\n\n summary = getOrMakeSummaryByURL(thirdPartySummary, url);\n if (summary) {\n summary.mainThreadTime = (summary.mainThreadTime + node.selfTime) as Types.Timing.Micro;\n }\n }\n }\n }\n }\n}\n\nfunction collectNetworkActivity(\n thirdPartySummary: ThirdPartySummary, requests: Types.Events.SyntheticNetworkRequest[]): void {\n for (const request of requests) {\n const url = request.args.data.url;\n\n let summary = getOrMakeSummaryByEntity(thirdPartySummary, request, url);\n if (summary) {\n summary.transferSize += request.args.data.encodedDataLength;\n }\n\n summary = getOrMakeSummaryByURL(thirdPartySummary, url);\n if (summary) {\n summary.transferSize += request.args.data.encodedDataLength;\n }\n }\n}\n\n/**\n * @param networkRequests Won't be filtered by trace bounds, so callers should ensure it is filtered.\n */\nexport function summarizeThirdParties(\n parsedTrace: Handlers.Types.ParsedTrace, traceBounds: Types.Timing.TraceWindowMicro,\n networkRequests: Types.Events.SyntheticNetworkRequest[]): ThirdPartySummary {\n const thirdPartySummary: ThirdPartySummary = {\n byEntity: new Map(),\n byUrl: new Map(),\n urlsByEntity: new Map(),\n eventsByEntity: new Map(),\n madeUpEntityCache: new Map(),\n };\n\n collectMainThreadActivity(thirdPartySummary, parsedTrace, traceBounds);\n collectNetworkActivity(thirdPartySummary, networkRequests);\n\n return thirdPartySummary;\n}\n\nfunction getSummaryMapWithMapping(\n events: Types.Events.Event[], entityByEvent: Map<Types.Events.Event, Handlers.Helpers.Entity>,\n eventsByEntity: Map<Handlers.Helpers.Entity, Types.Events.Event[]>): ThirdPartySummary {\n const byEvent = new Map<Types.Events.Event, Summary>();\n const byEntity = new Map<Handlers.Helpers.Entity, Summary>();\n const defaultSummary: Summary = {transferSize: 0, mainThreadTime: Types.Timing.Micro(0)};\n\n for (const event of events) {\n const urlSummary = byEvent.get(event) || {...defaultSummary};\n if (Types.Events.isSyntheticNetworkRequest(event)) {\n urlSummary.transferSize += event.args.data.encodedDataLength;\n }\n byEvent.set(event, urlSummary);\n }\n\n // Map each request's stat to a particular entity.\n for (const [request, requestSummary] of byEvent.entries()) {\n const entity = entityByEvent.get(request);\n if (!entity) {\n byEvent.delete(request);\n continue;\n }\n\n const entitySummary = byEntity.get(entity) || {...defaultSummary};\n entitySummary.transferSize += requestSummary.transferSize;\n byEntity.set(entity, entitySummary);\n }\n\n return {byEntity, eventsByEntity, madeUpEntityCache: new Map(), byUrl: new Map(), urlsByEntity: new Map()};\n}\n\n// TODO(crbug.com/352244718): Remove or refactor to use summarizeThirdParties/collectMainThreadActivity/etc.\n/**\n * Note: unlike summarizeThirdParties, this does not calculate mainThreadTime. The reason is that it is not\n * needed for its one use case, and when dragging the trace bounds it takes a long time to calculate.\n * If it is ever needed, we need to make getSelfTimeByUrl (see deleted code/blame) much faster (cache + bucket?).\n */\nexport function getSummariesAndEntitiesWithMapping(\n parsedTrace: Handlers.Types.ParsedTrace, traceBounds: Types.Timing.TraceWindowMicro,\n entityMapping: Handlers.Helpers.EntityMappings): {\n summaries: ThirdPartySummary,\n entityByEvent: Map<Types.Events.Event, Handlers.Helpers.Entity>,\n} {\n const entityByEvent = new Map(entityMapping.entityByEvent);\n const eventsByEntity = new Map(entityMapping.eventsByEntity);\n\n // Consider events only in bounds.\n const entityByEventArr = Array.from(entityByEvent.entries());\n const filteredEntries = entityByEventArr.filter(([event]) => {\n return Helpers.Timing.eventIsInBounds(event, traceBounds);\n });\n const entityByEventFiltered = new Map(filteredEntries);\n\n // Consider events only in bounds.\n const eventsByEntityArr = Array.from(eventsByEntity.entries());\n const filtered = eventsByEntityArr.filter(([, events]) => {\n events.map(event => {\n return Helpers.Timing.eventIsInBounds(event, traceBounds);\n });\n return events.length > 0;\n });\n const eventsByEntityFiltered = new Map(filtered);\n\n const allEvents = Array.from(entityByEvent.keys());\n const summaries = getSummaryMapWithMapping(allEvents, entityByEventFiltered, eventsByEntityFiltered);\n\n return {summaries, entityByEvent: entityByEventFiltered};\n}\n"]}
|
|
@@ -4,6 +4,7 @@ import type { TraceFilter } from './TraceFilter.js';
|
|
|
4
4
|
export declare class Node {
|
|
5
5
|
totalTime: number;
|
|
6
6
|
selfTime: number;
|
|
7
|
+
transferSize: number;
|
|
7
8
|
id: string | symbol;
|
|
8
9
|
/** The first trace event encountered that necessitated the creation of this tree node. */
|
|
9
10
|
event: Types.Events.Event;
|
|
@@ -68,12 +69,14 @@ export declare class BottomUpRootNode extends Node {
|
|
|
68
69
|
readonly endTime: Types.Timing.Milli;
|
|
69
70
|
private eventGroupIdCallback;
|
|
70
71
|
totalTime: number;
|
|
71
|
-
|
|
72
|
+
private calculateTransferSize?;
|
|
73
|
+
constructor(events: Types.Events.Event[], { textFilter, filters, startTime, endTime, eventGroupIdCallback, calculateTransferSize, }: {
|
|
72
74
|
textFilter: TraceFilter;
|
|
73
75
|
filters: readonly TraceFilter[];
|
|
74
76
|
startTime: Types.Timing.Milli;
|
|
75
77
|
endTime: Types.Timing.Milli;
|
|
76
78
|
eventGroupIdCallback?: ((arg0: Types.Events.Event) => string) | null;
|
|
79
|
+
calculateTransferSize?: boolean;
|
|
77
80
|
});
|
|
78
81
|
hasChildren(): boolean;
|
|
79
82
|
filterChildren(children: ChildrenCache): ChildrenCache;
|
|
@@ -86,7 +89,7 @@ export declare class GroupNode extends Node {
|
|
|
86
89
|
isGroupNodeInternal: boolean;
|
|
87
90
|
events: Types.Events.Event[];
|
|
88
91
|
constructor(id: string, parent: BottomUpRootNode | TopDownRootNode, events: Types.Events.Event[]);
|
|
89
|
-
addChild(child: BottomUpNode, selfTime: number, totalTime: number): void;
|
|
92
|
+
addChild(child: BottomUpNode, selfTime: number, totalTime: number, transferSize: number): void;
|
|
90
93
|
hasChildren(): boolean;
|
|
91
94
|
children(): ChildrenCache;
|
|
92
95
|
}
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
// Use of this source code is governed by a BSD-style license that can be
|
|
3
3
|
// found in the LICENSE file.
|
|
4
4
|
import * as Helpers from '../helpers/helpers.js';
|
|
5
|
+
import { SamplesIntegrator } from '../helpers/SamplesIntegrator.js';
|
|
5
6
|
import * as Types from '../types/types.js';
|
|
6
|
-
import { TimelineJSProfileProcessor } from './TimelineJSProfile.js';
|
|
7
7
|
export class Node {
|
|
8
8
|
totalTime;
|
|
9
9
|
selfTime;
|
|
10
|
+
transferSize;
|
|
10
11
|
id;
|
|
11
12
|
/** The first trace event encountered that necessitated the creation of this tree node. */
|
|
12
13
|
event;
|
|
@@ -21,6 +22,7 @@ export class Node {
|
|
|
21
22
|
constructor(id, event) {
|
|
22
23
|
this.totalTime = 0;
|
|
23
24
|
this.selfTime = 0;
|
|
25
|
+
this.transferSize = 0;
|
|
24
26
|
this.id = id;
|
|
25
27
|
this.event = event;
|
|
26
28
|
this.events = [event];
|
|
@@ -32,17 +34,17 @@ export class Node {
|
|
|
32
34
|
return this.isGroupNodeInternal;
|
|
33
35
|
}
|
|
34
36
|
hasChildren() {
|
|
35
|
-
throw 'Not implemented';
|
|
37
|
+
throw new Error('Not implemented');
|
|
36
38
|
}
|
|
37
39
|
setHasChildren(_value) {
|
|
38
|
-
throw 'Not implemented';
|
|
40
|
+
throw new Error('Not implemented');
|
|
39
41
|
}
|
|
40
42
|
/**
|
|
41
43
|
* Returns the direct descendants of this node.
|
|
42
44
|
* @returns a map with ordered <nodeId, Node> tuples.
|
|
43
45
|
*/
|
|
44
46
|
children() {
|
|
45
|
-
throw 'Not implemented';
|
|
47
|
+
throw new Error('Not implemented');
|
|
46
48
|
}
|
|
47
49
|
searchTree(matchFunction, results) {
|
|
48
50
|
results = results || [];
|
|
@@ -62,7 +64,7 @@ export class TopDownNode extends Node {
|
|
|
62
64
|
parent;
|
|
63
65
|
constructor(id, event, parent) {
|
|
64
66
|
super(id, event);
|
|
65
|
-
this.root = parent
|
|
67
|
+
this.root = parent?.root ?? null;
|
|
66
68
|
this.hasChildrenInternal = false;
|
|
67
69
|
this.childrenInternal = null;
|
|
68
70
|
this.parent = parent;
|
|
@@ -80,7 +82,7 @@ export class TopDownNode extends Node {
|
|
|
80
82
|
// Tracks the ancestor path of this node, includes the current node.
|
|
81
83
|
const path = [];
|
|
82
84
|
for (let node = this; node.parent && !node.isGroupNode(); node = node.parent) {
|
|
83
|
-
path.push(node);
|
|
85
|
+
path.push((node));
|
|
84
86
|
}
|
|
85
87
|
path.reverse();
|
|
86
88
|
const children = new Map();
|
|
@@ -168,6 +170,9 @@ export class TopDownNode extends Node {
|
|
|
168
170
|
}
|
|
169
171
|
node.selfTime += duration;
|
|
170
172
|
node.totalTime += duration;
|
|
173
|
+
if (Types.Events.isReceivedDataEvent(e)) {
|
|
174
|
+
node.transferSize += e.args.data.encodedDataLength;
|
|
175
|
+
}
|
|
171
176
|
currentDirectChild = node;
|
|
172
177
|
}
|
|
173
178
|
/**
|
|
@@ -241,6 +246,7 @@ export class TopDownRootNode extends TopDownNode {
|
|
|
241
246
|
this.selfTime = this.totalTime;
|
|
242
247
|
}
|
|
243
248
|
children() {
|
|
249
|
+
// FYI tree nodes are built lazily. https://codereview.chromium.org/2674283003
|
|
244
250
|
return this.childrenInternal || this.grouppedTopNodes();
|
|
245
251
|
}
|
|
246
252
|
grouppedTopNodes() {
|
|
@@ -262,7 +268,7 @@ export class TopDownRootNode extends TopDownNode {
|
|
|
262
268
|
else {
|
|
263
269
|
groupNode.events.push(...node.events);
|
|
264
270
|
}
|
|
265
|
-
groupNode.addChild(node, node.selfTime, node.totalTime);
|
|
271
|
+
groupNode.addChild(node, node.selfTime, node.totalTime, node.transferSize);
|
|
266
272
|
}
|
|
267
273
|
this.childrenInternal = groupNodes;
|
|
268
274
|
return groupNodes;
|
|
@@ -279,7 +285,8 @@ export class BottomUpRootNode extends Node {
|
|
|
279
285
|
endTime;
|
|
280
286
|
eventGroupIdCallback;
|
|
281
287
|
totalTime;
|
|
282
|
-
|
|
288
|
+
calculateTransferSize;
|
|
289
|
+
constructor(events, { textFilter, filters, startTime, endTime, eventGroupIdCallback, calculateTransferSize, }) {
|
|
283
290
|
super('', events[0]);
|
|
284
291
|
this.childrenInternal = null;
|
|
285
292
|
this.events = events;
|
|
@@ -289,6 +296,7 @@ export class BottomUpRootNode extends Node {
|
|
|
289
296
|
this.endTime = endTime;
|
|
290
297
|
this.eventGroupIdCallback = eventGroupIdCallback;
|
|
291
298
|
this.totalTime = endTime - startTime;
|
|
299
|
+
this.calculateTransferSize = calculateTransferSize;
|
|
292
300
|
}
|
|
293
301
|
hasChildren() {
|
|
294
302
|
return true;
|
|
@@ -297,17 +305,21 @@ export class BottomUpRootNode extends Node {
|
|
|
297
305
|
for (const [id, child] of children) {
|
|
298
306
|
// to provide better context to user only filter first (top) level.
|
|
299
307
|
if (child.event && child.depth <= 1 && !this.textFilter.accept(child.event)) {
|
|
300
|
-
children.delete(id);
|
|
308
|
+
children.delete((id));
|
|
301
309
|
}
|
|
302
310
|
}
|
|
303
311
|
return children;
|
|
304
312
|
}
|
|
305
313
|
children() {
|
|
314
|
+
// FYI tree nodes are built lazily. https://codereview.chromium.org/2674283003
|
|
306
315
|
if (!this.childrenInternal) {
|
|
307
316
|
this.childrenInternal = this.filterChildren(this.grouppedTopNodes());
|
|
308
317
|
}
|
|
309
318
|
return this.childrenInternal;
|
|
310
319
|
}
|
|
320
|
+
// If no grouping is applied, the nodes returned here are what's initially shown in the bottom-up view.
|
|
321
|
+
// "No grouping" == no grouping in UI dropdown == no groupingFunction…
|
|
322
|
+
// … HOWEVER, nodes are still aggregated via `generateEventID`, which is ~= the event name.
|
|
311
323
|
ungrouppedTopNodes() {
|
|
312
324
|
const root = this;
|
|
313
325
|
const startTime = this.startTime;
|
|
@@ -316,9 +328,25 @@ export class BottomUpRootNode extends Node {
|
|
|
316
328
|
const selfTimeStack = [endTime - startTime];
|
|
317
329
|
const firstNodeStack = [];
|
|
318
330
|
const totalTimeById = new Map();
|
|
331
|
+
// encodedDataLength is provided solely on instant events.
|
|
332
|
+
const sumTransferSizeOfInstantEvent = (e) => {
|
|
333
|
+
if (Types.Events.isReceivedDataEvent(e)) {
|
|
334
|
+
const id = generateEventID(e);
|
|
335
|
+
let node = nodeById.get(id);
|
|
336
|
+
if (!node) {
|
|
337
|
+
node = new BottomUpNode(root, id, e, false, root);
|
|
338
|
+
nodeById.set(id, node);
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
node.events.push(e);
|
|
342
|
+
}
|
|
343
|
+
node.transferSize += e.args.data.encodedDataLength;
|
|
344
|
+
}
|
|
345
|
+
};
|
|
319
346
|
Helpers.Trace.forEachEvent(this.events, {
|
|
320
347
|
onStartEvent,
|
|
321
348
|
onEndEvent,
|
|
349
|
+
onInstantEvent: this.calculateTransferSize ? sumTransferSizeOfInstantEvent : undefined,
|
|
322
350
|
startTime: Helpers.Timing.milliToMicro(this.startTime),
|
|
323
351
|
endTime: Helpers.Timing.milliToMicro(this.endTime),
|
|
324
352
|
eventFilter: this.filter,
|
|
@@ -357,9 +385,10 @@ export class BottomUpRootNode extends Node {
|
|
|
357
385
|
}
|
|
358
386
|
}
|
|
359
387
|
this.selfTime = selfTimeStack.pop() || 0;
|
|
388
|
+
// Delete any nodes that have no selfTime (or transferSize, if it's being calculated)
|
|
360
389
|
for (const pair of nodeById) {
|
|
361
|
-
if (pair[1].selfTime <= 0) {
|
|
362
|
-
nodeById.delete(pair[0]);
|
|
390
|
+
if (pair[1].selfTime <= 0 && (!this.calculateTransferSize || pair[1].transferSize <= 0)) {
|
|
391
|
+
nodeById.delete((pair[0]));
|
|
363
392
|
}
|
|
364
393
|
}
|
|
365
394
|
return nodeById;
|
|
@@ -380,7 +409,7 @@ export class BottomUpRootNode extends Node {
|
|
|
380
409
|
else {
|
|
381
410
|
groupNode.events.push(...node.events);
|
|
382
411
|
}
|
|
383
|
-
groupNode.addChild(node, node.selfTime, node.selfTime);
|
|
412
|
+
groupNode.addChild(node, node.selfTime, node.selfTime, node.transferSize);
|
|
384
413
|
}
|
|
385
414
|
return groupNodes;
|
|
386
415
|
}
|
|
@@ -396,10 +425,11 @@ export class GroupNode extends Node {
|
|
|
396
425
|
this.parent = parent;
|
|
397
426
|
this.isGroupNodeInternal = true;
|
|
398
427
|
}
|
|
399
|
-
addChild(child, selfTime, totalTime) {
|
|
428
|
+
addChild(child, selfTime, totalTime, transferSize) {
|
|
400
429
|
this.childrenInternal.set(child.id, child);
|
|
401
430
|
this.selfTime += selfTime;
|
|
402
431
|
this.totalTime += totalTime;
|
|
432
|
+
this.transferSize += transferSize;
|
|
403
433
|
child.parent = this;
|
|
404
434
|
}
|
|
405
435
|
hasChildren() {
|
|
@@ -516,8 +546,8 @@ export function eventStackFrame(event) {
|
|
|
516
546
|
}
|
|
517
547
|
export function generateEventID(event) {
|
|
518
548
|
if (Types.Events.isProfileCall(event)) {
|
|
519
|
-
const name =
|
|
520
|
-
|
|
549
|
+
const name = SamplesIntegrator.isNativeRuntimeFrame(event.callFrame) ?
|
|
550
|
+
SamplesIntegrator.nativeGroup(event.callFrame.functionName) :
|
|
521
551
|
event.callFrame.functionName;
|
|
522
552
|
const location = event.callFrame.scriptId || event.callFrame.url || '';
|
|
523
553
|
return `f:${name}@${location}`;
|
|
@@ -525,8 +555,8 @@ export function generateEventID(event) {
|
|
|
525
555
|
if (Types.Events.isConsoleTimeStamp(event) && event.args.data) {
|
|
526
556
|
return `${event.name}:${event.args.data.name}`;
|
|
527
557
|
}
|
|
528
|
-
if (Types.Events.isSyntheticNetworkRequest(event)) {
|
|
529
|
-
return
|
|
558
|
+
if (Types.Events.isSyntheticNetworkRequest(event) || Types.Events.isReceivedDataEvent(event)) {
|
|
559
|
+
return `req:${event.args.data.requestId}`;
|
|
530
560
|
}
|
|
531
561
|
return event.name;
|
|
532
562
|
}
|
|
@@ -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 * 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 /** 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.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 '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, 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.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 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 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);\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\n constructor(events: Types.Events.Event[], {textFilter, filters, startTime, endTime, eventGroupIdCallback}: {\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 }) {\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 }\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.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 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 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);\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): 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.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 = 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.isConsoleTimeStamp(event) && event.args.data) {\n return `${event.name}:${event.args.data.name}`;\n }\n if (Types.Events.isSyntheticNetworkRequest(event)) {\n return `${event.name}:${event.args.data.url}`;\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 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"]}
|
|
@@ -33,9 +33,9 @@
|
|
|
33
33
|
"../../../../../../../front_end/models/trace/extras/FilmStrip.ts",
|
|
34
34
|
"../../../../../../../front_end/models/trace/extras/MainThreadActivity.ts",
|
|
35
35
|
"../../../../../../../front_end/models/trace/extras/Metadata.ts",
|
|
36
|
+
"../../../../../../../front_end/models/trace/extras/ScriptDuplication.ts",
|
|
36
37
|
"../../../../../../../front_end/models/trace/extras/StackTraceForEvent.ts",
|
|
37
38
|
"../../../../../../../front_end/models/trace/extras/ThirdParties.ts",
|
|
38
|
-
"../../../../../../../front_end/models/trace/extras/TimelineJSProfile.ts",
|
|
39
39
|
"../../../../../../../front_end/models/trace/extras/TraceFilter.ts",
|
|
40
40
|
"../../../../../../../front_end/models/trace/extras/TraceTree.ts",
|
|
41
41
|
"../../../../../../../front_end/legacy/legacy-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,
|
|
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,iBAAiB,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,kBAAkB,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,SAAS,MAAM,gBAAgB,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 ScriptDuplication from './ScriptDuplication.js';\nexport * as StackTraceForEvent from './StackTraceForEvent.js';\nexport * as ThirdParties from './ThirdParties.js';\nexport * as TraceFilter from './TraceFilter.js';\nexport * as TraceTree from './TraceTree.js';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnimationFramesHandler.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/handlers/AnimationFramesHandler.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yEAAyE;AACzE,6BAA6B;AAC7B,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAS3C,SAAS,SAAS,CAAC,IAAwB;IACzC,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;AACnC,CAAC;AACD,2EAA2E;AAC3E,8CAA8C;AAC9C,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"AnimationFramesHandler.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/handlers/AnimationFramesHandler.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\nimport * as Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\nimport type {HandlerName} from './types.js';\n\nexport interface Data {\n animationFrames: Types.Events.SyntheticAnimationFramePair[];\n presentationForFrame: Map<Types.Events.SyntheticAnimationFramePair, Types.Events.AnimationFramePresentation>;\n}\n\nfunction threadKey(data: Types.Events.Event): string {\n return `${data.pid}-${data.tid}`;\n}\n// Track all the start + end events. We key them by the PID+TID so we don't\n// accidentally pair across different threads.\nconst animationFrameStarts = new Map<string, Types.Events.AnimationFrameAsyncStart[]>();\nconst animationFrameEnds = new Map<string, Types.Events.AnimationFrameAsyncEnd[]>();\n// Store all the AnimationFrame::Presentation events. Key them by their ID for\n// easy look-up later on when we associate one to the AnimationFrame event.\nconst animationFramePresentations = new Map<string, Types.Events.AnimationFramePresentation>();\n\n// The final list of animation frames that we return.\nconst animationFrames: Types.Events.SyntheticAnimationFramePair[] = [];\n\nconst presentationForFrame =\n new Map<Types.Events.SyntheticAnimationFramePair, Types.Events.AnimationFramePresentation>();\n\nexport function reset(): void {\n animationFrameStarts.clear();\n animationFrameEnds.clear();\n animationFrames.length = 0;\n presentationForFrame.clear();\n animationFramePresentations.clear();\n}\n\nexport function handleEvent(event: Types.Events.Event): void {\n if (Types.Events.isAnimationFrameAsyncStart(event)) {\n const key = threadKey(event);\n const existing = animationFrameStarts.get(key) ?? [];\n existing.push(event);\n animationFrameStarts.set(key, existing);\n } else if (Types.Events.isAnimationFrameAsyncEnd(event)) {\n const key = threadKey(event);\n const existing = animationFrameEnds.get(key) ?? [];\n existing.push(event);\n animationFrameEnds.set(key, existing);\n } else if (Types.Events.isAnimationFramePresentation(event) && event.args?.id) {\n animationFramePresentations.set(event.args.id, event);\n }\n}\n\nexport async function finalize(): Promise<void> {\n // AnimationFrames are represented with begin & end events on a stack; so we\n // can pair them by walking through the list of start events and pairing with\n // the same index in the list of end events, once both lists are sorted by\n // timestamp.\n // We walk through the set of begin/end events we gathered per pid+tid and\n // pair those up.\n // Unfortunately we cannot use the pairing helpers in Helpers.Trace because\n // only the begin event has an ID; the end event does not. But because we\n // know that AnimationFrames are sequential and do not overlap, we can pair\n // up events easily.\n for (const [key, startEvents] of animationFrameStarts.entries()) {\n const endEvents = animationFrameEnds.get(key);\n if (!endEvents) {\n continue;\n }\n\n Helpers.Trace.sortTraceEventsInPlace(startEvents);\n Helpers.Trace.sortTraceEventsInPlace(endEvents);\n\n for (let i = 0; i < startEvents.length; i++) {\n const endEvent = endEvents.at(i);\n if (!endEvent) {\n // Invalid data: break. We can't pair any other events up.\n break;\n }\n const startEvent = startEvents[i];\n\n const syntheticEvent = Helpers.SyntheticEvents.SyntheticEventsManager\n .registerSyntheticEvent<Types.Events.SyntheticAnimationFramePair>({\n rawSourceEvent: startEvent,\n ...startEvent,\n dur: Types.Timing.Micro(endEvent.ts - startEvent.ts),\n args: {\n data: {\n beginEvent: startEvent,\n endEvent,\n },\n },\n });\n animationFrames.push(syntheticEvent);\n\n // AnimationFrame begin events + AnimationFrame::Presentation events share\n // an args.id, so we can pair them up based on that.\n const id = startEvent.args?.id;\n if (id) {\n const presentationEvent = animationFramePresentations.get(id);\n if (presentationEvent) {\n presentationForFrame.set(syntheticEvent, presentationEvent);\n }\n }\n }\n }\n}\n\nexport function data(): Data {\n return {\n animationFrames,\n presentationForFrame,\n };\n}\n\nexport function deps(): HandlerName[] {\n return ['Meta'];\n}\n"]}
|