8
0
فهرست منبع

Merge pull request #1279 from ckeditor/t/1277

Internal: Set correct modelCursor in v->m docFrag converter. Closes #1277.
Piotr Jasiun 8 سال پیش
والد
کامیت
3cc573c270

+ 4 - 2
packages/ckeditor5-engine/src/conversion/view-to-model-converters.js

@@ -31,8 +31,10 @@ export function convertToModelFragment() {
 	return ( evt, data, conversionApi ) => {
 		// Second argument in `consumable.consume` is discarded for ViewDocumentFragment but is needed for ViewElement.
 		if ( !data.modelRange && conversionApi.consumable.consume( data.viewItem, { name: true } ) ) {
-			data = Object.assign( data, conversionApi.convertChildren( data.viewItem, data.modelCursor ) );
-			data.modelCursor = data.modelRange.end;
+			const { modelRange, modelCursor } = conversionApi.convertChildren( data.viewItem, data.modelCursor );
+
+			data.modelRange = modelRange;
+			data.modelCursor = modelCursor;
 		}
 	};
 }

+ 30 - 0
packages/ckeditor5-engine/tests/conversion/view-to-model-converters.js

@@ -151,5 +151,35 @@ describe( 'view-to-model-converters', () => {
 			expect( conversionResult.getChild( 0 ).maxOffset ).to.equal( 3 );
 			expect( conversionResult.getChild( 0 ).getChild( 0 ).data ).to.equal( 'foo' );
 		} );
+
+		it( 'should forward correct modelCursor', () => {
+			const spy = sinon.spy();
+			const view = new ViewDocumentFragment( [
+				new ViewContainerElement( 'div', null, [ new ViewText( 'abc' ), new ViewContainerElement( 'foo' ) ] ),
+				new ViewContainerElement( 'bar' )
+			] );
+			const position = ModelPosition.createAt( new ModelElement( 'element' ) );
+
+			dispatcher.on( 'documentFragment', convertToModelFragment() );
+			dispatcher.on( 'element', convertToModelFragment(), { priority: 'lowest' } );
+			dispatcher.on( 'element:foo', ( evt, data ) => {
+				// Be sure that current cursor is not the same as custom.
+				expect( data.modelCursor ).to.not.equal( position );
+				// Set custom cursor as a result of docFrag last child conversion.
+				// This cursor should be forwarded by a documentFragment converter.
+				data.modelCursor = position;
+				// Be sure that callback was fired.
+				spy();
+			} );
+
+			dispatcher.on( 'element:bar', ( evt, data ) => {
+				expect( data.modelCursor ).to.equal( position );
+				spy();
+			} );
+
+			dispatcher.convert( view );
+
+			sinon.assert.calledTwice( spy );
+		} );
 	} );
 } );