license class ProxyZoneSpec implements ZoneSpec { name : string = 'ProxyZone' ; private _delegateSpec : ZoneSpec | null = null ; properties : { [ k ] : any ; } = { 'ProxyZoneSpec' : this } ; propertyKeys : string [ ] | null = null ; lastTaskState : HasTaskState | null = null ; isNeedToTriggerHasTask = false ; private tasks : Task [ ] = [ ] ; static get ( ) { return Zone . current . get ( 'ProxyZoneSpec' ) ; } static isLoaded ( ) { return ProxyZoneSpec . get ( ) instanceof ProxyZoneSpec ; } static assertPresent ( ) { if ( ! ProxyZoneSpec . isLoaded ( ) ) { throw new Error ( `Expected to be running in 'ProxyZone', but it was not found.` ) ; } return ProxyZoneSpec . get ( ) ; } constructor ( private defaultSpecDelegate = null ) { this . setDelegate ( defaultSpecDelegate ) ; } setDelegate ( delegateSpec ) { const isNewDelegate = this . _delegateSpec !== delegateSpec ; this . _delegateSpec = delegateSpec ; this . propertyKeys && this . propertyKeys . forEach ( ( key ) => delete this . properties [ key ] ) ; this . propertyKeys = null ; if ( delegateSpec && delegateSpec . properties ) { this . propertyKeys = Object . keys ( delegateSpec . properties ) ; this . propertyKeys . forEach ( ( k ) => this . properties [ k ] = delegateSpec . properties ! [ k ] ) ; } if ( isNewDelegate && this . lastTaskState && ( this . lastTaskState . macroTask || this . lastTaskState . microTask ) ) { this . isNeedToTriggerHasTask = true ; } } getDelegate ( ) { return this . _delegateSpec ; } resetDelegate ( ) { const delegateSpec = this . getDelegate ( ) ; this . setDelegate ( this . defaultSpecDelegate ) ; } tryTriggerHasTask ( parentZoneDelegate , currentZone , targetZone ) { if ( this . isNeedToTriggerHasTask && this . lastTaskState ) { this . isNeedToTriggerHasTask = false ; this . onHasTask ( parentZoneDelegate , currentZone , targetZone , this . lastTaskState ) ; } } removeFromTasks ( task ) { if ( ! this . tasks ) { return ; } for ( let i = 0 ; i < this . tasks . length ; i ++ ) { if ( this . tasks [ i ] === task ) { this . tasks . splice ( i , 1 ) ; return ; } } } getAndClearPendingTasksInfo ( ) { if ( this . tasks . length === 0 ) { return '' ; } const taskInfo = this . tasks . map ( ( task ) => { const dataInfo = task . data && Object . keys ( task . data ) . map ( ( key ) => { return key + ':' + ( task . data as any ) [ key ] ; } ) . join ( ',' ) ; return `type: ${ task . type }, source: ${ task . source }, args: {${ dataInfo }}` ; } ) ; const pendingTasksInfo = '--Pendng async tasks are: [' + taskInfo + ']' ; this . tasks = [ ] ; return pendingTasksInfo ; } onFork ( parentZoneDelegate , currentZone , targetZone , zoneSpec ) { if ( this . _delegateSpec && this . _delegateSpec . onFork ) { return this . _delegateSpec . onFork ( parentZoneDelegate , currentZone , targetZone , zoneSpec ) ; } else { return parentZoneDelegate . fork ( targetZone , zoneSpec ) ; } } onIntercept ( parentZoneDelegate , currentZone , targetZone , delegate , source ) { if ( this . _delegateSpec && this . _delegateSpec . onIntercept ) { return this . _delegateSpec . onIntercept ( parentZoneDelegate , currentZone , targetZone , delegate , source ) ; } else { return parentZoneDelegate . intercept ( targetZone , delegate , source ) ; } } onInvoke ( parentZoneDelegate , currentZone , targetZone , delegate , applyThis , applyArgs ? , source ? ) { this . tryTriggerHasTask ( parentZoneDelegate , currentZone , targetZone ) ; if ( this . _delegateSpec && this . _delegateSpec . onInvoke ) { return this . _delegateSpec . onInvoke ( parentZoneDelegate , currentZone , targetZone , delegate , applyThis , applyArgs , source ) ; } else { return parentZoneDelegate . invoke ( targetZone , delegate , applyThis , applyArgs , source ) ; } } onHandleError ( parentZoneDelegate , currentZone , targetZone , error ) { if ( this . _delegateSpec && this . _delegateSpec . onHandleError ) { return this . _delegateSpec . onHandleError ( parentZoneDelegate , currentZone , targetZone , error ) ; } else { return parentZoneDelegate . handleError ( targetZone , error ) ; } } onScheduleTask ( parentZoneDelegate , currentZone , targetZone , task ) { if ( task . type !== 'eventTask' ) { this . tasks . push ( task ) ; } if ( this . _delegateSpec && this . _delegateSpec . onScheduleTask ) { return this . _delegateSpec . onScheduleTask ( parentZoneDelegate , currentZone , targetZone , task ) ; } else { return parentZoneDelegate . scheduleTask ( targetZone , task ) ; } } onInvokeTask ( parentZoneDelegate , currentZone , targetZone , task , applyThis , applyArgs ) { if ( task . type !== 'eventTask' ) { this . removeFromTasks ( task ) ; } this . tryTriggerHasTask ( parentZoneDelegate , currentZone , targetZone ) ; if ( this . _delegateSpec && this . _delegateSpec . onInvokeTask ) { return this . _delegateSpec . onInvokeTask ( parentZoneDelegate , currentZone , targetZone , task , applyThis , applyArgs ) ; } else { return parentZoneDelegate . invokeTask ( targetZone , task , applyThis , applyArgs ) ; } } onCancelTask ( parentZoneDelegate , currentZone , targetZone , task ) { if ( task . type !== 'eventTask' ) { this . removeFromTasks ( task ) ; } this . tryTriggerHasTask ( parentZoneDelegate , currentZone , targetZone ) ; if ( this . _delegateSpec && this . _delegateSpec . onCancelTask ) { return this . _delegateSpec . onCancelTask ( parentZoneDelegate , currentZone , targetZone , task ) ; } else { return parentZoneDelegate . cancelTask ( targetZone , task ) ; } } onHasTask ( delegate , current , target , hasTaskState ) { this . lastTaskState = hasTaskState ; if ( this . _delegateSpec && this . _delegateSpec . onHasTask ) { this . _delegateSpec . onHasTask ( delegate , current , target , hasTaskState ) ; } else { delegate . hasTask ( target , hasTaskState ) ; } } } ( Zone as any ) [ 'ProxyZoneSpec' ] = ProxyZoneSpec ;