function captureUncaughtExceptions(window, handler, shim) { if (!window) { return; } var oldOnError; if (typeof handler._rollbarOldOnError === 'function') { oldOnError = handler._rollbarOldOnError; } else if (window.onerror) { oldOnError = window.onerror; while (oldOnError._rollbarOldOnError) { oldOnError = oldOnError._rollbarOldOnError; } handler._rollbarOldOnError = oldOnError; } handler.handleAnonymousErrors(); var fn = function() { var args = Array.prototype.slice.call(arguments, 0); _rollbarWindowOnError(window, handler, oldOnError, args); }; if (shim) { fn._rollbarOldOnError = oldOnError; } window.onerror = fn; } function _rollbarWindowOnError(window, r, old, args) { if (window._rollbarWrappedError) { if (!args[4]) { args[4] = window._rollbarWrappedError; } if (!args[5]) { args[5] = window._rollbarWrappedError._rollbarContext; } window._rollbarWrappedError = null; } var ret = r.handleUncaughtException.apply(r, args); if (old) { old.apply(window, args); } // Let other chained onerror handlers above run before setting this. // If an error is thrown and caught within a chained onerror handler, // Error.prepareStackTrace() will see that one before the one we want. if (ret === 'anonymous') { r.anonymousErrorsPending += 1; // See Rollbar.prototype.handleAnonymousErrors() } } function captureUnhandledRejections(window, handler, shim) { if (!window) { return; } if (typeof window._rollbarURH === 'function' && window._rollbarURH.belongsToShim) { window.removeEventListener('unhandledrejection', window._rollbarURH); } var rejectionHandler = function (evt) { var reason, promise, detail; try { reason = evt.reason; } catch (e) { reason = undefined; } try { promise = evt.promise; } catch (e) { promise = '[unhandledrejection] error getting `promise` from event'; } try { detail = evt.detail; if (!reason && detail) { reason = detail.reason; promise = detail.promise; } } catch (e) { // Ignore } if (!reason) { reason = '[unhandledrejection] error getting `reason` from event'; } if (handler && handler.handleUnhandledRejection) { handler.handleUnhandledRejection(reason, promise); } }; rejectionHandler.belongsToShim = shim; window._rollbarURH = rejectionHandler; window.addEventListener('unhandledrejection', rejectionHandler); } module.exports = { captureUncaughtExceptions: captureUncaughtExceptions, captureUnhandledRejections: captureUnhandledRejections };