Skip to content

Commit 7d5f366

Browse files
committed
fix me for real??
1 parent 45aeae2 commit 7d5f366

File tree

1 file changed

+24
-19
lines changed

1 file changed

+24
-19
lines changed

packages/utils/src/instrument.ts

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ let debounceTimerID: number | undefined;
408408
let lastCapturedEventType: string | undefined;
409409
let lastCapturedEventTargetId: string | undefined;
410410

411-
type SentryWrappedTarget = EventTarget & { _sentryId?: string };
411+
type SentryWrappedTarget = HTMLElement & { _sentryId?: string };
412412

413413
/**
414414
* Check whether the event is similar to the last captured one. For example, two click events on the same button.
@@ -440,30 +440,33 @@ function isSimilarToLastCapturedEvent(event: Event): boolean {
440440
* Decide whether an event should be captured.
441441
* @param event event to be captured
442442
*/
443-
function shouldSkipDOMEvent(event: Event): boolean {
443+
function shouldSkipDOMEvent(eventType: string, target: SentryWrappedTarget | null): boolean {
444444
// We are only interested in filtering `keypress` events for now.
445-
if (event.type !== 'keypress') {
445+
if (eventType !== 'keypress') {
446446
return false;
447447
}
448448

449-
try {
450-
const target = event.target as HTMLElement;
449+
if (!target || !target.tagName) {
450+
return true;
451+
}
451452

452-
if (!target || !target.tagName) {
453-
return true;
454-
}
453+
// Only consider keypress events on actual input elements. This will disregard keypresses targeting body
454+
// e.g.tabbing through elements, hotkeys, etc.
455+
if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {
456+
return false;
457+
}
455458

456-
// Only consider keypress events on actual input elements. This will disregard keypresses targeting body
457-
// e.g.tabbing through elements, hotkeys, etc.
458-
if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {
459-
return false;
460-
}
459+
return true;
460+
}
461+
462+
function getEventTarget(event: Event): SentryWrappedTarget | null {
463+
try {
464+
return event.target as SentryWrappedTarget | null;
461465
} catch (e) {
462466
// just accessing `target` property can throw an exception in some rare circumstances
463467
// see: https://github.com/getsentry/sentry-javascript/issues/838
468+
return null;
464469
}
465-
466-
return true;
467470
}
468471

469472
/**
@@ -482,17 +485,19 @@ function makeDOMEventHandler(handler: Function, globalListener: boolean = false)
482485
return;
483486
}
484487

488+
const target = getEventTarget(event);
489+
485490
// We always want to skip _some_ events.
486-
if (shouldSkipDOMEvent(event)) {
491+
if (shouldSkipDOMEvent(event.type, target)) {
487492
return;
488493
}
489494

490495
// Mark event as "seen"
491496
addNonEnumerableProperty(event, '_sentryCaptured', true);
492497

493-
if (event.target && !(event.target as SentryWrappedTarget)._sentryId) {
498+
if (target && !target._sentryId) {
494499
// Add UUID to event target so we can identify if
495-
addNonEnumerableProperty(event.target, '_sentryId', uuid4());
500+
addNonEnumerableProperty(target, '_sentryId', uuid4());
496501
}
497502

498503
const name = event.type === 'keypress' ? 'input' : event.type;
@@ -507,7 +512,7 @@ function makeDOMEventHandler(handler: Function, globalListener: boolean = false)
507512
global: globalListener,
508513
});
509514
lastCapturedEventType = event.type;
510-
lastCapturedEventTargetId = event.target ? (event.target as SentryWrappedTarget)._sentryId : undefined;
515+
lastCapturedEventTargetId = target ? target._sentryId : undefined;
511516
}
512517

513518
// Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together.

0 commit comments

Comments
 (0)