8
0

shiftenter.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /**
  2. * @license Copyright (c) 2003-2019, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
  4. */
  5. import VirtualTestEditor from '@ckeditor/ckeditor5-core/tests/_utils/virtualtesteditor';
  6. import ShiftEnter from '../src/shiftenter';
  7. import ShiftEnterCommand from '../src/shiftentercommand';
  8. import EnterObserver from '../src/enterobserver';
  9. import DomEventData from '@ckeditor/ckeditor5-engine/src/view/observer/domeventdata';
  10. describe( 'ShiftEnter feature', () => {
  11. let editor, viewDocument;
  12. beforeEach( () => {
  13. return VirtualTestEditor
  14. .create( {
  15. plugins: [ ShiftEnter ]
  16. } )
  17. .then( newEditor => {
  18. editor = newEditor;
  19. viewDocument = editor.editing.view.document;
  20. } );
  21. } );
  22. it( 'creates the commands', () => {
  23. expect( editor.commands.get( 'shiftEnter' ) ).to.be.instanceof( ShiftEnterCommand );
  24. } );
  25. it( 'should set proper schema rules', () => {
  26. expect( editor.model.schema.isRegistered( 'softBreak' ) ).to.be.true;
  27. expect( editor.model.schema.checkChild( [ '$block' ], 'softBreak' ) ).to.be.true;
  28. expect( editor.model.schema.isInline( 'softBreak' ) ).to.be.true;
  29. } );
  30. it( 'registers the EnterObserver', () => {
  31. const observer = editor.editing.view.getObserver( EnterObserver );
  32. expect( observer ).to.be.an.instanceOf( EnterObserver );
  33. } );
  34. it( 'listens to the editing view enter event', () => {
  35. const spy = editor.execute = sinon.spy();
  36. const domEvt = getDomEvent();
  37. viewDocument.fire( 'enter', new DomEventData( viewDocument, domEvt, { isSoft: true } ) );
  38. expect( spy.calledOnce ).to.be.true;
  39. expect( spy.calledWithExactly( 'shiftEnter' ) ).to.be.true;
  40. expect( domEvt.preventDefault.calledOnce ).to.be.true;
  41. } );
  42. it( 'scrolls the editing document to the selection after executing the command', () => {
  43. const domEvt = getDomEvent();
  44. const executeSpy = editor.execute = sinon.spy();
  45. const scrollSpy = sinon.stub( editor.editing.view, 'scrollToTheSelection' );
  46. viewDocument.fire( 'enter', new DomEventData( viewDocument, domEvt, { isSoft: true } ) );
  47. sinon.assert.calledOnce( scrollSpy );
  48. sinon.assert.callOrder( domEvt.preventDefault, executeSpy, scrollSpy );
  49. } );
  50. it( 'does not execute the command if hard enter should be used', () => {
  51. const domEvt = getDomEvent();
  52. const commandExecuteSpy = sinon.stub( editor.commands.get( 'shiftEnter' ), 'execute' );
  53. viewDocument.fire( 'enter', new DomEventData( viewDocument, domEvt, { isSoft: false } ) );
  54. sinon.assert.notCalled( commandExecuteSpy );
  55. } );
  56. it( 'prevents default event action even if the command should not be executed', () => {
  57. const domEvt = getDomEvent();
  58. viewDocument.fire( 'enter', new DomEventData( viewDocument, domEvt, { isSoft: false } ) );
  59. sinon.assert.calledOnce( domEvt.preventDefault );
  60. } );
  61. function getDomEvent() {
  62. return {
  63. preventDefault: sinon.spy()
  64. };
  65. }
  66. } );