escpresshandler.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /**
  2. * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md.
  4. */
  5. /* global document */
  6. import escPressHandler from '../../src/bindings/escpresshandler';
  7. import DomEmitterMixin from '@ckeditor/ckeditor5-utils/src/dom/emittermixin';
  8. import { keyCodes } from '@ckeditor/ckeditor5-utils/src/keyboard';
  9. import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
  10. testUtils.createSinonSandbox();
  11. describe( 'escPressHandler', () => {
  12. let emitter, actionSpy, activator;
  13. beforeEach( () => {
  14. activator = testUtils.sinon.stub().returns( false );
  15. actionSpy = testUtils.sinon.spy();
  16. emitter = Object.create( DomEmitterMixin );
  17. escPressHandler( {
  18. emitter: emitter,
  19. activator: activator,
  20. callback: actionSpy
  21. } );
  22. } );
  23. afterEach( () => {
  24. emitter.stopListening();
  25. } );
  26. it( 'should fired callback after pressing `Esc` when listener is active', () => {
  27. activator.returns( true );
  28. dispatchKeyboardEvent( document, 'keydown', keyCodes.esc );
  29. sinon.assert.calledOnce( actionSpy );
  30. } );
  31. it( 'should not fired callback after pressing a key different than `Esc`', () => {
  32. activator.returns( true );
  33. dispatchKeyboardEvent( document, 'keydown', keyCodes.ctrlKey );
  34. sinon.assert.notCalled( actionSpy );
  35. } );
  36. it( 'should not fired callback after pressing Esc when listener is not active', () => {
  37. activator.returns( false );
  38. dispatchKeyboardEvent( document, 'keydown', keyCodes.enter );
  39. sinon.assert.notCalled( actionSpy );
  40. } );
  41. it( 'should not fired callback after pressing other than Esc key when listener is active', () => {
  42. activator.returns( false );
  43. dispatchKeyboardEvent( document, 'keydown', keyCodes.esc );
  44. sinon.assert.notCalled( actionSpy );
  45. } );
  46. it( 'should listen when model initial `ifActive` value was `true`', () => {
  47. const spy = testUtils.sinon.spy();
  48. activator.returns( true );
  49. emitter = Object.create( DomEmitterMixin );
  50. escPressHandler( {
  51. emitter: emitter,
  52. activator: activator,
  53. callback: spy
  54. } );
  55. dispatchKeyboardEvent( document, 'keydown', keyCodes.esc );
  56. sinon.assert.calledOnce( spy );
  57. } );
  58. it( 'should not listen when model initial `ifActive` value was `false`', () => {
  59. const spy = testUtils.sinon.spy();
  60. activator.returns( false );
  61. emitter = Object.create( DomEmitterMixin );
  62. escPressHandler( {
  63. emitter: emitter,
  64. activator: activator,
  65. callback: spy
  66. } );
  67. dispatchKeyboardEvent( document, 'keydown', keyCodes.esc );
  68. sinon.assert.notCalled( spy );
  69. } );
  70. it( 'should react on model `ifActive` property change', () => {
  71. activator.returns( true );
  72. dispatchKeyboardEvent( document, 'keydown', keyCodes.esc );
  73. sinon.assert.calledOnce( actionSpy );
  74. activator.returns( false );
  75. dispatchKeyboardEvent( document, 'keydown', keyCodes.esc );
  76. // Still called once, was not called second time.
  77. sinon.assert.calledOnce( actionSpy );
  78. activator.returns( true );
  79. dispatchKeyboardEvent( document, 'keydown', keyCodes.esc );
  80. // Called one more time.
  81. sinon.assert.calledTwice( actionSpy );
  82. } );
  83. } );
  84. // Creates and dispatches keyboard event with specified keyCode.
  85. //
  86. // @private
  87. // @param {EventTarget} eventTarget
  88. // @param {String} eventName
  89. // @param {Number} keyCode
  90. function dispatchKeyboardEvent( eventTarget, eventName, keyCode ) {
  91. const event = document.createEvent( 'Events' );
  92. event.initEvent( eventName, true, true );
  93. event.which = keyCode;
  94. event.keyCode = keyCode;
  95. eventTarget.dispatchEvent( event );
  96. }