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 131
131
"textContent" : " \n " ,
132
132
"id" : 20
133
133
},
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
+ },
134
149
{
135
150
"type" : 2 ,
136
151
"tagName" : " div" ,
141
156
{
142
157
"type" : 3 ,
143
158
"textContent" : " ***** ****** ** ******" ,
144
- "id" : 22
159
+ "id" : 24
145
160
}
146
161
],
147
- "id" : 21
162
+ "id" : 23
148
163
},
149
164
{
150
165
"type" : 3 ,
151
166
"textContent" : " \n " ,
152
- "id" : 23
167
+ "id" : 25
153
168
},
154
169
{
155
170
"type" : 2 ,
160
175
},
161
176
"childNodes" : [],
162
177
"isSVG" : true ,
163
- "id" : 24
178
+ "id" : 26
164
179
},
165
180
{
166
181
"type" : 3 ,
167
182
"textContent" : " \n " ,
168
- "id" : 25
183
+ "id" : 27
169
184
},
170
185
{
171
186
"type" : 2 ,
184
199
},
185
200
"childNodes" : [],
186
201
"isSVG" : true ,
187
- "id" : 27
202
+ "id" : 29
188
203
},
189
204
{
190
205
"type" : 2 ,
191
206
"tagName" : " area" ,
192
207
"attributes" : {},
193
208
"childNodes" : [],
194
209
"isSVG" : true ,
195
- "id" : 28
210
+ "id" : 30
196
211
},
197
212
{
198
213
"type" : 2 ,
199
214
"tagName" : " rect" ,
200
215
"attributes" : {},
201
216
"childNodes" : [],
202
217
"isSVG" : true ,
203
- "id" : 29
218
+ "id" : 31
204
219
}
205
220
],
206
221
"isSVG" : true ,
207
- "id" : 26
222
+ "id" : 28
208
223
},
209
224
{
210
225
"type" : 3 ,
211
226
"textContent" : " \n " ,
212
- "id" : 30
227
+ "id" : 32
213
228
},
214
229
{
215
230
"type" : 2 ,
219
234
"rr_height" : " [100-150]px"
220
235
},
221
236
"childNodes" : [],
222
- "id" : 31
237
+ "id" : 33
223
238
},
224
239
{
225
240
"type" : 3 ,
226
241
"textContent" : " \n " ,
227
- "id" : 32
242
+ "id" : 34
228
243
},
229
244
{
230
245
"type" : 2 ,
235
250
"src" : " file:///none.png"
236
251
},
237
252
"childNodes" : [],
238
- "id" : 33
253
+ "id" : 35
239
254
},
240
255
{
241
256
"type" : 3 ,
242
257
"textContent" : " \n " ,
243
- "id" : 34
258
+ "id" : 36
244
259
},
245
260
{
246
261
"type" : 2 ,
250
265
"rr_height" : " [0-50]px"
251
266
},
252
267
"childNodes" : [],
253
- "id" : 35
268
+ "id" : 37
254
269
},
255
270
{
256
271
"type" : 3 ,
257
272
"textContent" : " \n " ,
258
- "id" : 36
273
+ "id" : 38
259
274
},
260
275
{
261
276
"type" : 3 ,
262
277
"textContent" : " \n\n " ,
263
- "id" : 37
278
+ "id" : 39
264
279
}
265
280
],
266
281
"id" : 8
Original file line number Diff line number Diff line change @@ -4,13 +4,18 @@ import { IncrementalSource } from '@sentry-internal/rrweb';
4
4
5
5
import { sentryTest } from '../../../utils/fixtures' ;
6
6
import type { IncrementalRecordingSnapshot } from '../../../utils/replayHelpers' ;
7
+ < < < << << HEAD
7
8
import {
8
9
getFullRecordingSnapshots ,
10
+ = === ===
11
+ import { getFullRecordingSnapshots ,
12
+ > > >>> >> d495cdedf ( feat can unmask attributes , masks input type = button / submit ( only with maskAllText enabled ) )
9
13
getIncrementalRecordingSnapshots ,
10
14
shouldSkipReplayTest ,
11
15
waitForReplayRequest ,
12
16
} from '../../../utils/replayHelpers' ;
13
17
18
+
14
19
function isInputMutation (
15
20
snap : IncrementalRecordingSnapshot ,
16
21
) : 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';
3
3
import { IncrementalSource } from '@sentry-internal/rrweb' ;
4
4
5
5
import { sentryTest } from '../../../utils/fixtures' ;
6
- import type { IncrementalRecordingSnapshot } from '../../../utils/replayHelpers' ;
6
+ import { getFullRecordingSnapshots , IncrementalRecordingSnapshot } from '../../../utils/replayHelpers' ;
7
7
import {
8
8
getFullRecordingSnapshots ,
9
9
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
50
50
export const MIN_REPLAY_DURATION = 4_999 ;
51
51
/* The max. allowed value that the minReplayDuration can be set to. */
52
52
export 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 {
103
103
} : ReplayConfiguration = { } ) {
104
104
this . name = Replay . id ;
105
105
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
+
106
119
this . _recordingOptions = {
107
120
maskAllInputs,
108
121
maskAllText,
109
122
maskInputOptions : { ...( maskInputOptions || { } ) , password : true } ,
110
123
maskTextFn : maskFn ,
111
124
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
+ ) {
115
142
return value . replace ( / [ \S ] / g, '*' ) ;
116
143
}
117
144
118
145
return value ;
119
146
} ,
120
147
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 ,
133
149
134
150
// Our defaults
135
151
slimDOMOptions : 'all' ,
You can’t perform that action at this time.
0 commit comments