Skip to content

Commit c8550b9

Browse files
authored
Don't choke if accessing evt props trigger exceptions ... (#857)
1 parent 76f13b5 commit c8550b9

File tree

2 files changed

+70
-9
lines changed

2 files changed

+70
-9
lines changed

src/raven.js

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -746,14 +746,14 @@ Raven.prototype = {
746746
return;
747747

748748
self._lastCapturedEvent = evt;
749-
var elem = evt.target;
750749

750+
// try/catch both:
751+
// - accessing evt.target (see getsentry/raven-js#838, #768)
752+
// - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly
753+
// can throw an exception in some circumstances.
751754
var target;
752-
753-
// try/catch htmlTreeAsString because it's particularly complicated, and
754-
// just accessing the DOM incorrectly can throw an exception in some circumstances.
755755
try {
756-
target = htmlTreeAsString(elem);
756+
target = htmlTreeAsString(evt.target);
757757
} catch (e) {
758758
target = '<unknown>';
759759
}
@@ -778,8 +778,15 @@ Raven.prototype = {
778778
// debounce timeout is triggered, we will only capture
779779
// a single breadcrumb from the FIRST target (acceptable?)
780780
return function (evt) {
781-
var target = evt.target,
782-
tagName = target && target.tagName;
781+
var target;
782+
try {
783+
target = evt.target;
784+
} catch (e) {
785+
// just accessing event properties can throw an exception in some rare circumstances
786+
// see: https://github.com/getsentry/raven-js/issues/838
787+
return;
788+
}
789+
var tagName = target && target.tagName;
783790

784791
// only consider keypress events on actual input elements
785792
// this will disregard keypresses targeting body (e.g. tabbing
@@ -896,9 +903,17 @@ Raven.prototype = {
896903
// see #724
897904
if (!evt) return;
898905

899-
if (evt.type === 'click')
906+
var eventType;
907+
try {
908+
eventType = evt.type
909+
} catch (e) {
910+
// just accessing event properties can throw an exception in some rare circumstances
911+
// see: https://github.com/getsentry/raven-js/issues/838
912+
return;
913+
}
914+
if (eventType === 'click')
900915
return clickHandler(evt);
901-
else if (evt.type === 'keypress')
916+
else if (eventType === 'keypress')
902917
return keypressHandler(evt);
903918
};
904919
}

test/integration/test.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,52 @@ describe('integration', function () {
590590
);
591591
});
592592

593+
// doesn't work in PhantomJS
594+
if (!/PhantomJS/.test(window.navigator.userAgent)) {
595+
it('should bail out if accessing the `type` and `target` properties of an event throw an exception', function (done) {
596+
// see: https://github.com/getsentry/raven-js/issues/768
597+
var iframe = this.iframe;
598+
599+
iframeExecute(iframe, done,
600+
function () {
601+
setTimeout(done);
602+
603+
// some browsers trigger onpopstate for load / reset breadcrumb state
604+
Raven._breadcrumbs = [];
605+
606+
// click <input/>
607+
var evt = document.createEvent('MouseEvent');
608+
evt.initMouseEvent(evt,
609+
"click",
610+
true /* bubble */,
611+
true /* cancelable */,
612+
window,
613+
null,
614+
0, 0, 0, 0, /* coordinates */
615+
false, false, false, false, /* modifier keys */
616+
0 /*left*/,
617+
null
618+
);
619+
620+
function kaboom() { throw new Error('lol'); };
621+
Object.defineProperty(evt, 'type', { get: kaboom });
622+
Object.defineProperty(evt, 'target', { get: kaboom });
623+
624+
var input = document.querySelector('.a'); // leaf node
625+
input.dispatchEvent(evt);
626+
},
627+
function () {
628+
var Raven = iframe.contentWindow.Raven,
629+
breadcrumbs = Raven._breadcrumbs;
630+
631+
assert.equal(breadcrumbs.length, 1);
632+
assert.equal(breadcrumbs[0].category, 'ui.click');
633+
assert.equal(breadcrumbs[0].message, '<unknown>');
634+
}
635+
);
636+
});
637+
} // if PhantomJS
638+
593639
it('should record consecutive keypress events into a single "input" breadcrumb', function (done) {
594640
var iframe = this.iframe;
595641

0 commit comments

Comments
 (0)