diff --git a/src/utils.js b/src/utils.js index 514ae9ab0232..989624460c4a 100644 --- a/src/utils.js +++ b/src/utils.js @@ -4,14 +4,15 @@ function isObject(what) { return typeof what === 'object' && what !== null; } -// Sorta yanked from https://github.com/joyent/node/blob/aa3b4b4/lib/util.js#L560 +// Yanked from https://git.io/vS8DV re-used under CC0 // with some tiny modifications -function isError(what) { - var toString = {}.toString.call(what); - return isObject(what) && - toString === '[object Error]' || - toString === '[object Exception]' || // Firefox NS_ERROR_FAILURE Exceptions - what instanceof Error; +function isError(value) { + switch ({}.toString.call(value)) { + case '[object Error]': return true; + case '[object Exception]': return true; + case '[object DOMException]': return true; + default: return value instanceof Error; + } } module.exports = { diff --git a/test/utils.test.js b/test/utils.test.js index d59b7af1fd05..ccec78428f19 100644 --- a/test/utils.test.js +++ b/test/utils.test.js @@ -66,11 +66,39 @@ describe('utils', function () { }); describe('isError', function() { + function testErrorFromDifferentContext(createError) { + var iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + try { + return createError(iframe.contentWindow); + } finally { + iframe.parentElement.removeChild(iframe); + } + } + + function fromContext(win) { + return new win.Error(); + } + + function domException(win) { + try { + win.document.querySelectorAll(''); + } catch(e) { + return e; + } + } + it('should work as advertised', function() { assert.isTrue(isError(new Error())); assert.isTrue(isError(new ReferenceError())); assert.isTrue(isError(new RavenConfigError())); + assert.isTrue(isError(testErrorFromDifferentContext(fromContext))); + assert.isTrue(isError(testErrorFromDifferentContext(domException))); assert.isFalse(isError({})); + assert.isFalse(isError({ + message: 'A fake error', + stack: 'no stack here' + })); assert.isFalse(isError('')); assert.isFalse(isError(true)); });