Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extended text masking function to include relevant HTMLElement #1310

Merged
merged 13 commits into from
Oct 13, 2023
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,
getElementFromNode,
benjackwhite marked this conversation as resolved.
Show resolved Hide resolved
} 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, getElementFromNode(m.target))
benjackwhite marked this conversation as resolved.
Show resolved Hide resolved
: 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 getElementFromNode(node: Node | null): HTMLElement | null {
benjackwhite marked this conversation as resolved.
Show resolved Hide resolved
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 = getElementFromNode(node);
benjackwhite marked this conversation as resolved.
Show resolved Hide resolved

if (!el) {
return false;
}

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