DragEvent handling, null check fixes (#630)

This commit is contained in:
dbseel
2026-04-01 12:00:00 +08:00
committed by GitHub
parent eb25068b54
commit 989e327730
2 changed files with 54 additions and 23 deletions

View File

@@ -271,7 +271,10 @@ export default class MutationBuffer {
const shadowHost: Element | null = n.getRootNode const shadowHost: Element | null = n.getRootNode
? (n.getRootNode() as ShadowRoot)?.host ? (n.getRootNode() as ShadowRoot)?.host
: null; : null;
const notInDoc = !this.doc.contains(n) && !this.doc.contains(shadowHost); // ensure shadowHost is a Node, or doc.contains will throw an error
const notInDoc =
!this.doc.contains(n) &&
(!(shadowHost instanceof Node) || !this.doc.contains(shadowHost));
if (!n.parentNode || notInDoc) { if (!n.parentNode || notInDoc) {
return; return;
} }
@@ -359,6 +362,8 @@ export default class MutationBuffer {
if (!node) { if (!node) {
for (let index = addList.length - 1; index >= 0; index--) { for (let index = addList.length - 1; index >= 0; index--) {
const _node = addList.get(index)!; const _node = addList.get(index)!;
// ensure _node is defined before attempting to find value
if (_node) {
const parentId = this.mirror.getId( const parentId = this.mirror.getId(
(_node.value.parentNode as Node) as INode, (_node.value.parentNode as Node) as INode,
); );
@@ -369,6 +374,7 @@ export default class MutationBuffer {
} }
} }
} }
}
if (!node) { if (!node) {
/** /**
* If all nodes in queue could not find a serialized parent, * If all nodes in queue could not find a serialized parent,

View File

@@ -194,8 +194,9 @@ function initMoveObserver(
}, },
callbackThreshold, callbackThreshold,
); );
const updatePosition = throttle<MouseEvent | TouchEvent | DragEvent>(
(evt) => { // update position for mouse, touch, and drag events (drag event extends mouse event)
function handleUpdatePositionEvent(evt: MouseEvent | TouchEvent) {
const target = getEventTarget(evt); const target = getEventTarget(evt);
const { clientX, clientY } = isTouchEvent(evt) const { clientX, clientY } = isTouchEvent(evt)
? evt.changedTouches[0] ? evt.changedTouches[0]
@@ -209,6 +210,27 @@ function initMoveObserver(
id: mirror.getId(target as INode), id: mirror.getId(target as INode),
timeOffset: Date.now() - timeBaseline, timeOffset: Date.now() - timeBaseline,
}); });
}
// separate call for non-drag events, in case DragEvent is not defined
const updatePosition = throttle<MouseEvent | TouchEvent>(
(evt) => {
handleUpdatePositionEvent(evt);
wrappedCb(
evt instanceof MouseEvent
? IncrementalSource.MouseMove
: IncrementalSource.TouchMove,
);
},
threshold,
{
trailing: false,
},
);
// call for drag events, when DragEvent is defined
const updateDragPosition = throttle<MouseEvent | TouchEvent | DragEvent>(
(evt) => {
handleUpdatePositionEvent(evt);
wrappedCb( wrappedCb(
evt instanceof DragEvent evt instanceof DragEvent
? IncrementalSource.Drag ? IncrementalSource.Drag
@@ -222,10 +244,13 @@ function initMoveObserver(
trailing: false, trailing: false,
}, },
); );
// it is possible DragEvent is undefined even on devices
// that support event 'drag'
const dragEventDefined = typeof DragEvent !== 'undefined';
const handlers = [ const handlers = [
on('mousemove', updatePosition, doc), on('mousemove', updatePosition, doc),
on('touchmove', updatePosition, doc), on('touchmove', updatePosition, doc),
on('drag', updatePosition, doc), on('drag', dragEventDefined ? updateDragPosition : updatePosition, doc),
]; ];
return () => { return () => {
handlers.forEach((h) => h()); handlers.forEach((h) => h());