fix(tracing): do not serialize buffers into the trace file (#18132)
Fixes #18126.
This commit is contained in:
parent
734dd5d171
commit
6d363888f2
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue