From 12acf7e4a02053e91133c8b569ca312d8fb87478 Mon Sep 17 00:00:00 2001 From: doodlewind <7312949+doodlewind@users.noreply.github.com> Date: Fri, 28 Feb 2025 11:50:56 +0000 Subject: [PATCH] fix(editor): range IndexSizeError on firefox (#10519) This is a Firefox compat issue, I've manually confirmed this implementation works in latest Firefox build. --- .../affine/shared/src/utils/dom/point-to-range.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/blocksuite/affine/shared/src/utils/dom/point-to-range.ts b/blocksuite/affine/shared/src/utils/dom/point-to-range.ts index 9d842f8159..d7e879c844 100644 --- a/blocksuite/affine/shared/src/utils/dom/point-to-range.ts +++ b/blocksuite/affine/shared/src/utils/dom/point-to-range.ts @@ -28,7 +28,16 @@ export function caretRangeFromPoint( } // TODO handle caret is covered by popup const range = document.createRange(); - range.setStart(caret.offsetNode, caret.offset); + let offset = caret.offset; + if (caret.offsetNode.nodeType === Node.TEXT_NODE) { + const textNode = caret.offsetNode as Text; + offset = Math.max(0, Math.min(offset, textNode.length)); + } else if (caret.offsetNode.nodeType === Node.ELEMENT_NODE) { + const elementNode = caret.offsetNode as Element; + offset = Math.max(0, Math.min(offset, elementNode.childNodes.length)); + } + + range.setStart(caret.offsetNode, offset); return range; }