diff --git a/packages/rrweb/src/record/error-handler.ts b/packages/rrweb/src/record/error-handler.ts index cc0511457a..77efcc907a 100644 --- a/packages/rrweb/src/record/error-handler.ts +++ b/packages/rrweb/src/record/error-handler.ts @@ -15,7 +15,10 @@ export function unregisterErrorHandler() { /** * Wrap callbacks in a wrapper that allows to pass errors to a configured `errorHandler` method. */ -export const callbackWrapper = (cb: T): T => { +export const callbackWrapper = ( + cb: T, + errorSource?: string, +): T => { if (!errorHandler) { return cb; } @@ -24,6 +27,13 @@ export const callbackWrapper = (cb: T): T => { try { return cb(...rest); } catch (error) { + // Some libraries (styled-components) rely on an exception to be thrown. + // Attach an optional property here to allow `errorHandler` to make + // additional decisions (e.g. to re-throw). + if (errorSource) { + error.__source__ = errorSource; + } + if (errorHandler && errorHandler(error) === true) { return () => { // This will get called by `record()`'s cleanup function diff --git a/packages/rrweb/src/record/observer.ts b/packages/rrweb/src/record/observer.ts index 53e0f7e45f..409c9b7c56 100644 --- a/packages/rrweb/src/record/observer.ts +++ b/packages/rrweb/src/record/observer.ts @@ -724,6 +724,7 @@ function initStyleSheetObserver( } return target.apply(thisArg, argumentsList); }, + 'CSSStyleSheet.insertRule', ), }); @@ -891,6 +892,7 @@ function initStyleSheetObserver( } return target.apply(thisArg, argumentsList); }, + 'CSSStyleSheet.insertRule', ), }, );