@paulirish/trace_engine 0.0.10 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/analyze-trace.mjs +1 -1
- package/core/platform/DevToolsPath.d.ts +4 -13
- package/core/platform/DevToolsPath.js +7 -4
- package/core/platform/DevToolsPath.js.map +1 -7
- package/core/platform/MimeType.d.ts +27 -0
- package/core/platform/MimeType.js +119 -86
- package/core/platform/MimeType.js.map +1 -7
- package/core/platform/Timing.d.ts +7 -0
- package/core/platform/Timing.js +7 -4
- package/core/platform/Timing.js.map +1 -7
- package/core/platform/UIString.d.ts +2 -5
- package/core/platform/UIString.js +5 -2
- package/core/platform/UIString.js.map +1 -7
- package/core/platform/UserVisibleError.js +19 -10
- package/core/platform/UserVisibleError.js.map +1 -7
- package/core/platform/array-utilities.d.ts +48 -10
- package/core/platform/array-utilities.js +160 -124
- package/core/platform/array-utilities.js.map +1 -7
- package/core/platform/brand.d.ts +14 -0
- package/core/platform/brand.js +5 -1
- package/core/platform/brand.js.map +1 -7
- package/core/platform/date-utilities.js +10 -6
- package/core/platform/date-utilities.js.map +1 -7
- package/core/platform/dom-utilities.d.ts +3 -1
- package/core/platform/dom-utilities.js +94 -83
- package/core/platform/dom-utilities.js.map +1 -7
- package/core/platform/keyboard-utilities.d.ts +2 -0
- package/core/platform/keyboard-utilities.js +15 -24
- package/core/platform/keyboard-utilities.js.map +1 -7
- package/core/platform/map-utilities.d.ts +4 -0
- package/core/platform/map-utilities.js +66 -60
- package/core/platform/map-utilities.js.map +1 -7
- package/core/platform/number-utilities.js +66 -55
- package/core/platform/number-utilities.js.map +1 -7
- package/core/platform/platform.d.ts +5 -1
- package/core/platform/platform.js +54 -37
- package/core/platform/platform.js.map +1 -7
- package/core/platform/promise-utilities.d.ts +10 -0
- package/core/platform/promise-utilities.js +16 -8
- package/core/platform/promise-utilities.js.map +1 -7
- package/core/platform/set-utilities.js +20 -17
- package/core/platform/set-utilities.js.map +1 -7
- package/core/platform/string-utilities.d.ts +32 -1
- package/core/platform/string-utilities.js +453 -379
- package/core/platform/string-utilities.js.map +1 -7
- package/core/platform/typescript-utilities.d.ts +5 -5
- package/core/platform/typescript-utilities.js +19 -7
- package/core/platform/typescript-utilities.js.map +1 -7
- package/generated/protocol.d.ts +2081 -347
- package/generated/protocol.js +5 -2230
- package/models/cpu_profile/CPUProfileDataModel.d.ts +77 -0
- package/models/cpu_profile/CPUProfileDataModel.js +492 -359
- package/models/cpu_profile/CPUProfileDataModel.js.map +1 -7
- package/models/cpu_profile/ProfileTreeModel.d.ts +29 -0
- package/models/cpu_profile/ProfileTreeModel.js +87 -82
- package/models/cpu_profile/ProfileTreeModel.js.map +1 -7
- package/models/cpu_profile/cpu_profile.d.ts +3 -0
- package/models/cpu_profile/cpu_profile.js +7 -7
- package/models/cpu_profile/cpu_profile.js.map +1 -7
- package/models/trace/EntriesFilter.d.ts +55 -0
- package/models/trace/EntriesFilter.js +227 -166
- package/models/trace/EntriesFilter.js.map +1 -7
- package/models/trace/LegacyTracingModel.js.map +1 -7
- package/models/trace/ModelImpl.d.ts +110 -0
- package/models/trace/ModelImpl.js +161 -102
- package/models/trace/ModelImpl.js.map +1 -7
- package/models/trace/Processor.d.ts +36 -0
- package/models/trace/Processor.js +197 -163
- package/models/trace/Processor.js.map +1 -7
- package/models/trace/TracingManager.js.map +1 -7
- package/models/trace/extras/FetchNodes.d.ts +46 -0
- package/models/trace/extras/FetchNodes.js +132 -91
- package/models/trace/extras/FetchNodes.js.map +1 -7
- package/models/trace/extras/FilmStrip.d.ts +19 -0
- package/models/trace/extras/FilmStrip.js +38 -31
- package/models/trace/extras/FilmStrip.js.map +1 -7
- package/models/trace/extras/MainThreadActivity.d.ts +2 -0
- package/models/trace/extras/MainThreadActivity.js +72 -56
- package/models/trace/extras/MainThreadActivity.js.map +1 -7
- package/models/trace/extras/Metadata.d.ts +2 -0
- package/models/trace/extras/Metadata.js +42 -26
- package/models/trace/extras/Metadata.js.map +1 -7
- package/models/trace/extras/extras.js.map +1 -7
- package/models/trace/handlers/AnimationHandler.d.ts +8 -0
- package/models/trace/handlers/AnimationHandler.js +22 -20
- package/models/trace/handlers/AnimationHandler.js.map +1 -7
- package/models/trace/handlers/AuctionWorkletsHandler.d.ts +8 -0
- package/models/trace/handlers/AuctionWorkletsHandler.js +143 -89
- package/models/trace/handlers/AuctionWorkletsHandler.js.map +1 -7
- package/models/trace/handlers/FramesHandler.d.ts +76 -0
- package/models/trace/handlers/FramesHandler.js +424 -355
- package/models/trace/handlers/FramesHandler.js.map +1 -7
- package/models/trace/handlers/GPUHandler.d.ts +11 -0
- package/models/trace/handlers/GPUHandler.js +41 -37
- package/models/trace/handlers/GPUHandler.js.map +1 -7
- package/models/trace/handlers/InitiatorsHandler.d.ts +10 -0
- package/models/trace/handlers/InitiatorsHandler.js +164 -113
- package/models/trace/handlers/InitiatorsHandler.js.map +1 -7
- package/models/trace/handlers/InvalidationsHandler.d.ts +10 -0
- package/models/trace/handlers/InvalidationsHandler.js +101 -79
- package/models/trace/handlers/InvalidationsHandler.js.map +1 -7
- package/models/trace/handlers/LargestImagePaintHandler.d.ts +5 -0
- package/models/trace/handlers/LargestImagePaintHandler.js +32 -12
- package/models/trace/handlers/LargestImagePaintHandler.js.map +1 -7
- package/models/trace/handlers/LargestTextPaintHandler.d.ts +5 -0
- package/models/trace/handlers/LargestTextPaintHandler.js +20 -12
- package/models/trace/handlers/LargestTextPaintHandler.js.map +1 -7
- package/models/trace/handlers/LayerTreeHandler.d.ts +13 -0
- package/models/trace/handlers/LayerTreeHandler.js +96 -70
- package/models/trace/handlers/LayerTreeHandler.js.map +1 -7
- package/models/trace/handlers/LayoutShiftsHandler.d.ts +44 -0
- package/models/trace/handlers/LayoutShiftsHandler.js +304 -227
- package/models/trace/handlers/LayoutShiftsHandler.js.map +1 -7
- package/models/trace/handlers/MemoryHandler.d.ts +7 -0
- package/models/trace/handlers/MemoryHandler.js +14 -11
- package/models/trace/handlers/MemoryHandler.js.map +1 -7
- package/models/trace/handlers/MetaHandler.d.ts +37 -0
- package/models/trace/handlers/MetaHandler.js +314 -226
- package/models/trace/handlers/MetaHandler.js.map +1 -7
- package/models/trace/handlers/ModelHandlers.d.ts +21 -0
- package/models/trace/handlers/ModelHandlers.js +25 -22
- package/models/trace/handlers/ModelHandlers.js.map +1 -7
- package/models/trace/handlers/NetworkRequestsHandler.d.ts +17 -0
- package/models/trace/handlers/NetworkRequestsHandler.js +342 -218
- package/models/trace/handlers/NetworkRequestsHandler.js.map +1 -7
- package/models/trace/handlers/PageLoadMetricsHandler.d.ts +67 -0
- package/models/trace/handlers/PageLoadMetricsHandler.js +357 -284
- package/models/trace/handlers/PageLoadMetricsHandler.js.map +1 -7
- package/models/trace/handlers/RendererHandler.d.ts +101 -0
- package/models/trace/handlers/RendererHandler.js +295 -191
- package/models/trace/handlers/RendererHandler.js.map +1 -7
- package/models/trace/handlers/SamplesHandler.d.ts +46 -0
- package/models/trace/handlers/SamplesHandler.js +195 -158
- package/models/trace/handlers/SamplesHandler.js.map +1 -7
- package/models/trace/handlers/ScreenshotsHandler.d.ts +7 -0
- package/models/trace/handlers/ScreenshotsHandler.js +63 -41
- package/models/trace/handlers/ScreenshotsHandler.js.map +1 -7
- package/models/trace/handlers/Threads.d.ts +33 -0
- package/models/trace/handlers/Threads.js +85 -67
- package/models/trace/handlers/Threads.js.map +1 -7
- package/models/trace/handlers/UserInteractionsHandler.d.ts +57 -0
- package/models/trace/handlers/UserInteractionsHandler.js +240 -141
- package/models/trace/handlers/UserInteractionsHandler.js.map +1 -7
- package/models/trace/handlers/UserTimingsHandler.d.ts +28 -0
- package/models/trace/handlers/UserTimingsHandler.js +91 -80
- package/models/trace/handlers/UserTimingsHandler.js.map +1 -7
- package/models/trace/handlers/WarningsHandler.d.ts +14 -0
- package/models/trace/handlers/WarningsHandler.js +100 -62
- package/models/trace/handlers/WarningsHandler.js.map +1 -7
- package/models/trace/handlers/WorkersHandler.d.ts +11 -0
- package/models/trace/handlers/WorkersHandler.js +40 -38
- package/models/trace/handlers/WorkersHandler.js.map +1 -7
- package/models/trace/handlers/handlers.d.ts +3 -0
- package/models/trace/handlers/handlers.js +7 -4
- package/models/trace/handlers/handlers.js.map +1 -7
- package/models/trace/handlers/types.d.ts +45 -0
- package/models/trace/handlers/types.js +15 -15
- package/models/trace/handlers/types.js.map +1 -7
- package/models/trace/helpers/SamplesIntegrator.d.ts +49 -0
- package/models/trace/helpers/SamplesIntegrator.js +381 -204
- package/models/trace/helpers/SamplesIntegrator.js.map +1 -7
- package/models/trace/helpers/Timing.d.ts +26 -0
- package/models/trace/helpers/Timing.js +131 -110
- package/models/trace/helpers/Timing.js.map +1 -7
- package/models/trace/helpers/Trace.d.ts +37 -0
- package/models/trace/helpers/Trace.js +200 -166
- package/models/trace/helpers/Trace.js.map +1 -7
- package/models/trace/helpers/TreeHelpers.d.ts +90 -0
- package/models/trace/helpers/TreeHelpers.js +203 -100
- package/models/trace/helpers/TreeHelpers.js.map +1 -7
- package/models/trace/helpers/helpers.d.ts +4 -0
- package/models/trace/helpers/helpers.js +8 -5
- package/models/trace/helpers/helpers.js.map +1 -7
- package/models/trace/root-causes/LayoutShift.d.ts +119 -0
- package/models/trace/root-causes/LayoutShift.js +470 -323
- package/models/trace/root-causes/LayoutShift.js.map +1 -7
- package/models/trace/root-causes/RootCauses.d.ts +14 -0
- package/models/trace/root-causes/RootCauses.js +9 -6
- package/models/trace/root-causes/RootCauses.js.map +1 -7
- package/models/trace/root-causes/root-causes.d.ts +1 -0
- package/models/trace/root-causes/root-causes.js +5 -2
- package/models/trace/root-causes/root-causes.js.map +1 -7
- package/models/trace/trace.d.ts +11 -0
- package/models/trace/trace.js +17 -23
- package/models/trace/trace.js.map +1 -7
- package/models/trace/types/Configuration.d.ts +33 -0
- package/models/trace/types/Configuration.js +25 -14
- package/models/trace/types/Configuration.js.map +1 -7
- package/models/trace/types/File.d.ts +23 -0
- package/models/trace/types/File.js +5 -6
- package/models/trace/types/File.js.map +1 -7
- package/models/trace/types/Timing.d.ts +25 -0
- package/models/trace/types/Timing.js +10 -11
- package/models/trace/types/Timing.js.map +1 -7
- package/models/trace/types/TraceEvents.d.ts +1571 -0
- package/models/trace/types/TraceEvents.js +174 -381
- package/models/trace/types/TraceEvents.js.map +1 -7
- package/models/trace/types/types.d.ts +4 -0
- package/models/trace/types/types.js +8 -5
- package/models/trace/types/types.js.map +1 -7
- package/package.json +1 -1
- package/TracingManager.js +0 -0
- package/core/platform/devtools_entrypoint-bundle-tsconfig-tsconfig.json +0 -40
- package/core/platform/platform.js.compressed +0 -0
- package/core/platform/platform.js.hash +0 -1
- package/core/platform/platform.prebundle.d.ts +0 -15
- package/core/platform/platform.prebundle.js +0 -50
- package/core/platform/platform.prebundle.js.map +0 -1
- package/core/platform/platform.prebundle.ts +0 -64
- package/extras/extras.js +0 -0
- package/models/trace/SDKServices.js +0 -104
- package/models/trace/SDKServices.js.map +0 -7
- package/models/trace/TraceProcessor.js +0 -133
- package/models/trace/TraceProcessor.js.map +0 -7
- package/models/trace/TreeManipulator.js +0 -85
- package/models/trace/TreeManipulator.js.map +0 -7
- package/models/trace/devtools_entrypoint-legacy-typescript-tsconfig.json +0 -43
- package/models/trace/frames/TimelineFrameModel.js +0 -392
- package/models/trace/frames/TimelineFrameModel.js.map +0 -7
- package/models/trace/frames/bundle-tsconfig.json +0 -1
- package/models/trace/frames/devtools_entrypoint-bundle-typescript-tsconfig.json +0 -43
- package/models/trace/frames/frames-tsconfig.json +0 -58
- package/models/trace/frames/frames.js +0 -5
- package/models/trace/frames/frames.js.map +0 -7
- package/models/trace/handlers/Migration.js +0 -27
- package/models/trace/handlers/Migration.js.map +0 -7
- package/models/trace/handlers/UberFramesHandler.js +0 -293
- package/models/trace/handlers/UberFramesHandler.js.map +0 -7
- package/models/trace/legacy-tsconfig.json +0 -1
- package/models/trace/sdk_services/DOMNodeLookup.js +0 -41
- package/models/trace/sdk_services/DOMNodeLookup.js.map +0 -7
- package/models/trace/sdk_services/LayoutShifts.js +0 -68
- package/models/trace/sdk_services/LayoutShifts.js.map +0 -7
- package/models/trace/sdk_services/bundle-tsconfig.json +0 -1
- package/models/trace/sdk_services/devtools_entrypoint-bundle-typescript-tsconfig.json +0 -41
- package/models/trace/sdk_services/sdk_services-tsconfig.json +0 -57
- package/models/trace/sdk_services/sdk_services.js +0 -7
- package/models/trace/sdk_services/sdk_services.js.map +0 -7
- package/models/trace/trace-legacy.js +0 -16
- package/models/trace/trace-legacy.js.map +0 -7
- package/models/trace/worker/Processor.js +0 -143
- package/models/trace/worker/Processor.js.map +0 -7
- package/models/trace/worker/Types.js +0 -1
- package/models/trace/worker/Types.js.map +0 -7
- package/models/trace/worker/bundle-tsconfig.json +0 -1
- package/models/trace/worker/devtools_entrypoint-bundle-typescript-tsconfig.json +0 -41
- package/models/trace/worker/devtools_entrypoint-worker_entrypoint-typescript-tsconfig.json +0 -41
- package/models/trace/worker/processor-tsconfig.json +0 -45
- package/models/trace/worker/worker.js +0 -7
- package/models/trace/worker/worker.js.map +0 -7
- package/models/trace/worker/worker_entrypoint-tsconfig.json +0 -1
- package/models/trace/worker/worker_entrypoint.js +0 -36
- package/models/trace/worker/worker_entrypoint.js.map +0 -7
- package/trace.mjs +0 -6980
- package/trace.mjs.map +0 -8
|
@@ -1,7 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../../front_end/models/trace/handlers/FramesHandler.ts"],
|
|
4
|
-
"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\nimport * as Platform from '../../../core/platform/platform.js';\nimport * as Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\nimport {type AuctionWorkletsData, data as auctionWorkletsData} from './AuctionWorkletsHandler.js';\nimport {data as layerTreeHandlerData, type LayerTreeData} from './LayerTreeHandler.js';\nimport {data as metaHandlerData, type MetaHandlerData} from './MetaHandler.js';\nimport {data as rendererHandlerData, type RendererHandlerData} from './RendererHandler.js';\nimport * as Threads from './Threads.js';\nimport {HandlerState, type TraceEventHandlerName} from './types.js';\n\n/**\n * IMPORTANT: this handler is slightly different to the rest. This is because\n * it is an adaptation of the TimelineFrameModel that has been used in DevTools\n * for many years. Rather than re-implement all the logic from scratch, instead\n * this handler gathers up the events and instantitates the class in the\n * finalize() method. Once the class has parsed all events, it is used to then\n * return the array of frames.\n *\n * In time we expect to migrate this code to a more \"typical\" handler.\n */\nlet handlerState = HandlerState.UNINITIALIZED;\n\nconst allEvents: Types.TraceEvents.TraceEventData[] = [];\nlet model: TimelineFrameModel|null = null;\n\nexport function reset(): void {\n handlerState = HandlerState.UNINITIALIZED;\n allEvents.length = 0;\n}\nexport function initialize(): void {\n if (handlerState !== HandlerState.UNINITIALIZED) {\n throw new Error('FramesHandler was not reset before being initialized');\n }\n\n handlerState = HandlerState.INITIALIZED;\n}\n\nexport function handleEvent(event: Types.TraceEvents.TraceEventData): void {\n allEvents.push(event);\n}\n\nexport async function finalize(): Promise<void> {\n if (handlerState !== HandlerState.INITIALIZED) {\n throw new Error('FramesHandler is not initialized');\n }\n\n // Snapshot events can be emitted out of order, so we need to sort before\n // building the frames model.\n Helpers.Trace.sortTraceEventsInPlace(allEvents);\n\n const modelForTrace = new TimelineFrameModel(\n allEvents,\n rendererHandlerData(),\n auctionWorkletsData(),\n metaHandlerData(),\n layerTreeHandlerData(),\n );\n model = modelForTrace;\n}\n\nexport interface FramesData {\n frames: readonly TimelineFrame[];\n framesById: Readonly<Record<number, TimelineFrame|undefined>>;\n}\n\nexport function data(): FramesData {\n return {\n frames: model ? Array.from(model.frames()) : [],\n framesById: model ? {...model.framesById()} : {},\n };\n}\n\nexport function deps(): TraceEventHandlerName[] {\n return ['Meta', 'Renderer', 'AuctionWorklets', 'LayerTree'];\n}\n\ntype FrameEvent = Types.TraceEvents.TraceEventBeginFrame|Types.TraceEvents.TraceEventDroppedFrame|\n Types.TraceEvents.TraceEventRequestMainThreadFrame|\n Types.TraceEvents.TraceEventBeginMainThreadFrame|Types.TraceEvents.TraceEventCommit|\n Types.TraceEvents.TraceEventCompositeLayers|Types.TraceEvents.TraceEventActivateLayerTree|\n Types.TraceEvents.TraceEventNeedsBeginFrameChanged|Types.TraceEvents.TraceEventDrawFrame;\n\nfunction isFrameEvent(event: Types.TraceEvents.TraceEventData): event is FrameEvent {\n return (\n Types.TraceEvents.isTraceEventSetLayerId(event) || Types.TraceEvents.isTraceEventBeginFrame(event) ||\n Types.TraceEvents.isTraceEventDroppedFrame(event) ||\n Types.TraceEvents.isTraceEventRequestMainThreadFrame(event) ||\n Types.TraceEvents.isTraceEventBeginMainThreadFrame(event) ||\n Types.TraceEvents.isTraceEventNeedsBeginFrameChanged(event) ||\n // Note that \"Commit\" is the replacement for \"CompositeLayers\" so in a trace\n // we wouldn't expect to see a combination of these. All \"new\" trace\n // recordings use \"Commit\", but we can easily support \"CompositeLayers\" too\n // to not break older traces being imported.\n Types.TraceEvents.isTraceEventCommit(event) || Types.TraceEvents.isTraceEventCompositeLayers(event) ||\n Types.TraceEvents.isTraceEventActivateLayerTree(event) || Types.TraceEvents.isTraceEventDrawFrame(event));\n}\n\nfunction entryIsTopLevel(entry: Types.TraceEvents.TraceEventData): boolean {\n const devtoolsTimelineCategory = 'disabled-by-default-devtools.timeline';\n return entry.name === Types.TraceEvents.KnownEventName.RunTask && entry.cat.includes(devtoolsTimelineCategory);\n}\n\nexport class TimelineFrameModel {\n #frames: TimelineFrame[] = [];\n #frameById: {\n [x: number]: TimelineFrame,\n } = {};\n #beginFrameQueue: TimelineFrameBeginFrameQueue = new TimelineFrameBeginFrameQueue();\n #lastFrame: TimelineFrame|null = null;\n #mainFrameCommitted = false;\n #mainFrameRequested = false;\n #lastLayerTree: FrameLayerTreeData|null = null;\n #framePendingActivation: PendingFrame|null = null;\n #framePendingCommit: PendingFrame|null = null;\n #lastBeginFrame: number|null = null;\n #lastNeedsBeginFrame: number|null = null;\n #lastTaskBeginTime: Types.Timing.MicroSeconds|null = null;\n #layerTreeId: number|null = null;\n #activeProcessId: Types.TraceEvents.ProcessID|null = null;\n #activeThreadId: Types.TraceEvents.ThreadID|null = null;\n #layerTreeData: LayerTreeData;\n\n constructor(\n allEvents: readonly Types.TraceEvents.TraceEventData[], rendererData: RendererHandlerData,\n auctionWorkletsData: AuctionWorkletsData, metaData: MetaHandlerData, layerTreeData: LayerTreeData) {\n // We only care about getting threads from the Renderer, not Samples,\n // because Frames don't exist in a CPU Profile (which won't have Renderer\n // threads.)\n const mainThreads = Threads.threadsInRenderer(rendererData, auctionWorkletsData).filter(thread => {\n return thread.type === Threads.ThreadType.MAIN_THREAD && thread.processIsOnMainFrame;\n });\n const threadData = mainThreads.map(thread => {\n return {\n tid: thread.tid,\n pid: thread.pid,\n startTime: thread.entries[0].ts,\n };\n });\n\n this.#layerTreeData = layerTreeData;\n this.#addTraceEvents(allEvents, threadData, metaData.mainFrameId);\n }\n\n framesById(): Readonly<Record<number, TimelineFrame|undefined>> {\n return this.#frameById;\n }\n\n frames(): TimelineFrame[] {\n return this.#frames;\n }\n\n #handleBeginFrame(startTime: Types.Timing.MicroSeconds, seqId: number): void {\n if (!this.#lastFrame) {\n this.#startFrame(startTime, seqId);\n }\n this.#lastBeginFrame = startTime;\n\n this.#beginFrameQueue.addFrameIfNotExists(seqId, startTime, false, false);\n }\n\n #handleDroppedFrame(startTime: Types.Timing.MicroSeconds, seqId: number, isPartial: boolean): void {\n if (!this.#lastFrame) {\n this.#startFrame(startTime, seqId);\n }\n\n // This line handles the case where no BeginFrame event is issued for\n // the dropped frame. In this situation, add a BeginFrame to the queue\n // as if it actually occurred.\n this.#beginFrameQueue.addFrameIfNotExists(seqId, startTime, true, isPartial);\n this.#beginFrameQueue.setDropped(seqId, true);\n this.#beginFrameQueue.setPartial(seqId, isPartial);\n }\n\n #handleDrawFrame(startTime: Types.Timing.MicroSeconds, seqId: number): void {\n if (!this.#lastFrame) {\n this.#startFrame(startTime, seqId);\n return;\n }\n\n // - if it wasn't drawn, it didn't happen!\n // - only show frames that either did not wait for the main thread frame or had one committed.\n if (this.#mainFrameCommitted || !this.#mainFrameRequested) {\n if (this.#lastNeedsBeginFrame) {\n const idleTimeEnd = this.#framePendingActivation ? this.#framePendingActivation.triggerTime :\n (this.#lastBeginFrame || this.#lastNeedsBeginFrame);\n if (idleTimeEnd > this.#lastFrame.startTime) {\n this.#lastFrame.idle = true;\n this.#lastBeginFrame = null;\n }\n this.#lastNeedsBeginFrame = null;\n }\n\n const framesToVisualize = this.#beginFrameQueue.processPendingBeginFramesOnDrawFrame(seqId);\n\n // Visualize the current frame and all pending frames before it.\n for (const frame of framesToVisualize) {\n const isLastFrameIdle = this.#lastFrame.idle;\n\n // If |frame| is the first frame after an idle period, the CPU time\n // will be logged (\"committed\") under |frame| if applicable.\n this.#startFrame(frame.startTime, seqId);\n if (isLastFrameIdle && this.#framePendingActivation) {\n this.#commitPendingFrame();\n }\n if (frame.isDropped) {\n this.#lastFrame.dropped = true;\n }\n if (frame.isPartial) {\n this.#lastFrame.isPartial = true;\n }\n }\n }\n this.#mainFrameCommitted = false;\n }\n\n #handleActivateLayerTree(): void {\n if (!this.#lastFrame) {\n return;\n }\n if (this.#framePendingActivation && !this.#lastNeedsBeginFrame) {\n this.#commitPendingFrame();\n }\n }\n\n #handleRequestMainThreadFrame(): void {\n if (!this.#lastFrame) {\n return;\n }\n this.#mainFrameRequested = true;\n }\n\n #handleCommit(): void {\n if (!this.#framePendingCommit) {\n return;\n }\n this.#framePendingActivation = this.#framePendingCommit;\n this.#framePendingCommit = null;\n this.#mainFrameRequested = false;\n this.#mainFrameCommitted = true;\n }\n\n #handleLayerTreeSnapshot(layerTree: FrameLayerTreeData): void {\n this.#lastLayerTree = layerTree;\n }\n\n #handleNeedFrameChanged(startTime: Types.Timing.MicroSeconds, needsBeginFrame: boolean): void {\n if (needsBeginFrame) {\n this.#lastNeedsBeginFrame = startTime;\n }\n }\n\n #startFrame(startTime: Types.Timing.MicroSeconds, seqId: number): void {\n if (this.#lastFrame) {\n this.#flushFrame(this.#lastFrame, startTime);\n }\n this.#lastFrame =\n new TimelineFrame(seqId, startTime, Types.Timing.MicroSeconds(startTime - metaHandlerData().traceBounds.min));\n }\n\n #flushFrame(frame: TimelineFrame, endTime: Types.Timing.MicroSeconds): void {\n frame.setLayerTree(this.#lastLayerTree);\n frame.setEndTime(endTime);\n if (this.#lastLayerTree) {\n this.#lastLayerTree.paints = frame.paints;\n }\n const lastFrame = this.#frames[this.#frames.length - 1];\n if (this.#frames.length && lastFrame &&\n (frame.startTime !== lastFrame.endTime || frame.startTime > frame.endTime)) {\n console.assert(\n false, `Inconsistent frame time for frame ${this.#frames.length} (${frame.startTime} - ${frame.endTime})`);\n }\n this.#frames.push(frame);\n if (typeof frame.mainFrameId === 'number') {\n this.#frameById[frame.mainFrameId] = frame;\n }\n }\n\n #commitPendingFrame(): void {\n if (!this.#framePendingActivation || !this.#lastFrame) {\n return;\n }\n\n this.#lastFrame.paints = this.#framePendingActivation.paints;\n this.#lastFrame.mainFrameId = this.#framePendingActivation.mainFrameId;\n this.#framePendingActivation = null;\n }\n\n #addTraceEvents(\n events: readonly Types.TraceEvents.TraceEventData[], threadData: {\n pid: Types.TraceEvents.ProcessID,\n tid: Types.TraceEvents.ThreadID,\n startTime: Types.Timing.MicroSeconds,\n }[],\n mainFrameId: string): void {\n let j = 0;\n this.#activeThreadId = threadData.length && threadData[0].tid || null;\n this.#activeProcessId = threadData.length && threadData[0].pid || null;\n for (let i = 0; i < events.length; ++i) {\n while (j + 1 < threadData.length && threadData[j + 1].startTime <= events[i].ts) {\n this.#activeThreadId = threadData[++j].tid;\n this.#activeProcessId = threadData[j].pid;\n }\n this.#addTraceEvent(events[i], mainFrameId);\n }\n this.#activeThreadId = null;\n this.#activeProcessId = null;\n }\n\n #addTraceEvent(event: Types.TraceEvents.TraceEventData, mainFrameId: string): void {\n if (Types.TraceEvents.isTraceEventSetLayerId(event) && event.args.data.frame === mainFrameId) {\n this.#layerTreeId = event.args.data.layerTreeId;\n } else if (\n Types.TraceEvents.isTraceEventLayerTreeHostImplSnapshot(event) && Number(event.id) === this.#layerTreeId) {\n this.#handleLayerTreeSnapshot({\n entry: event,\n paints: [],\n });\n } else {\n if (isFrameEvent(event)) {\n this.#processCompositorEvents(event);\n }\n // Make sure we only use events from the main thread: we check the PID as\n // well in case two processes have a thread with the same TID.\n if (event.tid === this.#activeThreadId && event.pid === this.#activeProcessId) {\n this.#addMainThreadTraceEvent(event);\n }\n }\n }\n\n #processCompositorEvents(entry: FrameEvent): void {\n if (entry.args['layerTreeId'] !== this.#layerTreeId) {\n return;\n }\n if (Types.TraceEvents.isTraceEventBeginFrame(entry)) {\n this.#handleBeginFrame(entry.ts, entry.args['frameSeqId']);\n } else if (Types.TraceEvents.isTraceEventDrawFrame(entry)) {\n this.#handleDrawFrame(entry.ts, entry.args['frameSeqId']);\n } else if (Types.TraceEvents.isTraceEventActivateLayerTree(entry)) {\n this.#handleActivateLayerTree();\n } else if (Types.TraceEvents.isTraceEventRequestMainThreadFrame(entry)) {\n this.#handleRequestMainThreadFrame();\n } else if (Types.TraceEvents.isTraceEventNeedsBeginFrameChanged(entry)) {\n // needsBeginFrame property will either be 0 or 1, which represents\n // true/false in this case, hence the Boolean() wrapper.\n this.#handleNeedFrameChanged(entry.ts, entry.args['data'] && Boolean(entry.args['data']['needsBeginFrame']));\n } else if (Types.TraceEvents.isTraceEventDroppedFrame(entry)) {\n this.#handleDroppedFrame(entry.ts, entry.args['frameSeqId'], Boolean(entry.args['hasPartialUpdate']));\n }\n }\n\n #addMainThreadTraceEvent(entry: Types.TraceEvents.TraceEventData): void {\n if (entryIsTopLevel(entry)) {\n this.#lastTaskBeginTime = entry.ts;\n }\n if (!this.#framePendingCommit && MAIN_FRAME_MARKERS.has(entry.name as Types.TraceEvents.KnownEventName)) {\n this.#framePendingCommit = new PendingFrame(this.#lastTaskBeginTime || entry.ts);\n }\n if (!this.#framePendingCommit) {\n return;\n }\n\n if (Types.TraceEvents.isTraceEventBeginMainThreadFrame(entry) && entry.args.data.frameId) {\n this.#framePendingCommit.mainFrameId = entry.args.data.frameId;\n }\n if (Types.TraceEvents.isTraceEventPaint(entry)) {\n const snapshot = this.#layerTreeData.paintsToSnapshots.get(entry);\n if (snapshot) {\n this.#framePendingCommit.paints.push(new LayerPaintEvent(entry, snapshot));\n }\n }\n // Commit will be replacing CompositeLayers but CompositeLayers is kept\n // around for backwards compatibility.\n if ((Types.TraceEvents.isTraceEventCompositeLayers(entry) || Types.TraceEvents.isTraceEventCommit(entry)) &&\n entry.args['layerTreeId'] === this.#layerTreeId) {\n this.#handleCommit();\n }\n }\n}\n\nconst MAIN_FRAME_MARKERS = new Set<Types.TraceEvents.KnownEventName>([\n Types.TraceEvents.KnownEventName.ScheduleStyleRecalculation,\n Types.TraceEvents.KnownEventName.InvalidateLayout,\n Types.TraceEvents.KnownEventName.BeginMainThreadFrame,\n Types.TraceEvents.KnownEventName.ScrollLayer,\n]);\n\nexport interface FrameLayerTreeData {\n entry: Types.TraceEvents.TraceEventLayerTreeHostImplSnapshot;\n paints: LayerPaintEvent[];\n}\n\nexport class TimelineFrame {\n startTime: Types.Timing.MicroSeconds;\n startTimeOffset: Types.Timing.MicroSeconds;\n endTime: Types.Timing.MicroSeconds;\n duration: Types.Timing.MicroSeconds;\n idle: boolean;\n dropped: boolean;\n isPartial: boolean;\n layerTree: FrameLayerTreeData|null;\n paints: LayerPaintEvent[];\n mainFrameId: number|undefined;\n readonly seqId: number;\n\n constructor(seqId: number, startTime: Types.Timing.MicroSeconds, startTimeOffset: Types.Timing.MicroSeconds) {\n this.seqId = seqId;\n this.startTime = startTime;\n this.startTimeOffset = startTimeOffset;\n this.endTime = this.startTime;\n this.duration = Types.Timing.MicroSeconds(0);\n this.idle = false;\n this.dropped = false;\n this.isPartial = false;\n this.layerTree = null;\n this.paints = [];\n this.mainFrameId = undefined;\n }\n\n setEndTime(endTime: Types.Timing.MicroSeconds): void {\n this.endTime = endTime;\n this.duration = Types.Timing.MicroSeconds(this.endTime - this.startTime);\n }\n\n setLayerTree(layerTree: FrameLayerTreeData|null): void {\n this.layerTree = layerTree;\n }\n}\n\nexport interface LayerPaintEventPicture {\n rect: Array<number>;\n serializedPicture: string;\n}\nexport class LayerPaintEvent {\n readonly #event: Types.TraceEvents.TraceEventPaint;\n #snapshot: Types.TraceEvents.TraceEventDisplayItemListSnapshot;\n\n constructor(event: Types.TraceEvents.TraceEventPaint, snapshot: Types.TraceEvents.TraceEventDisplayItemListSnapshot) {\n this.#event = event;\n this.#snapshot = snapshot;\n }\n\n layerId(): number {\n return this.#event.args.data.layerId;\n }\n\n event(): Types.TraceEvents.TraceEventPaint {\n return this.#event;\n }\n\n picture(): LayerPaintEventPicture|null {\n const rect = this.#snapshot.args.snapshot.params?.layer_rect;\n const pictureData = this.#snapshot.args.snapshot.skp64;\n return rect && pictureData ? {rect: rect, serializedPicture: pictureData} : null;\n }\n}\n\nexport class PendingFrame {\n paints: LayerPaintEvent[];\n mainFrameId: number|undefined;\n triggerTime: number;\n constructor(triggerTime: number) {\n this.paints = [];\n this.mainFrameId = undefined;\n this.triggerTime = triggerTime;\n }\n}\n\n// The parameters of an impl-side BeginFrame.\nclass BeginFrameInfo {\n seqId: number;\n startTime: Types.Timing.MicroSeconds;\n isDropped: boolean;\n isPartial: boolean;\n constructor(seqId: number, startTime: Types.Timing.MicroSeconds, isDropped: boolean, isPartial: boolean) {\n this.seqId = seqId;\n this.startTime = startTime;\n this.isDropped = isDropped;\n this.isPartial = isPartial;\n }\n}\n\n// A queue of BeginFrames pending visualization.\n// BeginFrames are added into this queue as they occur; later when their\n// corresponding DrawFrames occur (or lack thereof), the BeginFrames are removed\n// from the queue and their timestamps are used for visualization.\nexport class TimelineFrameBeginFrameQueue {\n private queueFrames: number[] = [];\n\n // Maps frameSeqId to BeginFrameInfo.\n private mapFrames: {\n [x: number]: BeginFrameInfo,\n } = {};\n\n // Add a BeginFrame to the queue, if it does not already exit.\n addFrameIfNotExists(seqId: number, startTime: Types.Timing.MicroSeconds, isDropped: boolean, isPartial: boolean):\n void {\n if (!(seqId in this.mapFrames)) {\n this.mapFrames[seqId] = new BeginFrameInfo(seqId, startTime, isDropped, isPartial);\n this.queueFrames.push(seqId);\n }\n }\n\n // Set a BeginFrame in queue as dropped.\n setDropped(seqId: number, isDropped: boolean): void {\n if (seqId in this.mapFrames) {\n this.mapFrames[seqId].isDropped = isDropped;\n }\n }\n\n setPartial(seqId: number, isPartial: boolean): void {\n if (seqId in this.mapFrames) {\n this.mapFrames[seqId].isPartial = isPartial;\n }\n }\n\n processPendingBeginFramesOnDrawFrame(seqId: number): BeginFrameInfo[] {\n const framesToVisualize: BeginFrameInfo[] = [];\n\n // Do not visualize this frame in the rare case where the current DrawFrame\n // does not have a corresponding BeginFrame.\n if (seqId in this.mapFrames) {\n // Pop all BeginFrames before the current frame, and add only the dropped\n // ones in |frames_to_visualize|.\n // Non-dropped frames popped here are BeginFrames that are never\n // drawn (but not considered dropped either for some reason).\n // Those frames do not require an proactive visualization effort and will\n // be naturally presented as continuationss of other frames.\n while (this.queueFrames[0] !== seqId) {\n const currentSeqId = this.queueFrames[0];\n if (this.mapFrames[currentSeqId].isDropped) {\n framesToVisualize.push(this.mapFrames[currentSeqId]);\n }\n\n delete this.mapFrames[currentSeqId];\n this.queueFrames.shift();\n }\n\n // Pop the BeginFrame associated with the current DrawFrame.\n framesToVisualize.push(this.mapFrames[seqId]);\n delete this.mapFrames[seqId];\n this.queueFrames.shift();\n }\n return framesToVisualize;\n }\n}\n\nexport function framesWithinWindow(\n frames: readonly TimelineFrame[], startTime: Types.Timing.MicroSeconds,\n endTime: Types.Timing.MicroSeconds): TimelineFrame[] {\n const firstFrame = Platform.ArrayUtilities.lowerBound(frames, startTime || 0, (time, frame) => time - frame.endTime);\n const lastFrame =\n Platform.ArrayUtilities.lowerBound(frames, endTime || Infinity, (time, frame) => time - frame.startTime);\n return frames.slice(firstFrame, lastFrame);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
1
|
+
{"version":3,"file":"FramesHandler.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/handlers/FramesHandler.ts"],"names":[],"mappings":"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","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\nimport * as Platform from '../../../core/platform/platform.js';\nimport * as Helpers from '../helpers/helpers.js';\nimport * as Types from '../types/types.js';\n\nimport {type AuctionWorkletsData, data as auctionWorkletsData} from './AuctionWorkletsHandler.js';\nimport {data as layerTreeHandlerData, type LayerTreeData} from './LayerTreeHandler.js';\nimport {data as metaHandlerData, type MetaHandlerData} from './MetaHandler.js';\nimport {data as rendererHandlerData, type RendererHandlerData} from './RendererHandler.js';\nimport * as Threads from './Threads.js';\nimport {HandlerState, type TraceEventHandlerName} from './types.js';\n\n/**\n * IMPORTANT: this handler is slightly different to the rest. This is because\n * it is an adaptation of the TimelineFrameModel that has been used in DevTools\n * for many years. Rather than re-implement all the logic from scratch, instead\n * this handler gathers up the events and instantitates the class in the\n * finalize() method. Once the class has parsed all events, it is used to then\n * return the array of frames.\n *\n * In time we expect to migrate this code to a more \"typical\" handler.\n */\nlet handlerState = HandlerState.UNINITIALIZED;\n\nconst allEvents: Types.TraceEvents.TraceEventData[] = [];\nlet model: TimelineFrameModel|null = null;\n\nexport function reset(): void {\n handlerState = HandlerState.UNINITIALIZED;\n allEvents.length = 0;\n}\nexport function initialize(): void {\n if (handlerState !== HandlerState.UNINITIALIZED) {\n throw new Error('FramesHandler was not reset before being initialized');\n }\n\n handlerState = HandlerState.INITIALIZED;\n}\n\nexport function handleEvent(event: Types.TraceEvents.TraceEventData): void {\n allEvents.push(event);\n}\n\nexport async function finalize(): Promise<void> {\n if (handlerState !== HandlerState.INITIALIZED) {\n throw new Error('FramesHandler is not initialized');\n }\n\n // Snapshot events can be emitted out of order, so we need to sort before\n // building the frames model.\n Helpers.Trace.sortTraceEventsInPlace(allEvents);\n\n const modelForTrace = new TimelineFrameModel(\n allEvents,\n rendererHandlerData(),\n auctionWorkletsData(),\n metaHandlerData(),\n layerTreeHandlerData(),\n );\n model = modelForTrace;\n}\n\nexport interface FramesData {\n frames: readonly TimelineFrame[];\n framesById: Readonly<Record<number, TimelineFrame|undefined>>;\n}\n\nexport function data(): FramesData {\n return {\n frames: model ? Array.from(model.frames()) : [],\n framesById: model ? {...model.framesById()} : {},\n };\n}\n\nexport function deps(): TraceEventHandlerName[] {\n return ['Meta', 'Renderer', 'AuctionWorklets', 'LayerTree'];\n}\n\ntype FrameEvent = Types.TraceEvents.TraceEventBeginFrame|Types.TraceEvents.TraceEventDroppedFrame|\n Types.TraceEvents.TraceEventRequestMainThreadFrame|\n Types.TraceEvents.TraceEventBeginMainThreadFrame|Types.TraceEvents.TraceEventCommit|\n Types.TraceEvents.TraceEventCompositeLayers|Types.TraceEvents.TraceEventActivateLayerTree|\n Types.TraceEvents.TraceEventNeedsBeginFrameChanged|Types.TraceEvents.TraceEventDrawFrame;\n\nfunction isFrameEvent(event: Types.TraceEvents.TraceEventData): event is FrameEvent {\n return (\n Types.TraceEvents.isTraceEventSetLayerId(event) || Types.TraceEvents.isTraceEventBeginFrame(event) ||\n Types.TraceEvents.isTraceEventDroppedFrame(event) ||\n Types.TraceEvents.isTraceEventRequestMainThreadFrame(event) ||\n Types.TraceEvents.isTraceEventBeginMainThreadFrame(event) ||\n Types.TraceEvents.isTraceEventNeedsBeginFrameChanged(event) ||\n // Note that \"Commit\" is the replacement for \"CompositeLayers\" so in a trace\n // we wouldn't expect to see a combination of these. All \"new\" trace\n // recordings use \"Commit\", but we can easily support \"CompositeLayers\" too\n // to not break older traces being imported.\n Types.TraceEvents.isTraceEventCommit(event) || Types.TraceEvents.isTraceEventCompositeLayers(event) ||\n Types.TraceEvents.isTraceEventActivateLayerTree(event) || Types.TraceEvents.isTraceEventDrawFrame(event));\n}\n\nfunction entryIsTopLevel(entry: Types.TraceEvents.TraceEventData): boolean {\n const devtoolsTimelineCategory = 'disabled-by-default-devtools.timeline';\n return entry.name === Types.TraceEvents.KnownEventName.RunTask && entry.cat.includes(devtoolsTimelineCategory);\n}\n\nexport class TimelineFrameModel {\n #frames: TimelineFrame[] = [];\n #frameById: {\n [x: number]: TimelineFrame,\n } = {};\n #beginFrameQueue: TimelineFrameBeginFrameQueue = new TimelineFrameBeginFrameQueue();\n #lastFrame: TimelineFrame|null = null;\n #mainFrameCommitted = false;\n #mainFrameRequested = false;\n #lastLayerTree: FrameLayerTreeData|null = null;\n #framePendingActivation: PendingFrame|null = null;\n #framePendingCommit: PendingFrame|null = null;\n #lastBeginFrame: number|null = null;\n #lastNeedsBeginFrame: number|null = null;\n #lastTaskBeginTime: Types.Timing.MicroSeconds|null = null;\n #layerTreeId: number|null = null;\n #activeProcessId: Types.TraceEvents.ProcessID|null = null;\n #activeThreadId: Types.TraceEvents.ThreadID|null = null;\n #layerTreeData: LayerTreeData;\n\n constructor(\n allEvents: readonly Types.TraceEvents.TraceEventData[], rendererData: RendererHandlerData,\n auctionWorkletsData: AuctionWorkletsData, metaData: MetaHandlerData, layerTreeData: LayerTreeData) {\n // We only care about getting threads from the Renderer, not Samples,\n // because Frames don't exist in a CPU Profile (which won't have Renderer\n // threads.)\n const mainThreads = Threads.threadsInRenderer(rendererData, auctionWorkletsData).filter(thread => {\n return thread.type === Threads.ThreadType.MAIN_THREAD && thread.processIsOnMainFrame;\n });\n const threadData = mainThreads.map(thread => {\n return {\n tid: thread.tid,\n pid: thread.pid,\n startTime: thread.entries[0].ts,\n };\n });\n\n this.#layerTreeData = layerTreeData;\n this.#addTraceEvents(allEvents, threadData, metaData.mainFrameId);\n }\n\n framesById(): Readonly<Record<number, TimelineFrame|undefined>> {\n return this.#frameById;\n }\n\n frames(): TimelineFrame[] {\n return this.#frames;\n }\n\n #handleBeginFrame(startTime: Types.Timing.MicroSeconds, seqId: number): void {\n if (!this.#lastFrame) {\n this.#startFrame(startTime, seqId);\n }\n this.#lastBeginFrame = startTime;\n\n this.#beginFrameQueue.addFrameIfNotExists(seqId, startTime, false, false);\n }\n\n #handleDroppedFrame(startTime: Types.Timing.MicroSeconds, seqId: number, isPartial: boolean): void {\n if (!this.#lastFrame) {\n this.#startFrame(startTime, seqId);\n }\n\n // This line handles the case where no BeginFrame event is issued for\n // the dropped frame. In this situation, add a BeginFrame to the queue\n // as if it actually occurred.\n this.#beginFrameQueue.addFrameIfNotExists(seqId, startTime, true, isPartial);\n this.#beginFrameQueue.setDropped(seqId, true);\n this.#beginFrameQueue.setPartial(seqId, isPartial);\n }\n\n #handleDrawFrame(startTime: Types.Timing.MicroSeconds, seqId: number): void {\n if (!this.#lastFrame) {\n this.#startFrame(startTime, seqId);\n return;\n }\n\n // - if it wasn't drawn, it didn't happen!\n // - only show frames that either did not wait for the main thread frame or had one committed.\n if (this.#mainFrameCommitted || !this.#mainFrameRequested) {\n if (this.#lastNeedsBeginFrame) {\n const idleTimeEnd = this.#framePendingActivation ? this.#framePendingActivation.triggerTime :\n (this.#lastBeginFrame || this.#lastNeedsBeginFrame);\n if (idleTimeEnd > this.#lastFrame.startTime) {\n this.#lastFrame.idle = true;\n this.#lastBeginFrame = null;\n }\n this.#lastNeedsBeginFrame = null;\n }\n\n const framesToVisualize = this.#beginFrameQueue.processPendingBeginFramesOnDrawFrame(seqId);\n\n // Visualize the current frame and all pending frames before it.\n for (const frame of framesToVisualize) {\n const isLastFrameIdle = this.#lastFrame.idle;\n\n // If |frame| is the first frame after an idle period, the CPU time\n // will be logged (\"committed\") under |frame| if applicable.\n this.#startFrame(frame.startTime, seqId);\n if (isLastFrameIdle && this.#framePendingActivation) {\n this.#commitPendingFrame();\n }\n if (frame.isDropped) {\n this.#lastFrame.dropped = true;\n }\n if (frame.isPartial) {\n this.#lastFrame.isPartial = true;\n }\n }\n }\n this.#mainFrameCommitted = false;\n }\n\n #handleActivateLayerTree(): void {\n if (!this.#lastFrame) {\n return;\n }\n if (this.#framePendingActivation && !this.#lastNeedsBeginFrame) {\n this.#commitPendingFrame();\n }\n }\n\n #handleRequestMainThreadFrame(): void {\n if (!this.#lastFrame) {\n return;\n }\n this.#mainFrameRequested = true;\n }\n\n #handleCommit(): void {\n if (!this.#framePendingCommit) {\n return;\n }\n this.#framePendingActivation = this.#framePendingCommit;\n this.#framePendingCommit = null;\n this.#mainFrameRequested = false;\n this.#mainFrameCommitted = true;\n }\n\n #handleLayerTreeSnapshot(layerTree: FrameLayerTreeData): void {\n this.#lastLayerTree = layerTree;\n }\n\n #handleNeedFrameChanged(startTime: Types.Timing.MicroSeconds, needsBeginFrame: boolean): void {\n if (needsBeginFrame) {\n this.#lastNeedsBeginFrame = startTime;\n }\n }\n\n #startFrame(startTime: Types.Timing.MicroSeconds, seqId: number): void {\n if (this.#lastFrame) {\n this.#flushFrame(this.#lastFrame, startTime);\n }\n this.#lastFrame =\n new TimelineFrame(seqId, startTime, Types.Timing.MicroSeconds(startTime - metaHandlerData().traceBounds.min));\n }\n\n #flushFrame(frame: TimelineFrame, endTime: Types.Timing.MicroSeconds): void {\n frame.setLayerTree(this.#lastLayerTree);\n frame.setEndTime(endTime);\n if (this.#lastLayerTree) {\n this.#lastLayerTree.paints = frame.paints;\n }\n const lastFrame = this.#frames[this.#frames.length - 1];\n if (this.#frames.length && lastFrame &&\n (frame.startTime !== lastFrame.endTime || frame.startTime > frame.endTime)) {\n console.assert(\n false, `Inconsistent frame time for frame ${this.#frames.length} (${frame.startTime} - ${frame.endTime})`);\n }\n this.#frames.push(frame);\n if (typeof frame.mainFrameId === 'number') {\n this.#frameById[frame.mainFrameId] = frame;\n }\n }\n\n #commitPendingFrame(): void {\n if (!this.#framePendingActivation || !this.#lastFrame) {\n return;\n }\n\n this.#lastFrame.paints = this.#framePendingActivation.paints;\n this.#lastFrame.mainFrameId = this.#framePendingActivation.mainFrameId;\n this.#framePendingActivation = null;\n }\n\n #addTraceEvents(\n events: readonly Types.TraceEvents.TraceEventData[], threadData: {\n pid: Types.TraceEvents.ProcessID,\n tid: Types.TraceEvents.ThreadID,\n startTime: Types.Timing.MicroSeconds,\n }[],\n mainFrameId: string): void {\n let j = 0;\n this.#activeThreadId = threadData.length && threadData[0].tid || null;\n this.#activeProcessId = threadData.length && threadData[0].pid || null;\n for (let i = 0; i < events.length; ++i) {\n while (j + 1 < threadData.length && threadData[j + 1].startTime <= events[i].ts) {\n this.#activeThreadId = threadData[++j].tid;\n this.#activeProcessId = threadData[j].pid;\n }\n this.#addTraceEvent(events[i], mainFrameId);\n }\n this.#activeThreadId = null;\n this.#activeProcessId = null;\n }\n\n #addTraceEvent(event: Types.TraceEvents.TraceEventData, mainFrameId: string): void {\n if (Types.TraceEvents.isTraceEventSetLayerId(event) && event.args.data.frame === mainFrameId) {\n this.#layerTreeId = event.args.data.layerTreeId;\n } else if (\n Types.TraceEvents.isTraceEventLayerTreeHostImplSnapshot(event) && Number(event.id) === this.#layerTreeId) {\n this.#handleLayerTreeSnapshot({\n entry: event,\n paints: [],\n });\n } else {\n if (isFrameEvent(event)) {\n this.#processCompositorEvents(event);\n }\n // Make sure we only use events from the main thread: we check the PID as\n // well in case two processes have a thread with the same TID.\n if (event.tid === this.#activeThreadId && event.pid === this.#activeProcessId) {\n this.#addMainThreadTraceEvent(event);\n }\n }\n }\n\n #processCompositorEvents(entry: FrameEvent): void {\n if (entry.args['layerTreeId'] !== this.#layerTreeId) {\n return;\n }\n if (Types.TraceEvents.isTraceEventBeginFrame(entry)) {\n this.#handleBeginFrame(entry.ts, entry.args['frameSeqId']);\n } else if (Types.TraceEvents.isTraceEventDrawFrame(entry)) {\n this.#handleDrawFrame(entry.ts, entry.args['frameSeqId']);\n } else if (Types.TraceEvents.isTraceEventActivateLayerTree(entry)) {\n this.#handleActivateLayerTree();\n } else if (Types.TraceEvents.isTraceEventRequestMainThreadFrame(entry)) {\n this.#handleRequestMainThreadFrame();\n } else if (Types.TraceEvents.isTraceEventNeedsBeginFrameChanged(entry)) {\n // needsBeginFrame property will either be 0 or 1, which represents\n // true/false in this case, hence the Boolean() wrapper.\n this.#handleNeedFrameChanged(entry.ts, entry.args['data'] && Boolean(entry.args['data']['needsBeginFrame']));\n } else if (Types.TraceEvents.isTraceEventDroppedFrame(entry)) {\n this.#handleDroppedFrame(entry.ts, entry.args['frameSeqId'], Boolean(entry.args['hasPartialUpdate']));\n }\n }\n\n #addMainThreadTraceEvent(entry: Types.TraceEvents.TraceEventData): void {\n if (entryIsTopLevel(entry)) {\n this.#lastTaskBeginTime = entry.ts;\n }\n if (!this.#framePendingCommit && MAIN_FRAME_MARKERS.has(entry.name as Types.TraceEvents.KnownEventName)) {\n this.#framePendingCommit = new PendingFrame(this.#lastTaskBeginTime || entry.ts);\n }\n if (!this.#framePendingCommit) {\n return;\n }\n\n if (Types.TraceEvents.isTraceEventBeginMainThreadFrame(entry) && entry.args.data.frameId) {\n this.#framePendingCommit.mainFrameId = entry.args.data.frameId;\n }\n if (Types.TraceEvents.isTraceEventPaint(entry)) {\n const snapshot = this.#layerTreeData.paintsToSnapshots.get(entry);\n if (snapshot) {\n this.#framePendingCommit.paints.push(new LayerPaintEvent(entry, snapshot));\n }\n }\n // Commit will be replacing CompositeLayers but CompositeLayers is kept\n // around for backwards compatibility.\n if ((Types.TraceEvents.isTraceEventCompositeLayers(entry) || Types.TraceEvents.isTraceEventCommit(entry)) &&\n entry.args['layerTreeId'] === this.#layerTreeId) {\n this.#handleCommit();\n }\n }\n}\n\nconst MAIN_FRAME_MARKERS = new Set<Types.TraceEvents.KnownEventName>([\n Types.TraceEvents.KnownEventName.ScheduleStyleRecalculation,\n Types.TraceEvents.KnownEventName.InvalidateLayout,\n Types.TraceEvents.KnownEventName.BeginMainThreadFrame,\n Types.TraceEvents.KnownEventName.ScrollLayer,\n]);\n\nexport interface FrameLayerTreeData {\n entry: Types.TraceEvents.TraceEventLayerTreeHostImplSnapshot;\n paints: LayerPaintEvent[];\n}\n\nexport class TimelineFrame {\n startTime: Types.Timing.MicroSeconds;\n startTimeOffset: Types.Timing.MicroSeconds;\n endTime: Types.Timing.MicroSeconds;\n duration: Types.Timing.MicroSeconds;\n idle: boolean;\n dropped: boolean;\n isPartial: boolean;\n layerTree: FrameLayerTreeData|null;\n paints: LayerPaintEvent[];\n mainFrameId: number|undefined;\n readonly seqId: number;\n\n constructor(seqId: number, startTime: Types.Timing.MicroSeconds, startTimeOffset: Types.Timing.MicroSeconds) {\n this.seqId = seqId;\n this.startTime = startTime;\n this.startTimeOffset = startTimeOffset;\n this.endTime = this.startTime;\n this.duration = Types.Timing.MicroSeconds(0);\n this.idle = false;\n this.dropped = false;\n this.isPartial = false;\n this.layerTree = null;\n this.paints = [];\n this.mainFrameId = undefined;\n }\n\n setEndTime(endTime: Types.Timing.MicroSeconds): void {\n this.endTime = endTime;\n this.duration = Types.Timing.MicroSeconds(this.endTime - this.startTime);\n }\n\n setLayerTree(layerTree: FrameLayerTreeData|null): void {\n this.layerTree = layerTree;\n }\n}\n\nexport interface LayerPaintEventPicture {\n rect: Array<number>;\n serializedPicture: string;\n}\nexport class LayerPaintEvent {\n readonly #event: Types.TraceEvents.TraceEventPaint;\n #snapshot: Types.TraceEvents.TraceEventDisplayItemListSnapshot;\n\n constructor(event: Types.TraceEvents.TraceEventPaint, snapshot: Types.TraceEvents.TraceEventDisplayItemListSnapshot) {\n this.#event = event;\n this.#snapshot = snapshot;\n }\n\n layerId(): number {\n return this.#event.args.data.layerId;\n }\n\n event(): Types.TraceEvents.TraceEventPaint {\n return this.#event;\n }\n\n picture(): LayerPaintEventPicture|null {\n const rect = this.#snapshot.args.snapshot.params?.layer_rect;\n const pictureData = this.#snapshot.args.snapshot.skp64;\n return rect && pictureData ? {rect: rect, serializedPicture: pictureData} : null;\n }\n}\n\nexport class PendingFrame {\n paints: LayerPaintEvent[];\n mainFrameId: number|undefined;\n triggerTime: number;\n constructor(triggerTime: number) {\n this.paints = [];\n this.mainFrameId = undefined;\n this.triggerTime = triggerTime;\n }\n}\n\n// The parameters of an impl-side BeginFrame.\nclass BeginFrameInfo {\n seqId: number;\n startTime: Types.Timing.MicroSeconds;\n isDropped: boolean;\n isPartial: boolean;\n constructor(seqId: number, startTime: Types.Timing.MicroSeconds, isDropped: boolean, isPartial: boolean) {\n this.seqId = seqId;\n this.startTime = startTime;\n this.isDropped = isDropped;\n this.isPartial = isPartial;\n }\n}\n\n// A queue of BeginFrames pending visualization.\n// BeginFrames are added into this queue as they occur; later when their\n// corresponding DrawFrames occur (or lack thereof), the BeginFrames are removed\n// from the queue and their timestamps are used for visualization.\nexport class TimelineFrameBeginFrameQueue {\n private queueFrames: number[] = [];\n\n // Maps frameSeqId to BeginFrameInfo.\n private mapFrames: {\n [x: number]: BeginFrameInfo,\n } = {};\n\n // Add a BeginFrame to the queue, if it does not already exit.\n addFrameIfNotExists(seqId: number, startTime: Types.Timing.MicroSeconds, isDropped: boolean, isPartial: boolean):\n void {\n if (!(seqId in this.mapFrames)) {\n this.mapFrames[seqId] = new BeginFrameInfo(seqId, startTime, isDropped, isPartial);\n this.queueFrames.push(seqId);\n }\n }\n\n // Set a BeginFrame in queue as dropped.\n setDropped(seqId: number, isDropped: boolean): void {\n if (seqId in this.mapFrames) {\n this.mapFrames[seqId].isDropped = isDropped;\n }\n }\n\n setPartial(seqId: number, isPartial: boolean): void {\n if (seqId in this.mapFrames) {\n this.mapFrames[seqId].isPartial = isPartial;\n }\n }\n\n processPendingBeginFramesOnDrawFrame(seqId: number): BeginFrameInfo[] {\n const framesToVisualize: BeginFrameInfo[] = [];\n\n // Do not visualize this frame in the rare case where the current DrawFrame\n // does not have a corresponding BeginFrame.\n if (seqId in this.mapFrames) {\n // Pop all BeginFrames before the current frame, and add only the dropped\n // ones in |frames_to_visualize|.\n // Non-dropped frames popped here are BeginFrames that are never\n // drawn (but not considered dropped either for some reason).\n // Those frames do not require an proactive visualization effort and will\n // be naturally presented as continuationss of other frames.\n while (this.queueFrames[0] !== seqId) {\n const currentSeqId = this.queueFrames[0];\n if (this.mapFrames[currentSeqId].isDropped) {\n framesToVisualize.push(this.mapFrames[currentSeqId]);\n }\n\n delete this.mapFrames[currentSeqId];\n this.queueFrames.shift();\n }\n\n // Pop the BeginFrame associated with the current DrawFrame.\n framesToVisualize.push(this.mapFrames[seqId]);\n delete this.mapFrames[seqId];\n this.queueFrames.shift();\n }\n return framesToVisualize;\n }\n}\n\nexport function framesWithinWindow(\n frames: readonly TimelineFrame[], startTime: Types.Timing.MicroSeconds,\n endTime: Types.Timing.MicroSeconds): TimelineFrame[] {\n const firstFrame = Platform.ArrayUtilities.lowerBound(frames, startTime || 0, (time, frame) => time - frame.endTime);\n const lastFrame =\n Platform.ArrayUtilities.lowerBound(frames, endTime || Infinity, (time, frame) => time - frame.startTime);\n return frames.slice(firstFrame, lastFrame);\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type TraceEventHandlerName } from './types.js';
|
|
2
|
+
import * as Types from '../types/types.js';
|
|
3
|
+
export declare function reset(): void;
|
|
4
|
+
export declare function initialize(): void;
|
|
5
|
+
export declare function handleEvent(event: Types.TraceEvents.TraceEventData): void;
|
|
6
|
+
export declare function finalize(): Promise<void>;
|
|
7
|
+
export interface GPUHandlerReturnData {
|
|
8
|
+
mainGPUThreadTasks: readonly Types.TraceEvents.TraceEventGPUTask[];
|
|
9
|
+
}
|
|
10
|
+
export declare function data(): GPUHandlerReturnData;
|
|
11
|
+
export declare function deps(): TraceEventHandlerName[];
|
|
@@ -1,50 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
// Copyright 2022 The Chromium Authors. All rights reserved.
|
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
|
3
|
+
// found in the LICENSE file.
|
|
4
|
+
import { data as metaHandlerData } from './MetaHandler.js';
|
|
5
|
+
import * as Types from '../types/types.js';
|
|
6
|
+
import * as Helpers from '../helpers/helpers.js';
|
|
7
|
+
let handlerState = 1 /* HandlerState.UNINITIALIZED */;
|
|
8
|
+
// Each thread contains events. Events indicate the thread and process IDs, which are
|
|
9
|
+
// used to store the event in the correct process thread entry below.
|
|
10
|
+
const eventsInProcessThread = new Map();
|
|
7
11
|
let mainGPUThreadTasks = [];
|
|
8
12
|
export function reset() {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
13
|
+
eventsInProcessThread.clear();
|
|
14
|
+
mainGPUThreadTasks = [];
|
|
15
|
+
handlerState = 1 /* HandlerState.UNINITIALIZED */;
|
|
12
16
|
}
|
|
13
17
|
export function initialize() {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
+
if (handlerState !== 1 /* HandlerState.UNINITIALIZED */) {
|
|
19
|
+
throw new Error('GPU Handler was not reset before being initialized');
|
|
20
|
+
}
|
|
21
|
+
handlerState = 2 /* HandlerState.INITIALIZED */;
|
|
18
22
|
}
|
|
19
23
|
export function handleEvent(event) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
if (handlerState !== 2 /* HandlerState.INITIALIZED */) {
|
|
25
|
+
throw new Error('GPU Handler is not initialized');
|
|
26
|
+
}
|
|
27
|
+
if (!Types.TraceEvents.isTraceEventGPUTask(event)) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
Helpers.Trace.addEventToProcessThread(event, eventsInProcessThread);
|
|
27
31
|
}
|
|
28
32
|
export async function finalize() {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
if (handlerState !== 2 /* HandlerState.INITIALIZED */) {
|
|
34
|
+
throw new Error('GPU Handler is not initialized');
|
|
35
|
+
}
|
|
36
|
+
const { gpuProcessId, gpuThreadId } = metaHandlerData();
|
|
37
|
+
const gpuThreadsForProcess = eventsInProcessThread.get(gpuProcessId);
|
|
38
|
+
if (gpuThreadsForProcess && gpuThreadId) {
|
|
39
|
+
mainGPUThreadTasks = gpuThreadsForProcess.get(gpuThreadId) || [];
|
|
40
|
+
}
|
|
41
|
+
handlerState = 3 /* HandlerState.FINALIZED */;
|
|
38
42
|
}
|
|
39
43
|
export function data() {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
if (handlerState !== 3 /* HandlerState.FINALIZED */) {
|
|
45
|
+
throw new Error('GPU Handler is not finalized');
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
mainGPUThreadTasks: [...mainGPUThreadTasks],
|
|
49
|
+
};
|
|
46
50
|
}
|
|
47
51
|
export function deps() {
|
|
48
|
-
|
|
52
|
+
return ['Meta'];
|
|
49
53
|
}
|
|
50
|
-
//# sourceMappingURL=GPUHandler.js.map
|
|
54
|
+
//# sourceMappingURL=GPUHandler.js.map
|
|
@@ -1,7 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../../front_end/models/trace/handlers/GPUHandler.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright 2022 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport {data as metaHandlerData} from './MetaHandler.js';\n\nimport {type TraceEventHandlerName, HandlerState} from './types.js';\n\nimport * as Types from '../types/types.js';\nimport * as Helpers from '../helpers/helpers.js';\n\nlet handlerState = HandlerState.UNINITIALIZED;\n\n// Each thread contains events. Events indicate the thread and process IDs, which are\n// used to store the event in the correct process thread entry below.\nconst eventsInProcessThread =\n new Map<Types.TraceEvents.ProcessID, Map<Types.TraceEvents.ThreadID, Types.TraceEvents.TraceEventGPUTask[]>>();\n\nlet mainGPUThreadTasks: Types.TraceEvents.TraceEventGPUTask[] = [];\n\nexport function reset(): void {\n eventsInProcessThread.clear();\n mainGPUThreadTasks = [];\n\n handlerState = HandlerState.UNINITIALIZED;\n}\n\nexport function initialize(): void {\n if (handlerState !== HandlerState.UNINITIALIZED) {\n throw new Error('GPU Handler was not reset before being initialized');\n }\n\n handlerState = HandlerState.INITIALIZED;\n}\n\nexport function handleEvent(event: Types.TraceEvents.TraceEventData): void {\n if (handlerState !== HandlerState.INITIALIZED) {\n throw new Error('GPU Handler is not initialized');\n }\n\n if (!Types.TraceEvents.isTraceEventGPUTask(event)) {\n return;\n }\n\n Helpers.Trace.addEventToProcessThread(event, eventsInProcessThread);\n}\n\nexport async function finalize(): Promise<void> {\n if (handlerState !== HandlerState.INITIALIZED) {\n throw new Error('GPU Handler is not initialized');\n }\n\n const {gpuProcessId, gpuThreadId} = metaHandlerData();\n const gpuThreadsForProcess = eventsInProcessThread.get(gpuProcessId);\n if (gpuThreadsForProcess && gpuThreadId) {\n mainGPUThreadTasks = gpuThreadsForProcess.get(gpuThreadId) || [];\n }\n handlerState = HandlerState.FINALIZED;\n}\n\nexport interface GPUHandlerReturnData {\n mainGPUThreadTasks: readonly Types.TraceEvents.TraceEventGPUTask[];\n}\n\nexport function data(): GPUHandlerReturnData {\n if (handlerState !== HandlerState.FINALIZED) {\n throw new Error('GPU Handler is not finalized');\n }\n return {\n mainGPUThreadTasks: [...mainGPUThreadTasks],\n };\n}\n\nexport function deps(): TraceEventHandlerName[] {\n return ['Meta'];\n}\n"],
|
|
5
|
-
"mappings": "AAIA;AAEA;AAEA;AACA;AAEA,IAAI,eAAe,aAAa;AAIhC,MAAM,wBACF,oBAAI;AAER,IAAI,qBAA4D;AAEzD,wBAAuB;AAC5B,wBAAsB;AACtB,uBAAqB;AAErB,iBAAe,aAAa;AAAA;AAGvB,6BAA4B;AACjC,MAAI,iBAAiB,aAAa,eAAe;AAC/C,UAAM,IAAI,MAAM;AAAA;AAGlB,iBAAe,aAAa;AAAA;AAGvB,4BAAqB,OAA+C;AACzE,MAAI,iBAAiB,aAAa,aAAa;AAC7C,UAAM,IAAI,MAAM;AAAA;AAGlB,MAAI,CAAC,MAAM,YAAY,oBAAoB,QAAQ;AACjD;AAAA;AAGF,UAAQ,MAAM,wBAAwB,OAAO;AAAA;AAG/C,iCAAgD;AAC9C,MAAI,iBAAiB,aAAa,aAAa;AAC7C,UAAM,IAAI,MAAM;AAAA;AAGlB,QAAM,EAAC,cAAc,gBAAe;AACpC,QAAM,uBAAuB,sBAAsB,IAAI;AACvD,MAAI,wBAAwB,aAAa;AACvC,yBAAqB,qBAAqB,IAAI,gBAAgB;AAAA;AAEhE,iBAAe,aAAa;AAAA;AAOvB,uBAAsC;AAC3C,MAAI,iBAAiB,aAAa,WAAW;AAC3C,UAAM,IAAI,MAAM;AAAA;AAElB,SAAO;AAAA,IACL,oBAAoB,CAAC,GAAG;AAAA;AAAA;AAIrB,uBAAyC;AAC9C,SAAO,CAAC;AAAA;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
1
|
+
{"version":3,"file":"GPUHandler.js","sourceRoot":"","sources":["../../../../../../../front_end/models/trace/handlers/GPUHandler.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yEAAyE;AACzE,6BAA6B;AAE7B,OAAO,EAAC,IAAI,IAAI,eAAe,EAAC,MAAM,kBAAkB,CAAC;AAIzD,OAAO,KAAK,KAAK,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAC;AAEjD,IAAI,YAAY,qCAA6B,CAAC;AAE9C,qFAAqF;AACrF,qEAAqE;AACrE,MAAM,qBAAqB,GACvB,IAAI,GAAG,EAAuG,CAAC;AAEnH,IAAI,kBAAkB,GAA0C,EAAE,CAAC;AAEnE,MAAM,UAAU,KAAK;IACnB,qBAAqB,CAAC,KAAK,EAAE,CAAC;IAC9B,kBAAkB,GAAG,EAAE,CAAC;IAExB,YAAY,qCAA6B,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,YAAY,uCAA+B,EAAE;QAC/C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;KACvE;IAED,YAAY,mCAA2B,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAuC;IACjE,IAAI,YAAY,qCAA6B,EAAE;QAC7C,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;KACnD;IAED,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE;QACjD,OAAO;KACR;IAED,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,YAAY,qCAA6B,EAAE;QAC7C,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;KACnD;IAED,MAAM,EAAC,YAAY,EAAE,WAAW,EAAC,GAAG,eAAe,EAAE,CAAC;IACtD,MAAM,oBAAoB,GAAG,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACrE,IAAI,oBAAoB,IAAI,WAAW,EAAE;QACvC,kBAAkB,GAAG,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;KAClE;IACD,YAAY,iCAAyB,CAAC;AACxC,CAAC;AAMD,MAAM,UAAU,IAAI;IAClB,IAAI,YAAY,mCAA2B,EAAE;QAC3C,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;KACjD;IACD,OAAO;QACL,kBAAkB,EAAE,CAAC,GAAG,kBAAkB,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI;IAClB,OAAO,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC","sourcesContent":["// Copyright 2022 The Chromium Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style license that can be\n// found in the LICENSE file.\n\nimport {data as metaHandlerData} from './MetaHandler.js';\n\nimport {type TraceEventHandlerName, HandlerState} from './types.js';\n\nimport * as Types from '../types/types.js';\nimport * as Helpers from '../helpers/helpers.js';\n\nlet handlerState = HandlerState.UNINITIALIZED;\n\n// Each thread contains events. Events indicate the thread and process IDs, which are\n// used to store the event in the correct process thread entry below.\nconst eventsInProcessThread =\n new Map<Types.TraceEvents.ProcessID, Map<Types.TraceEvents.ThreadID, Types.TraceEvents.TraceEventGPUTask[]>>();\n\nlet mainGPUThreadTasks: Types.TraceEvents.TraceEventGPUTask[] = [];\n\nexport function reset(): void {\n eventsInProcessThread.clear();\n mainGPUThreadTasks = [];\n\n handlerState = HandlerState.UNINITIALIZED;\n}\n\nexport function initialize(): void {\n if (handlerState !== HandlerState.UNINITIALIZED) {\n throw new Error('GPU Handler was not reset before being initialized');\n }\n\n handlerState = HandlerState.INITIALIZED;\n}\n\nexport function handleEvent(event: Types.TraceEvents.TraceEventData): void {\n if (handlerState !== HandlerState.INITIALIZED) {\n throw new Error('GPU Handler is not initialized');\n }\n\n if (!Types.TraceEvents.isTraceEventGPUTask(event)) {\n return;\n }\n\n Helpers.Trace.addEventToProcessThread(event, eventsInProcessThread);\n}\n\nexport async function finalize(): Promise<void> {\n if (handlerState !== HandlerState.INITIALIZED) {\n throw new Error('GPU Handler is not initialized');\n }\n\n const {gpuProcessId, gpuThreadId} = metaHandlerData();\n const gpuThreadsForProcess = eventsInProcessThread.get(gpuProcessId);\n if (gpuThreadsForProcess && gpuThreadId) {\n mainGPUThreadTasks = gpuThreadsForProcess.get(gpuThreadId) || [];\n }\n handlerState = HandlerState.FINALIZED;\n}\n\nexport interface GPUHandlerReturnData {\n mainGPUThreadTasks: readonly Types.TraceEvents.TraceEventGPUTask[];\n}\n\nexport function data(): GPUHandlerReturnData {\n if (handlerState !== HandlerState.FINALIZED) {\n throw new Error('GPU Handler is not finalized');\n }\n return {\n mainGPUThreadTasks: [...mainGPUThreadTasks],\n };\n}\n\nexport function deps(): TraceEventHandlerName[] {\n return ['Meta'];\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as Types from '../types/types.js';
|
|
2
|
+
export declare function reset(): void;
|
|
3
|
+
export declare function initialize(): void;
|
|
4
|
+
export declare function handleEvent(event: Types.TraceEvents.TraceEventData): void;
|
|
5
|
+
export declare function finalize(): Promise<void>;
|
|
6
|
+
export interface InitiatorsData {
|
|
7
|
+
eventToInitiator: Map<Types.TraceEvents.TraceEventData, Types.TraceEvents.TraceEventData>;
|
|
8
|
+
initiatorToEvents: Map<Types.TraceEvents.TraceEventData, Types.TraceEvents.TraceEventData[]>;
|
|
9
|
+
}
|
|
10
|
+
export declare function data(): InitiatorsData;
|
|
@@ -1,133 +1,184 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const
|
|
1
|
+
// Copyright 2023 The Chromium Authors. All rights reserved.
|
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
|
3
|
+
// found in the LICENSE file.
|
|
4
|
+
import * as Helpers from '../helpers/helpers.js';
|
|
5
|
+
import * as Types from '../types/types.js';
|
|
6
|
+
let handlerState = 1 /* HandlerState.UNINITIALIZED */;
|
|
7
|
+
const lastScheduleStyleRecalcByFrame = new Map();
|
|
8
|
+
// This tracks the last event that is considered to have invalidated the layout
|
|
9
|
+
// for a given frame.
|
|
10
|
+
// Note that although there is an InvalidateLayout event, there are also other
|
|
11
|
+
// events (ScheduleStyleRecalculation) that could be the reason a layout was
|
|
12
|
+
// invalidated.
|
|
13
|
+
const lastInvalidationEventForFrame = new Map();
|
|
14
|
+
// Important: although the event is called UpdateLayoutTree, in the UI we
|
|
15
|
+
// present these to the user as "Recalculate Style". So don't get confused!
|
|
16
|
+
// These are the same - just UpdateLayoutTree is what the event from Chromium
|
|
17
|
+
// is called.
|
|
18
|
+
const lastUpdateLayoutTreeByFrame = new Map();
|
|
19
|
+
// These two maps store the same data but in different directions.
|
|
20
|
+
//
|
|
21
|
+
// For a given event, tell me what its initiator was. An event can only have one initiator.
|
|
22
|
+
const eventToInitiatorMap = new Map();
|
|
23
|
+
// For a given event, tell me what events it initiated. An event can initiate
|
|
24
|
+
// multiple events, hence why the value for this map is an array.
|
|
25
|
+
const initiatorToEventsMap = new Map();
|
|
26
|
+
const requestAnimationFrameEventsById = new Map();
|
|
27
|
+
const timerInstallEventsById = new Map();
|
|
28
|
+
const requestIdleCallbackEventsById = new Map();
|
|
29
|
+
const webSocketCreateEventsById = new Map();
|
|
14
30
|
export function reset() {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
31
|
+
lastScheduleStyleRecalcByFrame.clear();
|
|
32
|
+
lastInvalidationEventForFrame.clear();
|
|
33
|
+
lastUpdateLayoutTreeByFrame.clear();
|
|
34
|
+
timerInstallEventsById.clear();
|
|
35
|
+
eventToInitiatorMap.clear();
|
|
36
|
+
initiatorToEventsMap.clear();
|
|
37
|
+
requestAnimationFrameEventsById.clear();
|
|
38
|
+
requestIdleCallbackEventsById.clear();
|
|
39
|
+
webSocketCreateEventsById.clear();
|
|
40
|
+
handlerState = 1 /* HandlerState.UNINITIALIZED */;
|
|
25
41
|
}
|
|
26
42
|
export function initialize() {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
43
|
+
if (handlerState !== 1 /* HandlerState.UNINITIALIZED */) {
|
|
44
|
+
throw new Error('InitiatorsHandler was not reset before being initialized');
|
|
45
|
+
}
|
|
46
|
+
handlerState = 2 /* HandlerState.INITIALIZED */;
|
|
31
47
|
}
|
|
32
|
-
function storeInitiator(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
48
|
+
function storeInitiator(data) {
|
|
49
|
+
eventToInitiatorMap.set(data.event, data.initiator);
|
|
50
|
+
const eventsForInitiator = initiatorToEventsMap.get(data.initiator) || [];
|
|
51
|
+
eventsForInitiator.push(data.event);
|
|
52
|
+
initiatorToEventsMap.set(data.initiator, eventsForInitiator);
|
|
37
53
|
}
|
|
38
54
|
export function handleEvent(event) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
if (
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
55
|
+
if (Types.TraceEvents.isTraceEventScheduleStyleRecalculation(event)) {
|
|
56
|
+
lastScheduleStyleRecalcByFrame.set(event.args.data.frame, event);
|
|
57
|
+
}
|
|
58
|
+
else if (Types.TraceEvents.isTraceEventUpdateLayoutTree(event)) {
|
|
59
|
+
// IMPORTANT: although the trace event is called UpdateLayoutTree, this
|
|
60
|
+
// represents a Styles Recalculation. This event in the timeline is shown to
|
|
61
|
+
// the user as "Recalculate Styles."
|
|
62
|
+
if (event.args.beginData) {
|
|
63
|
+
// Store the last UpdateLayout event: we use this when we see an
|
|
64
|
+
// InvalidateLayout and try to figure out its initiator.
|
|
65
|
+
lastUpdateLayoutTreeByFrame.set(event.args.beginData.frame, event);
|
|
66
|
+
// If this frame has seen a ScheduleStyleRecalc event, then that event is
|
|
67
|
+
// considered to be the initiator of this StylesRecalc.
|
|
68
|
+
const scheduledStyleForFrame = lastScheduleStyleRecalcByFrame.get(event.args.beginData.frame);
|
|
69
|
+
if (scheduledStyleForFrame) {
|
|
70
|
+
storeInitiator({
|
|
71
|
+
event,
|
|
72
|
+
initiator: scheduledStyleForFrame,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
else if (Types.TraceEvents.isTraceEventInvalidateLayout(event)) {
|
|
78
|
+
// By default, the InvalidateLayout event is what triggered the layout invalidation for this frame.
|
|
79
|
+
let invalidationInitiator = event;
|
|
80
|
+
// However, if we have not had any prior invalidations for this frame, we
|
|
81
|
+
// want to consider StyleRecalculation events as they might be the actual
|
|
82
|
+
// cause of this layout invalidation.
|
|
83
|
+
if (!lastInvalidationEventForFrame.has(event.args.data.frame)) {
|
|
84
|
+
// 1. If we have not had an invalidation event for this frame
|
|
85
|
+
// 2. AND we have had an UpdateLayoutTree for this frame
|
|
86
|
+
// 3. AND the UpdateLayoutTree event ended AFTER the InvalidateLayout startTime
|
|
87
|
+
// 4. AND we have an initiator for the UpdateLayoutTree event
|
|
88
|
+
// 5. Then we set the last invalidation event for this frame to be the UpdateLayoutTree's initiator.
|
|
89
|
+
const lastUpdateLayoutTreeForFrame = lastUpdateLayoutTreeByFrame.get(event.args.data.frame);
|
|
90
|
+
if (lastUpdateLayoutTreeForFrame) {
|
|
91
|
+
const { endTime } = Helpers.Timing.eventTimingsMicroSeconds(lastUpdateLayoutTreeForFrame);
|
|
92
|
+
const initiatorOfUpdateLayout = eventToInitiatorMap.get(lastUpdateLayoutTreeForFrame);
|
|
93
|
+
if (initiatorOfUpdateLayout && endTime && endTime > event.ts) {
|
|
94
|
+
invalidationInitiator = initiatorOfUpdateLayout;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
lastInvalidationEventForFrame.set(event.args.data.frame, invalidationInitiator);
|
|
99
|
+
}
|
|
100
|
+
else if (Types.TraceEvents.isTraceEventLayout(event)) {
|
|
101
|
+
// The initiator of a Layout event is the last Invalidation event.
|
|
102
|
+
const lastInvalidation = lastInvalidationEventForFrame.get(event.args.beginData.frame);
|
|
103
|
+
if (lastInvalidation) {
|
|
104
|
+
storeInitiator({
|
|
105
|
+
event,
|
|
106
|
+
initiator: lastInvalidation,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// Now clear the last invalidation for the frame: the last invalidation has been linked to a Layout event, so it cannot be the initiator for any future layouts.
|
|
110
|
+
lastInvalidationEventForFrame.delete(event.args.beginData.frame);
|
|
51
111
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
112
|
+
else if (Types.TraceEvents.isTraceEventRequestAnimationFrame(event)) {
|
|
113
|
+
requestAnimationFrameEventsById.set(event.args.data.id, event);
|
|
114
|
+
}
|
|
115
|
+
else if (Types.TraceEvents.isTraceEventFireAnimationFrame(event)) {
|
|
116
|
+
// If we get a fire event, that means we should have had the
|
|
117
|
+
// RequestAnimationFrame event by now. If so, we can set that as the
|
|
118
|
+
// initiator for the fire event.
|
|
119
|
+
const matchingRequestEvent = requestAnimationFrameEventsById.get(event.args.data.id);
|
|
120
|
+
if (matchingRequestEvent) {
|
|
121
|
+
storeInitiator({
|
|
122
|
+
event,
|
|
123
|
+
initiator: matchingRequestEvent,
|
|
124
|
+
});
|
|
61
125
|
}
|
|
62
|
-
}
|
|
63
126
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const lastInvalidation = lastInvalidationEventForFrame.get(event.args.beginData.frame);
|
|
67
|
-
if (lastInvalidation) {
|
|
68
|
-
storeInitiator({
|
|
69
|
-
event,
|
|
70
|
-
initiator: lastInvalidation
|
|
71
|
-
});
|
|
127
|
+
else if (Types.TraceEvents.isTraceEventTimerInstall(event)) {
|
|
128
|
+
timerInstallEventsById.set(event.args.data.timerId, event);
|
|
72
129
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
if (matchingRequestEvent) {
|
|
79
|
-
storeInitiator({
|
|
80
|
-
event,
|
|
81
|
-
initiator: matchingRequestEvent
|
|
82
|
-
});
|
|
130
|
+
else if (Types.TraceEvents.isTraceEventTimerFire(event)) {
|
|
131
|
+
const matchingInstall = timerInstallEventsById.get(event.args.data.timerId);
|
|
132
|
+
if (matchingInstall) {
|
|
133
|
+
storeInitiator({ event, initiator: matchingInstall });
|
|
134
|
+
}
|
|
83
135
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
} else if (Types.TraceEvents.isTraceEventTimerFire(event)) {
|
|
87
|
-
const matchingInstall = timerInstallEventsById.get(event.args.data.timerId);
|
|
88
|
-
if (matchingInstall) {
|
|
89
|
-
storeInitiator({ event, initiator: matchingInstall });
|
|
136
|
+
else if (Types.TraceEvents.isTraceEventRequestIdleCallback(event)) {
|
|
137
|
+
requestIdleCallbackEventsById.set(event.args.data.id, event);
|
|
90
138
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
});
|
|
139
|
+
else if (Types.TraceEvents.isTraceEventFireIdleCallback(event)) {
|
|
140
|
+
const matchingRequestEvent = requestIdleCallbackEventsById.get(event.args.data.id);
|
|
141
|
+
if (matchingRequestEvent) {
|
|
142
|
+
storeInitiator({
|
|
143
|
+
event,
|
|
144
|
+
initiator: matchingRequestEvent,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
100
147
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
} else if (Types.TraceEvents.isTraceEventWebSocketSendHandshakeRequest(event)) {
|
|
104
|
-
const matchingCreateEvent = webSocketCreateEventsById.get(event.args.data.identifier);
|
|
105
|
-
if (matchingCreateEvent) {
|
|
106
|
-
storeInitiator({
|
|
107
|
-
event,
|
|
108
|
-
initiator: matchingCreateEvent
|
|
109
|
-
});
|
|
148
|
+
else if (Types.TraceEvents.isTraceEventWebSocketCreate(event)) {
|
|
149
|
+
webSocketCreateEventsById.set(event.args.data.identifier, event);
|
|
110
150
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
151
|
+
else if (Types.TraceEvents.isTraceEventWebSocketSendHandshakeRequest(event)) {
|
|
152
|
+
const matchingCreateEvent = webSocketCreateEventsById.get(event.args.data.identifier);
|
|
153
|
+
if (matchingCreateEvent) {
|
|
154
|
+
storeInitiator({
|
|
155
|
+
event,
|
|
156
|
+
initiator: matchingCreateEvent,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else if (Types.TraceEvents.isTraceEventWebSocketSendHandshakeRequest(event) ||
|
|
161
|
+
Types.TraceEvents.isTraceEventWebSocketReceiveHandshakeResponse(event) ||
|
|
162
|
+
Types.TraceEvents.isTraceEventWebSocketDestroy(event)) {
|
|
163
|
+
const matchingCreateEvent = webSocketCreateEventsById.get(event.args.data.identifier);
|
|
164
|
+
if (matchingCreateEvent) {
|
|
165
|
+
storeInitiator({
|
|
166
|
+
event,
|
|
167
|
+
initiator: matchingCreateEvent,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
118
170
|
}
|
|
119
|
-
}
|
|
120
171
|
}
|
|
121
172
|
export async function finalize() {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
173
|
+
if (handlerState !== 2 /* HandlerState.INITIALIZED */) {
|
|
174
|
+
throw new Error('InitiatorsHandler is not initialized');
|
|
175
|
+
}
|
|
176
|
+
handlerState = 3 /* HandlerState.FINALIZED */;
|
|
126
177
|
}
|
|
127
178
|
export function data() {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
179
|
+
return {
|
|
180
|
+
eventToInitiator: new Map(eventToInitiatorMap),
|
|
181
|
+
initiatorToEvents: new Map(initiatorToEventsMap),
|
|
182
|
+
};
|
|
132
183
|
}
|
|
133
|
-
//# sourceMappingURL=InitiatorsHandler.js.map
|
|
184
|
+
//# sourceMappingURL=InitiatorsHandler.js.map
|