File tree Expand file tree Collapse file tree 5 files changed +72
-33
lines changed
browser-integration-tests/suites/replay
privacyDefault/test.ts-snapshots Expand file tree Collapse file tree 5 files changed +72
-33
lines changed Original file line number Diff line number Diff line change 131131 "textContent" : " \n " ,
132132 "id" : 20
133133 },
134+ {
135+ "type" : 2 ,
136+ "tagName" : " input" ,
137+ "attributes" : {
138+ "data-sentry-unmask" : " " ,
139+ "placeholder" : " Placeholder can be unmasked"
140+ },
141+ "childNodes" : [],
142+ "id" : 21
143+ },
144+ {
145+ "type" : 3 ,
146+ "textContent" : " \n " ,
147+ "id" : 22
148+ },
134149 {
135150 "type" : 2 ,
136151 "tagName" : " div" ,
141156 {
142157 "type" : 3 ,
143158 "textContent" : " ***** ****** ** ******" ,
144- "id" : 22
159+ "id" : 24
145160 }
146161 ],
147- "id" : 21
162+ "id" : 23
148163 },
149164 {
150165 "type" : 3 ,
151166 "textContent" : " \n " ,
152- "id" : 23
167+ "id" : 25
153168 },
154169 {
155170 "type" : 2 ,
160175 },
161176 "childNodes" : [],
162177 "isSVG" : true ,
163- "id" : 24
178+ "id" : 26
164179 },
165180 {
166181 "type" : 3 ,
167182 "textContent" : " \n " ,
168- "id" : 25
183+ "id" : 27
169184 },
170185 {
171186 "type" : 2 ,
184199 },
185200 "childNodes" : [],
186201 "isSVG" : true ,
187- "id" : 27
202+ "id" : 29
188203 },
189204 {
190205 "type" : 2 ,
191206 "tagName" : " area" ,
192207 "attributes" : {},
193208 "childNodes" : [],
194209 "isSVG" : true ,
195- "id" : 28
210+ "id" : 30
196211 },
197212 {
198213 "type" : 2 ,
199214 "tagName" : " rect" ,
200215 "attributes" : {},
201216 "childNodes" : [],
202217 "isSVG" : true ,
203- "id" : 29
218+ "id" : 31
204219 }
205220 ],
206221 "isSVG" : true ,
207- "id" : 26
222+ "id" : 28
208223 },
209224 {
210225 "type" : 3 ,
211226 "textContent" : " \n " ,
212- "id" : 30
227+ "id" : 32
213228 },
214229 {
215230 "type" : 2 ,
219234 "rr_height" : " [100-150]px"
220235 },
221236 "childNodes" : [],
222- "id" : 31
237+ "id" : 33
223238 },
224239 {
225240 "type" : 3 ,
226241 "textContent" : " \n " ,
227- "id" : 32
242+ "id" : 34
228243 },
229244 {
230245 "type" : 2 ,
235250 "src" : " file:///none.png"
236251 },
237252 "childNodes" : [],
238- "id" : 33
253+ "id" : 35
239254 },
240255 {
241256 "type" : 3 ,
242257 "textContent" : " \n " ,
243- "id" : 34
258+ "id" : 36
244259 },
245260 {
246261 "type" : 2 ,
250265 "rr_height" : " [0-50]px"
251266 },
252267 "childNodes" : [],
253- "id" : 35
268+ "id" : 37
254269 },
255270 {
256271 "type" : 3 ,
257272 "textContent" : " \n " ,
258- "id" : 36
273+ "id" : 38
259274 },
260275 {
261276 "type" : 3 ,
262277 "textContent" : " \n\n " ,
263- "id" : 37
278+ "id" : 39
264279 }
265280 ],
266281 "id" : 8
Original file line number Diff line number Diff line change @@ -4,13 +4,18 @@ import { IncrementalSource } from '@sentry-internal/rrweb';
44
55import { sentryTest } from '../../../utils/fixtures' ;
66import type { IncrementalRecordingSnapshot } from '../../../utils/replayHelpers' ;
7+ < < < << << HEAD
78import {
89 getFullRecordingSnapshots ,
10+ = === ===
11+ import { getFullRecordingSnapshots ,
12+ > > >>> >> d495cdedf ( feat can unmask attributes , masks input type = button / submit ( only with maskAllText enabled ) )
913 getIncrementalRecordingSnapshots ,
1014 shouldSkipReplayTest ,
1115 waitForReplayRequest ,
1216} from '../../../utils/replayHelpers' ;
1317
18+
1419function isInputMutation (
1520 snap : IncrementalRecordingSnapshot ,
1621) : snap is IncrementalRecordingSnapshot & { data : inputData } {
Original file line number Diff line number Diff line change @@ -3,7 +3,7 @@ import type { inputData } from '@sentry-internal/rrweb';
33import { IncrementalSource } from '@sentry-internal/rrweb' ;
44
55import { sentryTest } from '../../../utils/fixtures' ;
6- import type { IncrementalRecordingSnapshot } from '../../../utils/replayHelpers' ;
6+ import { getFullRecordingSnapshots , IncrementalRecordingSnapshot } from '../../../utils/replayHelpers' ;
77import {
88 getFullRecordingSnapshots ,
99 getIncrementalRecordingSnapshots ,
Original file line number Diff line number Diff line change @@ -50,3 +50,6 @@ export const REPLAY_MAX_EVENT_BUFFER_SIZE = 20_000_000; // ~20MB
5050export const MIN_REPLAY_DURATION = 4_999 ;
5151/* The max. allowed value that the minReplayDuration can be set to. */
5252export const MIN_REPLAY_DURATION_LIMIT = 15_000 ;
53+
54+ /** Default attributes to be ignored when `maskAllText` is enabled */
55+ export const DEFAULT_IGNORED_ATTRIBUTES = [ 'title' , 'placeholder' ] ;
Original file line number Diff line number Diff line change @@ -101,33 +101,49 @@ export class Replay implements Integration {
101101 // eslint-disable-next-line deprecation/deprecation
102102 ignoreClass,
103103 } : ReplayConfiguration = { } ) {
104+ const privacyOptions = getPrivacyOptions ( {
105+ mask,
106+ unmask,
107+ block,
108+ unblock,
109+ ignore,
110+ blockClass,
111+ blockSelector,
112+ maskTextClass,
113+ maskTextSelector,
114+ ignoreClass,
115+ } ) ;
116+
104117 this . _recordingOptions = {
105118 maskAllInputs,
106119 maskAllText,
107120 maskInputOptions : { ...( maskInputOptions || { } ) , password : true } ,
108121 maskTextFn : maskFn ,
109122 maskInputFn : maskFn ,
110- maskAttributeFn : ( key : string , value : string ) : string => {
111- // For now, always mask these attributes
112- if ( maskAttributes . includes ( key ) ) {
123+ maskAttributeFn : ( key : string , value : string , el : HTMLElement ) : string => {
124+ // We only mask attributes if `maskAllText` is true
125+ if ( ! maskAllText ) {
126+ return value ;
127+ }
128+
129+ // unmaskTextSelector takes precendence
130+ if ( privacyOptions . unmaskTextSelector && el . matches ( privacyOptions . unmaskTextSelector ) ) {
131+ return value ;
132+ }
133+
134+ if (
135+ maskAttributes . includes ( key ) ||
136+ // Need to mask `value` attribute for `<input>` if it's a button-like
137+ // type
138+ ( key === 'value' && el . tagName === 'INPUT' && [ 'submit' , 'button' ] . includes ( el . getAttribute ( 'type' ) || '' ) )
139+ ) {
113140 return value . replace ( / [ \S ] / g, '*' ) ;
114141 }
115142
116143 return value ;
117144 } ,
118145
119- ...getPrivacyOptions ( {
120- mask,
121- unmask,
122- block,
123- unblock,
124- ignore,
125- blockClass,
126- blockSelector,
127- maskTextClass,
128- maskTextSelector,
129- ignoreClass,
130- } ) ,
146+ ...privacyOptions ,
131147
132148 // Our defaults
133149 slimDOMOptions : 'all' ,
You can’t perform that action at this time.
0 commit comments