diff --git a/packages/rrweb/src/record/index.ts b/packages/rrweb/src/record/index.ts index 5930913a8a..b08c9ff448 100644 --- a/packages/rrweb/src/record/index.ts +++ b/packages/rrweb/src/record/index.ts @@ -110,6 +110,7 @@ function record( // as they destroy some (hidden) info: headMetaAuthorship: _slimDOMOptions === 'all', headMetaDescKeywords: _slimDOMOptions === 'all', + headTitleMutations: _slimDOMOptions === 'all', // block title tag 'animation' which can generate a lot of mutations that aren't usually displayed in replayers } : _slimDOMOptions ? _slimDOMOptions diff --git a/packages/rrweb/src/record/mutation.ts b/packages/rrweb/src/record/mutation.ts index be6fe19b9d..444af01d3d 100644 --- a/packages/rrweb/src/record/mutation.ts +++ b/packages/rrweb/src/record/mutation.ts @@ -429,7 +429,7 @@ export default class MutationBuffer { }; private processMutation = (m: mutationRecord) => { - if (isIgnored(m.target)) { + if (isIgnored(m.target, this.slimDOMOptions)) { return; } switch (m.type) { @@ -529,7 +529,7 @@ export default class MutationBuffer { const parentId = isShadowRoot(m.target) ? this.mirror.getId((m.target.host as unknown) as INode) : this.mirror.getId(m.target as INode); - if (isBlocked(m.target, this.blockClass) || isIgnored(n)) { + if (isBlocked(m.target, this.blockClass) || isIgnored(n, this.slimDOMOptions)) { return; } // removed node has not been serialized yet, just remove it from the Set @@ -578,7 +578,7 @@ export default class MutationBuffer { return; } if (isINode(n)) { - if (isIgnored(n)) { + if (isIgnored(n, this.slimDOMOptions)) { return; } this.movedSet.add(n); diff --git a/packages/rrweb/src/utils.ts b/packages/rrweb/src/utils.ts index 8ae1635fe6..ad7e6b8eef 100644 --- a/packages/rrweb/src/utils.ts +++ b/packages/rrweb/src/utils.ts @@ -247,7 +247,13 @@ export function isBlocked(node: Node | null, blockClass: blockClass): boolean { return isBlocked(node.parentNode, blockClass); } -export function isIgnored(n: Node | INode): boolean { +export function isIgnored(n: Node | INode, slimDOMOptions: SlimDOMOptions): boolean { + if ((n as Node).tagName === 'TITLE' && slimDOMOptions.headTitleMutations) { + // we do this check here but not in rrweb-snapshot + // to block mutations/animations on the title. + // the headTitleMutations options isn't intended to block recording of the initial value + return true; + } if ('__sn' in n) { return (n as INode).__sn.id === IGNORED_NODE; }