Discovered that the common case of mouse movement or scrolling happening during takeFullSnapshot was causing mutations to be immediately emitted, contrary to the goal of https://github.com/rrweb-io/rrweb/pull/385 (#470)

This commit is contained in:
Eoghan Murray
2026-04-01 12:00:00 +08:00
committed by GitHub
parent faa2ec79fa
commit 9f3f4d15f2
3 changed files with 20 additions and 9 deletions

View File

@@ -147,7 +147,6 @@ function record<T = eventWithTime>(
) {
// we've got a user initiated event so first we need to apply
// all DOM changes that have been buffering during paused state
mutationBuffer.emit();
mutationBuffer.unfreeze();
}
@@ -182,7 +181,7 @@ function record<T = eventWithTime>(
);
let wasFrozen = mutationBuffer.isFrozen();
mutationBuffer.freeze(); // don't allow any mirror modifications during snapshotting
mutationBuffer.lock(); // don't allow any mirror modifications during snapshotting
const [node, idNodeMap] = snapshot(document, {
blockClass,
blockSelector,
@@ -221,10 +220,7 @@ function record<T = eventWithTime>(
},
}),
);
if (!wasFrozen) {
mutationBuffer.emit(); // emit anything queued up now
mutationBuffer.unfreeze();
}
mutationBuffer.unlock(); // generate & emit any mutations that happened during snapshotting, as can now apply against the newly built mirror
}
try {

View File

@@ -173,20 +173,33 @@ export default class MutationBuffer {
public unfreeze() {
this.frozen = false;
this.emit();
}
public isFrozen() {
return this.frozen;
}
public lock() {
this.locked = true;
}
public unlock() {
this.locked = false;
this.emit();
}
public processMutations = (mutations: mutationRecord[]) => {
mutations.forEach(this.processMutation);
if (!this.frozen) {
this.emit();
}
this.emit();
};
public emit = () => {
if (this.frozen || this.locked) {
return;
}
// delay any modification of the mirror until this function
// so that the mirror for takeFullSnapshot doesn't get mutated while it's event is being processed

View File

@@ -21,6 +21,8 @@ export default class MutationBuffer {
freeze(): void;
unfreeze(): void;
isFrozen(): boolean;
lock(): void;
unlock(): void;
processMutations: (mutations: mutationRecord[]) => void;
emit: () => void;
private processMutation;