diff --git a/packages/core/src/integrations/inboundfilters.ts b/packages/core/src/integrations/inboundfilters.ts index 61dfad5f47fd..fec0265e499b 100644 --- a/packages/core/src/integrations/inboundfilters.ts +++ b/packages/core/src/integrations/inboundfilters.ts @@ -1,5 +1,5 @@ import { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub'; -import { Event, Integration } from '@sentry/types'; +import { Event, Integration, StackFrame } from '@sentry/types'; import { getEventDescription, isMatchingPattern, logger } from '@sentry/utils'; // "Script error." is hard coded into browsers for errors that it can't read. @@ -189,17 +189,30 @@ export class InboundFilters implements Integration { return []; } + /** JSDoc */ + private _getLastValidUrl(frames: StackFrame[] = []): string | null { + for (let i = frames.length - 1; i >= 0; i--) { + const frame = frames[i]; + + if (frame?.filename !== '') { + return frame.filename || null; + } + } + + return null; + } + /** JSDoc */ private _getEventFilterUrl(event: Event): string | null { try { if (event.stacktrace) { const frames = event.stacktrace.frames; - return (frames && frames[frames.length - 1].filename) || null; + return this._getLastValidUrl(frames); } if (event.exception) { const frames = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames; - return (frames && frames[frames.length - 1].filename) || null; + return this._getLastValidUrl(frames); } return null; } catch (oO) { diff --git a/packages/core/test/lib/integrations/inboundfilters.test.ts b/packages/core/test/lib/integrations/inboundfilters.test.ts index 75b6ad848fd8..283ae7404140 100644 --- a/packages/core/test/lib/integrations/inboundfilters.test.ts +++ b/packages/core/test/lib/integrations/inboundfilters.test.ts @@ -456,5 +456,36 @@ describe('InboundFilters', () => { ), ).toBe(true); }); + + it('should search for script names when there is an anonymous callback at the last frame', () => { + const messageEvent = { + message: 'any', + stacktrace: { + frames: [ + { filename: 'https://our-side.com/js/bundle.js' }, + { filename: 'https://awesome-analytics.io/some/file.js' }, + { filename: '' }, + ], + }, + }; + + expect( + inboundFilters._isAllowedUrl( + messageEvent, + inboundFilters._mergeOptions({ + allowUrls: ['https://awesome-analytics.io/some/file.js'], + }), + ), + ).toBe(true); + + expect( + inboundFilters._isDeniedUrl( + messageEvent, + inboundFilters._mergeOptions({ + denyUrls: ['https://awesome-analytics.io/some/file.js'], + }), + ), + ).toBe(true); + }); }); });