fix(editor): behavior of deleting at the start of line (#12787)

Close BS-3182, #12736 




#### PR Dependency Tree


* **PR #12787** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Bug Fixes**
- Improved the behavior when deleting empty lines and merging blocks,
ensuring more accurate handling of block deletion and cursor focus in
various scenarios.
- **Tests**
- Added new end-to-end tests to verify correct deletion of lines in
edgeless text and paragraph blocks, including checks for block removal
and cursor position.
- Introduced a utility function to retrieve block IDs for testing
purposes.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
L-Sun
2025-06-12 14:58:03 +08:00
committed by GitHub
parent d12954f8c3
commit 8d2214424c
4 changed files with 138 additions and 16 deletions
@@ -11,6 +11,8 @@ import {
edgelessCommonSetup,
enterPlaygroundRoom,
getEdgelessSelectedRect,
getIds,
getInlineSelectionIndex,
getPageSnapshot,
initEmptyEdgelessState,
pasteByKeyboard,
@@ -21,6 +23,8 @@ import {
pressBackspace,
pressEnter,
pressEscape,
pressShiftTab,
pressTab,
redoByKeyboard,
selectAllByKeyboard,
setEdgelessTool,
@@ -552,6 +556,52 @@ test.describe('edgeless text block', () => {
1
);
});
test('edgeless text should be able to delete line', async ({ page }) => {
await dblclickView(page, [100, -100]);
// 5: aaa
// 6: bbb
// 7: ccc|
{
await type(page, 'aaa');
await pressEnter(page);
await pressTab(page);
await type(page, 'bbb');
await pressEnter(page);
await pressShiftTab(page);
await type(page, 'ccc');
}
// 5: aaa
// 6: bbb|
await pressBackspace(page, 4);
expect(await getIds(page)).not.toContain(7);
await assertBlockTextContent(page, 5, 'aaa');
await assertBlockTextContent(page, 6, 'bbb');
expect(await getInlineSelectionIndex(page)).toBe(3);
// 5: |aaa
// 6: bbb
{
await pressArrowUp(page);
await pressArrowLeft(page, 3);
await pressBackspace(page);
}
await assertBlockTextContent(page, 5, 'aaa');
await assertBlockTextContent(page, 6, 'bbb');
expect(await getInlineSelectionIndex(page)).toBe(0);
// 6: |bbb
{
await pressArrowRight(page, 3);
await pressBackspace(page, 4);
}
expect(await getIds(page)).not.toContain(7);
await assertBlockTextContent(page, 6, 'bbb');
expect(await getInlineSelectionIndex(page)).toBe(0);
});
});
test('press backspace at the start of first line when edgeless text exist', async ({