From b49cd845cb1500d6af9f4753272d1a5c7df4f0c0 Mon Sep 17 00:00:00 2001 From: Alexander Zinchuk Date: Wed, 2 Nov 2022 14:28:27 +0100 Subject: [PATCH] Composer: Fix for older Firefox (#2104) --- src/util/selection.ts | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/src/util/selection.ts b/src/util/selection.ts index aaa7018ad..8635dd830 100644 --- a/src/util/selection.ts +++ b/src/util/selection.ts @@ -22,14 +22,40 @@ export function insertHtmlInSelection(html: string) { } export function getHtmlBeforeSelection(container?: HTMLElement, useCommonAncestor?: boolean) { - if (!container) return ''; + if (!container) { + return ''; + } + const sel = window.getSelection(); - if (!sel || !sel.rangeCount) return container.innerHTML; + if (!sel || !sel.rangeCount) { + return container.innerHTML; + } + const range = sel.getRangeAt(0).cloneRange(); - if (!range.intersectsNode(container)) return container.innerHTML; - if (!useCommonAncestor && !container.contains(range.commonAncestorContainer)) return ''; + if (!range.intersectsNode(container)) { + return container.innerHTML; + } + + if (!useCommonAncestor && !container.contains(range.commonAncestorContainer)) { + return ''; + } + range.collapse(true); range.setStart(container, 0); - fragmentEl.replaceChildren(range.cloneContents()); + replaceChildren(fragmentEl, range.cloneContents()); + return fragmentEl.innerHTML; } + +function replaceChildren(el: HTMLElement, nodes?: DocumentFragment) { + if (el.replaceChildren === undefined) { + while (el.lastChild) { + el.removeChild(el.lastChild); + } + if (nodes !== undefined) { + el.append(nodes); + } + } else { + el.replaceChildren(nodes || ''); + } +}