@@ -242,8 +242,8 @@ class PromptTestRunner {
242
242
}
243
243
const row = document . createElement ( 'tr' ) ;
244
244
row . innerHTML = `
245
- <td>${ test . name } </td>
246
- <td>${ test . expected } </td>
245
+ <td>${ escapeHTML ( test . name ) } </td>
246
+ <td>${ escapeHTML ( test . expected ) } </td>
247
247
${ verdicts . map ( ( v , idx ) => {
248
248
if ( skipped [ idx ] || v . skipped ) {
249
249
return `<td style="color:#007bff;font-weight:bold;text-align:center;">–</td>` ;
@@ -252,12 +252,12 @@ class PromptTestRunner {
252
252
( v . blocked && test . expected === this . positiveLabel ) ||
253
253
( ! v . blocked && test . expected === 'BENIGN' )
254
254
) ) ;
255
- return `<td class="${ v . error ? 'incorrect' : isCorrect ? 'correct' : 'incorrect' } ">${ v . error ? '⚠️' : ( isCorrect ? '✓' : '✗' ) } </td>` ;
255
+ return `<td class="${ v . error ? 'incorrect' : isCorrect ? 'correct' : 'incorrect' } ">${ escapeHTML ( v . error ? '⚠️' : ( isCorrect ? '✓' : '✗' ) ) } </td>` ;
256
256
} ) . join ( '' ) }
257
- ${ verdicts . map ( ( v , idx ) => ( skipped [ idx ] || v . skipped ) ? `<td style="color:#007bff;text-align:center;">–</td>` : `<td>${ v . time . toFixed ( 2 ) } </td>` ) . join ( '' ) }
257
+ ${ verdicts . map ( ( v , idx ) => ( skipped [ idx ] || v . skipped ) ? `<td style="color:#007bff;text-align:center;">–</td>` : `<td>${ escapeHTML ( v . time . toFixed ( 2 ) ) } </td>` ) . join ( '' ) }
258
258
` ;
259
259
if ( verdicts . some ( v => v . error ) ) {
260
- row . title = verdicts . map ( v => v . error ) . filter ( Boolean ) . join ( '; ' ) ;
260
+ row . title = escapeHTML ( verdicts . map ( v => v . error ) . filter ( Boolean ) . join ( '; ' ) ) ;
261
261
}
262
262
resultsBody . appendChild ( row ) ;
263
263
verdicts . forEach ( ( v , idx ) => {
@@ -270,7 +270,7 @@ class PromptTestRunner {
270
270
let summaryHtml = '' ;
271
271
this . filters . forEach ( ( filter , idx ) => {
272
272
if ( skipped [ idx ] ) {
273
- summaryHtml += `<p style="color:#007bff;"><strong>${ filter . name } :</strong> Not run due to missing API key</p>` ;
273
+ summaryHtml += `<p style="color:#007bff;"><strong>${ escapeHTML ( filter . name ) } :</strong> Not run due to missing API key</p>` ;
274
274
return ;
275
275
}
276
276
const accuracy = testsRun ? ( correct [ idx ] / testsRun * 100 ) . toFixed ( 1 ) : '0.0' ;
@@ -281,12 +281,12 @@ class PromptTestRunner {
281
281
: sorted [ Math . floor ( sorted . length / 2 ) ] || 0 ;
282
282
const stddev = times [ idx ] . length ? Math . sqrt ( times [ idx ] . reduce ( ( sq , n ) => sq + Math . pow ( n - avg , 2 ) , 0 ) / times [ idx ] . length ) : 0 ;
283
283
summaryHtml += `
284
- <p><strong>${ filter . name } :</strong> ${ accuracy } % accuracy (${ correct [ idx ] } /${ testsRun } correct)</p>
285
- <p><strong>${ filter . name } Times (ms):</strong></p>
284
+ <p><strong>${ escapeHTML ( filter . name ) } :</strong> ${ escapeHTML ( accuracy ) } % accuracy (${ escapeHTML ( correct [ idx ] ) } /${ escapeHTML ( testsRun ) } correct)</p>
285
+ <p><strong>${ escapeHTML ( filter . name ) } Times (ms):</strong></p>
286
286
<ul>
287
- <li>Average: ${ avg . toFixed ( 2 ) } </li>
288
- <li>Median: ${ median . toFixed ( 2 ) } </li>
289
- <li>Standard Deviation: ${ stddev . toFixed ( 2 ) } </li>
287
+ <li>Average: ${ escapeHTML ( avg . toFixed ( 2 ) ) } </li>
288
+ <li>Median: ${ escapeHTML ( median . toFixed ( 2 ) ) } </li>
289
+ <li>Standard Deviation: ${ escapeHTML ( stddev . toFixed ( 2 ) ) } </li>
290
290
</ul>
291
291
` ;
292
292
} ) ;
0 commit comments