63 lines
No EOL
1.6 KiB
JavaScript
63 lines
No EOL
1.6 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
/**
|
|
* These variables store information about text content of a target node,
|
|
* allowing comparison of content before and after a given event.
|
|
*
|
|
* Identify the node where selection currently begins, then observe
|
|
* both its text content and its current position in the DOM. Since the
|
|
* browser may natively replace the target node during composition, we can
|
|
* use its position to find its replacement.
|
|
*
|
|
*
|
|
*/
|
|
|
|
let root = null;
|
|
let startText = null;
|
|
let fallbackText = null;
|
|
export function initialize(nativeEventTarget) {
|
|
root = nativeEventTarget;
|
|
startText = getText();
|
|
return true;
|
|
}
|
|
export function reset() {
|
|
root = null;
|
|
startText = null;
|
|
fallbackText = null;
|
|
}
|
|
export function getData() {
|
|
if (fallbackText) {
|
|
return fallbackText;
|
|
}
|
|
let start;
|
|
const startValue = startText;
|
|
const startLength = startValue.length;
|
|
let end;
|
|
const endValue = getText();
|
|
const endLength = endValue.length;
|
|
for (start = 0; start < startLength; start++) {
|
|
if (startValue[start] !== endValue[start]) {
|
|
break;
|
|
}
|
|
}
|
|
const minEnd = startLength - start;
|
|
for (end = 1; end <= minEnd; end++) {
|
|
if (startValue[startLength - end] !== endValue[endLength - end]) {
|
|
break;
|
|
}
|
|
}
|
|
const sliceTail = end > 1 ? 1 - end : undefined;
|
|
fallbackText = start |> endValue.slice(%, sliceTail);
|
|
return fallbackText;
|
|
}
|
|
export function getText() {
|
|
if ('value' in root) {
|
|
return root.value;
|
|
}
|
|
return root.textContent;
|
|
} |