From 6fe6119f89b66234c385d653f58a46e4bb7bdccd Mon Sep 17 00:00:00 2001 From: Kuba Niegowski Date: Wed, 12 Apr 2023 19:22:05 +0200 Subject: [PATCH] The target ranges should not be fixed while editor is in composition mode. --- .../src/controller/editingcontroller.ts | 11 ++++++++-- .../tests/controller/editingcontroller.js | 22 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/packages/ckeditor5-engine/src/controller/editingcontroller.ts b/packages/ckeditor5-engine/src/controller/editingcontroller.ts index 28343c619dd..1a7d6ab2082 100644 --- a/packages/ckeditor5-engine/src/controller/editingcontroller.ts +++ b/packages/ckeditor5-engine/src/controller/editingcontroller.ts @@ -10,6 +10,7 @@ import { CKEditorError, ObservableMixin, + env, type GetCallback } from '@ckeditor/ckeditor5-utils'; @@ -125,7 +126,7 @@ export default class EditingController extends ObservableMixin() { // Fix `beforeinput` target ranges so that they map to the valid model ranges. this.listenTo( this.view.document, 'beforeinput', - fixTargetRanges( this.mapper, this.model.schema ), + fixTargetRanges( this.mapper, this.model.schema, this.view ), { priority: 'high' } ); @@ -252,8 +253,14 @@ export default class EditingController extends ObservableMixin() { * * This is using the same logic as the selection post-fixer. */ -function fixTargetRanges( mapper: Mapper, schema: Schema ): GetCallback { +function fixTargetRanges( mapper: Mapper, schema: Schema, view: View ): GetCallback { return ( evt, data ) => { + // The Renderer is disabled while composing on non-android browsers, so we can't be sure that target ranges + // could be properly mapped to view and model because the DOM and view tree drifted apart. + if ( view.document.isComposing && !env.isAndroid ) { + return; + } + for ( let i = 0; i < data.targetRanges.length; i++ ) { const viewRange = data.targetRanges[ i ]; const modelRange = mapper.toModelRange( viewRange ); diff --git a/packages/ckeditor5-engine/tests/controller/editingcontroller.js b/packages/ckeditor5-engine/tests/controller/editingcontroller.js index 657c8832186..6aea8fdb966 100644 --- a/packages/ckeditor5-engine/tests/controller/editingcontroller.js +++ b/packages/ckeditor5-engine/tests/controller/editingcontroller.js @@ -935,6 +935,28 @@ describe( 'EditingController', () => { sinon.assert.calledOnce( enterSpy ); } ); + it( 'should not crash while trying to fix null range while composing', () => { + setModelData( model, 'a' ); + + const targetRanges = [ null ]; + + const eventData = { + inputType: 'insertCompositionText', + data: 'ab', + targetRanges + }; + + viewDocument.isComposing = true; + fireBeforeInputEvent( eventData ); + + // Verify beforeinput range. + sinon.assert.calledOnce( beforeInputSpy ); + + const inputData = beforeInputSpy.args[ 0 ][ 1 ]; + expect( inputData.inputType ).to.equal( eventData.inputType ); + expect( inputData.targetRanges[ 0 ] ).to.be.null; + } ); + function fireBeforeInputEvent( eventData ) { viewDocument.fire( 'beforeinput', { domEvent: {