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 @@ -103,33 +103,49 @@ export class Replay implements Integration {
103103 } : ReplayConfiguration = { } ) {
104104 this . name = Replay . id ;
105105
106+ const privacyOptions = getPrivacyOptions ( {
107+ mask,
108+ unmask,
109+ block,
110+ unblock,
111+ ignore,
112+ blockClass,
113+ blockSelector,
114+ maskTextClass,
115+ maskTextSelector,
116+ ignoreClass,
117+ } ) ;
118+
106119 this . _recordingOptions = {
107120 maskAllInputs,
108121 maskAllText,
109122 maskInputOptions : { ...( maskInputOptions || { } ) , password : true } ,
110123 maskTextFn : maskFn ,
111124 maskInputFn : maskFn ,
112- maskAttributeFn : ( key : string , value : string ) : string => {
113- // For now, always mask these attributes
114- if ( maskAttributes . includes ( key ) ) {
125+ maskAttributeFn : ( key : string , value : string , el : HTMLElement ) : string => {
126+ // We only mask attributes if `maskAllText` is true
127+ if ( ! maskAllText ) {
128+ return value ;
129+ }
130+
131+ // unmaskTextSelector takes precendence
132+ if ( privacyOptions . unmaskTextSelector && el . matches ( privacyOptions . unmaskTextSelector ) ) {
133+ return value ;
134+ }
135+
136+ if (
137+ maskAttributes . includes ( key ) ||
138+ // Need to mask `value` attribute for `<input>` if it's a button-like
139+ // type
140+ ( key === 'value' && el . tagName === 'INPUT' && [ 'submit' , 'button' ] . includes ( el . getAttribute ( 'type' ) || '' ) )
141+ ) {
115142 return value . replace ( / [ \S ] / g, '*' ) ;
116143 }
117144
118145 return value ;
119146 } ,
120147
121- ...getPrivacyOptions ( {
122- mask,
123- unmask,
124- block,
125- unblock,
126- ignore,
127- blockClass,
128- blockSelector,
129- maskTextClass,
130- maskTextSelector,
131- ignoreClass,
132- } ) ,
148+ ...privacyOptions ,
133149
134150 // Our defaults
135151 slimDOMOptions : 'all' ,
You can’t perform that action at this time.
0 commit comments