Skip to content

Commit

Permalink
Extended text masking function to include relevant HTMLElement (#1310)
Browse files Browse the repository at this point in the history
* Extends maskTextFn to pass the HTMLElement to the deciding function

---------

Authored-by: benjackwhite <[email protected]>
Co-authored-by: Justin Halsall <[email protected]>
Co-authored-by: Eoghan Murray <[email protected]>
  • Loading branch information
3 people authored Oct 13, 2023
1 parent 980a38c commit 7c0dc9d
Show file tree
Hide file tree
Showing 8 changed files with 403 additions and 16 deletions.
6 changes: 6 additions & 0 deletions .changeset/swift-dancers-rest.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'rrweb-snapshot': minor
'rrweb': minor
---

Extends maskTextFn to pass the HTMLElement to the deciding function
2 changes: 1 addition & 1 deletion packages/rrweb-snapshot/src/snapshot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -575,7 +575,7 @@ function serializeTextNode(
needMaskingText(n, maskTextClass, maskTextSelector)
) {
textContent = maskTextFn
? maskTextFn(textContent)
? maskTextFn(textContent, n.parentElement)
: textContent.replace(/[\S]/g, '*');
}

Expand Down
2 changes: 1 addition & 1 deletion packages/rrweb-snapshot/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ export type DataURLOptions = Partial<{
quality: number;
}>;

export type MaskTextFn = (text: string) => string;
export type MaskTextFn = (text: string, element: HTMLElement | null) => string;
export type MaskInputFn = (text: string, element: HTMLElement) => string;

export type KeepIframeSrcFn = (src: string) => boolean;
Expand Down
4 changes: 3 additions & 1 deletion packages/rrweb/src/record/mutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import {
isSerializedStylesheet,
inDom,
getShadowHost,
closestElementOfNode,
} from '../utils';

type DoubleLinkedListNode = {
Expand Down Expand Up @@ -508,6 +509,7 @@ export default class MutationBuffer {
switch (m.type) {
case 'characterData': {
const value = m.target.textContent;

if (
!isBlocked(m.target, this.blockClass, this.blockSelector, false) &&
value !== m.oldValue
Expand All @@ -520,7 +522,7 @@ export default class MutationBuffer {
this.maskTextSelector,
) && value
? this.maskTextFn
? this.maskTextFn(value)
? this.maskTextFn(value, closestElementOfNode(m.target))
: value.replace(/[\S]/g, '*')
: value,
node: m.target,
Expand Down
27 changes: 22 additions & 5 deletions packages/rrweb/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,23 @@ export function getWindowWidth(): number {
);
}

/**
* Returns the given node as an HTMLElement if it is one, otherwise the parent node as an HTMLElement
* @param node - node to check
* @returns HTMLElement or null
*/

export function closestElementOfNode(node: Node | null): HTMLElement | null {
if (!node) {
return null;
}
const el: HTMLElement | null =
node.nodeType === node.ELEMENT_NODE
? (node as HTMLElement)
: node.parentElement;
return el;
}

/**
* Checks if the given element set to be blocked by rrweb
* @param node - node to check
Expand All @@ -232,11 +249,11 @@ export function isBlocked(
if (!node) {
return false;
}
const el: HTMLElement | null =
node.nodeType === node.ELEMENT_NODE
? (node as HTMLElement)
: node.parentElement;
if (!el) return false;
const el = closestElementOfNode(node);

if (!el) {
return false;
}

try {
if (typeof blockClass === 'string') {
Expand Down
Loading

0 comments on commit 7c0dc9d

Please sign in to comment.