Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions frontend/app/components/trace_viewer/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
40 changes: 32 additions & 8 deletions frontend/app/components/trace_viewer_v2/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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[];
}

/**
Expand All @@ -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<string, unknown>;
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']);
}
}

Expand Down Expand Up @@ -1112,14 +1136,14 @@ export async function traceViewerV2Main(
} else {
const jsonData = (await loadJsonDataInternal(
urlObj.toString(),
)) as Record<string, unknown>;
)) 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);
Expand Down