Skip to content

Commit

Permalink
improve: some websites rebuild imcomplete (#1163)
Browse files Browse the repository at this point in the history
* improve: mutation.ts, loop use Set replace Array

* improve: add a try-catch to utils.ts to make it robust

* Create yellow-mails-cheat.md

---------

Co-authored-by: Yun Feng <[email protected]>
  • Loading branch information
zhaobosky and YunFeng0817 authored Mar 13, 2023
1 parent e7f0c80 commit 4cb4d0e
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 7 deletions.
8 changes: 8 additions & 0 deletions .changeset/yellow-mails-cheat.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'rrweb': patch
---

Fix: some websites rebuild imcomplete

1. Some websites, addedSet in emit function is not empty, but the result converted from Array.from is empty.
2. Some websites polyfill classList functions of HTML elements. Their implementation may throw errors and cause the snapshot to fail. I add try-catch statements to make the code robust.
4 changes: 2 additions & 2 deletions packages/rrweb/src/record/mutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -333,7 +333,7 @@ export default class MutationBuffer {
this.mirror.removeNodeFromMap(this.mapRemoves.shift()!);
}

for (const n of Array.from(this.movedSet.values())) {
for (const n of this.movedSet) {
if (
isParentRemoved(this.removes, n, this.mirror) &&
!this.movedSet.has(n.parentNode!)
Expand All @@ -343,7 +343,7 @@ export default class MutationBuffer {
pushAdd(n);
}

for (const n of Array.from(this.addedSet.values())) {
for (const n of this.addedSet) {
if (
!isAncestorInSet(this.droppedSet, n) &&
!isParentRemoved(this.removes, n, this.mirror)
Expand Down
14 changes: 9 additions & 5 deletions packages/rrweb/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -229,11 +229,15 @@ export function isBlocked(
: node.parentElement;
if (!el) return false;

if (typeof blockClass === 'string') {
if (el.classList.contains(blockClass)) return true;
if (checkAncestors && el.closest('.' + blockClass) !== null) return true;
} else {
if (classMatchesRegex(el, blockClass, checkAncestors)) return true;
try {
if (typeof blockClass === 'string') {
if (el.classList.contains(blockClass)) return true;
if (checkAncestors && el.closest('.' + blockClass) !== null) return true;
} else {
if (classMatchesRegex(el, blockClass, checkAncestors)) return true;
}
} catch (e) {
// e
}
if (blockSelector) {
if (el.matches(blockSelector)) return true;
Expand Down

0 comments on commit 4cb4d0e

Please sign in to comment.