* Find a Editor range from a DOM range or selection.
(
editor: Editor,
domRange: DOMRange | DOMStaticRange | DOMSelection,
options: {
exactMatch: T
suppressThrow: T
},
)
| 1006 | * Find a Editor range from a DOM range or selection. |
| 1007 | */ |
| 1008 | toEditorRange<T extends boolean>( |
| 1009 | editor: Editor, |
| 1010 | domRange: DOMRange | DOMStaticRange | DOMSelection, |
| 1011 | options: { |
| 1012 | exactMatch: T |
| 1013 | suppressThrow: T |
| 1014 | }, |
| 1015 | ): T extends true ? Range | null : Range { |
| 1016 | const { exactMatch, suppressThrow } = options |
| 1017 | const el = isDOMSelection(domRange) ? domRange.anchorNode : domRange.startContainer |
| 1018 | let anchorNode |
| 1019 | let anchorOffset |
| 1020 | let focusNode |
| 1021 | let focusOffset |
| 1022 | let isCollapsed |
| 1023 | |
| 1024 | if (el) { |
| 1025 | if (isDOMSelection(domRange)) { |
| 1026 | anchorNode = domRange.anchorNode |
| 1027 | anchorOffset = domRange.anchorOffset |
| 1028 | focusNode = domRange.focusNode |
| 1029 | focusOffset = domRange.focusOffset |
| 1030 | // COMPAT: There's a bug in chrome that always returns `true` for |
| 1031 | // `isCollapsed` for a Selection that comes from a ShadowRoot. |
| 1032 | // (2020/08/08) |
| 1033 | // https://bugs.chromium.org/p/chromium/issues/detail?id=447523 |
| 1034 | if (IS_CHROME && hasShadowRoot()) { |
| 1035 | isCollapsed = |
| 1036 | domRange.anchorNode === domRange.focusNode && |
| 1037 | domRange.anchorOffset === domRange.focusOffset |
| 1038 | } else { |
| 1039 | isCollapsed = domRange.isCollapsed |
| 1040 | } |
| 1041 | } else { |
| 1042 | anchorNode = domRange.startContainer |
| 1043 | anchorOffset = domRange.startOffset |
| 1044 | focusNode = domRange.endContainer |
| 1045 | focusOffset = domRange.endOffset |
| 1046 | isCollapsed = domRange.collapsed |
| 1047 | } |
| 1048 | } |
| 1049 | |
| 1050 | if (anchorNode == null || focusNode == null || anchorOffset == null || focusOffset == null) { |
| 1051 | throw new Error(`Cannot resolve a Editor range from DOM range: ${domRange}`) |
| 1052 | } |
| 1053 | |
| 1054 | const anchor = Editable.toEditorPoint(editor, [anchorNode, anchorOffset], { |
| 1055 | exactMatch, |
| 1056 | suppressThrow, |
| 1057 | }) |
| 1058 | if (!anchor) { |
| 1059 | return null as T extends true ? Range | null : Range |
| 1060 | } |
| 1061 | |
| 1062 | const focus = isCollapsed |
| 1063 | ? anchor |
| 1064 | : Editable.toEditorPoint(editor, [focusNode, focusOffset], { |
| 1065 | exactMatch, |
nothing calls this directly
no test coverage detected
searching dependent graphs…