Skip to content

Commit b7503d0

Browse files
authored
Fix breadcrumb capture on mousemove events in some cases (fixes #724) (#766)
1 parent 592bfce commit b7503d0

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

src/raven.js

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,6 @@ Raven.prototype = {
736736
// TODO: if somehow user switches keypress target before
737737
// debounce timeout is triggered, we will only capture
738738
// a single breadcrumb from the FIRST target (acceptable?)
739-
740739
return function (evt) {
741740
var target = evt.target,
742741
tagName = target && target.tagName;
@@ -755,7 +754,7 @@ Raven.prototype = {
755754
}
756755
clearTimeout(timeout);
757756
self._keypressTimeout = setTimeout(function () {
758-
self._keypressTimeout = null;
757+
self._keypressTimeout = null;
759758
}, debounceDuration);
760759
};
761760
},
@@ -841,13 +840,24 @@ Raven.prototype = {
841840

842841
// More breadcrumb DOM capture ... done here and not in `_instrumentBreadcrumbs`
843842
// so that we don't have more than one wrapper function
844-
var before;
843+
var before,
844+
clickHandler,
845+
keypressHandler;
846+
845847
if (autoBreadcrumbs && autoBreadcrumbs.dom && (global === 'EventTarget' || global === 'Node')) {
846-
if (evtName === 'click'){
847-
before = self._breadcrumbEventHandler(evtName);
848-
} else if (evtName === 'keypress') {
849-
before = self._keypressEventHandler();
850-
}
848+
// NOTE: generating multiple handlers per addEventListener invocation, should
849+
// revisit and verify we can just use one (almost certainly)
850+
clickHandler = self._breadcrumbEventHandler('click');
851+
keypressHandler = self._keypressEventHandler();
852+
before = function (evt) {
853+
// need to intercept every DOM event in `before` argument, in case that
854+
// same wrapped method is re-used for different events (e.g. mousemove THEN click)
855+
// see #724
856+
if (evt.type === 'click')
857+
return clickHandler(evt);
858+
else if (evt.type === 'keypress')
859+
return keypressHandler(evt);
860+
};
851861
}
852862
return orig.call(this, evtName, self.wrap(fn, undefined, before), capture, secure);
853863
};

test/integration/test.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,10 @@ describe('integration', function () {
580580
var clickHandler = function (evt) {
581581
//evt.stopPropagation();
582582
};
583+
584+
// mousemove event shouldnt clobber subsequent "breadcrumbed" events (see #724)
585+
document.querySelector('.a').addEventListener('mousemove', clickHandler);
586+
583587
document.querySelector('.a').addEventListener('click', clickHandler);
584588
document.querySelector('.b').addEventListener('click', clickHandler);
585589
document.querySelector('.c').addEventListener('click', clickHandler);

0 commit comments

Comments
 (0)