Ver código fonte

Changed: `engine.dev-utils.enableEngineDebug` now provides additional logging when delta transformation crashes.

Szymon Cofalik 8 anos atrás
pai
commit
3290bc37c8

+ 11 - 1
packages/ckeditor5-engine/src/dev-utils/enableenginedebug.js

@@ -336,7 +336,17 @@ function enableLoggingTools() {
 	const _deltaTransformTransform = deltaTransform.transform;
 
 	deltaTransform.transform = function( a, b, isAMoreImportantThanB ) {
-		const results = _deltaTransformTransform( a, b, isAMoreImportantThanB );
+		let results;
+
+		try {
+			results = _deltaTransformTransform( a, b, isAMoreImportantThanB );
+		} catch ( e ) {
+			logger.error( 'Error during delta transformation!' );
+			logger.error( a.toString() + ( isAMoreImportantThanB ? ' (important)' : '' ) );
+			logger.error( b.toString() + ( isAMoreImportantThanB ? '' : ' (important)' ) );
+
+			throw e;
+		}
 
 		for ( let i = 0; i < results.length; i++ ) {
 			results[ i ]._saveHistory( {

+ 18 - 0
packages/ckeditor5-engine/tests/dev-utils/enableenginedebug.js

@@ -932,6 +932,24 @@ describe( 'debug tools', () => {
 
 			expect( JSON.stringify( recreated ) ).to.equal( JSON.stringify( original ) );
 		} );
+
+		it( 'provide additional logging when transformation crashes', () => {
+			const deltaA = new MoveDelta();
+			const opA = new MoveOperation( ModelPosition.createAt( root, 4 ), 4, ModelPosition.createAt( otherRoot, 4 ), 0 );
+			deltaA.addOperation( opA );
+
+			const deltaB = new InsertDelta();
+			const opB = new InsertOperation( ModelPosition.createAt( root, 0 ), new ModelText( 'a' ), 0 );
+			deltaB.addOperation( opB );
+
+			deltaTransform.defaultTransform = () => {
+				throw new Error();
+			};
+
+			expect( () => deltaTransform.transform( deltaA, deltaB, true ) ).to.throw( Error );
+			expect( error.calledWith( deltaA.toString() + ' (important)' ) ).to.be.true;
+			expect( error.calledWith( deltaB.toString() ) ).to.be.true;
+		} );
 	} );
 
 	function expectLog( expectedLogMsg ) {