diff --git a/src/raven.js b/src/raven.js index 3575983af124..2c3db845ac06 100644 --- a/src/raven.js +++ b/src/raven.js @@ -221,7 +221,14 @@ Raven.prototype = { } // We don't wanna wrap it twice! - if (func.__raven__) { + try { + if (func.__raven__) { + return func; + } + } catch (e) { + // Just accessing the __raven__ prop in some Selenium environments + // can cause a "Permission denied" exception (see raven-js#495). + // Bail on wrapping and return the function as-is (defers to window.onerror). return func; } diff --git a/test/raven.test.js b/test/raven.test.js index c232937de926..2fb7d2277e69 100644 --- a/test/raven.test.js +++ b/test/raven.test.js @@ -1729,6 +1729,19 @@ describe('Raven (public API)', function() { }, error); }); + it('should return input funciton as-is if accessing __raven__ prop throws exception', function (){ + // see raven-js#495 + var fn = function () {}; + Object.defineProperty(fn, '__raven__', { + get: function () { + throw new Error('Permission denied') + } + }); + assert.throw(function () { fn.__raven__; }, 'Permission denied'); + var wrapped = Raven.wrap(fn); + assert.equal(fn, wrapped); + }); + }); describe('.context', function() {