@paulirish/trace_engine 0.0.10 → 0.0.11
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/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/extras/extras.js +0 -0
- package/trace.mjs +0 -6980
- package/trace.mjs.map +0 -8
|
@@ -1,7 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../front_end/models/trace/LegacyTracingModel.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright 2014 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//\n// This is what was SDK.TracingModel moved into models/trace to avoid circular dependency issues. Our ultimate goal is to remove this model entirely once the migration to the new model is done\n\nimport * as Helpers from './helpers/helpers.js';\nimport {type EventPayload} from './TracingManager.js';\nimport * as Types from './types/types.js';\n\ntype IgnoreListArgs = {\n [key: string]: string|number|ObjectSnapshot,\n};\n\nexport class TracingModel {\n readonly #title: string|undefined;\n readonly #processById: Map<string|number, Process>;\n readonly #processByName: Map<string, Process>;\n #minimumRecordTimeInternal: number;\n #maximumRecordTimeInternal: number;\n readonly #devToolsMetadataEventsInternal: Event[];\n #asyncEvents: AsyncEvent[];\n readonly #openAsyncEvents: Map<string, AsyncEvent>;\n readonly #openNestableAsyncEvents: Map<string, AsyncEvent[]>;\n readonly #profileGroups: Map<string, ProfileEventsGroup>;\n readonly #parsedCategories: Map<string, Set<string>>;\n readonly #allEventsPayload: EventPayload[] = [];\n\n constructor(title?: string) {\n this.#title = title;\n this.#processById = new Map();\n this.#processByName = new Map();\n this.#minimumRecordTimeInternal = Number(Infinity);\n this.#maximumRecordTimeInternal = Number(-Infinity);\n this.#devToolsMetadataEventsInternal = [];\n this.#asyncEvents = [];\n this.#openAsyncEvents = new Map();\n this.#openNestableAsyncEvents = new Map();\n this.#profileGroups = new Map();\n this.#parsedCategories = new Map();\n }\n\n static isTopLevelEvent(event: CompatibleTraceEvent): boolean {\n return eventHasCategory(event, DevToolsTimelineEventCategory) && event.name === 'RunTask' ||\n eventHasCategory(event, LegacyTopLevelEventCategory) ||\n eventHasCategory(event, DevToolsMetadataEventCategory) &&\n event.name === 'Program'; // Older timelines may have this instead of toplevel.\n }\n\n static extractId(payload: EventPayload): string|undefined {\n const scope = payload.scope || '';\n if (typeof payload.id2 === 'undefined') {\n return scope && payload.id ? `${scope}@${payload.id}` : payload.id;\n }\n const id2 = payload.id2;\n if (typeof id2 === 'object' && ('global' in id2) !== ('local' in id2)) {\n return typeof id2['global'] !== 'undefined' ? `:${scope}:${id2['global']}` :\n `:${scope}:${payload.pid}:${id2['local']}`;\n }\n console.error(\n `Unexpected id2 field at ${payload.ts / 1000}, one and only one of 'local' and 'global' should be present.`);\n return undefined;\n }\n\n static browserMainThread(tracingModel: TracingModel): Thread|null {\n const processes = tracingModel.sortedProcesses();\n // Avoid warning for an empty #model.\n if (!processes.length) {\n return null;\n }\n const browserMainThreadName = 'CrBrowserMain';\n const browserProcesses = [];\n const browserMainThreads = [];\n for (const process of processes) {\n if (process.name().toLowerCase().endsWith('browser')) {\n browserProcesses.push(process);\n }\n browserMainThreads.push(...process.sortedThreads().filter(t => t.name() === browserMainThreadName));\n }\n if (browserMainThreads.length === 1) {\n return browserMainThreads[0];\n }\n if (browserProcesses.length === 1) {\n return browserProcesses[0].threadByName(browserMainThreadName);\n }\n const tracingStartedInBrowser =\n tracingModel.devToolsMetadataEvents().filter(e => e.name === 'TracingStartedInBrowser');\n if (tracingStartedInBrowser.length === 1) {\n return tracingStartedInBrowser[0].thread;\n }\n console.error(\n 'Failed to find browser main thread in trace, some timeline features may be unavailable');\n return null;\n }\n\n allRawEvents(): readonly EventPayload[] {\n return this.#allEventsPayload;\n }\n\n devToolsMetadataEvents(): Event[] {\n return this.#devToolsMetadataEventsInternal;\n }\n\n addEvents(events: readonly EventPayload[]): void {\n for (let i = 0; i < events.length; ++i) {\n this.addEvent(events[i]);\n }\n }\n\n tracingComplete(): void {\n this.processPendingAsyncEvents();\n for (const process of this.#processById.values()) {\n for (const thread of process.threads.values()) {\n thread.tracingComplete();\n }\n }\n }\n\n private addEvent(payload: EventPayload): void {\n this.#allEventsPayload.push(payload);\n let process = this.#processById.get(payload.pid);\n if (!process) {\n process = new Process(this, payload.pid);\n this.#processById.set(payload.pid, process);\n }\n\n const timestamp = payload.ts / 1000;\n // We do allow records for unrelated threads to arrive out-of-order,\n // so there's a chance we're getting records from the past.\n if (timestamp && timestamp < this.#minimumRecordTimeInternal &&\n eventPhasesOfInterestForTraceBounds.has(payload.ph as Types.TraceEvents.Phase) &&\n // UMA related events are ignored when calculating the minimumRecordTime because they might\n // be related to previous navigations that happened before the current trace started and\n // will currently not be displayed anyways.\n // See crbug.com/1201198\n (!payload.name.endsWith('::UMA'))) {\n this.#minimumRecordTimeInternal = timestamp;\n }\n\n if (payload.name === 'TracingStartedInBrowser') {\n // If we received a timestamp for tracing start, use that for minimumRecordTime.\n this.#minimumRecordTimeInternal = timestamp;\n }\n\n if (eventPhasesOfInterestForTraceBounds.has(payload.ph as Types.TraceEvents.Phase)) {\n const endTimeStamp = (payload.ts + (payload.dur || 0)) / 1000;\n this.#maximumRecordTimeInternal = Math.max(this.#maximumRecordTimeInternal, endTimeStamp);\n }\n const event = process.addEvent(payload);\n if (!event) {\n return;\n }\n if (payload.ph === Types.TraceEvents.Phase.SAMPLE) {\n this.addSampleEvent(event);\n return;\n }\n // Build async event when we've got events from all threads & processes, so we can sort them and process in the\n // chronological order. However, also add individual async events to the thread flow (above), so we can easily\n // display them on the same chart as other events, should we choose so.\n if (Types.TraceEvents.isAsyncPhase(payload.ph)) {\n this.#asyncEvents.push((event as AsyncEvent));\n }\n if (event.hasCategory(DevToolsMetadataEventCategory)) {\n this.#devToolsMetadataEventsInternal.push(event);\n }\n\n if (payload.ph !== Types.TraceEvents.Phase.METADATA) {\n return;\n }\n\n switch (payload.name) {\n case MetadataEvent.ProcessSortIndex: {\n process.setSortIndex(payload.args['sort_index']);\n break;\n }\n case MetadataEvent.ProcessName: {\n const processName = payload.args['name'];\n process.setName(processName);\n this.#processByName.set(processName, process);\n break;\n }\n case MetadataEvent.ThreadSortIndex: {\n process.threadById(payload.tid).setSortIndex(payload.args['sort_index']);\n break;\n }\n case MetadataEvent.ThreadName: {\n process.threadById(payload.tid).setName(payload.args['name']);\n break;\n }\n }\n }\n\n private addSampleEvent(event: Event): void {\n const id = `${event.thread.process().id()}:${event.id}`;\n const group = this.#profileGroups.get(id);\n if (group) {\n group.addChild(event);\n } else {\n this.#profileGroups.set(id, new ProfileEventsGroup(event));\n }\n }\n\n profileGroup(event: Event): ProfileEventsGroup|null {\n return this.#profileGroups.get(`${event.thread.process().id()}:${event.id}`) || null;\n }\n\n minimumRecordTime(): number {\n return this.#minimumRecordTimeInternal;\n }\n\n maximumRecordTime(): number {\n return this.#maximumRecordTimeInternal;\n }\n\n sortedProcesses(): Process[] {\n return NamedObject.sort([...this.#processById.values()]);\n }\n\n getProcessByName(name: string): Process|null {\n return this.#processByName.get(name) ?? null;\n }\n\n getProcessById(pid: number): Process|null {\n return this.#processById.get(pid) || null;\n }\n\n getThreadByName(processName: string, threadName: string): Thread|null {\n const process = this.getProcessByName(processName);\n return process && process.threadByName(threadName);\n }\n\n private processPendingAsyncEvents(): void {\n this.#asyncEvents.sort(Event.compareStartTime);\n for (let i = 0; i < this.#asyncEvents.length; ++i) {\n const event = this.#asyncEvents[i];\n if (Types.TraceEvents.isNestableAsyncPhase(event.phase)) {\n this.addNestableAsyncEvent(event);\n } else {\n this.addAsyncEvent(event);\n }\n }\n this.#asyncEvents = [];\n this.closeOpenAsyncEvents();\n }\n\n private closeOpenAsyncEvents(): void {\n for (const event of this.#openAsyncEvents.values()) {\n event.setEndTime(this.#maximumRecordTimeInternal);\n // FIXME: remove this once we figure a better way to convert async console\n // events to sync [waterfall] timeline records.\n event.steps[0].setEndTime(this.#maximumRecordTimeInternal);\n }\n this.#openAsyncEvents.clear();\n\n for (const eventStack of this.#openNestableAsyncEvents.values()) {\n while (eventStack.length) {\n const event = eventStack.pop();\n if (!event) {\n continue;\n }\n event.setEndTime(this.#maximumRecordTimeInternal);\n }\n }\n this.#openNestableAsyncEvents.clear();\n }\n\n private addNestableAsyncEvent(event: Event): void {\n const key = event.categoriesString + '.' + event.id;\n let openEventsStack = this.#openNestableAsyncEvents.get(key);\n\n switch (event.phase) {\n case Types.TraceEvents.Phase.ASYNC_NESTABLE_START: {\n if (!openEventsStack) {\n openEventsStack = [];\n this.#openNestableAsyncEvents.set(key, openEventsStack);\n }\n const asyncEvent = new AsyncEvent(event);\n openEventsStack.push(asyncEvent);\n event.thread.addAsyncEvent(asyncEvent);\n break;\n }\n\n case Types.TraceEvents.Phase.ASYNC_NESTABLE_INSTANT: {\n if (openEventsStack && openEventsStack.length) {\n const event = openEventsStack[openEventsStack.length - 1];\n if (event) {\n event.addStep(event);\n }\n }\n break;\n }\n\n case Types.TraceEvents.Phase.ASYNC_NESTABLE_END: {\n if (!openEventsStack || !openEventsStack.length) {\n break;\n }\n const top = openEventsStack.pop();\n if (!top) {\n break;\n }\n if (top.name !== event.name) {\n console.error(\n `Begin/end event mismatch for nestable async event, ${top.name} vs. ${event.name}, key: ${key}`);\n break;\n }\n top.addStep(event);\n }\n }\n }\n\n private addAsyncEvent(event: Event): void {\n const key = event.categoriesString + '.' + event.name + '.' + event.id;\n let asyncEvent = this.#openAsyncEvents.get(key);\n\n if (event.phase === Types.TraceEvents.Phase.ASYNC_BEGIN) {\n if (asyncEvent) {\n console.error(`Event ${event.name} has already been started`);\n return;\n }\n asyncEvent = new AsyncEvent(event);\n this.#openAsyncEvents.set(key, asyncEvent);\n event.thread.addAsyncEvent(asyncEvent);\n return;\n }\n if (!asyncEvent) {\n // Quietly ignore stray async events, we're probably too late for the start.\n return;\n }\n if (event.phase === Types.TraceEvents.Phase.ASYNC_END) {\n asyncEvent.addStep(event);\n this.#openAsyncEvents.delete(key);\n return;\n }\n if (event.phase === Types.TraceEvents.Phase.ASYNC_STEP_INTO ||\n event.phase === Types.TraceEvents.Phase.ASYNC_STEP_PAST) {\n const lastStep = asyncEvent.steps[asyncEvent.steps.length - 1];\n if (lastStep && lastStep.phase !== Types.TraceEvents.Phase.ASYNC_BEGIN && lastStep.phase !== event.phase) {\n console.assert(\n false,\n 'Async event step phase mismatch: ' + lastStep.phase + ' at ' + lastStep.startTime + ' vs. ' + event.phase +\n ' at ' + event.startTime);\n return;\n }\n asyncEvent.addStep(event);\n return;\n }\n console.assert(false, 'Invalid async event phase');\n }\n\n title(): string|undefined {\n return this.#title;\n }\n\n parsedCategoriesForString(str: string): Set<string> {\n let parsedCategories = this.#parsedCategories.get(str);\n if (!parsedCategories) {\n parsedCategories = new Set(str ? str.split(',') : []);\n this.#parsedCategories.set(str, parsedCategories);\n }\n return parsedCategories;\n }\n}\n\nexport const eventPhasesOfInterestForTraceBounds: Set<Types.TraceEvents.Phase> = new Set([\n Types.TraceEvents.Phase.BEGIN,\n Types.TraceEvents.Phase.END,\n Types.TraceEvents.Phase.COMPLETE,\n Types.TraceEvents.Phase.INSTANT,\n]);\n\nexport const MetadataEvent = {\n ProcessSortIndex: 'process_sort_index',\n ProcessName: 'process_name',\n ThreadSortIndex: 'thread_sort_index',\n ThreadName: 'thread_name',\n};\n\n// TODO(alph): LegacyTopLevelEventCategory is not recorded since M74 and used for loading\n// legacy profiles. Drop at some point.\nexport const LegacyTopLevelEventCategory = 'toplevel';\n\nexport const DevToolsMetadataEventCategory = 'disabled-by-default-devtools.timeline';\nexport const DevToolsTimelineEventCategory = 'disabled-by-default-devtools.timeline';\n\nexport function eventHasPayload(event: Event): event is PayloadEvent {\n return 'rawPayload' in event;\n}\n\nexport class Event {\n categoriesString: string;\n readonly #parsedCategories: Set<string>;\n name: string;\n phase: Types.TraceEvents.Phase;\n startTime: number;\n thread: Thread;\n // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: any;\n id!: string|null;\n ordinal: number;\n selfTime: number;\n endTime?: number;\n duration?: number;\n\n // The constructor is protected so that we ensure that only classes or\n // subclasses can directly instantiate events. All other callers should\n // either create ConstructedEvent instances, which have a public constructor,\n // or use the static fromPayload method which can create an event instance\n // from the trace payload.\n protected constructor(\n categories: string|undefined, name: string, phase: Types.TraceEvents.Phase, startTime: number, thread: Thread) {\n this.categoriesString = categories || '';\n this.#parsedCategories = thread.getModel().parsedCategoriesForString(this.categoriesString);\n this.name = name;\n this.phase = phase;\n this.startTime = startTime;\n this.thread = thread;\n this.args = {};\n this.ordinal = 0;\n\n this.selfTime = 0;\n }\n\n static compareStartTime(a: Event|null, b: Event|null): number {\n if (!a || !b) {\n return 0;\n }\n\n return a.startTime - b.startTime;\n }\n\n static orderedCompareStartTime(a: Event, b: Event): number {\n // Array.mergeOrdered coalesces objects if comparator returns 0.\n // To change this behavior this comparator return -1 in the case events\n // startTime's are equal, so both events got placed into the result array.\n return a.startTime - b.startTime || a.ordinal - b.ordinal || -1;\n }\n\n hasCategory(categoryName: string): boolean {\n return this.#parsedCategories.has(categoryName);\n }\n\n setEndTime(endTime: number): void {\n if (endTime < this.startTime) {\n console.assert(false, 'Event out of order: ' + this.name);\n return;\n }\n this.endTime = endTime;\n this.duration = endTime - this.startTime;\n }\n\n // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addArgs(args: any): void {\n // Shallow copy args to avoid modifying original #payload which may be saved to file.\n for (const name in args) {\n if (name in this.args) {\n console.error('Same argument name (' + name + ') is used for begin and end phases of ' + this.name);\n }\n\n (this.args as IgnoreListArgs)[name] = (args as IgnoreListArgs)[name];\n }\n }\n\n complete(endEvent: Event): void {\n if (endEvent.args) {\n this.addArgs(endEvent.args);\n } else {\n console.error('Missing mandatory event argument \\'args\\' at ' + endEvent.startTime);\n }\n this.setEndTime(endEvent.startTime);\n }\n}\n\n/**\n * Represents a tracing event that is not directly linked to an individual\n * object in the trace. We construct these events at times, particularly when\n * building up the CPU profile data for JS Profiling.\n **/\nexport class ConstructedEvent extends Event {\n // Because the constructor of Event is marked as protected, but we want\n // people to be able to create constructed events, we override the\n // constructor here, even though we are only calling super, in order to mark\n // it as public.\n constructor(\n categories: string|undefined, name: string, phase: Types.TraceEvents.Phase, startTime: number, thread: Thread) {\n super(categories, name, phase, startTime, thread);\n }\n}\n\n/**\n * Represents a tracing event that has been created directly from an object in\n * the trace file and therefore is guaranteed to have a payload associated with\n * it. The only way to create these events is to use the static fromPayload\n * method, which you must call with a payload.\n **/\nexport class PayloadEvent extends Event {\n #rawPayload: EventPayload;\n\n /**\n * Returns the raw payload that was used to create this event instance.\n **/\n rawLegacyPayload(): EventPayload {\n return this.#rawPayload;\n }\n\n /**\n * Returns the raw payload that was used to create this event instance, but\n * returns it typed as the new engine's TraceEventArgs option.\n **/\n rawPayload(): Types.TraceEvents.TraceEventData {\n return this.#rawPayload as unknown as Types.TraceEvents.TraceEventData;\n }\n\n protected constructor(\n categories: string|undefined, name: string, phase: Types.TraceEvents.Phase, startTime: number, thread: Thread,\n rawPayload: EventPayload) {\n super(categories, name, phase, startTime, thread);\n this.#rawPayload = rawPayload;\n }\n\n static fromPayload(payload: EventPayload, thread: Thread): PayloadEvent {\n const event = new PayloadEvent(payload.cat, payload.name, payload.ph, payload.ts / 1000, thread, payload);\n event.#rawPayload = payload;\n if (payload.args) {\n event.addArgs(payload.args);\n }\n if (typeof payload.dur === 'number') {\n event.setEndTime((payload.ts + payload.dur) / 1000);\n }\n const id = TracingModel.extractId(payload);\n if (typeof id !== 'undefined') {\n event.id = id;\n }\n\n return event;\n }\n}\n\nexport class ObjectSnapshot extends PayloadEvent {\n private constructor(\n category: string|undefined, name: string, startTime: number, thread: Thread, rawPayload: EventPayload) {\n super(category, name, Types.TraceEvents.Phase.OBJECT_SNAPSHOT, startTime, thread, rawPayload);\n }\n\n static override fromPayload(payload: EventPayload, thread: Thread): ObjectSnapshot {\n const snapshot = new ObjectSnapshot(payload.cat, payload.name, payload.ts / 1000, thread, payload);\n const id = TracingModel.extractId(payload);\n if (typeof id !== 'undefined') {\n snapshot.id = id;\n }\n if (!payload.args || !payload.args['snapshot']) {\n console.error('Missing mandatory \\'snapshot\\' argument at ' + payload.ts / 1000);\n return snapshot;\n }\n if (payload.args) {\n snapshot.addArgs(payload.args);\n }\n return snapshot;\n }\n\n getSnapshot(): ObjectSnapshot {\n const snapshot = this.args['snapshot'];\n if (!snapshot) {\n throw new Error('ObjectSnapshot has no snapshot argument.');\n }\n return snapshot;\n }\n}\n\nexport class AsyncEvent extends ConstructedEvent {\n steps: Event[];\n causedFrame: boolean;\n\n constructor(startEvent: Event) {\n super(startEvent.categoriesString, startEvent.name, startEvent.phase, startEvent.startTime, startEvent.thread);\n this.addArgs(startEvent.args);\n this.steps = [startEvent];\n this.causedFrame = false;\n }\n\n addStep(event: Event): void {\n this.steps.push(event);\n if (event.phase === Types.TraceEvents.Phase.ASYNC_END ||\n event.phase === Types.TraceEvents.Phase.ASYNC_NESTABLE_END) {\n this.setEndTime(event.startTime);\n // FIXME: ideally, we shouldn't do this, but this makes the logic of converting\n // async console events to sync ones much simpler.\n this.steps[0].setEndTime(event.startTime);\n }\n }\n}\n\nclass ProfileEventsGroup {\n children: Event[];\n constructor(event: Event) {\n this.children = [event];\n }\n\n addChild(event: Event): void {\n this.children.push(event);\n }\n}\n\nclass NamedObject {\n model: TracingModel;\n readonly idInternal: number;\n #nameInternal: string;\n #sortIndex: number;\n constructor(model: TracingModel, id: number) {\n this.model = model;\n this.idInternal = id;\n this.#nameInternal = '';\n this.#sortIndex = 0;\n }\n\n static sort<Item extends NamedObject>(array: Item[]): Item[] {\n return array.sort((a, b) => {\n return a.#sortIndex !== b.#sortIndex ? a.#sortIndex - b.#sortIndex : a.name().localeCompare(b.name());\n });\n }\n\n setName(name: string): void {\n this.#nameInternal = name;\n }\n\n name(): string {\n return this.#nameInternal;\n }\n\n id(): number {\n return this.idInternal;\n }\n\n setSortIndex(sortIndex: number): void {\n this.#sortIndex = sortIndex;\n }\n\n getModel(): TracingModel {\n return this.model;\n }\n}\n\nexport class Process extends NamedObject {\n readonly threads: Map<number, Thread>;\n readonly #threadByNameInternal: Map<string, Thread|null>;\n constructor(model: TracingModel, id: number) {\n super(model, id);\n this.threads = new Map();\n this.#threadByNameInternal = new Map();\n }\n\n threadById(id: number): Thread {\n let thread = this.threads.get(id);\n if (!thread) {\n thread = new Thread(this, id);\n this.threads.set(id, thread);\n }\n return thread;\n }\n\n threadByName(name: string): Thread|null {\n return this.#threadByNameInternal.get(name) || null;\n }\n\n setThreadByName(name: string, thread: Thread): void {\n this.#threadByNameInternal.set(name, thread);\n }\n\n addEvent(payload: EventPayload): Event|null {\n return this.threadById(payload.tid).addEvent(payload);\n }\n\n sortedThreads(): Thread[] {\n return NamedObject.sort([...this.threads.values()]);\n }\n}\n\nexport class Thread extends NamedObject {\n readonly #processInternal: Process;\n #eventsInternal: Event[];\n readonly #asyncEventsInternal: AsyncEvent[];\n #lastTopLevelEvent: Event|null;\n constructor(process: Process, id: number) {\n super(process.getModel(), id);\n this.#processInternal = process;\n\n this.#eventsInternal = [];\n this.#asyncEventsInternal = [];\n this.#lastTopLevelEvent = null;\n }\n\n /**\n * Whilst we are in the middle of migrating to the new Phase enum, we need to\n * be able to compare events with the legacy phase to the new enum. This method\n * does this by casting the event phase to a string, ensuring we can compare it\n * against either enum. Once the migration is complete (crbug.com/1417587), we\n * will be able to use === to compare with no TS errors and this method can be\n * removed.\n */\n #eventMatchesPhase(event: Event, phase: Types.TraceEvents.Phase): boolean {\n return (event.phase as string) === phase;\n }\n\n tracingComplete(): void {\n this.#asyncEventsInternal.sort(Event.compareStartTime);\n this.#eventsInternal.sort(Event.compareStartTime);\n const stack: Event[] = [];\n const toDelete = new Set<number>();\n for (let i = 0; i < this.#eventsInternal.length; ++i) {\n const e = this.#eventsInternal[i];\n e.ordinal = i;\n if (this.#eventMatchesPhase(e, Types.TraceEvents.Phase.END)) {\n toDelete.add(i); // Mark for removal.\n // Quietly ignore unbalanced close events, they're legit (we could have missed start one).\n if (!stack.length) {\n continue;\n }\n const top = stack.pop();\n if (!top) {\n continue;\n }\n if (top.name !== e.name || top.categoriesString !== e.categoriesString) {\n console.error(\n 'B/E events mismatch at ' + top.startTime + ' (' + top.name + ') vs. ' + e.startTime + ' (' + e.name +\n ')');\n } else {\n top.complete(e);\n }\n } else if (this.#eventMatchesPhase(e, Types.TraceEvents.Phase.BEGIN)) {\n stack.push(e);\n }\n }\n\n // Handle Begin events with no matching End.\n // This commonly happens due to a bug in the trace machinery. See crbug.com/982252\n while (stack.length) {\n const event = stack.pop();\n if (event) {\n // Masquerade the event as Instant, so it's rendered to the user.\n // The ideal fix is resolving crbug.com/1021571, but handling that without a perfetto migration appears prohibitive\n event.phase = Types.TraceEvents.Phase.INSTANT;\n }\n }\n this.#eventsInternal = this.#eventsInternal.filter((_, idx) => !toDelete.has(idx));\n }\n\n addEvent(payload: EventPayload): Event|null {\n const event = payload.ph === Types.TraceEvents.Phase.OBJECT_SNAPSHOT ? ObjectSnapshot.fromPayload(payload, this) :\n PayloadEvent.fromPayload(payload, this);\n if (TracingModel.isTopLevelEvent(event)) {\n // Discard nested \"top-level\" events.\n const lastTopLevelEvent = this.#lastTopLevelEvent;\n if (lastTopLevelEvent && (lastTopLevelEvent.endTime || 0) > event.startTime) {\n return null;\n }\n this.#lastTopLevelEvent = event;\n }\n this.#eventsInternal.push(event);\n return event;\n }\n\n addAsyncEvent(asyncEvent: AsyncEvent): void {\n this.#asyncEventsInternal.push(asyncEvent);\n }\n\n override setName(name: string): void {\n super.setName(name);\n this.#processInternal.setThreadByName(name, this);\n }\n\n process(): Process {\n return this.#processInternal;\n }\n\n events(): Event[] {\n return this.#eventsInternal;\n }\n\n asyncEvents(): AsyncEvent[] {\n return this.#asyncEventsInternal;\n }\n\n removeEventsByName(name: string): Event[] {\n const extracted: Event[] = [];\n this.#eventsInternal = this.#eventsInternal.filter(e => {\n if (!e) {\n return false;\n }\n\n if (e.name !== name) {\n return true;\n }\n\n extracted.push(e);\n return false;\n });\n\n return extracted;\n }\n}\n\nexport interface TimesForEventMs {\n startTime: Types.Timing.MilliSeconds;\n endTime?: Types.Timing.MilliSeconds;\n selfTime: Types.Timing.MilliSeconds;\n duration: Types.Timing.MilliSeconds;\n}\n\nexport function timesForEventInMilliseconds(event: Event|Types.TraceEvents.TraceEventData): TimesForEventMs {\n if (event instanceof Event) {\n return {\n startTime: Types.Timing.MilliSeconds(event.startTime),\n endTime: event.endTime ? Types.Timing.MilliSeconds(event.endTime) : undefined,\n duration: Types.Timing.MilliSeconds(event.duration || 0),\n selfTime: Types.Timing.MilliSeconds(event.selfTime),\n };\n }\n return Helpers.Timing.eventTimingsMilliSeconds(event);\n}\n// Parsed categories are cached to prevent calling cat.split() multiple\n// times on the same categories string.\nconst parsedCategories = new Map<string, Set<string>>();\nexport function eventHasCategory(event: CompatibleTraceEvent, category: string): boolean {\n if (event instanceof Event) {\n return event.hasCategory(category);\n }\n let parsedCategoriesForEvent = parsedCategories.get(event.cat);\n if (!parsedCategoriesForEvent) {\n parsedCategoriesForEvent = new Set(event.cat.split(',') || []);\n }\n return parsedCategoriesForEvent.has(category);\n}\n\nexport function phaseForEvent(event: Event|Types.TraceEvents.TraceEventData): Types.TraceEvents.Phase {\n if (event instanceof Event) {\n return event.phase;\n }\n return event.ph;\n}\n\nexport function threadIDForEvent(event: Event|Types.TraceEvents.TraceEventData): Types.TraceEvents.ThreadID {\n if (event instanceof Event) {\n return event.thread.idInternal as Types.TraceEvents.ThreadID;\n }\n return event.tid;\n}\n\nexport function eventIsFromNewEngine(event: CompatibleTraceEvent|null): event is Types.TraceEvents.TraceEventData {\n return event !== null && !(event instanceof Event);\n}\n\nexport type CompatibleTraceEvent = Event|Types.TraceEvents.TraceEventData;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
1
|
+
{"version":3,"file":"LegacyTracingModel.js","sourceRoot":"","sources":["../../../../../../front_end/models/trace/LegacyTracingModel.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2014 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//\n// This is what was SDK.TracingModel moved into models/trace to avoid circular dependency issues. Our ultimate goal is to remove this model entirely once the migration to the new model is done\n\nimport * as Helpers from './helpers/helpers.js';\nimport {type EventPayload} from './TracingManager.js';\nimport * as Types from './types/types.js';\n\ntype IgnoreListArgs = {\n [key: string]: string|number|ObjectSnapshot,\n};\n\nexport class TracingModel {\n readonly #title: string|undefined;\n readonly #processById: Map<string|number, Process>;\n readonly #processByName: Map<string, Process>;\n #minimumRecordTimeInternal: number;\n #maximumRecordTimeInternal: number;\n readonly #devToolsMetadataEventsInternal: Event[];\n #asyncEvents: AsyncEvent[];\n readonly #openAsyncEvents: Map<string, AsyncEvent>;\n readonly #openNestableAsyncEvents: Map<string, AsyncEvent[]>;\n readonly #profileGroups: Map<string, ProfileEventsGroup>;\n readonly #parsedCategories: Map<string, Set<string>>;\n readonly #allEventsPayload: EventPayload[] = [];\n\n constructor(title?: string) {\n this.#title = title;\n this.#processById = new Map();\n this.#processByName = new Map();\n this.#minimumRecordTimeInternal = Number(Infinity);\n this.#maximumRecordTimeInternal = Number(-Infinity);\n this.#devToolsMetadataEventsInternal = [];\n this.#asyncEvents = [];\n this.#openAsyncEvents = new Map();\n this.#openNestableAsyncEvents = new Map();\n this.#profileGroups = new Map();\n this.#parsedCategories = new Map();\n }\n\n static isTopLevelEvent(event: CompatibleTraceEvent): boolean {\n return eventHasCategory(event, DevToolsTimelineEventCategory) && event.name === 'RunTask' ||\n eventHasCategory(event, LegacyTopLevelEventCategory) ||\n eventHasCategory(event, DevToolsMetadataEventCategory) &&\n event.name === 'Program'; // Older timelines may have this instead of toplevel.\n }\n\n static extractId(payload: EventPayload): string|undefined {\n const scope = payload.scope || '';\n if (typeof payload.id2 === 'undefined') {\n return scope && payload.id ? `${scope}@${payload.id}` : payload.id;\n }\n const id2 = payload.id2;\n if (typeof id2 === 'object' && ('global' in id2) !== ('local' in id2)) {\n return typeof id2['global'] !== 'undefined' ? `:${scope}:${id2['global']}` :\n `:${scope}:${payload.pid}:${id2['local']}`;\n }\n console.error(\n `Unexpected id2 field at ${payload.ts / 1000}, one and only one of 'local' and 'global' should be present.`);\n return undefined;\n }\n\n static browserMainThread(tracingModel: TracingModel): Thread|null {\n const processes = tracingModel.sortedProcesses();\n // Avoid warning for an empty #model.\n if (!processes.length) {\n return null;\n }\n const browserMainThreadName = 'CrBrowserMain';\n const browserProcesses = [];\n const browserMainThreads = [];\n for (const process of processes) {\n if (process.name().toLowerCase().endsWith('browser')) {\n browserProcesses.push(process);\n }\n browserMainThreads.push(...process.sortedThreads().filter(t => t.name() === browserMainThreadName));\n }\n if (browserMainThreads.length === 1) {\n return browserMainThreads[0];\n }\n if (browserProcesses.length === 1) {\n return browserProcesses[0].threadByName(browserMainThreadName);\n }\n const tracingStartedInBrowser =\n tracingModel.devToolsMetadataEvents().filter(e => e.name === 'TracingStartedInBrowser');\n if (tracingStartedInBrowser.length === 1) {\n return tracingStartedInBrowser[0].thread;\n }\n console.error(\n 'Failed to find browser main thread in trace, some timeline features may be unavailable');\n return null;\n }\n\n allRawEvents(): readonly EventPayload[] {\n return this.#allEventsPayload;\n }\n\n devToolsMetadataEvents(): Event[] {\n return this.#devToolsMetadataEventsInternal;\n }\n\n addEvents(events: readonly EventPayload[]): void {\n for (let i = 0; i < events.length; ++i) {\n this.addEvent(events[i]);\n }\n }\n\n tracingComplete(): void {\n this.processPendingAsyncEvents();\n for (const process of this.#processById.values()) {\n for (const thread of process.threads.values()) {\n thread.tracingComplete();\n }\n }\n }\n\n private addEvent(payload: EventPayload): void {\n this.#allEventsPayload.push(payload);\n let process = this.#processById.get(payload.pid);\n if (!process) {\n process = new Process(this, payload.pid);\n this.#processById.set(payload.pid, process);\n }\n\n const timestamp = payload.ts / 1000;\n // We do allow records for unrelated threads to arrive out-of-order,\n // so there's a chance we're getting records from the past.\n if (timestamp && timestamp < this.#minimumRecordTimeInternal &&\n eventPhasesOfInterestForTraceBounds.has(payload.ph as Types.TraceEvents.Phase) &&\n // UMA related events are ignored when calculating the minimumRecordTime because they might\n // be related to previous navigations that happened before the current trace started and\n // will currently not be displayed anyways.\n // See crbug.com/1201198\n (!payload.name.endsWith('::UMA'))) {\n this.#minimumRecordTimeInternal = timestamp;\n }\n\n if (payload.name === 'TracingStartedInBrowser') {\n // If we received a timestamp for tracing start, use that for minimumRecordTime.\n this.#minimumRecordTimeInternal = timestamp;\n }\n\n if (eventPhasesOfInterestForTraceBounds.has(payload.ph as Types.TraceEvents.Phase)) {\n const endTimeStamp = (payload.ts + (payload.dur || 0)) / 1000;\n this.#maximumRecordTimeInternal = Math.max(this.#maximumRecordTimeInternal, endTimeStamp);\n }\n const event = process.addEvent(payload);\n if (!event) {\n return;\n }\n if (payload.ph === Types.TraceEvents.Phase.SAMPLE) {\n this.addSampleEvent(event);\n return;\n }\n // Build async event when we've got events from all threads & processes, so we can sort them and process in the\n // chronological order. However, also add individual async events to the thread flow (above), so we can easily\n // display them on the same chart as other events, should we choose so.\n if (Types.TraceEvents.isAsyncPhase(payload.ph)) {\n this.#asyncEvents.push((event as AsyncEvent));\n }\n if (event.hasCategory(DevToolsMetadataEventCategory)) {\n this.#devToolsMetadataEventsInternal.push(event);\n }\n\n if (payload.ph !== Types.TraceEvents.Phase.METADATA) {\n return;\n }\n\n switch (payload.name) {\n case MetadataEvent.ProcessSortIndex: {\n process.setSortIndex(payload.args['sort_index']);\n break;\n }\n case MetadataEvent.ProcessName: {\n const processName = payload.args['name'];\n process.setName(processName);\n this.#processByName.set(processName, process);\n break;\n }\n case MetadataEvent.ThreadSortIndex: {\n process.threadById(payload.tid).setSortIndex(payload.args['sort_index']);\n break;\n }\n case MetadataEvent.ThreadName: {\n process.threadById(payload.tid).setName(payload.args['name']);\n break;\n }\n }\n }\n\n private addSampleEvent(event: Event): void {\n const id = `${event.thread.process().id()}:${event.id}`;\n const group = this.#profileGroups.get(id);\n if (group) {\n group.addChild(event);\n } else {\n this.#profileGroups.set(id, new ProfileEventsGroup(event));\n }\n }\n\n profileGroup(event: Event): ProfileEventsGroup|null {\n return this.#profileGroups.get(`${event.thread.process().id()}:${event.id}`) || null;\n }\n\n minimumRecordTime(): number {\n return this.#minimumRecordTimeInternal;\n }\n\n maximumRecordTime(): number {\n return this.#maximumRecordTimeInternal;\n }\n\n sortedProcesses(): Process[] {\n return NamedObject.sort([...this.#processById.values()]);\n }\n\n getProcessByName(name: string): Process|null {\n return this.#processByName.get(name) ?? null;\n }\n\n getProcessById(pid: number): Process|null {\n return this.#processById.get(pid) || null;\n }\n\n getThreadByName(processName: string, threadName: string): Thread|null {\n const process = this.getProcessByName(processName);\n return process && process.threadByName(threadName);\n }\n\n private processPendingAsyncEvents(): void {\n this.#asyncEvents.sort(Event.compareStartTime);\n for (let i = 0; i < this.#asyncEvents.length; ++i) {\n const event = this.#asyncEvents[i];\n if (Types.TraceEvents.isNestableAsyncPhase(event.phase)) {\n this.addNestableAsyncEvent(event);\n } else {\n this.addAsyncEvent(event);\n }\n }\n this.#asyncEvents = [];\n this.closeOpenAsyncEvents();\n }\n\n private closeOpenAsyncEvents(): void {\n for (const event of this.#openAsyncEvents.values()) {\n event.setEndTime(this.#maximumRecordTimeInternal);\n // FIXME: remove this once we figure a better way to convert async console\n // events to sync [waterfall] timeline records.\n event.steps[0].setEndTime(this.#maximumRecordTimeInternal);\n }\n this.#openAsyncEvents.clear();\n\n for (const eventStack of this.#openNestableAsyncEvents.values()) {\n while (eventStack.length) {\n const event = eventStack.pop();\n if (!event) {\n continue;\n }\n event.setEndTime(this.#maximumRecordTimeInternal);\n }\n }\n this.#openNestableAsyncEvents.clear();\n }\n\n private addNestableAsyncEvent(event: Event): void {\n const key = event.categoriesString + '.' + event.id;\n let openEventsStack = this.#openNestableAsyncEvents.get(key);\n\n switch (event.phase) {\n case Types.TraceEvents.Phase.ASYNC_NESTABLE_START: {\n if (!openEventsStack) {\n openEventsStack = [];\n this.#openNestableAsyncEvents.set(key, openEventsStack);\n }\n const asyncEvent = new AsyncEvent(event);\n openEventsStack.push(asyncEvent);\n event.thread.addAsyncEvent(asyncEvent);\n break;\n }\n\n case Types.TraceEvents.Phase.ASYNC_NESTABLE_INSTANT: {\n if (openEventsStack && openEventsStack.length) {\n const event = openEventsStack[openEventsStack.length - 1];\n if (event) {\n event.addStep(event);\n }\n }\n break;\n }\n\n case Types.TraceEvents.Phase.ASYNC_NESTABLE_END: {\n if (!openEventsStack || !openEventsStack.length) {\n break;\n }\n const top = openEventsStack.pop();\n if (!top) {\n break;\n }\n if (top.name !== event.name) {\n console.error(\n `Begin/end event mismatch for nestable async event, ${top.name} vs. ${event.name}, key: ${key}`);\n break;\n }\n top.addStep(event);\n }\n }\n }\n\n private addAsyncEvent(event: Event): void {\n const key = event.categoriesString + '.' + event.name + '.' + event.id;\n let asyncEvent = this.#openAsyncEvents.get(key);\n\n if (event.phase === Types.TraceEvents.Phase.ASYNC_BEGIN) {\n if (asyncEvent) {\n console.error(`Event ${event.name} has already been started`);\n return;\n }\n asyncEvent = new AsyncEvent(event);\n this.#openAsyncEvents.set(key, asyncEvent);\n event.thread.addAsyncEvent(asyncEvent);\n return;\n }\n if (!asyncEvent) {\n // Quietly ignore stray async events, we're probably too late for the start.\n return;\n }\n if (event.phase === Types.TraceEvents.Phase.ASYNC_END) {\n asyncEvent.addStep(event);\n this.#openAsyncEvents.delete(key);\n return;\n }\n if (event.phase === Types.TraceEvents.Phase.ASYNC_STEP_INTO ||\n event.phase === Types.TraceEvents.Phase.ASYNC_STEP_PAST) {\n const lastStep = asyncEvent.steps[asyncEvent.steps.length - 1];\n if (lastStep && lastStep.phase !== Types.TraceEvents.Phase.ASYNC_BEGIN && lastStep.phase !== event.phase) {\n console.assert(\n false,\n 'Async event step phase mismatch: ' + lastStep.phase + ' at ' + lastStep.startTime + ' vs. ' + event.phase +\n ' at ' + event.startTime);\n return;\n }\n asyncEvent.addStep(event);\n return;\n }\n console.assert(false, 'Invalid async event phase');\n }\n\n title(): string|undefined {\n return this.#title;\n }\n\n parsedCategoriesForString(str: string): Set<string> {\n let parsedCategories = this.#parsedCategories.get(str);\n if (!parsedCategories) {\n parsedCategories = new Set(str ? str.split(',') : []);\n this.#parsedCategories.set(str, parsedCategories);\n }\n return parsedCategories;\n }\n}\n\nexport const eventPhasesOfInterestForTraceBounds: Set<Types.TraceEvents.Phase> = new Set([\n Types.TraceEvents.Phase.BEGIN,\n Types.TraceEvents.Phase.END,\n Types.TraceEvents.Phase.COMPLETE,\n Types.TraceEvents.Phase.INSTANT,\n]);\n\nexport const MetadataEvent = {\n ProcessSortIndex: 'process_sort_index',\n ProcessName: 'process_name',\n ThreadSortIndex: 'thread_sort_index',\n ThreadName: 'thread_name',\n};\n\n// TODO(alph): LegacyTopLevelEventCategory is not recorded since M74 and used for loading\n// legacy profiles. Drop at some point.\nexport const LegacyTopLevelEventCategory = 'toplevel';\n\nexport const DevToolsMetadataEventCategory = 'disabled-by-default-devtools.timeline';\nexport const DevToolsTimelineEventCategory = 'disabled-by-default-devtools.timeline';\n\nexport function eventHasPayload(event: Event): event is PayloadEvent {\n return 'rawPayload' in event;\n}\n\nexport class Event {\n categoriesString: string;\n readonly #parsedCategories: Set<string>;\n name: string;\n phase: Types.TraceEvents.Phase;\n startTime: number;\n thread: Thread;\n // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n args: any;\n id!: string|null;\n ordinal: number;\n selfTime: number;\n endTime?: number;\n duration?: number;\n\n // The constructor is protected so that we ensure that only classes or\n // subclasses can directly instantiate events. All other callers should\n // either create ConstructedEvent instances, which have a public constructor,\n // or use the static fromPayload method which can create an event instance\n // from the trace payload.\n protected constructor(\n categories: string|undefined, name: string, phase: Types.TraceEvents.Phase, startTime: number, thread: Thread) {\n this.categoriesString = categories || '';\n this.#parsedCategories = thread.getModel().parsedCategoriesForString(this.categoriesString);\n this.name = name;\n this.phase = phase;\n this.startTime = startTime;\n this.thread = thread;\n this.args = {};\n this.ordinal = 0;\n\n this.selfTime = 0;\n }\n\n static compareStartTime(a: Event|null, b: Event|null): number {\n if (!a || !b) {\n return 0;\n }\n\n return a.startTime - b.startTime;\n }\n\n static orderedCompareStartTime(a: Event, b: Event): number {\n // Array.mergeOrdered coalesces objects if comparator returns 0.\n // To change this behavior this comparator return -1 in the case events\n // startTime's are equal, so both events got placed into the result array.\n return a.startTime - b.startTime || a.ordinal - b.ordinal || -1;\n }\n\n hasCategory(categoryName: string): boolean {\n return this.#parsedCategories.has(categoryName);\n }\n\n setEndTime(endTime: number): void {\n if (endTime < this.startTime) {\n console.assert(false, 'Event out of order: ' + this.name);\n return;\n }\n this.endTime = endTime;\n this.duration = endTime - this.startTime;\n }\n\n // TODO(crbug.com/1172300) Ignored during the jsdoc to ts migration\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n addArgs(args: any): void {\n // Shallow copy args to avoid modifying original #payload which may be saved to file.\n for (const name in args) {\n if (name in this.args) {\n console.error('Same argument name (' + name + ') is used for begin and end phases of ' + this.name);\n }\n\n (this.args as IgnoreListArgs)[name] = (args as IgnoreListArgs)[name];\n }\n }\n\n complete(endEvent: Event): void {\n if (endEvent.args) {\n this.addArgs(endEvent.args);\n } else {\n console.error('Missing mandatory event argument \\'args\\' at ' + endEvent.startTime);\n }\n this.setEndTime(endEvent.startTime);\n }\n}\n\n/**\n * Represents a tracing event that is not directly linked to an individual\n * object in the trace. We construct these events at times, particularly when\n * building up the CPU profile data for JS Profiling.\n **/\nexport class ConstructedEvent extends Event {\n // Because the constructor of Event is marked as protected, but we want\n // people to be able to create constructed events, we override the\n // constructor here, even though we are only calling super, in order to mark\n // it as public.\n constructor(\n categories: string|undefined, name: string, phase: Types.TraceEvents.Phase, startTime: number, thread: Thread) {\n super(categories, name, phase, startTime, thread);\n }\n}\n\n/**\n * Represents a tracing event that has been created directly from an object in\n * the trace file and therefore is guaranteed to have a payload associated with\n * it. The only way to create these events is to use the static fromPayload\n * method, which you must call with a payload.\n **/\nexport class PayloadEvent extends Event {\n #rawPayload: EventPayload;\n\n /**\n * Returns the raw payload that was used to create this event instance.\n **/\n rawLegacyPayload(): EventPayload {\n return this.#rawPayload;\n }\n\n /**\n * Returns the raw payload that was used to create this event instance, but\n * returns it typed as the new engine's TraceEventArgs option.\n **/\n rawPayload(): Types.TraceEvents.TraceEventData {\n return this.#rawPayload as unknown as Types.TraceEvents.TraceEventData;\n }\n\n protected constructor(\n categories: string|undefined, name: string, phase: Types.TraceEvents.Phase, startTime: number, thread: Thread,\n rawPayload: EventPayload) {\n super(categories, name, phase, startTime, thread);\n this.#rawPayload = rawPayload;\n }\n\n static fromPayload(payload: EventPayload, thread: Thread): PayloadEvent {\n const event = new PayloadEvent(payload.cat, payload.name, payload.ph, payload.ts / 1000, thread, payload);\n event.#rawPayload = payload;\n if (payload.args) {\n event.addArgs(payload.args);\n }\n if (typeof payload.dur === 'number') {\n event.setEndTime((payload.ts + payload.dur) / 1000);\n }\n const id = TracingModel.extractId(payload);\n if (typeof id !== 'undefined') {\n event.id = id;\n }\n\n return event;\n }\n}\n\nexport class ObjectSnapshot extends PayloadEvent {\n private constructor(\n category: string|undefined, name: string, startTime: number, thread: Thread, rawPayload: EventPayload) {\n super(category, name, Types.TraceEvents.Phase.OBJECT_SNAPSHOT, startTime, thread, rawPayload);\n }\n\n static override fromPayload(payload: EventPayload, thread: Thread): ObjectSnapshot {\n const snapshot = new ObjectSnapshot(payload.cat, payload.name, payload.ts / 1000, thread, payload);\n const id = TracingModel.extractId(payload);\n if (typeof id !== 'undefined') {\n snapshot.id = id;\n }\n if (!payload.args || !payload.args['snapshot']) {\n console.error('Missing mandatory \\'snapshot\\' argument at ' + payload.ts / 1000);\n return snapshot;\n }\n if (payload.args) {\n snapshot.addArgs(payload.args);\n }\n return snapshot;\n }\n\n getSnapshot(): ObjectSnapshot {\n const snapshot = this.args['snapshot'];\n if (!snapshot) {\n throw new Error('ObjectSnapshot has no snapshot argument.');\n }\n return snapshot;\n }\n}\n\nexport class AsyncEvent extends ConstructedEvent {\n steps: Event[];\n causedFrame: boolean;\n\n constructor(startEvent: Event) {\n super(startEvent.categoriesString, startEvent.name, startEvent.phase, startEvent.startTime, startEvent.thread);\n this.addArgs(startEvent.args);\n this.steps = [startEvent];\n this.causedFrame = false;\n }\n\n addStep(event: Event): void {\n this.steps.push(event);\n if (event.phase === Types.TraceEvents.Phase.ASYNC_END ||\n event.phase === Types.TraceEvents.Phase.ASYNC_NESTABLE_END) {\n this.setEndTime(event.startTime);\n // FIXME: ideally, we shouldn't do this, but this makes the logic of converting\n // async console events to sync ones much simpler.\n this.steps[0].setEndTime(event.startTime);\n }\n }\n}\n\nclass ProfileEventsGroup {\n children: Event[];\n constructor(event: Event) {\n this.children = [event];\n }\n\n addChild(event: Event): void {\n this.children.push(event);\n }\n}\n\nclass NamedObject {\n model: TracingModel;\n readonly idInternal: number;\n #nameInternal: string;\n #sortIndex: number;\n constructor(model: TracingModel, id: number) {\n this.model = model;\n this.idInternal = id;\n this.#nameInternal = '';\n this.#sortIndex = 0;\n }\n\n static sort<Item extends NamedObject>(array: Item[]): Item[] {\n return array.sort((a, b) => {\n return a.#sortIndex !== b.#sortIndex ? a.#sortIndex - b.#sortIndex : a.name().localeCompare(b.name());\n });\n }\n\n setName(name: string): void {\n this.#nameInternal = name;\n }\n\n name(): string {\n return this.#nameInternal;\n }\n\n id(): number {\n return this.idInternal;\n }\n\n setSortIndex(sortIndex: number): void {\n this.#sortIndex = sortIndex;\n }\n\n getModel(): TracingModel {\n return this.model;\n }\n}\n\nexport class Process extends NamedObject {\n readonly threads: Map<number, Thread>;\n readonly #threadByNameInternal: Map<string, Thread|null>;\n constructor(model: TracingModel, id: number) {\n super(model, id);\n this.threads = new Map();\n this.#threadByNameInternal = new Map();\n }\n\n threadById(id: number): Thread {\n let thread = this.threads.get(id);\n if (!thread) {\n thread = new Thread(this, id);\n this.threads.set(id, thread);\n }\n return thread;\n }\n\n threadByName(name: string): Thread|null {\n return this.#threadByNameInternal.get(name) || null;\n }\n\n setThreadByName(name: string, thread: Thread): void {\n this.#threadByNameInternal.set(name, thread);\n }\n\n addEvent(payload: EventPayload): Event|null {\n return this.threadById(payload.tid).addEvent(payload);\n }\n\n sortedThreads(): Thread[] {\n return NamedObject.sort([...this.threads.values()]);\n }\n}\n\nexport class Thread extends NamedObject {\n readonly #processInternal: Process;\n #eventsInternal: Event[];\n readonly #asyncEventsInternal: AsyncEvent[];\n #lastTopLevelEvent: Event|null;\n constructor(process: Process, id: number) {\n super(process.getModel(), id);\n this.#processInternal = process;\n\n this.#eventsInternal = [];\n this.#asyncEventsInternal = [];\n this.#lastTopLevelEvent = null;\n }\n\n /**\n * Whilst we are in the middle of migrating to the new Phase enum, we need to\n * be able to compare events with the legacy phase to the new enum. This method\n * does this by casting the event phase to a string, ensuring we can compare it\n * against either enum. Once the migration is complete (crbug.com/1417587), we\n * will be able to use === to compare with no TS errors and this method can be\n * removed.\n */\n #eventMatchesPhase(event: Event, phase: Types.TraceEvents.Phase): boolean {\n return (event.phase as string) === phase;\n }\n\n tracingComplete(): void {\n this.#asyncEventsInternal.sort(Event.compareStartTime);\n this.#eventsInternal.sort(Event.compareStartTime);\n const stack: Event[] = [];\n const toDelete = new Set<number>();\n for (let i = 0; i < this.#eventsInternal.length; ++i) {\n const e = this.#eventsInternal[i];\n e.ordinal = i;\n if (this.#eventMatchesPhase(e, Types.TraceEvents.Phase.END)) {\n toDelete.add(i); // Mark for removal.\n // Quietly ignore unbalanced close events, they're legit (we could have missed start one).\n if (!stack.length) {\n continue;\n }\n const top = stack.pop();\n if (!top) {\n continue;\n }\n if (top.name !== e.name || top.categoriesString !== e.categoriesString) {\n console.error(\n 'B/E events mismatch at ' + top.startTime + ' (' + top.name + ') vs. ' + e.startTime + ' (' + e.name +\n ')');\n } else {\n top.complete(e);\n }\n } else if (this.#eventMatchesPhase(e, Types.TraceEvents.Phase.BEGIN)) {\n stack.push(e);\n }\n }\n\n // Handle Begin events with no matching End.\n // This commonly happens due to a bug in the trace machinery. See crbug.com/982252\n while (stack.length) {\n const event = stack.pop();\n if (event) {\n // Masquerade the event as Instant, so it's rendered to the user.\n // The ideal fix is resolving crbug.com/1021571, but handling that without a perfetto migration appears prohibitive\n event.phase = Types.TraceEvents.Phase.INSTANT;\n }\n }\n this.#eventsInternal = this.#eventsInternal.filter((_, idx) => !toDelete.has(idx));\n }\n\n addEvent(payload: EventPayload): Event|null {\n const event = payload.ph === Types.TraceEvents.Phase.OBJECT_SNAPSHOT ? ObjectSnapshot.fromPayload(payload, this) :\n PayloadEvent.fromPayload(payload, this);\n if (TracingModel.isTopLevelEvent(event)) {\n // Discard nested \"top-level\" events.\n const lastTopLevelEvent = this.#lastTopLevelEvent;\n if (lastTopLevelEvent && (lastTopLevelEvent.endTime || 0) > event.startTime) {\n return null;\n }\n this.#lastTopLevelEvent = event;\n }\n this.#eventsInternal.push(event);\n return event;\n }\n\n addAsyncEvent(asyncEvent: AsyncEvent): void {\n this.#asyncEventsInternal.push(asyncEvent);\n }\n\n override setName(name: string): void {\n super.setName(name);\n this.#processInternal.setThreadByName(name, this);\n }\n\n process(): Process {\n return this.#processInternal;\n }\n\n events(): Event[] {\n return this.#eventsInternal;\n }\n\n asyncEvents(): AsyncEvent[] {\n return this.#asyncEventsInternal;\n }\n\n removeEventsByName(name: string): Event[] {\n const extracted: Event[] = [];\n this.#eventsInternal = this.#eventsInternal.filter(e => {\n if (!e) {\n return false;\n }\n\n if (e.name !== name) {\n return true;\n }\n\n extracted.push(e);\n return false;\n });\n\n return extracted;\n }\n}\n\nexport interface TimesForEventMs {\n startTime: Types.Timing.MilliSeconds;\n endTime?: Types.Timing.MilliSeconds;\n selfTime: Types.Timing.MilliSeconds;\n duration: Types.Timing.MilliSeconds;\n}\n\nexport function timesForEventInMilliseconds(event: Event|Types.TraceEvents.TraceEventData): TimesForEventMs {\n if (event instanceof Event) {\n return {\n startTime: Types.Timing.MilliSeconds(event.startTime),\n endTime: event.endTime ? Types.Timing.MilliSeconds(event.endTime) : undefined,\n duration: Types.Timing.MilliSeconds(event.duration || 0),\n selfTime: Types.Timing.MilliSeconds(event.selfTime),\n };\n }\n return Helpers.Timing.eventTimingsMilliSeconds(event);\n}\n// Parsed categories are cached to prevent calling cat.split() multiple\n// times on the same categories string.\nconst parsedCategories = new Map<string, Set<string>>();\nexport function eventHasCategory(event: CompatibleTraceEvent, category: string): boolean {\n if (event instanceof Event) {\n return event.hasCategory(category);\n }\n let parsedCategoriesForEvent = parsedCategories.get(event.cat);\n if (!parsedCategoriesForEvent) {\n parsedCategoriesForEvent = new Set(event.cat.split(',') || []);\n }\n return parsedCategoriesForEvent.has(category);\n}\n\nexport function phaseForEvent(event: Event|Types.TraceEvents.TraceEventData): Types.TraceEvents.Phase {\n if (event instanceof Event) {\n return event.phase;\n }\n return event.ph;\n}\n\nexport function threadIDForEvent(event: Event|Types.TraceEvents.TraceEventData): Types.TraceEvents.ThreadID {\n if (event instanceof Event) {\n return event.thread.idInternal as Types.TraceEvents.ThreadID;\n }\n return event.tid;\n}\n\nexport function eventIsFromNewEngine(event: CompatibleTraceEvent|null): event is Types.TraceEvents.TraceEventData {\n return event !== null && !(event instanceof Event);\n}\n\nexport type CompatibleTraceEvent = Event|Types.TraceEvents.TraceEventData;\n"]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as Handlers from './handlers/handlers.js';
|
|
2
|
+
import * as Types from './types/types.js';
|
|
3
|
+
export interface ParseConfig {
|
|
4
|
+
metadata?: Types.File.MetaData;
|
|
5
|
+
isFreshRecording?: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The new trace engine model we are migrating to. The Model is responsible for
|
|
9
|
+
* parsing arrays of raw trace events and storing the resulting data. It can
|
|
10
|
+
* store multiple traces at once, and can return the data for any of them.
|
|
11
|
+
* Currently as we migrate from the old engine to this, we are turning on the
|
|
12
|
+
* model handlers incrementally as we need the data, to save performance costs
|
|
13
|
+
* of running handlers that we do not use. Therefore, when the model is
|
|
14
|
+
* constructed we pass through a set of handlers that should be used. Once we
|
|
15
|
+
* have migrated all tracks in the Performance Panel to this model, we can
|
|
16
|
+
* remove this ability to run a subset of handlers, as we will need all handlers
|
|
17
|
+
* to be used at that point. For tests, if you want to construct a model with
|
|
18
|
+
* all handlers, you can use the static `Model.createWithAllHandlers` method.
|
|
19
|
+
**/
|
|
20
|
+
export declare class Model<EnabledModelHandlers extends {
|
|
21
|
+
[key: string]: Handlers.Types.TraceEventHandler;
|
|
22
|
+
}> extends EventTarget {
|
|
23
|
+
#private;
|
|
24
|
+
static createWithAllHandlers(config?: Types.Configuration.Configuration): Model<typeof Handlers.ModelHandlers>;
|
|
25
|
+
constructor(handlers: EnabledModelHandlers, config?: Types.Configuration.Configuration);
|
|
26
|
+
/**
|
|
27
|
+
* Updates the configuration. Useful if a user changes a setting - this lets
|
|
28
|
+
* us update the model without having to destroy it and recreate it with the
|
|
29
|
+
* new settings.
|
|
30
|
+
*/
|
|
31
|
+
updateConfiguration(config: Types.Configuration.Configuration): void;
|
|
32
|
+
/**
|
|
33
|
+
* Parses an array of trace events into a structured object containing all the
|
|
34
|
+
* information parsed by the trace handlers.
|
|
35
|
+
* You can `await` this function to pause execution until parsing is complete,
|
|
36
|
+
* or instead rely on the `ModuleUpdateEvent` that is dispatched when the
|
|
37
|
+
* parsing is finished.
|
|
38
|
+
*
|
|
39
|
+
* Once parsed, you then have to call the `traceParsedData` method, providing an
|
|
40
|
+
* index of the trace you want to have the data for. This is because any model
|
|
41
|
+
* can store a number of traces. Each trace is given an index, which starts at 0
|
|
42
|
+
* and increments by one as a new trace is parsed.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* // Awaiting the parse method() to block until parsing complete
|
|
46
|
+
* await this.traceModel.parse(events);
|
|
47
|
+
* const data = this.traceModel.traceParsedData(0)
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* // Using an event listener to be notified when tracing is complete.
|
|
51
|
+
* this.traceModel.addEventListener(Trace.ModelUpdateEvent.eventName, (event) => {
|
|
52
|
+
* if(event.data.data === 'done') {
|
|
53
|
+
* // trace complete
|
|
54
|
+
* const data = this.traceModel.traceParsedData(0);
|
|
55
|
+
* }
|
|
56
|
+
* });
|
|
57
|
+
* void this.traceModel.parse(events);
|
|
58
|
+
**/
|
|
59
|
+
parse(traceEvents: readonly Types.TraceEvents.TraceEventData[], config?: ParseConfig): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Returns the parsed trace data indexed by the order in which it was stored.
|
|
62
|
+
* If no index is given, the last stored parsed data is returned.
|
|
63
|
+
*/
|
|
64
|
+
traceParsedData(index?: number): Handlers.Types.EnabledHandlerDataWithMeta<EnabledModelHandlers> | null;
|
|
65
|
+
metadata(index: number): Types.File.MetaData | null;
|
|
66
|
+
traceEvents(index: number): readonly Types.TraceEvents.TraceEventData[] | null;
|
|
67
|
+
size(): number;
|
|
68
|
+
deleteTraceByIndex(recordingIndex: number): void;
|
|
69
|
+
getRecordingsAvailable(): string[];
|
|
70
|
+
resetProcessor(): void;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* This parsed trace file is used by the Model. It keeps multiple instances
|
|
74
|
+
* of these so that the user can swap between them. The key is that it is
|
|
75
|
+
* essentially the TraceFile plus whatever the model has parsed from it.
|
|
76
|
+
*/
|
|
77
|
+
export type ParsedTraceFile<Handlers extends {
|
|
78
|
+
[key: string]: Handlers.Types.TraceEventHandler;
|
|
79
|
+
}> = Types.File.TraceFile & {
|
|
80
|
+
traceParsedData: Handlers.Types.EnabledHandlerDataWithMeta<Handlers> | null;
|
|
81
|
+
};
|
|
82
|
+
export declare const enum ModelUpdateType {
|
|
83
|
+
COMPLETE = "COMPLETE",
|
|
84
|
+
PROGRESS_UPDATE = "PROGRESS_UPDATE"
|
|
85
|
+
}
|
|
86
|
+
export type ModelUpdateEventData = ModelUpdateEventComplete | ModelUpdateEventProgress;
|
|
87
|
+
export type ModelUpdateEventComplete = {
|
|
88
|
+
type: ModelUpdateType.COMPLETE;
|
|
89
|
+
data: 'done';
|
|
90
|
+
};
|
|
91
|
+
export type ModelUpdateEventProgress = {
|
|
92
|
+
type: ModelUpdateType.PROGRESS_UPDATE;
|
|
93
|
+
data: TraceParseEventProgressData;
|
|
94
|
+
};
|
|
95
|
+
export type TraceParseEventProgressData = {
|
|
96
|
+
index: number;
|
|
97
|
+
total: number;
|
|
98
|
+
};
|
|
99
|
+
export declare class ModelUpdateEvent extends Event {
|
|
100
|
+
data: ModelUpdateEventData;
|
|
101
|
+
static readonly eventName = "modelupdate";
|
|
102
|
+
constructor(data: ModelUpdateEventData);
|
|
103
|
+
}
|
|
104
|
+
declare global {
|
|
105
|
+
interface HTMLElementEventMap {
|
|
106
|
+
[ModelUpdateEvent.eventName]: ModelUpdateEvent;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export declare function isModelUpdateDataComplete(eventData: ModelUpdateEventData): eventData is ModelUpdateEventComplete;
|
|
110
|
+
export declare function isModelUpdateDataProgress(eventData: ModelUpdateEventData): eventData is ModelUpdateEventProgress;
|
|
@@ -1,116 +1,175 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
import * as
|
|
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 * as Platform from '../../core/platform/platform.js';
|
|
5
|
+
import * as Handlers from './handlers/handlers.js';
|
|
6
|
+
import * as Helpers from './helpers/helpers.js';
|
|
7
|
+
import { TraceParseProgressEvent, TraceProcessor } from './Processor.js';
|
|
8
|
+
import * as Types from './types/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* The new trace engine model we are migrating to. The Model is responsible for
|
|
11
|
+
* parsing arrays of raw trace events and storing the resulting data. It can
|
|
12
|
+
* store multiple traces at once, and can return the data for any of them.
|
|
13
|
+
* Currently as we migrate from the old engine to this, we are turning on the
|
|
14
|
+
* model handlers incrementally as we need the data, to save performance costs
|
|
15
|
+
* of running handlers that we do not use. Therefore, when the model is
|
|
16
|
+
* constructed we pass through a set of handlers that should be used. Once we
|
|
17
|
+
* have migrated all tracks in the Performance Panel to this model, we can
|
|
18
|
+
* remove this ability to run a subset of handlers, as we will need all handlers
|
|
19
|
+
* to be used at that point. For tests, if you want to construct a model with
|
|
20
|
+
* all handlers, you can use the static `Model.createWithAllHandlers` method.
|
|
21
|
+
**/
|
|
6
22
|
export class Model extends EventTarget {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
constructor(handlers, config) {
|
|
17
|
-
super();
|
|
18
|
-
if (config) {
|
|
19
|
-
this.#config = config;
|
|
23
|
+
#traces = [];
|
|
24
|
+
#nextNumberByDomain = new Map();
|
|
25
|
+
#recordingsAvailable = [];
|
|
26
|
+
#lastRecordingIndex = 0;
|
|
27
|
+
#processor;
|
|
28
|
+
#config = Types.Configuration.DEFAULT;
|
|
29
|
+
static createWithAllHandlers(config) {
|
|
30
|
+
return new Model(Handlers.ModelHandlers, config);
|
|
20
31
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
async parse(traceEvents, config) {
|
|
28
|
-
const metadata = config?.metadata || {};
|
|
29
|
-
const isFreshRecording = config?.isFreshRecording || false;
|
|
30
|
-
const onTraceUpdate = (event) => {
|
|
31
|
-
const { data } = event;
|
|
32
|
-
this.dispatchEvent(new ModelUpdateEvent({ type: ModelUpdateType.PROGRESS_UPDATE, data }));
|
|
33
|
-
};
|
|
34
|
-
this.#processor.addEventListener(TraceParseProgressEvent.eventName, onTraceUpdate);
|
|
35
|
-
const file = {
|
|
36
|
-
traceEvents,
|
|
37
|
-
metadata,
|
|
38
|
-
traceParsedData: null
|
|
39
|
-
};
|
|
40
|
-
try {
|
|
41
|
-
await this.#processor.parse(traceEvents, isFreshRecording);
|
|
42
|
-
this.#storeParsedFileData(file, this.#processor.data);
|
|
43
|
-
this.#traces.push(file);
|
|
44
|
-
} catch (e) {
|
|
45
|
-
throw e;
|
|
46
|
-
} finally {
|
|
47
|
-
this.#processor.removeEventListener(TraceParseProgressEvent.eventName, onTraceUpdate);
|
|
48
|
-
this.dispatchEvent(new ModelUpdateEvent({ type: ModelUpdateType.COMPLETE, data: "done" }));
|
|
32
|
+
constructor(handlers, config) {
|
|
33
|
+
super();
|
|
34
|
+
if (config) {
|
|
35
|
+
this.#config = config;
|
|
36
|
+
}
|
|
37
|
+
this.#processor = new TraceProcessor(handlers, this.#config);
|
|
49
38
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (origin) {
|
|
59
|
-
const nextSequenceForDomain = Platform.MapUtilities.getWithDefault(this.#nextNumberByDomain, origin, () => 1);
|
|
60
|
-
recordingName = `${origin} (${nextSequenceForDomain})`;
|
|
61
|
-
this.#nextNumberByDomain.set(origin, nextSequenceForDomain + 1);
|
|
62
|
-
}
|
|
39
|
+
/**
|
|
40
|
+
* Updates the configuration. Useful if a user changes a setting - this lets
|
|
41
|
+
* us update the model without having to destroy it and recreate it with the
|
|
42
|
+
* new settings.
|
|
43
|
+
*/
|
|
44
|
+
updateConfiguration(config) {
|
|
45
|
+
this.#config = config;
|
|
46
|
+
this.#processor.updateConfiguration(config);
|
|
63
47
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
48
|
+
/**
|
|
49
|
+
* Parses an array of trace events into a structured object containing all the
|
|
50
|
+
* information parsed by the trace handlers.
|
|
51
|
+
* You can `await` this function to pause execution until parsing is complete,
|
|
52
|
+
* or instead rely on the `ModuleUpdateEvent` that is dispatched when the
|
|
53
|
+
* parsing is finished.
|
|
54
|
+
*
|
|
55
|
+
* Once parsed, you then have to call the `traceParsedData` method, providing an
|
|
56
|
+
* index of the trace you want to have the data for. This is because any model
|
|
57
|
+
* can store a number of traces. Each trace is given an index, which starts at 0
|
|
58
|
+
* and increments by one as a new trace is parsed.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* // Awaiting the parse method() to block until parsing complete
|
|
62
|
+
* await this.traceModel.parse(events);
|
|
63
|
+
* const data = this.traceModel.traceParsedData(0)
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* // Using an event listener to be notified when tracing is complete.
|
|
67
|
+
* this.traceModel.addEventListener(Trace.ModelUpdateEvent.eventName, (event) => {
|
|
68
|
+
* if(event.data.data === 'done') {
|
|
69
|
+
* // trace complete
|
|
70
|
+
* const data = this.traceModel.traceParsedData(0);
|
|
71
|
+
* }
|
|
72
|
+
* });
|
|
73
|
+
* void this.traceModel.parse(events);
|
|
74
|
+
**/
|
|
75
|
+
async parse(traceEvents, config) {
|
|
76
|
+
const metadata = config?.metadata || {};
|
|
77
|
+
const isFreshRecording = config?.isFreshRecording || false;
|
|
78
|
+
// During parsing, periodically update any listeners on each processors'
|
|
79
|
+
// progress (if they have any updates).
|
|
80
|
+
const onTraceUpdate = (event) => {
|
|
81
|
+
const { data } = event;
|
|
82
|
+
this.dispatchEvent(new ModelUpdateEvent({ type: "PROGRESS_UPDATE" /* ModelUpdateType.PROGRESS_UPDATE */, data: data }));
|
|
83
|
+
};
|
|
84
|
+
this.#processor.addEventListener(TraceParseProgressEvent.eventName, onTraceUpdate);
|
|
85
|
+
// Create a parsed trace file. It will be populated with data from the processor.
|
|
86
|
+
const file = {
|
|
87
|
+
traceEvents,
|
|
88
|
+
metadata,
|
|
89
|
+
traceParsedData: null,
|
|
90
|
+
};
|
|
91
|
+
try {
|
|
92
|
+
// Wait for all outstanding promises before finishing the async execution,
|
|
93
|
+
// but perform all tasks in parallel.
|
|
94
|
+
await this.#processor.parse(traceEvents, isFreshRecording);
|
|
95
|
+
this.#storeParsedFileData(file, this.#processor.data);
|
|
96
|
+
// We only push the file onto this.#traces here once we know it's valid
|
|
97
|
+
// and there's been no errors in the parsing.
|
|
98
|
+
this.#traces.push(file);
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
throw e;
|
|
102
|
+
}
|
|
103
|
+
finally {
|
|
104
|
+
// All processors have finished parsing, no more updates are expected.
|
|
105
|
+
this.#processor.removeEventListener(TraceParseProgressEvent.eventName, onTraceUpdate);
|
|
106
|
+
// Finally, update any listeners that all processors are 'done'.
|
|
107
|
+
this.dispatchEvent(new ModelUpdateEvent({ type: "COMPLETE" /* ModelUpdateType.COMPLETE */, data: 'done' }));
|
|
108
|
+
}
|
|
69
109
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
110
|
+
#storeParsedFileData(file, data) {
|
|
111
|
+
file.traceParsedData = data;
|
|
112
|
+
this.#lastRecordingIndex++;
|
|
113
|
+
let recordingName = `Trace ${this.#lastRecordingIndex}`;
|
|
114
|
+
let origin = null;
|
|
115
|
+
if (file.traceParsedData) {
|
|
116
|
+
origin = Helpers.Trace.extractOriginFromTrace(file.traceParsedData.Meta.mainFrameURL);
|
|
117
|
+
if (origin) {
|
|
118
|
+
const nextSequenceForDomain = Platform.MapUtilities.getWithDefault(this.#nextNumberByDomain, origin, () => 1);
|
|
119
|
+
recordingName = `${origin} (${nextSequenceForDomain})`;
|
|
120
|
+
this.#nextNumberByDomain.set(origin, nextSequenceForDomain + 1);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
this.#recordingsAvailable.push(recordingName);
|
|
75
124
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
125
|
+
/**
|
|
126
|
+
* Returns the parsed trace data indexed by the order in which it was stored.
|
|
127
|
+
* If no index is given, the last stored parsed data is returned.
|
|
128
|
+
*/
|
|
129
|
+
traceParsedData(index = this.#traces.length - 1) {
|
|
130
|
+
if (!this.#traces[index]) {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
return this.#traces[index].traceParsedData;
|
|
134
|
+
}
|
|
135
|
+
metadata(index) {
|
|
136
|
+
if (!this.#traces[index]) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
return this.#traces[index].metadata;
|
|
140
|
+
}
|
|
141
|
+
traceEvents(index) {
|
|
142
|
+
if (!this.#traces[index]) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
return this.#traces[index].traceEvents;
|
|
146
|
+
}
|
|
147
|
+
size() {
|
|
148
|
+
return this.#traces.length;
|
|
149
|
+
}
|
|
150
|
+
deleteTraceByIndex(recordingIndex) {
|
|
151
|
+
this.#traces.splice(recordingIndex, 1);
|
|
152
|
+
this.#recordingsAvailable.splice(recordingIndex, 1);
|
|
153
|
+
}
|
|
154
|
+
getRecordingsAvailable() {
|
|
155
|
+
return this.#recordingsAvailable;
|
|
156
|
+
}
|
|
157
|
+
resetProcessor() {
|
|
158
|
+
this.#processor.reset();
|
|
81
159
|
}
|
|
82
|
-
return this.#traces[index].traceEvents;
|
|
83
|
-
}
|
|
84
|
-
size() {
|
|
85
|
-
return this.#traces.length;
|
|
86
|
-
}
|
|
87
|
-
deleteTraceByIndex(recordingIndex) {
|
|
88
|
-
this.#traces.splice(recordingIndex, 1);
|
|
89
|
-
this.#recordingsAvailable.splice(recordingIndex, 1);
|
|
90
|
-
}
|
|
91
|
-
getRecordingsAvailable() {
|
|
92
|
-
return this.#recordingsAvailable;
|
|
93
|
-
}
|
|
94
|
-
resetProcessor() {
|
|
95
|
-
this.#processor.reset();
|
|
96
|
-
}
|
|
97
160
|
}
|
|
98
|
-
export var ModelUpdateType = /* @__PURE__ */ ((ModelUpdateType2) => {
|
|
99
|
-
ModelUpdateType2["COMPLETE"] = "COMPLETE";
|
|
100
|
-
ModelUpdateType2["PROGRESS_UPDATE"] = "PROGRESS_UPDATE";
|
|
101
|
-
return ModelUpdateType2;
|
|
102
|
-
})(ModelUpdateType || {});
|
|
103
161
|
export class ModelUpdateEvent extends Event {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
162
|
+
data;
|
|
163
|
+
static eventName = 'modelupdate';
|
|
164
|
+
constructor(data) {
|
|
165
|
+
super(ModelUpdateEvent.eventName);
|
|
166
|
+
this.data = data;
|
|
167
|
+
}
|
|
109
168
|
}
|
|
110
169
|
export function isModelUpdateDataComplete(eventData) {
|
|
111
|
-
|
|
170
|
+
return eventData.type === "COMPLETE" /* ModelUpdateType.COMPLETE */;
|
|
112
171
|
}
|
|
113
172
|
export function isModelUpdateDataProgress(eventData) {
|
|
114
|
-
|
|
173
|
+
return eventData.type === "PROGRESS_UPDATE" /* ModelUpdateType.PROGRESS_UPDATE */;
|
|
115
174
|
}
|
|
116
|
-
//# sourceMappingURL=ModelImpl.js.map
|
|
175
|
+
//# sourceMappingURL=ModelImpl.js.map
|