55 */
66
77import type { AggregatedIssue } from '../../node_modules/chrome-devtools-frontend/mcp/mcp.js' ;
8+ import type { McpContext } from '../McpContext.js' ;
89
910export interface ConsoleMessageData {
1011 consoleMessageStableId : number ;
@@ -36,11 +37,14 @@ function getArgs(msg: ConsoleMessageData) {
3637}
3738
3839// The verbose format for a console message, including all details.
39- export function formatConsoleEventVerbose ( msg : ConsoleMessageData ) : string {
40+ export function formatConsoleEventVerbose (
41+ msg : ConsoleMessageData ,
42+ context ?: McpContext ,
43+ ) : string {
4044 const aggregatedIssue = msg . item ;
4145 const result = [
4246 `ID: ${ msg . consoleMessageStableId } ` ,
43- `Message: ${ msg . type } > ${ aggregatedIssue ? formatIssue ( aggregatedIssue , msg . description ) : msg . message } ` ,
47+ `Message: ${ msg . type } > ${ aggregatedIssue ? formatIssue ( aggregatedIssue , msg . description , context ) : msg . message } ` ,
4448 aggregatedIssue ? undefined : formatArgs ( msg ) ,
4549 ] . filter ( line => ! ! line ) ;
4650 return result . join ( '\n' ) ;
@@ -65,10 +69,19 @@ function formatArgs(consoleData: ConsoleMessageData): string {
6569
6670 return result . join ( '\n' ) ;
6771}
68-
72+ interface IssueDetailsWithResources {
73+ violatingNodeId ?: number ;
74+ nodeId ?: number ;
75+ documentNodeId ?: number ;
76+ request ?: {
77+ requestId ?: string ;
78+ url : string ;
79+ } ;
80+ }
6981export function formatIssue (
7082 issue : AggregatedIssue ,
7183 description ?: string ,
84+ context ?: McpContext ,
7285) : string {
7386 const result : string [ ] = [ ] ;
7487
@@ -87,6 +100,86 @@ export function formatIssue(
87100 }
88101 }
89102
103+ const issues : Array < {
104+ details ?: ( ) => IssueDetailsWithResources ;
105+ getDetails ?: ( ) => IssueDetailsWithResources ;
106+ } > = [
107+ ...issue . getCorsIssues ( ) ,
108+ ...issue . getMixedContentIssues ( ) ,
109+ ...issue . getGenericIssues ( ) ,
110+ ...issue . getLowContrastIssues ( ) ,
111+ ...issue . getElementAccessibilityIssues ( ) ,
112+ ...issue . getQuirksModeIssues ( ) ,
113+ ] ;
114+ const affectedResources : Array < {
115+ uid ?: string ;
116+ data ?: object ;
117+ request ?: string | number ;
118+ } > = [ ] ;
119+ for ( const singleIssue of issues ) {
120+ if ( ! singleIssue . details && ! singleIssue . getDetails ) continue ;
121+
122+ let details =
123+ singleIssue . details ?.( ) as unknown as IssueDetailsWithResources ;
124+ if ( ! details )
125+ details =
126+ singleIssue . getDetails ?.( ) as unknown as IssueDetailsWithResources ;
127+ if ( ! details ) continue ;
128+
129+ let uid ;
130+ let request : number | string | undefined ;
131+ if ( details . violatingNodeId && context ) {
132+ uid = context . resolveCdpElementId ( details . violatingNodeId ) ;
133+ }
134+ if ( details . nodeId && context ) {
135+ uid = context . resolveCdpElementId ( details . nodeId ) ;
136+ }
137+ if ( details . documentNodeId && context ) {
138+ uid = context . resolveCdpElementId ( details . documentNodeId ) ;
139+ }
140+
141+ if ( details . request ) {
142+ request = details . request . url ;
143+ if ( details . request . requestId && context ) {
144+ const resolvedId = context . resolveCdpRequestId (
145+ details . request . requestId ,
146+ ) ;
147+ if ( resolvedId ) {
148+ request = resolvedId ;
149+ }
150+ }
151+ }
152+
153+ // eslint-disable-next-line
154+ const data = structuredClone ( details ) as any ;
155+ delete data . violatingNodeId ;
156+ delete data . nodeId ;
157+ delete data . documentNodeId ;
158+ delete data . errorType ;
159+ delete data . frameId ;
160+ delete data . request ;
161+ affectedResources . push ( {
162+ uid,
163+ data : data ,
164+ request,
165+ } ) ;
166+ }
167+ if ( affectedResources . length ) {
168+ result . push ( '### Affected resources' ) ;
169+ }
170+ result . push (
171+ ...affectedResources . map ( item => {
172+ const details = [ ] ;
173+ if ( item . uid ) details . push ( `uid=${ item . uid } ` ) ;
174+ if ( item . request ) {
175+ details . push (
176+ ( typeof item . request === 'number' ? `reqid=` : 'url=' ) + item . request ,
177+ ) ;
178+ }
179+ if ( item . data ) details . push ( `data=${ JSON . stringify ( item . data ) } ` ) ;
180+ return details . join ( ' ' ) ;
181+ } ) ,
182+ ) ;
90183 if ( result . length === 0 )
91184 return 'No details provided for the issue ' + issue . code ( ) ;
92185 return result . join ( '\n' ) ;
0 commit comments