@@ -32,6 +32,15 @@ const worker = optionEnabled('worker') ? new TestWorker(debug) : undefined;
3232
3333const autoCloseOnPass = document . getElementById ( 'autoCloseOnPass' ) as HTMLInputElement ;
3434const resultsVis = document . getElementById ( 'resultsVis' ) ! ;
35+ const progressElem = document . getElementById ( 'progress' ) ! ;
36+ const progressTestNameElem = progressElem . querySelector ( '.progress-test-name' ) ! ;
37+ const stopButtonElem = progressElem . querySelector ( 'button' ) ! ;
38+ let runDepth = 0 ;
39+ let stopRequested = false ;
40+
41+ stopButtonElem . addEventListener ( 'click' , ( ) => {
42+ stopRequested = true ;
43+ } ) ;
3544
3645dataCache . setStore ( {
3746 load : async ( path : string ) => {
@@ -119,6 +128,7 @@ function makeCaseHTML(t: TestTreeLeaf): VisualizedSubtree {
119128 if ( clearRenderedResult ) clearRenderedResult ( ) ;
120129
121130 const result : SubtreeResult = emptySubtreeResult ( ) ;
131+ progressTestNameElem . textContent = name ;
122132
123133 haveSomeResults = true ;
124134 const [ rec , res ] = logger . record ( name ) ;
@@ -212,9 +222,28 @@ function makeSubtreeHTML(n: TestSubtree, parentLevel: TestQueryLevel): Visualize
212222 ) ;
213223
214224 const runMySubtree = async ( ) => {
225+ if ( runDepth === 0 ) {
226+ stopRequested = false ;
227+ progressElem . style . display = '' ;
228+ }
229+ if ( stopRequested ) {
230+ const result = emptySubtreeResult ( ) ;
231+ result . skip = 1 ;
232+ result . total = 1 ;
233+ return result ;
234+ }
235+
236+ ++ runDepth ;
237+
215238 if ( clearRenderedResult ) clearRenderedResult ( ) ;
216239 subtreeResult = await runSubtree ( ) ;
217240 if ( updateRenderedResult ) updateRenderedResult ( ) ;
241+
242+ -- runDepth ;
243+ if ( runDepth === 0 ) {
244+ progressElem . style . display = 'none' ;
245+ }
246+
218247 return subtreeResult ;
219248 } ;
220249
0 commit comments