55 */
66
77import { logger } from '../logger.js' ;
8- import { zod } from '../third_party/index.js' ;
8+ import { zod , DevTools } from '../third_party/index.js' ;
99import type { Page } from '../third_party/index.js' ;
10- import type { InsightName } from '../trace-processing/parse.js' ;
10+ import type { InsightName , TraceResult } from '../trace-processing/parse.js' ;
1111import {
1212 getInsightOutput ,
1313 getTraceSummary ,
1414 parseRawTraceBuffer ,
1515 traceResultIsSuccess ,
1616} from '../trace-processing/parse.js' ;
17- import { populateCruxData } from '../utils/crux.js' ;
1817
1918import { ToolCategory } from './categories.js' ;
2019import type { Context , Response } from './ToolDefinition.js' ;
@@ -172,7 +171,7 @@ async function stopTracingAndAppendOutput(
172171 const result = await parseRawTraceBuffer ( traceEventsBuffer ) ;
173172 response . appendResponseLine ( 'The performance trace has been stopped.' ) ;
174173 if ( traceResultIsSuccess ( result ) ) {
175- await populateCruxData ( result . parsedTrace ) ;
174+ await populateCruxData ( result ) ;
176175 context . storeTraceRecording ( result ) ;
177176 const traceSummaryText = getTraceSummary ( result ) ;
178177 response . appendResponseLine ( traceSummaryText ) ;
@@ -193,3 +192,48 @@ async function stopTracingAndAppendOutput(
193192 context . setIsRunningPerformanceTrace ( false ) ;
194193 }
195194}
195+
196+ async function populateCruxData ( result : TraceResult ) : Promise < void > {
197+ try {
198+ logger ( 'populateCruxData called' ) ;
199+ const cruxManager = DevTools . CrUXManager . CrUXManager . instance ( ) ;
200+ const settings = DevTools . Common . Settings . Settings . instance ( ) ;
201+ const cruxSetting = settings . createSetting ( 'field-data' , { enabled : true } ) ;
202+ cruxSetting . set ( { ...cruxSetting . get ( ) , enabled : true } ) ;
203+
204+ if ( ! cruxSetting . get ( ) . enabled ) {
205+ logger ( 'CrUX is disabled in settings' ) ;
206+ return ;
207+ }
208+
209+ const urls = new Set < string > ( ) ;
210+ if ( result . insights ) {
211+ for ( const insightSet of result . insights . values ( ) ) {
212+ urls . add ( insightSet . url . href ) ;
213+ }
214+ } else {
215+ const mainUrl = result . parsedTrace . data . Meta . mainFrameURL ;
216+ if ( mainUrl ) {
217+ urls . add ( mainUrl ) ;
218+ }
219+ }
220+
221+ if ( urls . size === 0 ) {
222+ logger ( 'No URLs found for CrUX data' ) ;
223+ return ;
224+ }
225+
226+ logger ( `Fetching CrUX data for ${ urls . size } URLs: ${ Array . from ( urls ) . join ( ', ' ) } ` ) ;
227+ const cruxData = await Promise . all (
228+ Array . from ( urls ) . map ( async url => {
229+ const data = await cruxManager . getFieldDataForPage ( url ) ;
230+ logger ( `CrUX data for ${ url } : ${ data ? 'found' : 'not found' } ` ) ;
231+ return data ;
232+ } ) ,
233+ ) ;
234+
235+ result . parsedTrace . metadata . cruxFieldData = cruxData ;
236+ } catch ( err ) {
237+ logger ( 'Error populating CrUX data:' , err ) ;
238+ }
239+ }
0 commit comments