85 lines
2.6 KiB
JavaScript
85 lines
2.6 KiB
JavaScript
/* globals getSelection */
|
|
|
|
import { getRelativePosition, fromRelativePosition } from '../../Util/relativePosition.js'
|
|
|
|
let browserSelection = null
|
|
let relativeSelection = null
|
|
|
|
/**
|
|
* @private
|
|
*/
|
|
export let beforeTransactionSelectionFixer
|
|
if (typeof getSelection !== 'undefined') {
|
|
beforeTransactionSelectionFixer = function _beforeTransactionSelectionFixer (y, domBinding, transaction, remote) {
|
|
if (!remote) {
|
|
return
|
|
}
|
|
relativeSelection = { from: null, to: null, fromY: null, toY: null }
|
|
browserSelection = getSelection()
|
|
const anchorNode = browserSelection.anchorNode
|
|
const anchorNodeType = domBinding.domToType.get(anchorNode)
|
|
if (anchorNode !== null && anchorNodeType !== undefined) {
|
|
relativeSelection.from = getRelativePosition(anchorNodeType, browserSelection.anchorOffset)
|
|
relativeSelection.fromY = anchorNodeType._y
|
|
}
|
|
const focusNode = browserSelection.focusNode
|
|
const focusNodeType = domBinding.domToType.get(focusNode)
|
|
if (focusNode !== null && focusNodeType !== undefined) {
|
|
relativeSelection.to = getRelativePosition(focusNodeType, browserSelection.focusOffset)
|
|
relativeSelection.toY = focusNodeType._y
|
|
}
|
|
}
|
|
} else {
|
|
beforeTransactionSelectionFixer = function _fakeBeforeTransactionSelectionFixer () {}
|
|
}
|
|
|
|
/**
|
|
* @private
|
|
*/
|
|
export function afterTransactionSelectionFixer (y, domBinding, transaction, remote) {
|
|
if (relativeSelection === null || !remote) {
|
|
return
|
|
}
|
|
const to = relativeSelection.to
|
|
const from = relativeSelection.from
|
|
const fromY = relativeSelection.fromY
|
|
const toY = relativeSelection.toY
|
|
let shouldUpdate = false
|
|
let anchorNode = browserSelection.anchorNode
|
|
let anchorOffset = browserSelection.anchorOffset
|
|
let focusNode = browserSelection.focusNode
|
|
let focusOffset = browserSelection.focusOffset
|
|
if (from !== null) {
|
|
let sel = fromRelativePosition(fromY, from)
|
|
if (sel !== null) {
|
|
let node = domBinding.typeToDom.get(sel.type)
|
|
let offset = sel.offset
|
|
if (node !== anchorNode || offset !== anchorOffset) {
|
|
anchorNode = node
|
|
anchorOffset = offset
|
|
shouldUpdate = true
|
|
}
|
|
}
|
|
}
|
|
if (to !== null) {
|
|
let sel = fromRelativePosition(toY, to)
|
|
if (sel !== null) {
|
|
let node = domBinding.typeToDom.get(sel.type)
|
|
let offset = sel.offset
|
|
if (node !== focusNode || offset !== focusOffset) {
|
|
focusNode = node
|
|
focusOffset = offset
|
|
shouldUpdate = true
|
|
}
|
|
}
|
|
}
|
|
if (shouldUpdate) {
|
|
browserSelection.setBaseAndExtent(
|
|
anchorNode,
|
|
anchorOffset,
|
|
focusNode,
|
|
focusOffset
|
|
)
|
|
}
|
|
}
|