fixed review comments and made the code way easier
Signed-off-by: René <snooz@posteo.de>
This commit is contained in:
parent
c39e5f90c9
commit
6f45a0d0a9
|
|
@ -18,7 +18,6 @@ import type * as api from '../../types/types';
|
||||||
import type * as channels from '@protocol/channels';
|
import type * as channels from '@protocol/channels';
|
||||||
import { Artifact } from './artifact';
|
import { Artifact } from './artifact';
|
||||||
import { ChannelOwner } from './channelOwner';
|
import { ChannelOwner } from './channelOwner';
|
||||||
import { captureRawStack, filteredStackTrace } from '../utils';
|
|
||||||
|
|
||||||
export class Tracing extends ChannelOwner<channels.TracingChannel> implements api.Tracing {
|
export class Tracing extends ChannelOwner<channels.TracingChannel> implements api.Tracing {
|
||||||
private _includeSources = false;
|
private _includeSources = false;
|
||||||
|
|
@ -53,10 +52,6 @@ export class Tracing extends ChannelOwner<channels.TracingChannel> implements ap
|
||||||
}
|
}
|
||||||
|
|
||||||
async group(name: string, options: { location?: { file: string, line?: number, column?: number } } = {}) {
|
async group(name: string, options: { location?: { file: string, line?: number, column?: number } } = {}) {
|
||||||
if (!options.location) {
|
|
||||||
const filteredStack = filteredStackTrace(captureRawStack());
|
|
||||||
options.location = filteredStack[0];
|
|
||||||
}
|
|
||||||
await this._channel.tracingGroup({ name, options });
|
await this._channel.tracingGroup({ name, options });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import type * as channels from '@protocol/channels';
|
import type * as channels from '@protocol/channels';
|
||||||
|
import type { CallMetadata } from '@protocol/callMetadata';
|
||||||
import type { Tracing } from '../trace/recorder/tracing';
|
import type { Tracing } from '../trace/recorder/tracing';
|
||||||
import { ArtifactDispatcher } from './artifactDispatcher';
|
import { ArtifactDispatcher } from './artifactDispatcher';
|
||||||
import { Dispatcher, existingDispatcher } from './dispatcher';
|
import { Dispatcher, existingDispatcher } from './dispatcher';
|
||||||
|
|
@ -41,9 +42,9 @@ export class TracingDispatcher extends Dispatcher<Tracing, channels.TracingChann
|
||||||
return await this._object.startChunk(params);
|
return await this._object.startChunk(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
async tracingGroup(params: channels.TracingTracingGroupParams): Promise<channels.TracingTracingGroupResult> {
|
async tracingGroup(params: channels.TracingTracingGroupParams, metadata: CallMetadata): Promise<channels.TracingTracingGroupResult> {
|
||||||
const { name, options } = params;
|
const { name, options } = params;
|
||||||
await this._object.group(name, options);
|
await this._object.group(name, options, metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
async tracingGroupEnd(params: channels.TracingTracingGroupEndParams): Promise<channels.TracingTracingGroupEndResult> {
|
async tracingGroupEnd(params: channels.TracingTracingGroupEndParams): Promise<channels.TracingTracingGroupEndResult> {
|
||||||
|
|
|
||||||
|
|
@ -62,7 +62,6 @@ type RecordingState = {
|
||||||
recording: boolean;
|
recording: boolean;
|
||||||
callIds: Set<string>;
|
callIds: Set<string>;
|
||||||
groupStack: string[];
|
groupStack: string[];
|
||||||
groupId: number;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const kScreencastOptions = { width: 800, height: 600, quality: 90 };
|
const kScreencastOptions = { width: 800, height: 600, quality: 90 };
|
||||||
|
|
@ -151,7 +150,6 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps
|
||||||
recording: false,
|
recording: false,
|
||||||
callIds: new Set(),
|
callIds: new Set(),
|
||||||
groupStack: [],
|
groupStack: [],
|
||||||
groupId: 0,
|
|
||||||
};
|
};
|
||||||
this._fs.mkdir(this._state.resourcesDir);
|
this._fs.mkdir(this._state.resourcesDir);
|
||||||
this._fs.writeFile(this._state.networkFile, '');
|
this._fs.writeFile(this._state.networkFile, '');
|
||||||
|
|
@ -198,23 +196,27 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps
|
||||||
return { traceName: this._state.traceName };
|
return { traceName: this._state.traceName };
|
||||||
}
|
}
|
||||||
|
|
||||||
async group(name: string, options: { location?: { file: string, line?: number, column?: number } } = {}): Promise<void> {
|
async group(name: string, options: { location?: { file: string, line?: number, column?: number } } = {}, metadata: CallMetadata): Promise<void> {
|
||||||
if (!this._state)
|
if (!this._state)
|
||||||
return;
|
return;
|
||||||
const stackFrame: StackFrame = {
|
const stackFrames: StackFrame[] = [];
|
||||||
file: options.location?.file || '',
|
const { file, line, column } = options.location ?? metadata.location ?? {};
|
||||||
line: options.location?.line || 0,
|
if (file) {
|
||||||
column: options.location?.column || 0,
|
stackFrames.push({
|
||||||
};
|
file,
|
||||||
|
line: line ?? 0,
|
||||||
|
column: column ?? 0,
|
||||||
|
});
|
||||||
|
}
|
||||||
const event: trace.BeforeActionTraceEvent = {
|
const event: trace.BeforeActionTraceEvent = {
|
||||||
type: 'before',
|
type: 'before',
|
||||||
callId: `group-${this._state.groupId++}`,
|
callId: metadata.id,
|
||||||
startTime: monotonicTime(),
|
startTime: metadata.startTime,
|
||||||
apiName: name,
|
apiName: name,
|
||||||
class: 'Tracing',
|
class: 'Tracing',
|
||||||
method: 'group',
|
method: 'group',
|
||||||
params: { },
|
params: { },
|
||||||
stack: [stackFrame],
|
stack: stackFrames,
|
||||||
};
|
};
|
||||||
if (this._state.groupStack.length)
|
if (this._state.groupStack.length)
|
||||||
event.parentId = this._state.groupStack[this._state.groupStack.length - 1];
|
event.parentId = this._state.groupStack[this._state.groupStack.length - 1];
|
||||||
|
|
@ -403,10 +405,12 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps
|
||||||
|
|
||||||
onBeforeCall(sdkObject: SdkObject, metadata: CallMetadata) {
|
onBeforeCall(sdkObject: SdkObject, metadata: CallMetadata) {
|
||||||
// IMPORTANT: no awaits before this._appendTraceEvent in this method.
|
// IMPORTANT: no awaits before this._appendTraceEvent in this method.
|
||||||
const event = createBeforeActionTraceEvent(metadata);
|
const event = createBeforeActionTraceEvent(
|
||||||
|
metadata,
|
||||||
|
this._state?.groupStack.length ? this._state.groupStack[this._state.groupStack.length - 1] : undefined
|
||||||
|
);
|
||||||
if (!event)
|
if (!event)
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
this._applyOpenGroup(event);
|
|
||||||
sdkObject.attribution.page?.temporarilyDisableTracingScreencastThrottling();
|
sdkObject.attribution.page?.temporarilyDisableTracingScreencastThrottling();
|
||||||
event.beforeSnapshot = `before@${metadata.id}`;
|
event.beforeSnapshot = `before@${metadata.id}`;
|
||||||
this._state?.callIds.add(metadata.id);
|
this._state?.callIds.add(metadata.id);
|
||||||
|
|
@ -414,11 +418,6 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps
|
||||||
return this._captureSnapshot(event.beforeSnapshot, sdkObject, metadata);
|
return this._captureSnapshot(event.beforeSnapshot, sdkObject, metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
private _applyOpenGroup(event: trace.BeforeActionTraceEvent) {
|
|
||||||
if (event.parentId === undefined && this._state?.groupStack.length)
|
|
||||||
event.parentId = this._state?.groupStack[this._state.groupStack.length - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
onBeforeInputAction(sdkObject: SdkObject, metadata: CallMetadata) {
|
onBeforeInputAction(sdkObject: SdkObject, metadata: CallMetadata) {
|
||||||
if (!this._state?.callIds.has(metadata.id))
|
if (!this._state?.callIds.has(metadata.id))
|
||||||
return Promise.resolve();
|
return Promise.resolve();
|
||||||
|
|
@ -626,10 +625,10 @@ export function shouldCaptureSnapshot(metadata: CallMetadata): boolean {
|
||||||
return commandsWithTracingSnapshots.has(metadata.type + '.' + metadata.method);
|
return commandsWithTracingSnapshots.has(metadata.type + '.' + metadata.method);
|
||||||
}
|
}
|
||||||
|
|
||||||
function createBeforeActionTraceEvent(metadata: CallMetadata): trace.BeforeActionTraceEvent | null {
|
function createBeforeActionTraceEvent(metadata: CallMetadata, parentId?: string): trace.BeforeActionTraceEvent | null {
|
||||||
if (metadata.internal || metadata.method.startsWith('tracing'))
|
if (metadata.internal || metadata.method.startsWith('tracing'))
|
||||||
return null;
|
return null;
|
||||||
return {
|
const event: trace.BeforeActionTraceEvent = {
|
||||||
type: 'before',
|
type: 'before',
|
||||||
callId: metadata.id,
|
callId: metadata.id,
|
||||||
startTime: metadata.startTime,
|
startTime: metadata.startTime,
|
||||||
|
|
@ -640,6 +639,9 @@ function createBeforeActionTraceEvent(metadata: CallMetadata): trace.BeforeActio
|
||||||
stepId: metadata.stepId,
|
stepId: metadata.stepId,
|
||||||
pageId: metadata.pageId,
|
pageId: metadata.pageId,
|
||||||
};
|
};
|
||||||
|
if (parentId)
|
||||||
|
event.parentId = parentId;
|
||||||
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createInputActionTraceEvent(metadata: CallMetadata): trace.InputActionTraceEvent | null {
|
function createInputActionTraceEvent(metadata: CallMetadata): trace.InputActionTraceEvent | null {
|
||||||
|
|
|
||||||
|
|
@ -47,25 +47,6 @@ export function captureRawStack(): RawStack {
|
||||||
return stack.split('\n');
|
return stack.split('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
export function filterStackFile(file: string) {
|
|
||||||
if (!process.env.PWDEBUGIMPL && file.startsWith(CORE_DIR))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function filteredStackTrace(rawStack: RawStack): StackFrame[] {
|
|
||||||
const frames: StackFrame[] = [];
|
|
||||||
for (const line of rawStack) {
|
|
||||||
const frame = parseStackTraceLine(line);
|
|
||||||
if (!frame || !frame.file)
|
|
||||||
continue;
|
|
||||||
if (!filterStackFile(frame.file))
|
|
||||||
continue;
|
|
||||||
frames.push(frame);
|
|
||||||
}
|
|
||||||
return frames;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function captureLibraryStackTrace(): { frames: StackFrame[], apiName: string } {
|
export function captureLibraryStackTrace(): { frames: StackFrame[], apiName: string } {
|
||||||
const stack = captureRawStack();
|
const stack = captureRawStack();
|
||||||
|
|
||||||
|
|
|
||||||
6
packages/playwright-core/types/types.d.ts
vendored
6
packages/playwright-core/types/types.d.ts
vendored
|
|
@ -21059,8 +21059,8 @@ export interface Touchscreen {
|
||||||
*/
|
*/
|
||||||
export interface Tracing {
|
export interface Tracing {
|
||||||
/**
|
/**
|
||||||
* Creates a new inline group in the trace log, causing any subsequent calls to be indented by an additional level,
|
* Creates a new inline group in the trace, causing any subsequent calls to belong to this group, until
|
||||||
* until [tracing.groupEnd()](https://playwright.dev/docs/api/class-tracing#tracing-group-end) is called.
|
* [tracing.groupEnd()](https://playwright.dev/docs/api/class-tracing#tracing-group-end) is called.
|
||||||
* @param name Group name shown in the trace viewer.
|
* @param name Group name shown in the trace viewer.
|
||||||
* @param options
|
* @param options
|
||||||
*/
|
*/
|
||||||
|
|
@ -21084,7 +21084,7 @@ export interface Tracing {
|
||||||
}): Promise<void>;
|
}): Promise<void>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Closes the last opened inline group in the trace log.
|
* Closes the last opened inline group in the trace.
|
||||||
*/
|
*/
|
||||||
groupEnd(): Promise<void>;
|
groupEnd(): Promise<void>;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue