Skip to content

Commit 71d3201

Browse files
Connor ClarkDevtools-frontend LUCI CQ
authored andcommitted
[RPP] Support loading compressed enhanced traces
Bug: 432043263 Change-Id: Id5bacaa55e6b32d06b8eb4e8a19e1a4321bbb6f9 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6761382 Commit-Queue: Paul Irish <[email protected]> Reviewed-by: Paul Irish <[email protected]> Commit-Queue: Connor Clark <[email protected]> Auto-Submit: Connor Clark <[email protected]>
1 parent fed93c7 commit 71d3201

File tree

3 files changed

+36
-24
lines changed

3 files changed

+36
-24
lines changed

front_end/core/sdk/RehydratingConnection.ts

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -93,34 +93,33 @@ export class RehydratingConnection implements ProtocolClient.InspectorBackend.Co
9393
*/
9494
#onReceiveHostWindowPayload(event: MessageEvent): void {
9595
if (event.data.type === 'REHYDRATING_TRACE_FILE') {
96-
const {traceFile} = event.data;
97-
const reader = new FileReader();
98-
reader.onload = async(): Promise<void> => {
99-
await this.startHydration(reader.result as string);
100-
};
101-
reader.onerror = (): void => {
96+
const traceJson = event.data.traceJson as string;
97+
let trace;
98+
try {
99+
trace = JSON.parse(traceJson) as TraceFile;
100+
} catch {
102101
this.#onConnectionLost(i18nString(UIStrings.errorLoadingLog));
103-
};
104-
reader.readAsText(traceFile);
102+
return;
103+
}
104+
void this.startHydration(trace);
105105
}
106106
this.#rehydratingWindow.removeEventListener('message', this.#onReceiveHostWindowPayloadBound);
107107
}
108108

109-
async startHydration(logPayload: string): Promise<boolean> {
109+
async startHydration(trace: TraceFile): Promise<boolean> {
110110
// OnMessage should've been set before hydration, and the connection should
111111
// be initialized and not hydrated already.
112112
if (!this.onMessage || this.rehydratingConnectionState !== RehydratingConnectionState.INITIALIZED) {
113113
return false;
114114
}
115115

116-
const payload = JSON.parse(logPayload) as TraceFile;
117-
if (!('traceEvents' in payload)) {
116+
if (!('traceEvents' in trace)) {
118117
console.error('RehydratingConnection failed to initialize due to missing trace events in payload');
119118
return false;
120119
}
121120

122-
this.trace = payload;
123-
const enhancedTracesParser = new EnhancedTraces.EnhancedTracesParser(payload);
121+
this.trace = trace;
122+
const enhancedTracesParser = new EnhancedTraces.EnhancedTracesParser(trace);
124123
const hydratingData = enhancedTracesParser.data();
125124

126125
let sessionId = 0;

front_end/panels/timeline/TimelineLoader.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,24 @@ export class TimelineLoader implements Common.StringOutputStream.OutputStream {
7676
return loader;
7777
}
7878

79+
static loadFromParsedJsonFile(contents: ParsedJSONFile, client: Client): TimelineLoader {
80+
const loader = new TimelineLoader(client);
81+
82+
window.setTimeout(async () => {
83+
client.loadingStarted();
84+
try {
85+
loader.#processParsedFile(contents);
86+
await loader.close();
87+
} catch (e: unknown) {
88+
await loader.close();
89+
const message = e instanceof Error ? e.message : '';
90+
return loader.reportErrorAndCancelLoading(i18nString(UIStrings.malformedTimelineDataS, {PH1: message}));
91+
}
92+
});
93+
94+
return loader;
95+
}
96+
7997
static loadFromEvents(events: Trace.Types.Events.Event[], client: Client): TimelineLoader {
8098
const loader = new TimelineLoader(client);
8199
window.setTimeout(async () => {

front_end/panels/timeline/TimelinePanel.ts

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,25 +1538,20 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
15381538
if (this.state !== State.IDLE) {
15391539
return;
15401540
}
1541-
const maximumTraceFileLengthToDetermineEnhancedTraces = 5000;
1542-
// We are expecting to locate the enhanced traces version within the first 5000
1543-
// characters of the trace file if the given trace file is enhanced traces.
1544-
// Doing so can avoid serializing the whole trace while needing to serialize
1545-
// it again in rehydrated session for enhanced traces.
1546-
const blob = file.slice(0, maximumTraceFileLengthToDetermineEnhancedTraces);
1547-
const content = await blob.text();
1541+
1542+
const content = await Common.Gzip.fileToString(file);
15481543
if (content.includes('enhancedTraceVersion')) {
15491544
await window.scheduler.postTask(() => {
1550-
this.#launchRehydratedSession(file);
1545+
this.#launchRehydratedSession(content);
15511546
}, {priority: 'background'});
15521547
} else {
1553-
this.loader = await TimelineLoader.loadFromFile(file, this);
1548+
this.loader = TimelineLoader.loadFromParsedJsonFile(JSON.parse(content), this);
15541549
this.prepareToLoadTimeline();
15551550
}
15561551
this.createFileSelector();
15571552
}
15581553

1559-
#launchRehydratedSession(file: File): void {
1554+
#launchRehydratedSession(traceJson: string): void {
15601555
let rehydratingWindow: Window|null = null;
15611556
let pathToLaunch: string|null = null;
15621557
const url = new URL(window.location.href);
@@ -1568,7 +1563,7 @@ export class TimelinePanel extends Common.ObjectWrapper.eventMixin<EventTypes, t
15681563
const hostWindow = window;
15691564
function onMessageHandler(ev: MessageEvent): void {
15701565
if (url && ev.data && ev.data.type === 'REHYDRATING_WINDOW_READY') {
1571-
rehydratingWindow?.postMessage({type: 'REHYDRATING_TRACE_FILE', traceFile: file}, url.origin);
1566+
rehydratingWindow?.postMessage({type: 'REHYDRATING_TRACE_FILE', traceJson}, url.origin);
15721567
}
15731568
hostWindow.removeEventListener('message', onMessageHandler);
15741569
}

0 commit comments

Comments
 (0)