@@ -9,7 +9,7 @@ function iframeExecute(iframe, done, execute, assertCallback) {
9
9
}
10
10
}
11
11
// use setTimeout so stack trace doesn't go all the way back to mocha test runner
12
- iframe . contentWindow . eval ( 'setTimeout (' + execute . toString ( ) + ');' ) ;
12
+ iframe . contentWindow . eval ( 'origSetTimeout (' + execute . toString ( ) + ');' ) ;
13
13
}
14
14
15
15
function createIframe ( done ) {
@@ -136,7 +136,7 @@ describe('integration', function () {
136
136
} ,
137
137
function ( ) {
138
138
var ravenData = iframe . contentWindow . ravenData ;
139
- assert . equal ( ravenData . exception . values [ 0 ] . stacktrace . frames . length , eventHandlerStackDepth + 2 ) ;
139
+ assert . equal ( ravenData . exception . values [ 0 ] . stacktrace . frames . length , eventHandlerStackDepth + 1 ) ;
140
140
}
141
141
) ;
142
142
} ) ;
@@ -223,5 +223,27 @@ describe('integration', function () {
223
223
}
224
224
) ;
225
225
} ) ;
226
+
227
+ it ( 'should capture exceptions from XMLHttpRequest event handlers (e.g. onreadystatechange)' , function ( done ) {
228
+ var iframe = this . iframe ;
229
+
230
+ iframeExecute ( iframe , done ,
231
+ function ( ) {
232
+ setTimeout ( done ) ;
233
+ var xhr = new XMLHttpRequest ( ) ;
234
+ xhr . onreadystatechange = function ( ) {
235
+ foo ( ) ;
236
+ }
237
+ xhr . open ( 'GET' , 'example.json' ) ;
238
+ xhr . send ( ) ;
239
+ } ,
240
+ function ( ) {
241
+ var ravenData = iframe . contentWindow . ravenData ;
242
+ console . log ( ravenData ) ;
243
+ // # of frames alter significantly between chrome/firefox & safari
244
+ assert . isTrue ( ravenData . exception . values [ 0 ] . stacktrace . frames . length >= 4 ) ;
245
+ }
246
+ ) ;
247
+ } ) ;
226
248
} ) ;
227
249
} ) ;
0 commit comments