Jelajahi Sumber

Better checking if clicked inside nested edtiable in widget.

Szymon Kupś 9 tahun lalu
induk
melakukan
55bf5584d0
1 mengubah file dengan 23 tambahan dan 7 penghapusan
  1. 23 7
      packages/ckeditor5-image/src/widget/widget.js

+ 23 - 7
packages/ckeditor5-image/src/widget/widget.js

@@ -14,6 +14,7 @@ import ModelRange from '@ckeditor/ckeditor5-engine/src/model/range';
 import ModelSelection from '@ckeditor/ckeditor5-engine/src/model/selection';
 import ModelElement from '@ckeditor/ckeditor5-engine/src/model/element';
 import ViewEditableElement from '@ckeditor/ckeditor5-engine/src/view/editableelement';
+import RootEditableElement from '@ckeditor/ckeditor5-engine/src/view/rooteditableelement';
 import { isWidget } from './utils';
 import { keyCodes } from '@ckeditor/ckeditor5-utils/src/keyboard';
 
@@ -55,19 +56,18 @@ export default class Widget extends Plugin {
 	_onMousedown( eventInfo, domEventData ) {
 		const editor = this.editor;
 		const viewDocument = editor.editing.view;
+		let element = domEventData.target;
 
 		// Do nothing if inside nested editable.
-		if ( domEventData.target instanceof ViewEditableElement ) {
+		if ( isInsideNestedEditable( element ) ) {
 			return;
 		}
 
 		// If target is not a widget element - check if one of the ancestors is.
-		let widgetElement = domEventData.target;
+		if ( !isWidget( element ) ) {
+			element = element.findAncestor( isWidget );
 
-		if ( !isWidget( widgetElement ) ) {
-			widgetElement = widgetElement.findAncestor( isWidget );
-
-			if ( !widgetElement ) {
+			if ( !element ) {
 				return;
 			}
 		}
@@ -80,7 +80,7 @@ export default class Widget extends Plugin {
 		}
 
 		// Create model selection over widget.
-		const modelElement = editor.editing.mapper.toModelElement( widgetElement );
+		const modelElement = editor.editing.mapper.toModelElement( element );
 
 		editor.document.enqueueChanges( ( ) => {
 			this._setSelectionOverElement( modelElement );
@@ -242,3 +242,19 @@ function isArrowKeyCode( keyCode ) {
 function isDeleteKeyCode( keyCode ) {
 	return keyCode == keyCodes.delete || keyCode == keyCodes.backspace;
 }
+
+// Returns `true` when element is a nested editable or is placed inside one.
+//
+// @param {module:engine/view/element~Element}
+// @returns {Boolean}
+function isInsideNestedEditable( element ) {
+	while ( element ) {
+		if ( element instanceof ViewEditableElement && !( element instanceof RootEditableElement ) ) {
+			return true;
+		}
+
+		element = element.parent;
+	}
+
+	return false;
+}