From 2e0562dde10e3cf9cb96ee673104ae4dc4c55128 Mon Sep 17 00:00:00 2001 From: Mateusz Baginski Date: Fri, 16 Aug 2024 12:55:18 +0200 Subject: [PATCH] Fix broken clipboard --- packages/ckeditor5-clipboard/tests/dragdrop.js | 3 ++- packages/ckeditor5-engine/src/view/view.ts | 5 ++--- packages/ckeditor5-widget/src/widget.ts | 14 ++++++++------ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/ckeditor5-clipboard/tests/dragdrop.js b/packages/ckeditor5-clipboard/tests/dragdrop.js index a4af8ad20f5..d0d41b45491 100644 --- a/packages/ckeditor5-clipboard/tests/dragdrop.js +++ b/packages/ckeditor5-clipboard/tests/dragdrop.js @@ -2436,7 +2436,8 @@ describe( 'Drag and Drop', () => { const eventData = prepareEventData( model.document.selection.getLastPosition(), domTarget ); viewDocument.fire( 'mousedown', { - ...eventData + ...eventData, + preventDefault } ); viewDocument.fire( 'dragstart', { diff --git a/packages/ckeditor5-engine/src/view/view.ts b/packages/ckeditor5-engine/src/view/view.ts index 82c0161f7eb..ca2751135dc 100644 --- a/packages/ckeditor5-engine/src/view/view.ts +++ b/packages/ckeditor5-engine/src/view/view.ts @@ -824,12 +824,11 @@ export function getPointViewRange( rangeOffset?: number; } ): Range | null { - const domDoc = ( domEvent.target as HTMLElement ).ownerDocument; - - if ( !domDoc ) { + if ( !domEvent.target ) { return null; } + const domDoc = ( domEvent.target as HTMLElement ).ownerDocument; const x = domEvent.clientX; const y = domEvent.clientY; let domRange; diff --git a/packages/ckeditor5-widget/src/widget.ts b/packages/ckeditor5-widget/src/widget.ts index 83f8746ac83..556a5dda3aa 100644 --- a/packages/ckeditor5-widget/src/widget.ts +++ b/packages/ckeditor5-widget/src/widget.ts @@ -307,14 +307,16 @@ export default class Widget extends Plugin { return range && range.start.parent; } )(); - // If the click target is a text node, we need to get the parent element. - const clickElementFromPoint = clickTargetFromPoint && clickTargetFromPoint.is( '$text' ) ? - clickTargetFromPoint.parent : clickTargetFromPoint; + // If the click target is a text node, we need to abort heuristics. This is because the text node + // can be draggable and focusing the parent node breaks the drag and drop. + if ( !clickTargetFromPoint || clickTargetFromPoint.is( '$text' ) ) { + return; + } // If the element is a widget, we need to select the widget itself otherwise we need to select the first ancestor widget. - if ( clickElementFromPoint && clickElementFromPoint.is( 'element' ) ) { - element = isWidget( clickElementFromPoint ) ? - clickElementFromPoint : clickElementFromPoint.findAncestor( isWidget ); + if ( clickTargetFromPoint && clickTargetFromPoint.is( 'element' ) ) { + element = isWidget( clickTargetFromPoint ) ? + clickTargetFromPoint : clickTargetFromPoint.findAncestor( isWidget ); } if ( !element ) {