diff --git a/frontend/app/components/trace_viewer/BUILD b/frontend/app/components/trace_viewer/BUILD index 410726497..ea0346a8e 100644 --- a/frontend/app/components/trace_viewer/BUILD +++ b/frontend/app/components/trace_viewer/BUILD @@ -62,6 +62,8 @@ xprof_ng_module( "//javascript/angular2/testing/catalyst/fake_async", "//third_party/javascript/typings/jasmine", "@npm//@angular/common", + "@npm//@angular/core", + "@npm//@angular/core_testing", "@npm//@angular/router", "@npm//@ngrx/store", "@npm//rxjs", diff --git a/frontend/app/components/trace_viewer_v2/main.ts b/frontend/app/components/trace_viewer_v2/main.ts index d65ff3ebf..ba77f089e 100644 --- a/frontend/app/components/trace_viewer_v2/main.ts +++ b/frontend/app/components/trace_viewer_v2/main.ts @@ -215,10 +215,30 @@ declare global { /** * Interface for the trace data loaded by the trace viewer. */ +export interface RawData { + [key: string]: string | number; +} + +export interface RawDetailsData { + [key: string]: boolean | undefined; +} + +export interface RawDetailItem { + name?: string; + value?: boolean; +} + +export interface RawTraceData { + [key: string]: RawData[] | [number, number] | TraceDetails | RawDetailsData | RawDetailItem[] | undefined; + traceEvents?: RawData[]; + fullTimespan?: [number, number]; + details?: TraceDetails | RawDetailsData | RawDetailItem[]; +} + export declare interface TraceData { - traceEvents: Array<{[key: string]: unknown}>; + traceEvents: RawData[]; fullTimespan?: [number, number]; - details?: TraceDetails; + details?: TraceDetails | RawDetailsData | RawDetailItem[]; } /** @@ -239,20 +259,24 @@ export function isTraceData(data: unknown): data is TraceData { * Dispatches a DETAILS_RECEIVED_EVENT if the trace data contains details. */ function maybeDispatchDetailsReceivedEvent(jsonData: TraceData) { - const rawDetails = jsonData.details as unknown; + const rawDetails = jsonData.details; if (!rawDetails) return; const details: TraceDetails = new Map(); if (Array.isArray(rawDetails)) { for (const d of rawDetails) { - if (d && typeof d === 'object' && d.name === 'full_dma') { + if (d && typeof d === 'object' && d.name === 'full_dma' && d.value !== undefined) { details.set('full_dma', d.value); } } + } else if (rawDetails instanceof Map) { + if (rawDetails.has('full_dma')) { + details.set('full_dma', rawDetails.get('full_dma')!); + } } else if (typeof rawDetails === 'object' && rawDetails !== null) { - const rawDetailsObj = rawDetails as Record; + const rawDetailsObj = rawDetails as RawDetailsData; if (rawDetailsObj['full_dma'] !== undefined) { - details.set('full_dma', rawDetailsObj['full_dma'] as boolean); + details.set('full_dma', rawDetailsObj['full_dma']); } } @@ -1112,14 +1136,14 @@ export async function traceViewerV2Main( } else { const jsonData = (await loadJsonDataInternal( urlObj.toString(), - )) as Record; + )) as RawTraceData; // Mirror the legacy behavior: gently default to an empty array if // traceEvents is missing so that the WASM module can safely clear out // any previous search results. const normalizedData: TraceData = { ...jsonData, traceEvents: Array.isArray(jsonData?.['traceEvents']) - ? (jsonData['traceEvents'] as Array<{[key: string]: unknown}>) + ? (jsonData['traceEvents'] as RawData[]) : [], }; traceviewerModule.setSearchResultsInWasm(normalizedData);