1111 */
1212
1313const NEWLINE = '\n' ;
14- const SEP = ' ------------- ' ;
15- const IGNORE_FRAMES : string [ ] = [ ] ;
14+ const IGNORE_FRAMES : { [ k : string ] : true } = { } ;
1615const creationTrace = '__creationTrace__' ;
16+ const ERROR_TAG = 'STACKTRACE TRACKING' ;
17+ const SEP_TAG = '__SEP_TAG__' ;
18+ let sepTemplate = '' ;
1719
1820class LongStackTrace {
1921 error : Error = getStacktrace ( ) ;
2022 timestamp : Date = new Date ( ) ;
2123}
2224
2325function getStacktraceWithUncaughtError ( ) : Error {
24- return new Error ( 'STACKTRACE TRACKING' ) ;
26+ return new Error ( ERROR_TAG ) ;
2527}
2628
2729function getStacktraceWithCaughtError ( ) : Error {
@@ -49,22 +51,24 @@ function addErrorStack(lines: string[], error: Error): void {
4951 for ( let i = 0 ; i < trace . length ; i ++ ) {
5052 const frame = trace [ i ] ;
5153 // Filter out the Frames which are part of stack capturing.
52- if ( ! ( i < IGNORE_FRAMES . length && IGNORE_FRAMES [ i ] === frame ) ) {
54+ if ( ! IGNORE_FRAMES . hasOwnProperty ( frame ) ) {
5355 lines . push ( trace [ i ] ) ;
5456 }
5557 }
5658}
5759
5860function renderLongStackTrace ( frames : LongStackTrace [ ] , stack : string ) : string {
59- const longTrace : string [ ] = [ stack ] ;
61+ const longTrace : string [ ] = [ stack . trim ( ) ] ;
6062
6163 if ( frames ) {
6264 let timestamp = new Date ( ) . getTime ( ) ;
6365 for ( let i = 0 ; i < frames . length ; i ++ ) {
6466 const traceFrames : LongStackTrace = frames [ i ] ;
6567 const lastTime = traceFrames . timestamp ;
66- longTrace . push (
67- `${ SEP } Elapsed: ${ timestamp - lastTime . getTime ( ) } ms; At: ${ lastTime } ${ SEP } ` ) ;
68+ let separator =
69+ `____________________Elapsed ${ timestamp - lastTime . getTime ( ) } ms; At: ${ lastTime } ` ;
70+ separator = separator . replace ( / [ ^ \w \d ] / g, '_' ) ;
71+ longTrace . push ( sepTemplate . replace ( SEP_TAG , separator ) ) ;
6872 addErrorStack ( longTrace , traceFrames . error ) ;
6973
7074 timestamp = lastTime . getTime ( ) ;
@@ -105,42 +109,15 @@ function renderLongStackTrace(frames: LongStackTrace[], stack: string): string {
105109 } ,
106110
107111 onHandleError : function (
108- parentZoneDelegate : ZoneDelegate , currentZone : Zone , targetZone : Zone , error : any ) : any {
112+ parentZoneDelegate : ZoneDelegate , currentZone : Zone , targetZone : Zone , error : any ) : boolean {
109113 const parentTask = Zone . currentTask || error . task ;
110114 if ( error instanceof Error && parentTask ) {
111- let stackSetSucceeded : string | boolean = null ;
115+ const longStack =
116+ renderLongStackTrace ( parentTask . data && parentTask . data [ creationTrace ] , error . stack ) ;
112117 try {
113- let descriptor = Object . getOwnPropertyDescriptor ( error , 'stack' ) ;
114- if ( descriptor && descriptor . configurable ) {
115- const delegateGet = descriptor . get ;
116- const value = descriptor . value ;
117- descriptor = {
118- get : function ( ) {
119- return renderLongStackTrace (
120- parentTask . data && parentTask . data [ creationTrace ] ,
121- delegateGet ? delegateGet . apply ( this ) : value ) ;
122- }
123- } ;
124- Object . defineProperty ( error , 'stack' , descriptor ) ;
125- stackSetSucceeded = true ;
126- }
118+ error . stack = ( error as any ) . longStack = longStack ;
127119 } catch ( err ) {
128120 }
129- const longStack : string = stackSetSucceeded ?
130- null :
131- renderLongStackTrace ( parentTask . data && parentTask . data [ creationTrace ] , error . stack ) ;
132- if ( ! stackSetSucceeded ) {
133- try {
134- stackSetSucceeded = error . stack = longStack ;
135- } catch ( err ) {
136- }
137- }
138- if ( ! stackSetSucceeded ) {
139- try {
140- stackSetSucceeded = ( error as any ) . longStack = longStack ;
141- } catch ( err ) {
142- }
143- }
144121 }
145122 return parentZoneDelegate . handleError ( targetZone , error ) ;
146123 }
@@ -161,11 +138,19 @@ function computeIgnoreFrames() {
161138 for ( let i = 0 ; i < frames1 . length ; i ++ ) {
162139 const frame1 = frames1 [ i ] ;
163140 const frame2 = frames2 [ i ] ;
141+ if ( ! sepTemplate && frame1 . indexOf ( ERROR_TAG ) == - 1 ) {
142+ sepTemplate = frame1 . replace ( / ^ ( \s * ( a t ) ? \s * ) ( [ \w \/ \< ] + ) / , '$1' + SEP_TAG ) ;
143+ }
164144 if ( frame1 === frame2 ) {
165- IGNORE_FRAMES . push ( frame1 ) ;
145+ IGNORE_FRAMES [ frame1 ] = true ;
166146 } else {
167147 break ;
168148 }
149+ console . log ( '>>>>>>' , sepTemplate , frame1 ) ;
150+ }
151+ if ( ! sepTemplate ) {
152+ // If we could not find it default to this text.
153+ sepTemplate = SEP_TAG + '@[native code]' ;
169154 }
170155}
171156computeIgnoreFrames ( ) ;
0 commit comments