check added nodes from removed nodes and dropped nodes

This commit is contained in:
Yanzhen Yu
2026-04-01 12:00:00 +08:00
parent aa3e2f02ed
commit 7c35cb2f49
5 changed files with 937 additions and 12 deletions

View File

@@ -1,6 +1,6 @@
{
"name": "rrweb",
"version": "0.4.1",
"version": "0.4.2",
"description": "record and replay the web",
"main": "dist/index.js",
"module": "dist/module.js",
@@ -15,6 +15,11 @@
"keywords": [
"rrweb"
],
"files": [
"dist",
"index.d.ts",
"src/types.ts"
],
"author": "yanzhen@smartx.com",
"license": "MIT",
"bugs": {
@@ -26,10 +31,12 @@
"@types/mocha": "^5.2.5",
"@types/node": "^10.11.7",
"@types/puppeteer": "^1.9.0",
"@types/rewire": "^2.5.28",
"chai": "^4.2.0",
"jest-snapshot": "^23.6.0",
"mocha": "^5.2.0",
"puppeteer": "^1.9.0",
"rewire": "^4.0.1",
"rollup": "^0.66.6",
"rollup-plugin-node-resolve": "^3.4.0",
"rollup-plugin-typescript": "^1.0.0",

View File

@@ -47,7 +47,7 @@ function initMutationObserver(cb: mutationCallBack): MutationObserver {
const observer = new MutationObserver(mutations => {
const texts: textCursor[] = [];
const attributes: attributeCursor[] = [];
const removes: removedNodeMutation[] = [];
let removes: removedNodeMutation[] = [];
const adds: addedNodeMutation[] = [];
const dropped: Node[] = [];
@@ -123,8 +123,21 @@ function initMutationObserver(cb: mutationCallBack): MutationObserver {
}
});
removes = removes.map(remove => {
if (remove.parentNode) {
remove.parentId = mirror.getId(remove.parentNode as INode);
delete remove.parentNode;
}
return remove;
});
Array.from(addsSet).forEach(n => {
if (n.parentNode && dropped.indexOf(n.parentNode) < 0) {
const parentId = mirror.getId(n.parentNode as INode);
if (
parentId &&
!dropped.some(d => d === n.parentNode) &&
!removes.some(r => r.id === parentId)
) {
adds.push({
parentId: mirror.getId(n.parentNode as INode),
previousId: !n.previousSibling
@@ -149,13 +162,7 @@ function initMutationObserver(cb: mutationCallBack): MutationObserver {
id: mirror.getId(attribute.node as INode),
attributes: attribute.attributes,
})),
removes: removes.map(remove => {
if (remove.parentNode) {
remove.parentId = mirror.getId(remove.parentNode as INode);
delete remove.parentNode;
}
return remove;
}),
removes,
adds,
});
});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,5 @@
<body>
<ul>
<li></li>
</ul>
</body>

View File

@@ -77,7 +77,32 @@ describe('record integration tests', () => {
await page.select('select', '1');
const snapshots = await page.evaluate('window.snapshots');
const result = matchSnapshot(JSON.stringify(snapshots), __filename, 'form');
const result = matchSnapshot(
JSON.stringify(snapshots, null, 2),
__filename,
'form',
);
assert(result.pass, result.pass ? '' : result.report());
}).timeout(5000);
it('can record childList mutations', async () => {
const page: puppeteer.Page = await this.browser.newPage();
await page.goto('about:blank');
await page.setContent(getHtml.call(this, 'child-list.html'));
await page.evaluate(() => {
const li = document.createElement('li');
const ul = document.querySelector('ul') as HTMLUListElement;
ul.appendChild(li);
document.body.removeChild(ul);
});
const snapshots = await page.evaluate('window.snapshots');
const result = matchSnapshot(
JSON.stringify(snapshots, null, 2),
__filename,
'child-list',
);
assert(result.pass, result.pass ? '' : result.report());
}).timeout(5000);
});