@@ -236,6 +236,7 @@ class StatusRule {
236236 this . requires = value . requires || [ ] ;
237237 this . fail = value . fail ;
238238 this . skip = value . skip ;
239+ this . skipTests = value . skipTests ;
239240 if ( pattern ) {
240241 this . pattern = this . transformPattern ( pattern ) ;
241242 }
@@ -312,6 +313,7 @@ class WPTTestSpec {
312313 this . failedTests = [ ] ;
313314 this . flakyTests = [ ] ;
314315 this . skipReasons = [ ] ;
316+ this . skippedTests = [ ] ;
315317 for ( const item of rules ) {
316318 if ( item . requires . length ) {
317319 for ( const req of item . requires ) {
@@ -328,6 +330,9 @@ class WPTTestSpec {
328330 if ( item . skip ) {
329331 this . skipReasons . push ( item . skip ) ;
330332 }
333+ if ( Array . isArray ( item . skipTests ) ) {
334+ this . skippedTests . push ( ...item . skipTests ) ;
335+ }
331336 }
332337
333338 this . failedTests = [ ...new Set ( this . failedTests ) ] ;
@@ -347,6 +352,22 @@ class WPTTestSpec {
347352 return meta . variant ?. map ( ( variant ) => new WPTTestSpec ( mod , filename , rules , variant ) ) || [ spec ] ;
348353 }
349354
355+ /**
356+ * Check if a subtest should be skipped by name.
357+ * @param {string } name
358+ * @returns {boolean }
359+ */
360+ isSkippedTest ( name ) {
361+ for ( const matcher of this . skippedTests ) {
362+ if ( typeof matcher === 'string' ) {
363+ if ( name === matcher ) return true ;
364+ } else if ( matcher . test ( name ) ) {
365+ return true ;
366+ }
367+ }
368+ return false ;
369+ }
370+
350371 getRelativePath ( ) {
351372 return path . join ( this . module , this . filename ) ;
352373 }
@@ -684,6 +705,7 @@ class WPTRunner {
684705 } ,
685706 scriptsToRun,
686707 needsGc : ! ! meta . script ?. find ( ( script ) => script === '/common/gc.js' ) ,
708+ skippedTests : spec . skippedTests ,
687709 } ,
688710 } ) ;
689711 this . inProgress . add ( spec ) ;
@@ -694,6 +716,8 @@ class WPTRunner {
694716 switch ( message . type ) {
695717 case 'result' :
696718 return this . resultCallback ( spec , message . result , reportResult ) ;
719+ case 'skip' :
720+ return this . skipTest ( spec , { name : message . name } , reportResult ) ;
697721 case 'completion' :
698722 return this . completionCallback ( spec , message . status , reportResult ) ;
699723 default :
@@ -751,6 +775,7 @@ class WPTRunner {
751775 const failures = [ ] ;
752776 let expectedFailures = 0 ;
753777 let skipped = 0 ;
778+ let skippedTests = 0 ;
754779 for ( const [ key , item ] of Object . entries ( this . results ) ) {
755780 if ( item . fail ?. unexpected ) {
756781 failures . push ( key ) ;
@@ -761,6 +786,9 @@ class WPTRunner {
761786 if ( item . skip ) {
762787 skipped ++ ;
763788 }
789+ if ( item . skipTests ) {
790+ skippedTests += item . skipTests . length ;
791+ }
764792 }
765793
766794 const unexpectedPasses = [ ] ;
@@ -801,7 +829,8 @@ class WPTRunner {
801829 console . log ( `Ran ${ ran } /${ total } tests, ${ skipped } skipped,` ,
802830 `${ passed } passed, ${ expectedFailures } expected failures,` ,
803831 `${ failures . length } unexpected failures,` ,
804- `${ unexpectedPasses . length } unexpected passes` ) ;
832+ `${ unexpectedPasses . length } unexpected passes` +
833+ ( skippedTests ? `, ${ skippedTests } subtests skipped` : '' ) ) ;
805834 if ( failures . length > 0 ) {
806835 const file = path . join ( 'test' , 'wpt' , 'status' , `${ this . path } .json` ) ;
807836 throw new Error (
@@ -890,8 +919,16 @@ class WPTRunner {
890919 let result = this . results [ spec . filename ] ;
891920 result ||= this . results [ spec . filename ] = { } ;
892921 if ( item . status === kSkip ) {
893- // { filename: { skip: 'reason' } }
894- result [ kSkip ] = item . reason ;
922+ if ( item . name ) {
923+ // Subtest-level skip: { filename: { skipTests: [ ... ] } }
924+ result . skipTests ||= [ ] ;
925+ if ( ! result . skipTests . includes ( item . name ) ) {
926+ result . skipTests . push ( item . name ) ;
927+ }
928+ } else {
929+ // File-level skip: { filename: { skip: 'reason' } }
930+ result [ kSkip ] = item . reason ;
931+ }
895932 } else {
896933 // { filename: { fail: { expected: [ ... ],
897934 // unexpected: [ ... ] } }}
@@ -910,6 +947,15 @@ class WPTRunner {
910947 reportResult ?. addSubtest ( test . name , 'PASS' ) ;
911948 }
912949
950+ skipTest ( spec , test , reportResult ) {
951+ console . log ( `[SKIP] ${ test . name } ` ) ;
952+ reportResult ?. addSubtest ( test . name , 'NOTRUN' ) ;
953+ this . addTestResult ( spec , {
954+ name : test . name ,
955+ status : kSkip ,
956+ } ) ;
957+ }
958+
913959 fail ( spec , test , status , reportResult ) {
914960 const expected = spec . failedTests . includes ( test . name ) ;
915961 if ( expected ) {
0 commit comments