fix(trace viewer): library-only trace should not merge actions (#31768)
Without `wallTime`, actions are matched by `actionName:undefined` and all actions with the same are merged. Fixes #31764.
This commit is contained in:
parent
b8546eb35e
commit
b535139b32
|
|
@ -183,8 +183,8 @@ function mergeActionsAndUpdateTiming(contexts: ContextEntry[]) {
|
||||||
if (traceFileToContexts.size > 1)
|
if (traceFileToContexts.size > 1)
|
||||||
makeCallIdsUniqueAcrossTraceFiles(contexts, ++traceFileId);
|
makeCallIdsUniqueAcrossTraceFiles(contexts, ++traceFileId);
|
||||||
// Align action times across runner and library contexts within each trace file.
|
// Align action times across runner and library contexts within each trace file.
|
||||||
const map = mergeActionsAndUpdateTimingSameTrace(contexts);
|
const actions = mergeActionsAndUpdateTimingSameTrace(contexts);
|
||||||
result.push(...map.values());
|
result.push(...actions);
|
||||||
}
|
}
|
||||||
result.sort((a1, a2) => {
|
result.sort((a1, a2) => {
|
||||||
if (a2.parentId === a1.callId)
|
if (a2.parentId === a1.callId)
|
||||||
|
|
@ -211,19 +211,26 @@ function makeCallIdsUniqueAcrossTraceFiles(contexts: ContextEntry[], traceFileId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function mergeActionsAndUpdateTimingSameTrace(contexts: ContextEntry[]) {
|
function mergeActionsAndUpdateTimingSameTrace(contexts: ContextEntry[]): ActionTraceEventInContext[] {
|
||||||
const map = new Map<string, ActionTraceEventInContext>();
|
const map = new Map<string, ActionTraceEventInContext>();
|
||||||
|
|
||||||
const libraryContexts = contexts.filter(context => context.origin === 'library');
|
const libraryContexts = contexts.filter(context => context.origin === 'library');
|
||||||
const testRunnerContexts = contexts.filter(context => context.origin === 'testRunner');
|
const testRunnerContexts = contexts.filter(context => context.origin === 'testRunner');
|
||||||
|
|
||||||
|
// With library-only or test-runner-only traces there is nothing to match.
|
||||||
|
if (!testRunnerContexts.length || !libraryContexts.length) {
|
||||||
|
return contexts.map(context => {
|
||||||
|
return context.actions.map(action => ({ ...action, context }));
|
||||||
|
}).flat();
|
||||||
|
}
|
||||||
|
|
||||||
// Library actions are replaced with corresponding test runner steps. Matching with
|
// Library actions are replaced with corresponding test runner steps. Matching with
|
||||||
// the test runner steps enables us to find parent steps.
|
// the test runner steps enables us to find parent steps.
|
||||||
// - In the newer versions the actions are matched by explicit step id stored in the
|
// - In the newer versions the actions are matched by explicit step id stored in the
|
||||||
// library context actions.
|
// library context actions.
|
||||||
// - In the older versions the step id is not stored and the match is perfomed based on
|
// - In the older versions the step id is not stored and the match is perfomed based on
|
||||||
// action name and wallTime.
|
// action name and wallTime.
|
||||||
const matchByStepId = !libraryContexts.length || libraryContexts.some(c => c.actions.some(a => !!a.stepId));
|
const matchByStepId = libraryContexts.some(c => c.actions.some(a => !!a.stepId));
|
||||||
|
|
||||||
for (const context of libraryContexts) {
|
for (const context of libraryContexts) {
|
||||||
for (const action of context.actions) {
|
for (const action of context.actions) {
|
||||||
|
|
@ -264,7 +271,7 @@ function mergeActionsAndUpdateTimingSameTrace(contexts: ContextEntry[]) {
|
||||||
map.set(key, { ...action, context });
|
map.set(key, { ...action, context });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return map;
|
return [...map.values()];
|
||||||
}
|
}
|
||||||
|
|
||||||
function adjustMonotonicTime(contexts: ContextEntry[], monotonicTimeDelta: number) {
|
function adjustMonotonicTime(contexts: ContextEntry[], monotonicTimeDelta: number) {
|
||||||
|
|
|
||||||
BIN
tests/assets/trace-library-1.46.zip
Normal file
BIN
tests/assets/trace-library-1.46.zip
Normal file
Binary file not shown.
|
|
@ -1282,6 +1282,17 @@ test('should open snapshot in new browser context', async ({ browser, page, runA
|
||||||
await newPage.close();
|
await newPage.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should show similar actions from library-only trace', async ({ showTraceViewer, asset }) => {
|
||||||
|
const traceViewer = await showTraceViewer([asset('trace-library-1.46.zip')]);
|
||||||
|
await expect(traceViewer.actionTitles).toHaveText([
|
||||||
|
/page.setContent/,
|
||||||
|
/locator.getAttributelocator\('div'\)/,
|
||||||
|
/locator.isVisiblelocator\('div'\)/,
|
||||||
|
/locator.getAttributelocator\('div'\)/,
|
||||||
|
/locator.isVisiblelocator\('div'\)/,
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
function parseMillis(s: string): number {
|
function parseMillis(s: string): number {
|
||||||
const matchMs = s.match(/(\d+)ms/);
|
const matchMs = s.match(/(\d+)ms/);
|
||||||
if (matchMs)
|
if (matchMs)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue