-
Notifications
You must be signed in to change notification settings - Fork 68
Living with a previously defined onerror-function #43
Description
Hi,
I previously reported this to the Honeybadger issue list, but they informed me that the code in question was actually part of your project. So here goes...
I was working on getting Honeybadger integrated in our app and ran into an issue. It's a heavy client-side app and we have our own onerror-function defined. In this function we ignore quite a number of errors which occurs in various libraries (and browser extensions) which doesn't affect our site. When an error we can't recover from occurs we render a failure page.
This is where I found the issue. Notifications weren't being sent to Honeybadger. The reason is because Honeybadger dynamically adds elements to the document in order to perform a crossdomain post, but our failure-page-rendering removed everything from the body before it renders which removes the Honeybadger elements and thus nothing is sent.
The code in question is part of TraceKit and looks like this
notifyHandlers(stack, 'from window.onerror');
if (_oldOnerrorHandler) {
return _oldOnerrorHandler.apply(this, arguments);
}I believe there are two issues here. (1) You attempt to notify handlers before the old onerror handler has run (if it exists). (2) TraceKit does not respect the return of the old onerror method. Returning true prevents the firing of the default event handler (i.e. the error has been dealt with), and I feel that this should also be respected by TraceKit.
I'd like to see the code be changed to something similar to
if (_oldOnerrorHandler) {
var errorHandled = _oldOnerrorHandler.apply(this, arguments);
if (errorHandled) return true;
notifyHandlers(stack, 'from window.onerror');
} else {
notifyHandlers(stack, 'from window.onerror');
}Now TraceKit notifies hanglers after the already defined error handling has been run, and only notifies handlers if the error hasn't already been dealt with.