fix(tracing): do not serialize buffers into the trace file (#18132)

Fixes #18126.
This commit is contained in:
Dmitry Gozman 2022-10-17 16:17:25 -07:00 committed by GitHub
parent 734dd5d171
commit 6d363888f2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 11 deletions

View file

@ -367,8 +367,8 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps
onEntryFinished(entry: har.Entry) { onEntryFinished(entry: har.Entry) {
const event: trace.ResourceSnapshotTraceEvent = { type: 'resource-snapshot', snapshot: entry }; const event: trace.ResourceSnapshotTraceEvent = { type: 'resource-snapshot', snapshot: entry };
this._appendTraceOperation(async () => { this._appendTraceOperation(async () => {
visitSha1s(event, this._state!.networkSha1s); const visited = visitTraceEvent(event, this._state!.networkSha1s);
await fs.promises.appendFile(this._state!.networkFile, JSON.stringify(event) + '\n'); await fs.promises.appendFile(this._state!.networkFile, JSON.stringify(visited) + '\n');
}); });
} }
@ -408,8 +408,8 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps
private _appendTraceEvent(event: trace.TraceEvent) { private _appendTraceEvent(event: trace.TraceEvent) {
this._appendTraceOperation(async () => { this._appendTraceOperation(async () => {
visitSha1s(event, this._state!.traceSha1s); const visited = visitTraceEvent(event, this._state!.traceSha1s);
await fs.promises.appendFile(this._state!.traceFile, JSON.stringify(event) + '\n'); await fs.promises.appendFile(this._state!.traceFile, JSON.stringify(visited) + '\n');
}); });
} }
@ -452,22 +452,24 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps
} }
} }
function visitSha1s(object: any, sha1s: Set<string>) { function visitTraceEvent(object: any, sha1s: Set<string>): any {
if (Array.isArray(object)) { if (Array.isArray(object))
object.forEach(o => visitSha1s(o, sha1s)); return object.map(o => visitTraceEvent(o, sha1s));
return; if (object instanceof Buffer)
} return undefined;
if (typeof object === 'object') { if (typeof object === 'object') {
const result: any = {};
for (const key in object) { for (const key in object) {
if (key === 'sha1' || key === '_sha1' || key.endsWith('Sha1')) { if (key === 'sha1' || key === '_sha1' || key.endsWith('Sha1')) {
const sha1 = object[key]; const sha1 = object[key];
if (sha1) if (sha1)
sha1s.add(sha1); sha1s.add(sha1);
} }
visitSha1s(object[key], sha1s); result[key] = visitTraceEvent(object[key], sha1s);
} }
return; return result;
} }
return object;
} }
export function shouldCaptureSnapshot(metadata: CallMetadata): boolean { export function shouldCaptureSnapshot(metadata: CallMetadata): boolean {

View file

@ -107,6 +107,17 @@ test('should not collect snapshots by default', async ({ context, page, server }
expect(events.some(e => e.type === 'resource-snapshot')).toBeFalsy(); expect(events.some(e => e.type === 'resource-snapshot')).toBeFalsy();
}); });
test('should not include buffers in the trace', async ({ context, page, server }, testInfo) => {
await context.tracing.start({ snapshots: true });
await page.goto(server.PREFIX + '/empty.html');
await page.screenshot();
await context.tracing.stop({ path: testInfo.outputPath('trace.zip') });
const { events } = await parseTrace(testInfo.outputPath('trace.zip'));
const screenshotEvent = events.find(e => e.type === 'action' && e.metadata.apiName === 'page.screenshot');
expect(screenshotEvent.metadata.snapshots.length).toBe(2);
expect(screenshotEvent.metadata.result).toEqual({});
});
test('should exclude internal pages', async ({ browserName, context, page, server }, testInfo) => { test('should exclude internal pages', async ({ browserName, context, page, server }, testInfo) => {
test.fixme(true, 'https://github.com/microsoft/playwright/issues/6743'); test.fixme(true, 'https://github.com/microsoft/playwright/issues/6743');
await page.goto(server.EMPTY_PAGE); await page.goto(server.EMPTY_PAGE);