@@ -7,6 +7,10 @@ import { ParserState, ParserAction, IParsingState, IDcsHandler, IEscapeSequenceP
77import { IDisposable } from 'xterm' ;
88import { Disposable } from './common/Lifecycle' ;
99
10+ interface IHandlerLink extends IDisposable {
11+ nextHandler : IHandlerLink | null ;
12+ }
13+
1014/**
1115 * Returns an array filled with numbers between the low and high parameters (right exclusive).
1216 * @param low The low number.
@@ -304,33 +308,38 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
304308 this . _executeHandlerFb = callback ;
305309 }
306310
307- addCsiHandler ( flag : string , callback : ( params : number [ ] , collect : string ) => boolean ) : IDisposable {
308- const index = flag . charCodeAt ( 0 ) ;
309- const oldHead = this . _csiHandlers [ index ] ;
310- const parser = this ;
311- const newHead =
312- ( params : number [ ] , collect : string ) : void => {
313- if ( ! callback ( params , collect ) ) {
314- if ( newHead . nextHandler ) { newHead . nextHandler ( params , collect ) ; }
315- else { this . _csiHandlerFb ( collect , params , index ) ; }
316- }
317- } ;
318- newHead . nextHandler = oldHead ;
311+ private _linkHandler ( handlers : object [ ] , index : number , newCallback : object ) : IDisposable {
312+ const newHead : any = newCallback ;
313+ newHead . nextHandler = handlers [ index ] as IHandlerLink ;
319314 newHead . dispose = function ( ) : void {
320- let previous = null ; let cur = parser . _csiHandlers [ index ] ;
315+ let previous = null ;
316+ let cur = handlers [ index ] as IHandlerLink ;
321317 for ( ; cur && cur . nextHandler ;
322318 previous = cur , cur = cur . nextHandler ) {
323319 if ( cur === newHead ) {
324320 if ( previous ) { previous . nextHandler = cur . nextHandler ; }
325- else { parser . _csiHandlers [ index ] = cur . nextHandler ; }
321+ else { handlers [ index ] = cur . nextHandler ; }
326322 break ;
327323 }
328324 }
329325 } ;
330- this . _csiHandlers [ index ] = newHead ;
326+ handlers [ index ] = newHead ;
331327 return newHead ;
332328 }
333329
330+ addCsiHandler ( flag : string , callback : ( params : number [ ] , collect : string ) => boolean ) : IDisposable {
331+ const index = flag . charCodeAt ( 0 ) ;
332+ const newHead =
333+ ( params : number [ ] , collect : string ) : void => {
334+ if ( ! callback ( params , collect ) ) {
335+ const next = ( newHead as unknown as IHandlerLink ) . nextHandler ;
336+ if ( next ) { ( next as any ) ( params , collect ) ; }
337+ else { this . _csiHandlerFb ( collect , params , index ) ; }
338+ }
339+ } ;
340+ return this . _linkHandler ( this . _csiHandlers , index , newHead ) ;
341+ }
342+
334343 setCsiHandler ( flag : string , callback : ( params : number [ ] , collect : string ) => void ) : void {
335344 this . _csiHandlers [ flag . charCodeAt ( 0 ) ] = callback ;
336345 }
@@ -352,30 +361,15 @@ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceP
352361 }
353362
354363 addOscHandler ( ident : number , callback : ( data : string ) => boolean ) : IDisposable {
355- const oldHead = this . _oscHandlers [ ident ] ;
356- const parser = this ;
357364 const newHead =
358365 ( data : string ) : void => {
359366 if ( ! callback ( data ) ) {
360- if ( newHead . nextHandler ) { newHead . nextHandler ( data ) ; }
367+ const next = ( newHead as unknown as IHandlerLink ) . nextHandler ;
368+ if ( next ) { ( next as any ) ( data ) ; }
361369 else { this . _oscHandlerFb ( ident , data ) ; }
362370 }
363371 } ;
364- newHead . nextHandler = oldHead ;
365- newHead . dispose =
366- function ( ) : void {
367- let previous = null ; let cur = parser . _oscHandlers [ ident ] ;
368- for ( ; cur && cur . nextHandler ;
369- previous = cur , cur = cur . nextHandler ) {
370- if ( cur === newHead ) {
371- if ( previous ) { previous . nextHandler = cur . nextHandler ; }
372- else { parser . _oscHandlers [ ident ] = cur . nextHandler ; }
373- break ;
374- }
375- }
376- } ;
377- this . _oscHandlers [ ident ] = newHead ;
378- return newHead ;
372+ return this . _linkHandler ( this . _oscHandlers , ident , newHead ) ;
379373 }
380374 setOscHandler ( ident : number , callback : ( data : string ) => void ) : void {
381375 this . _oscHandlers [ ident ] = callback ;
0 commit comments