Skip to content

Commit 657dc44

Browse files
[lexical-yjs] Bug Fix: prevent collab element nodes from removing other nodes from node map (#7295)
1 parent 6416a25 commit 657dc44

File tree

5 files changed

+83
-4
lines changed

5 files changed

+83
-4
lines changed

packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs

+71
Original file line numberDiff line numberDiff line change
@@ -670,4 +670,75 @@ test.describe('Collaboration', () => {
670670
`,
671671
);
672672
});
673+
674+
test('$handleNormalizationMergeConflicts handles nodes that have been reparented', async ({
675+
page,
676+
isCollab,
677+
}) => {
678+
test.skip(!isCollab);
679+
680+
// Add paragraph, type ABC into second paragraph, bold the B, backspace text into the first paragraph to reparent the text nodes
681+
await focusEditor(page);
682+
await page.keyboard.press('Enter');
683+
await page.keyboard.type('ABC');
684+
await page.keyboard.press('ArrowLeft');
685+
await selectCharacters(page, 'left', 'B'.length);
686+
await toggleBold(page);
687+
await page.keyboard.press('ArrowLeft');
688+
await page.keyboard.press('ArrowLeft');
689+
await page.keyboard.press('Backspace');
690+
691+
await assertHTML(
692+
page,
693+
html`
694+
<p
695+
class="PlaygroundEditorTheme__paragraph PlaygroundEditorTheme__ltr"
696+
dir="ltr">
697+
<span data-lexical-text="true">A</span>
698+
<strong
699+
class="PlaygroundEditorTheme__textBold"
700+
data-lexical-text="true">
701+
B
702+
</strong>
703+
<span data-lexical-text="true">C</span>
704+
</p>
705+
`,
706+
);
707+
708+
// Right collaborator deletes A, left deletes B.
709+
await sleep(1050);
710+
await page.keyboard.press('Delete');
711+
await sleep(50);
712+
await page
713+
.frameLocator('iframe[name="right"]')
714+
.locator('[data-lexical-editor="true"]')
715+
.focus();
716+
await page.keyboard.press('Delete');
717+
718+
await assertHTML(
719+
page,
720+
html`
721+
<p
722+
class="PlaygroundEditorTheme__paragraph PlaygroundEditorTheme__ltr"
723+
dir="ltr">
724+
<span data-lexical-text="true">C</span>
725+
</p>
726+
`,
727+
);
728+
729+
// Left collaborator undoes their deletion of A.
730+
await page.frameLocator('iframe[name="left"]').getByLabel('Undo').click();
731+
732+
// Check that normalization worked properly.
733+
await assertHTML(
734+
page,
735+
html`
736+
<p
737+
class="PlaygroundEditorTheme__paragraph PlaygroundEditorTheme__ltr"
738+
dir="ltr">
739+
<span data-lexical-text="true">AC</span>
740+
</p>
741+
`,
742+
);
743+
});
673744
});

packages/lexical-yjs/src/CollabDecoratorNode.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,9 @@ export class CollabDecoratorNode {
9595

9696
destroy(binding: Binding): void {
9797
const collabNodeMap = binding.collabNodeMap;
98-
collabNodeMap.delete(this._key);
98+
if (collabNodeMap.get(this._key) === this) {
99+
collabNodeMap.delete(this._key);
100+
}
99101
}
100102
}
101103

packages/lexical-yjs/src/CollabElementNode.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -679,7 +679,9 @@ export class CollabElementNode {
679679
children[i].destroy(binding);
680680
}
681681

682-
collabNodeMap.delete(this._key);
682+
if (collabNodeMap.get(this._key) === this) {
683+
collabNodeMap.delete(this._key);
684+
}
683685
}
684686
}
685687

packages/lexical-yjs/src/CollabLineBreakNode.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,9 @@ export class CollabLineBreakNode {
5454

5555
destroy(binding: Binding): void {
5656
const collabNodeMap = binding.collabNodeMap;
57-
collabNodeMap.delete(this._key);
57+
if (collabNodeMap.get(this._key) === this) {
58+
collabNodeMap.delete(this._key);
59+
}
5860
}
5961
}
6062

packages/lexical-yjs/src/CollabTextNode.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,9 @@ export class CollabTextNode {
162162

163163
destroy(binding: Binding): void {
164164
const collabNodeMap = binding.collabNodeMap;
165-
collabNodeMap.delete(this._key);
165+
if (collabNodeMap.get(this._key) === this) {
166+
collabNodeMap.delete(this._key);
167+
}
166168
}
167169
}
168170

0 commit comments

Comments
 (0)