Files
rrweb/src/record/collection.ts
Yanzhen Yu 406e7a8d39 update mutation observer handler
1. deep delete from adds set when node was dropped
2. remove node from dropped set when node was added again
2019-02-03 23:07:35 +08:00

42 lines
1.0 KiB
TypeScript

/**
* Some utils to handle the mutation observer DOM records.
* It should be more clear to extend the native data structure
* like Set and Map, but currently Typescript does not support
* that.
*/
import { INode } from 'rrweb-snapshot';
import { removedNodeMutation } from '../types';
import { mirror } from '../utils';
export function deepDelete(addsSet: Set<Node>, n: Node) {
addsSet.delete(n);
n.childNodes.forEach(childN => deepDelete(addsSet, childN));
}
export function isParentRemoved(
removes: removedNodeMutation[],
n: Node,
): boolean {
const { parentNode } = n;
if (!parentNode) {
return false;
}
const parentId = mirror.getId((parentNode as Node) as INode);
if (removes.some(r => r.id === parentId)) {
return true;
}
return isParentRemoved(removes, parentNode);
}
export function isParentDropped(droppedSet: Set<Node>, n: Node): boolean {
const { parentNode } = n;
if (!parentNode) {
return false;
}
if (droppedSet.has(parentNode)) {
return true;
}
return isParentDropped(droppedSet, parentNode);
}