1
- import type { INode } from '@sentry-internal/rrweb-snapshot' ;
1
+ import { record } from '@sentry-internal/rrweb' ;
2
+ import type { serializedElementNodeWithId , serializedNodeWithId } from '@sentry-internal/rrweb-snapshot' ;
2
3
import { NodeType } from '@sentry-internal/rrweb-snapshot' ;
3
4
import type { Breadcrumb } from '@sentry/types' ;
4
5
import { htmlTreeAsString } from '@sentry/utils' ;
@@ -49,28 +50,26 @@ export const handleDomListener: (replay: ReplayContainer) => (handlerData: DomHa
49
50
} ;
50
51
51
52
/** Get the base DOM breadcrumb. */
52
- export function getBaseDomBreadcrumb ( target : Node | INode | null , message : string ) : Breadcrumb {
53
- // `__sn` property is the serialized node created by rrweb
54
- const serializedNode = target && isRrwebNode ( target ) && target . __sn . type === NodeType . Element ? target . __sn : null ;
53
+ export function getBaseDomBreadcrumb ( target : Node | null , message : string ) : Breadcrumb {
54
+ const nodeId = record . mirror . getId ( target ) ;
55
+ const node = nodeId && record . mirror . getNode ( nodeId ) ;
56
+ const meta = node && record . mirror . getMeta ( node ) ;
57
+ const element = meta && isElement ( meta ) ? meta : null ;
55
58
56
59
return {
57
60
message,
58
- data : serializedNode
61
+ data : element
59
62
? {
60
- nodeId : serializedNode . id ,
63
+ nodeId,
61
64
node : {
62
- id : serializedNode . id ,
63
- tagName : serializedNode . tagName ,
64
- textContent : target
65
- ? Array . from ( target . childNodes )
66
- . map (
67
- ( node : Node | INode ) => '__sn' in node && node . __sn . type === NodeType . Text && node . __sn . textContent ,
68
- )
69
- . filter ( Boolean ) // filter out empty values
70
- . map ( text => ( text as string ) . trim ( ) )
71
- . join ( '' )
72
- : '' ,
73
- attributes : getAttributesToRecord ( serializedNode . attributes ) ,
65
+ id : nodeId ,
66
+ tagName : element . tagName ,
67
+ textContent : Array . from ( element . childNodes )
68
+ . map ( ( node : serializedNodeWithId ) => node . type === NodeType . Text && node . textContent )
69
+ . filter ( Boolean ) // filter out empty values
70
+ . map ( text => ( text as string ) . trim ( ) )
71
+ . join ( '' ) ,
72
+ attributes : getAttributesToRecord ( element . attributes ) ,
74
73
} ,
75
74
}
76
75
: { } ,
@@ -90,11 +89,11 @@ export function handleDom(handlerData: DomHandlerData): Breadcrumb | null {
90
89
} ) ;
91
90
}
92
91
93
- function getDomTarget ( handlerData : DomHandlerData ) : { target : Node | INode | null ; message : string } {
92
+ function getDomTarget ( handlerData : DomHandlerData ) : { target : Node | null ; message : string } {
94
93
const isClick = handlerData . name === 'click' ;
95
94
96
95
let message : string | undefined ;
97
- let target : Node | INode | null = null ;
96
+ let target : Node | null = null ;
98
97
99
98
// Accessing event.target can throw (see getsentry/raven-js#838, #768)
100
99
try {
@@ -107,6 +106,6 @@ function getDomTarget(handlerData: DomHandlerData): { target: Node | INode | nul
107
106
return { target, message } ;
108
107
}
109
108
110
- function isRrwebNode ( node : EventTarget ) : node is INode {
111
- return '__sn' in node ;
109
+ function isElement ( node : serializedNodeWithId ) : node is serializedElementNodeWithId {
110
+ return node . type === NodeType . Element ;
112
111
}
0 commit comments