diff --git a/core/computed/page-dependency-graph.js b/core/computed/page-dependency-graph.js index 0a03ce4a356a..04072f00b376 100644 --- a/core/computed/page-dependency-graph.js +++ b/core/computed/page-dependency-graph.js @@ -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; } diff --git a/core/lib/lantern/page-dependency-graph.js b/core/lib/lantern/page-dependency-graph.js index b0311d4b08c1..1a1dfaa6764a 100644 --- a/core/lib/lantern/page-dependency-graph.js +++ b/core/lib/lantern/page-dependency-graph.js @@ -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[]} */ diff --git a/core/test/lib/lantern/metrics/metric-test-utils.js b/core/test/lib/lantern/metrics/metric-test-utils.js index 4ae467dd10fc..09ada786be61 100644 --- a/core/test/lib/lantern/metrics/metric-test-utils.js +++ b/core/test/lib/lantern/metrics/metric-test-utils.js @@ -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'; @@ -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 */ @@ -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});