Skip to content

Commit

Permalink
core(lantern): extract main thread events w/o TraceProcessor (#16049)
Browse files Browse the repository at this point in the history
  • Loading branch information
connorjclark authored Jun 10, 2024
1 parent 322a3b7 commit b242369
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 17 deletions.
2 changes: 1 addition & 1 deletion core/computed/page-dependency-graph.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class PageDependencyGraph {
if (data.fromTrace) {
const traceEngineResult = await TraceEngineResult.request({trace}, context);
const {graph} = await LanternPageDependencyGraph.createGraphFromTrace(
mainThreadEvents, trace, traceEngineResult, URL);
trace, traceEngineResult, URL);
return graph;
}

Expand Down
44 changes: 42 additions & 2 deletions core/lib/lantern/page-dependency-graph.js
Original file line number Diff line number Diff line change
Expand Up @@ -785,12 +785,52 @@ class PageDependencyGraph {
}

/**
* @param {LH.TraceEvent[]} mainThreadEvents
* @param {LH.Trace} trace
* @param {LH.Artifacts.TraceEngineResult} traceEngineResult
* @return {LH.TraceEvent[]}
*/
static _collectMainThreadEvents(trace, traceEngineResult) {
const Meta = traceEngineResult.data.Meta;
const mainFramePids = Meta.mainFrameNavigations.length
? new Set(Meta.mainFrameNavigations.map(nav => nav.pid))
: Meta.topLevelRendererIds;

const rendererPidToTid = new Map();
for (const pid of mainFramePids) {
const threads = Meta.threadsInProcess.get(pid) ?? [];

let found = false;
for (const [tid, thread] of threads) {
if (thread.args.name === 'CrRendererMain') {
rendererPidToTid.set(pid, tid);
found = true;
break;
}
}

if (found) continue;

// `CrRendererMain` can be missing if chrome is launched with the `--single-process` flag.
// In this case, page tasks will be run in the browser thread.
for (const [tid, thread] of threads) {
if (thread.args.name === 'CrBrowserMain') {
rendererPidToTid.set(pid, tid);
found = true;
break;
}
}
}

return trace.traceEvents.filter(e => rendererPidToTid.get(e.pid) === e.tid);
}

/**
* @param {LH.Trace} trace
* @param {LH.Artifacts.TraceEngineResult} traceEngineResult
* @param {LH.Artifacts.URL} URL
*/
static async createGraphFromTrace(mainThreadEvents, trace, traceEngineResult, URL) {
static async createGraphFromTrace(trace, traceEngineResult, URL) {
const mainThreadEvents = this._collectMainThreadEvents(trace, traceEngineResult);
const workerThreads = this._findWorkerThreads(trace);

/** @type {Lantern.NetworkRequest[]} */
Expand Down
16 changes: 2 additions & 14 deletions core/test/lib/lantern/metrics/metric-test-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
* SPDX-License-Identifier: Apache-2.0
*/

import {ProcessedTrace} from '../../../../computed/processed-trace.js';
import {TraceEngineResult} from '../../../../computed/trace-engine-result.js';
import {createProcessedNavigation} from '../../../../lib/lantern/lantern.js';
import {PageDependencyGraph} from '../../../../lib/lantern/page-dependency-graph.js';
Expand All @@ -17,18 +16,6 @@ import {getURLArtifactFromDevtoolsLog} from '../../../test-utils.js';

// TODO(15841): remove usage of Lighthouse code to create test data

/**
* @param {LH.Artifacts.TraceEngineResult} traceEngineResult
* @param {LH.Artifacts.URL} theURL
* @param {LH.Trace} trace
* @param {LH.Artifacts.ComputedContext} context
*/
async function createGraph(traceEngineResult, theURL, trace, context) {
const {mainThreadEvents} = await ProcessedTrace.request(trace, context);
return PageDependencyGraph.createGraphFromTrace(
mainThreadEvents, trace, traceEngineResult, theURL);
}

/**
* @param {{trace: LH.Trace, devtoolsLog: LH.DevtoolsLog, settings?: LH.Config.Settings, URL?: LH.Artifacts.URL}} opts
*/
Expand All @@ -39,7 +26,8 @@ async function getComputationDataFromFixture({trace, devtoolsLog, settings, URL}

const context = {settings, computedCache: new Map()};
const traceEngineResult = await TraceEngineResult.request({trace}, context);
const {graph, records} = await createGraph(traceEngineResult, URL, trace, context);
const {graph, records} =
await PageDependencyGraph.createGraphFromTrace(trace, traceEngineResult, URL);
const processedNavigation = createProcessedNavigation(traceEngineResult);
const networkAnalysis = NetworkAnalyzer.analyze(records);
const simulator = Simulator.createSimulator({...settings, networkAnalysis});
Expand Down

0 comments on commit b242369

Please sign in to comment.