From 3c37188ba132e18ae74cca5d75df4d93891cd015 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Sun, 3 Aug 2025 14:20:29 +0200 Subject: [PATCH 1/3] feat(browser): Handles data URIs in chrome stack frames --- packages/browser/src/stack-parsers.ts | 11 ++++ .../browser/test/tracekit/chromium.test.ts | 51 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/packages/browser/src/stack-parsers.ts b/packages/browser/src/stack-parsers.ts index d857b2e92b36..86c1eba09ba8 100644 --- a/packages/browser/src/stack-parsers.ts +++ b/packages/browser/src/stack-parsers.ts @@ -61,10 +61,21 @@ const chromeRegex = const chromeEvalRegex = /\((\S*)(?::(\d+))(?::(\d+))\)/; +// at dynamicFn (data:application/javascript,export function dynamicFn() {... +const chromeDataUriRegex = /at (.+?) ?\(data:(.+?),/; + // Chromium based browsers: Chrome, Brave, new Opera, new Edge // We cannot call this variable `chrome` because it can conflict with global `chrome` variable in certain environments // See: https://github.com/getsentry/sentry-javascript/issues/6880 const chromeStackParserFn: StackLineParserFn = line => { + const dataUriMatch = line.match(chromeDataUriRegex); + if (dataUriMatch) { + return { + filename: ``, + function: dataUriMatch[1], + }; + } + // If the stack line has no function name, we need to parse it differently const noFnParts = chromeRegexNoFnName.exec(line) as null | [string, string, string, string]; diff --git a/packages/browser/test/tracekit/chromium.test.ts b/packages/browser/test/tracekit/chromium.test.ts index 71cb950c147d..57a533a74796 100644 --- a/packages/browser/test/tracekit/chromium.test.ts +++ b/packages/browser/test/tracekit/chromium.test.ts @@ -741,4 +741,55 @@ describe('Tracekit - Chrome Tests', () => { value: 'memory access out of bounds', }); }); + + it('should correctly parse with data uris', () => { + const DATA_URI_ERROR = { + message: 'Error from data-uri module', + name: 'Error', + stack: `Error: Error from data-uri module + at dynamicFn (data:application/javascript,export function dynamicFn() { throw new Error('Error from data-uri module');};:1:38) + at loadDodgyModule (file:///Users/tim/Documents/Repositories/data-uri-tests/index.mjs:8:5) + at async callSomeFunction (file:///Users/tim/Documents/Repositories/data-uri-tests/index.mjs:12:5) + at async file:///Users/tim/Documents/Repositories/data-uri-tests/index.mjs:16:5`, + }; + + const ex = exceptionFromError(parser, DATA_URI_ERROR); + + // This is really ugly but the wasm integration should clean up these stack frames + expect(ex).toStrictEqual({ + stacktrace: { + frames: [ + { + colno: 5, + filename: 'file:///Users/tim/Documents/Repositories/data-uri-tests/index.mjs', + function: '?', + in_app: true, + lineno: 16, + }, + { + colno: 5, + filename: 'file:///Users/tim/Documents/Repositories/data-uri-tests/index.mjs', + function: 'async callSomeFunction', + in_app: true, + lineno: 12, + }, + { + colno: 5, + filename: 'file:///Users/tim/Documents/Repositories/data-uri-tests/index.mjs', + function: 'loadDodgyModule', + in_app: true, + lineno: 8, + }, + { + filename: '', + function: 'dynamicFn', + } + ] + }, + type: 'Error', + value: 'Error from data-uri module', + }); + }); }); + + From fd681db6d94ce2e0f61b94c37b561ad1baa90378 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Sun, 3 Aug 2025 14:41:59 +0200 Subject: [PATCH 2/3] lint --- packages/browser/test/tracekit/chromium.test.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/browser/test/tracekit/chromium.test.ts b/packages/browser/test/tracekit/chromium.test.ts index 57a533a74796..9a1cbd0abbe9 100644 --- a/packages/browser/test/tracekit/chromium.test.ts +++ b/packages/browser/test/tracekit/chromium.test.ts @@ -783,13 +783,11 @@ describe('Tracekit - Chrome Tests', () => { { filename: '', function: 'dynamicFn', - } - ] + }, + ], }, type: 'Error', value: 'Error from data-uri module', }); }); }); - - From 776dbe89d4a7b7f58da4c123e0dbe96480cc333e Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 5 Aug 2025 18:14:49 +0200 Subject: [PATCH 3/3] better comment --- packages/browser/src/stack-parsers.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/browser/src/stack-parsers.ts b/packages/browser/src/stack-parsers.ts index 86c1eba09ba8..02c3a1f66af3 100644 --- a/packages/browser/src/stack-parsers.ts +++ b/packages/browser/src/stack-parsers.ts @@ -61,7 +61,8 @@ const chromeRegex = const chromeEvalRegex = /\((\S*)(?::(\d+))(?::(\d+))\)/; -// at dynamicFn (data:application/javascript,export function dynamicFn() {... +// Matches stack frames with data URIs instead of filename so we can still get the function name +// Example: "at dynamicFn (data:application/javascript,export function dynamicFn() {..." const chromeDataUriRegex = /at (.+?) ?\(data:(.+?),/; // Chromium based browsers: Chrome, Brave, new Opera, new Edge