瀏覽代碼

Double shift enter should not leave the code block when executed at the end of it.

Aleksander Nowodzinski 6 年之前
父節點
當前提交
d79649d4fc

+ 2 - 1
packages/ckeditor5-code-block/src/codeblockediting.js

@@ -136,8 +136,9 @@ export default class CodeBlockEditing extends Plugin {
 			if ( positionParent.is( 'codeBlock' ) ) {
 				const lastPosition = doc.selection.getLastPosition();
 				const isSoftBreakBefore = lastPosition.nodeBefore && lastPosition.nodeBefore.is( 'softBreak' );
+				const isSoftEnter = data.isSoft;
 
-				if ( doc.selection.isCollapsed && lastPosition.isAtEnd && isSoftBreakBefore ) {
+				if ( !isSoftEnter && doc.selection.isCollapsed && lastPosition.isAtEnd && isSoftBreakBefore ) {
 					editor.model.change( writer => {
 						writer.remove( lastPosition.nodeBefore );
 						editor.execute( 'enter' );

+ 40 - 27
packages/ckeditor5-code-block/tests/codeblockediting.js

@@ -14,6 +14,7 @@ import Enter from '@ckeditor/ckeditor5-enter/src/enter';
 import ShiftEnter from '@ckeditor/ckeditor5-enter/src/shiftenter';
 import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
 import Undo from '@ckeditor/ckeditor5-undo/src/undo';
+import DomEventData from '@ckeditor/ckeditor5-engine/src/view/observer/domeventdata';
 
 import ClassicTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/classictesteditor';
 import { getData as getModelData, setData as setModelData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
@@ -22,7 +23,7 @@ import { getData as getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils
 import { _clear as clearTranslations, add as addTranslations } from '@ckeditor/ckeditor5-utils/src/translation-service';
 
 describe( 'CodeBlockEditing', () => {
-	let editor, element, model, view;
+	let editor, element, model, view, viewDoc;
 
 	before( () => {
 		addTranslations( 'en', {
@@ -51,6 +52,7 @@ describe( 'CodeBlockEditing', () => {
 				editor = newEditor;
 				model = editor.model;
 				view = editor.editing.view;
+				viewDoc = view.document;
 			} );
 	} );
 
@@ -188,9 +190,9 @@ describe( 'CodeBlockEditing', () => {
 
 			setModelData( model, '<codeBlock>foo[]bar</codeBlock>' );
 
-			editor.editing.view.document.fire( 'enter', {
-				preventDefault: () => {}
-			} );
+			viewDoc.fire( 'enter', new DomEventData( viewDoc, {
+				preventDefault: sinon.spy()
+			} ) );
 
 			expect( getModelData( model ) ).to.equal( '<codeBlock>foo<softBreak></softBreak>[]bar</codeBlock>' );
 			sinon.assert.calledOnce( shiftEnterCommand.execute );
@@ -206,9 +208,9 @@ describe( 'CodeBlockEditing', () => {
 
 			setModelData( model, '<paragraph>foo[]bar</paragraph>' );
 
-			editor.editing.view.document.fire( 'enter', {
-				preventDefault: () => {}
-			} );
+			viewDoc.fire( 'enter', new DomEventData( viewDoc, {
+				preventDefault: sinon.spy()
+			} ) );
 
 			expect( getModelData( model ) ).to.equal( '<paragraph>foo</paragraph><paragraph>[]bar</paragraph>' );
 			sinon.assert.calledOnce( enterCommand.execute );
@@ -220,15 +222,15 @@ describe( 'CodeBlockEditing', () => {
 
 			setModelData( model, '<codeBlock language="css">foo[]</codeBlock>' );
 
-			editor.editing.view.document.fire( 'enter', {
-				preventDefault: () => {}
-			} );
+			viewDoc.fire( 'enter', new DomEventData( viewDoc, {
+				preventDefault: sinon.spy()
+			} ) );
 
 			expect( getModelData( model ) ).to.equal( '<codeBlock language="css">foo<softBreak></softBreak>[]</codeBlock>' );
 
-			editor.editing.view.document.fire( 'enter', {
-				preventDefault: () => {}
-			} );
+			viewDoc.fire( 'enter', new DomEventData( viewDoc, {
+				preventDefault: sinon.spy()
+			} ) );
 
 			expect( getModelData( model ) ).to.equal(
 				'<codeBlock language="css">foo</codeBlock>' +
@@ -247,16 +249,16 @@ describe( 'CodeBlockEditing', () => {
 		it( 'should not leave the block when pressed twice when in the middle of the code', () => {
 			setModelData( model, '<codeBlock language="css">fo[]o</codeBlock>' );
 
-			editor.editing.view.document.fire( 'enter', {
-				preventDefault: () => {}
-			} );
+			viewDoc.fire( 'enter', new DomEventData( viewDoc, {
+				preventDefault: sinon.spy()
+			} ) );
 
 			expect( getModelData( model ) ).to.equal(
 				'<codeBlock language="css">fo<softBreak></softBreak>[]o</codeBlock>' );
 
-			editor.editing.view.document.fire( 'enter', {
-				preventDefault: () => {}
-			} );
+			viewDoc.fire( 'enter', new DomEventData( viewDoc, {
+				preventDefault: sinon.spy()
+			} ) );
 
 			expect( getModelData( model ) ).to.equal(
 				'<codeBlock language="css">fo<softBreak></softBreak><softBreak></softBreak>[]o</codeBlock>' );
@@ -265,20 +267,31 @@ describe( 'CodeBlockEditing', () => {
 		it( 'should not leave the block when pressed twice at the beginning of the code', () => {
 			setModelData( model, '<codeBlock language="css">[]foo</codeBlock>' );
 
-			editor.editing.view.document.fire( 'enter', {
-				preventDefault: () => {}
-			} );
+			viewDoc.fire( 'enter', new DomEventData( viewDoc, {
+				preventDefault: sinon.spy()
+			} ) );
 
 			expect( getModelData( model ) ).to.equal(
 				'<codeBlock language="css"><softBreak></softBreak>[]foo</codeBlock>' );
 
-			editor.editing.view.document.fire( 'enter', {
-				preventDefault: () => {}
-			} );
+			viewDoc.fire( 'enter', new DomEventData( viewDoc, {
+				preventDefault: sinon.spy()
+			} ) );
 
 			expect( getModelData( model ) ).to.equal(
 				'<codeBlock language="css"><softBreak></softBreak><softBreak></softBreak>[]foo</codeBlock>' );
 		} );
+
+		it( 'should not leave the block when pressed shift+enter twice at the end of the code', () => {
+			setModelData( model, '<codeBlock language="css">foo<softBreak></softBreak>[]</codeBlock>' );
+
+			viewDoc.fire( 'enter', new DomEventData( viewDoc, {
+				preventDefault: sinon.spy()
+			}, { isSoft: true } ) );
+
+			expect( getModelData( model ) ).to.equal(
+				'<codeBlock language="css">foo<softBreak></softBreak><softBreak></softBreak>[]</codeBlock>' );
+		} );
 	} );
 
 	describe( 'editing pipeline m -> v', () => {
@@ -567,7 +580,7 @@ describe( 'CodeBlockEditing', () => {
 				getData: sinon.stub().withArgs( 'text/plain' ).returns( 'bar' )
 			};
 
-			editor.editing.view.document.fire( 'clipboardInput', {
+			viewDoc.fire( 'clipboardInput', {
 				dataTransfer: dataTransferMock,
 				stop: sinon.spy()
 			} );
@@ -583,7 +596,7 @@ describe( 'CodeBlockEditing', () => {
 				getData: sinon.stub().withArgs( 'text/plain' ).returns( 'bar\nbaz\n' )
 			};
 
-			editor.editing.view.document.fire( 'clipboardInput', {
+			viewDoc.fire( 'clipboardInput', {
 				dataTransfer: dataTransferMock,
 				stop: sinon.spy()
 			} );