3
3
MaskInputOptions ,
4
4
SlimDOMOptions ,
5
5
createMirror ,
6
+ DataURLOptions ,
6
7
} from '@sentry-internal/rrweb-snapshot' ;
7
8
import { initObservers , mutationBuffers } from './observer' ;
8
9
import {
@@ -27,6 +28,8 @@ import {
27
28
scrollCallback ,
28
29
canvasMutationParam ,
29
30
adoptedStyleSheetParam ,
31
+ SamplingStrategy ,
32
+ blockClass ,
30
33
} from '@sentry-internal/rrweb-types' ;
31
34
import type { CrossOriginIframeMessageEventContent } from '../types' ;
32
35
import {
@@ -115,6 +118,7 @@ function record<T = eventWithTime>(
115
118
ignoreCSSAttributes = new Set ( [ ] ) ,
116
119
errorHandler,
117
120
onMutation,
121
+ canvasManager : customCanvasManager ,
118
122
} = options ;
119
123
120
124
registerErrorHandler ( errorHandler ) ;
@@ -337,20 +341,18 @@ function record<T = eventWithTime>(
337
341
338
342
const processedNodeManager = new ProcessedNodeManager ( ) ;
339
343
340
- const canvasManager : CanvasManagerInterface =
341
- typeof __RRWEB_EXCLUDE_CANVAS__ === 'boolean' && __RRWEB_EXCLUDE_CANVAS__
342
- ? new CanvasManagerNoop ( )
343
- : new CanvasManager ( {
344
- recordCanvas,
345
- mutationCb : wrappedCanvasMutationEmit ,
346
- win : window ,
347
- blockClass,
348
- blockSelector,
349
- unblockSelector,
350
- mirror,
351
- sampling : sampling . canvas ,
352
- dataURLOptions,
353
- } ) ;
344
+ const canvasManager : CanvasManagerInterface = customCanvasManager
345
+ ? customCanvasManager
346
+ : typeof __RRWEB_EXCLUDE_CANVAS__ === 'boolean' && __RRWEB_EXCLUDE_CANVAS__
347
+ ? new CanvasManagerNoop ( )
348
+ : getCanvasManager ( {
349
+ recordCanvas,
350
+ blockClass,
351
+ blockSelector,
352
+ unblockSelector,
353
+ sampling,
354
+ dataURLOptions,
355
+ } ) ;
354
356
355
357
const shadowDomManager : ShadowDomManagerInterface =
356
358
typeof __RRWEB_EXCLUDE_SHADOW_DOM__ === 'boolean' &&
@@ -721,6 +723,14 @@ export function takeFullSnapshot(isCheckout?: boolean) {
721
723
_takeFullSnapshot ( isCheckout ) ;
722
724
}
723
725
726
+ function wrappedEmit ( e : eventWithTime ) {
727
+ if ( ! _wrappedEmit ) {
728
+ return ;
729
+ }
730
+
731
+ _wrappedEmit ( e ) ;
732
+ }
733
+
724
734
// record.addCustomEvent is removed because Sentry Session Replay does not use it
725
735
// record.freezePage is removed because Sentry Session Replay does not use it
726
736
@@ -729,3 +739,31 @@ record.mirror = mirror;
729
739
record . takeFullSnapshot = takeFullSnapshot ;
730
740
731
741
export default record ;
742
+
743
+ const wrappedCanvasMutationEmit = ( p : canvasMutationParam ) =>
744
+ wrappedEmit (
745
+ wrapEvent ( {
746
+ type : EventType . IncrementalSnapshot ,
747
+ data : {
748
+ source : IncrementalSource . CanvasMutation ,
749
+ ...p ,
750
+ } ,
751
+ } ) ,
752
+ ) ;
753
+
754
+ export function getCanvasManager ( options : {
755
+ recordCanvas : boolean ;
756
+ blockClass : blockClass ;
757
+ blockSelector : string | null ;
758
+ unblockSelector : string | null ;
759
+ sampling : SamplingStrategy ;
760
+ dataURLOptions : DataURLOptions ;
761
+ } ) : CanvasManagerInterface {
762
+ return new CanvasManager ( {
763
+ ...options ,
764
+ sampling : options . sampling . canvas ,
765
+ mutationCb : wrappedCanvasMutationEmit ,
766
+ win : window ,
767
+ mirror,
768
+ } ) ;
769
+ }
0 commit comments