@@ -256,6 +256,89 @@ describe('integration', function () {
256256 ) ;
257257 } ) ;
258258
259+ it ( 'should catch thrown strings' , function ( done ) {
260+ var iframe = this . iframe ;
261+
262+ iframeExecute ( iframe , done ,
263+ function ( ) {
264+ // intentionally loading this error via a script file to make
265+ // sure it is 1) not caught by instrumentation 2) doesn't trigger
266+ // "Script error"
267+ var script = document . createElement ( 'script' ) ;
268+ script . src = 'throw-string.js' ;
269+ script . onload = function ( ) {
270+ done ( ) ;
271+ } ;
272+ document . head . appendChild ( script ) ;
273+ } ,
274+ function ( ) {
275+ var ravenData = iframe . contentWindow . ravenData [ 0 ] ;
276+ assert . match ( ravenData . exception . values [ 0 ] . value , / s t r i n g E r r o r $ / ) ;
277+ assert . equal ( ravenData . exception . values [ 0 ] . stacktrace . frames . length , 1 ) ; // always 1 because thrown strings can't provide > 1 frame
278+
279+ // some browsers extract proper url, line, and column for thrown strings
280+ // but not all - falls back to frame url
281+ assert . match ( ravenData . exception . values [ 0 ] . stacktrace . frames [ 0 ] . filename , / \/ t e s t \/ i n t e g r a t i o n \/ / ) ;
282+ assert . match ( ravenData . exception . values [ 0 ] . stacktrace . frames [ 0 ] [ 'function' ] , / \? | g l o b a l c o d e / ) ;
283+ }
284+ ) ;
285+ } ) ;
286+
287+ it ( 'should catch thrown objects' , function ( done ) {
288+ var iframe = this . iframe ;
289+
290+ iframeExecute ( iframe , done ,
291+ function ( ) {
292+ // intentionally loading this error via a script file to make
293+ // sure it is 1) not caught by instrumentation 2) doesn't trigger
294+ // "Script error"
295+ var script = document . createElement ( 'script' ) ;
296+ script . src = 'throw-object.js' ;
297+ script . onload = function ( ) {
298+ done ( ) ;
299+ } ;
300+ document . head . appendChild ( script ) ;
301+ } ,
302+ function ( ) {
303+ var ravenData = iframe . contentWindow . ravenData [ 0 ] ;
304+ assert . equal ( ravenData . exception . values [ 0 ] . type , undefined ) ;
305+ assert . equal ( ravenData . exception . values [ 0 ] . value , '[object Object]' ) ;
306+ assert . equal ( ravenData . exception . values [ 0 ] . stacktrace . frames . length , 1 ) ; // always 1 because thrown objects can't provide > 1 frame
307+
308+ // some browsers extract proper url, line, and column for thrown objects
309+ // but not all - falls back to frame url
310+ assert . match ( ravenData . exception . values [ 0 ] . stacktrace . frames [ 0 ] . filename , / \/ t e s t \/ i n t e g r a t i o n \/ / ) ;
311+ assert . match ( ravenData . exception . values [ 0 ] . stacktrace . frames [ 0 ] [ 'function' ] , / \? | g l o b a l c o d e / ) ;
312+ }
313+ ) ;
314+ } ) ;
315+
316+ it ( 'should catch thrown errors' , function ( done ) {
317+ var iframe = this . iframe ;
318+
319+ iframeExecute ( iframe , done ,
320+ function ( ) {
321+ // intentionally loading this error via a script file to make
322+ // sure it is 1) not caught by instrumentation 2) doesn't trigger
323+ // "Script error"
324+ var script = document . createElement ( 'script' ) ;
325+ script . src = 'throw-error.js' ;
326+ script . onload = function ( ) {
327+ done ( ) ;
328+ } ;
329+ document . head . appendChild ( script ) ;
330+ } ,
331+ function ( ) {
332+ var ravenData = iframe . contentWindow . ravenData [ 0 ] ;
333+ assert . match ( ravenData . exception . values [ 0 ] . type , / ^ E r r o r / ) ;
334+ assert . match ( ravenData . exception . values [ 0 ] . value , / r e a l E r r o r $ / ) ;
335+ assert . isAbove ( ravenData . exception . values [ 0 ] . stacktrace . frames . length , 0 ) ; // 1 or 2 depending on platform
336+ assert . match ( ravenData . exception . values [ 0 ] . stacktrace . frames [ 0 ] . filename , / \/ t e s t \/ i n t e g r a t i o n \/ t h r o w - e r r o r \. j s / )
337+ assert . match ( ravenData . exception . values [ 0 ] . stacktrace . frames [ 0 ] [ 'function' ] , / \? | g l o b a l c o d e / ) ;
338+ }
339+ ) ;
340+ } ) ;
341+
259342 it ( 'should NOT catch an exception already caught via Raven.wrap' , function ( done ) {
260343 var iframe = this . iframe ;
261344
0 commit comments