8
0

enabletoolbarkeyboardfocus.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /**
  2. * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
  3. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
  4. */
  5. /* global document */
  6. import View from '../../src/view';
  7. import ToolbarView from '../../src/toolbar/toolbarview';
  8. import FocusTracker from '@ckeditor/ckeditor5-utils/src/focustracker';
  9. import KeystrokeHandler from '@ckeditor/ckeditor5-utils/src/keystrokehandler';
  10. import { keyCodes } from '@ckeditor/ckeditor5-utils/src/keyboard';
  11. import enableToolbarKeyboardFocus from '../../src/toolbar/enabletoolbarkeyboardfocus';
  12. describe( 'enableToolbarKeyboardFocus()', () => {
  13. let origin, originFocusTracker, originKeystrokeHandler, toolbar;
  14. beforeEach( () => {
  15. origin = viewCreator();
  16. originFocusTracker = new FocusTracker();
  17. originKeystrokeHandler = new KeystrokeHandler();
  18. toolbar = new ToolbarView( { t: langString => langString } );
  19. toolbar.render();
  20. enableToolbarKeyboardFocus( {
  21. origin,
  22. originFocusTracker,
  23. originKeystrokeHandler,
  24. toolbar
  25. } );
  26. } );
  27. it( 'focuses the toolbar on Alt+F10', () => {
  28. const spy = sinon.spy( toolbar, 'focus' );
  29. const toolbarFocusTracker = toolbar.focusTracker;
  30. const keyEvtData = {
  31. keyCode: keyCodes.f10,
  32. altKey: true,
  33. preventDefault: sinon.spy(),
  34. stopPropagation: sinon.spy()
  35. };
  36. toolbarFocusTracker.isFocused = false;
  37. originFocusTracker.isFocused = false;
  38. originKeystrokeHandler.press( keyEvtData );
  39. sinon.assert.notCalled( spy );
  40. toolbarFocusTracker.isFocused = true;
  41. originFocusTracker.isFocused = true;
  42. originKeystrokeHandler.press( keyEvtData );
  43. sinon.assert.notCalled( spy );
  44. toolbarFocusTracker.isFocused = false;
  45. originFocusTracker.isFocused = true;
  46. originKeystrokeHandler.press( keyEvtData );
  47. sinon.assert.calledOnce( spy );
  48. sinon.assert.calledOnce( keyEvtData.preventDefault );
  49. sinon.assert.calledOnce( keyEvtData.stopPropagation );
  50. } );
  51. it( 're–foucuses origin on Esc', () => {
  52. const spy = origin.focus = sinon.spy();
  53. const toolbarFocusTracker = toolbar.focusTracker;
  54. const keyEvtData = {
  55. keyCode: keyCodes.esc,
  56. preventDefault: sinon.spy(),
  57. stopPropagation: sinon.spy()
  58. };
  59. toolbarFocusTracker.isFocused = false;
  60. toolbar.keystrokes.press( keyEvtData );
  61. sinon.assert.notCalled( spy );
  62. toolbarFocusTracker.isFocused = true;
  63. toolbar.keystrokes.press( keyEvtData );
  64. sinon.assert.calledOnce( spy );
  65. sinon.assert.calledOnce( keyEvtData.preventDefault );
  66. sinon.assert.calledOnce( keyEvtData.stopPropagation );
  67. } );
  68. it( 'supports beforeFocus and afterBlur callbacks', () => {
  69. const beforeFocus = sinon.spy();
  70. const afterBlur = sinon.spy();
  71. origin = viewCreator();
  72. originFocusTracker = new FocusTracker();
  73. originKeystrokeHandler = new KeystrokeHandler();
  74. toolbar = new ToolbarView( { t: langString => langString } );
  75. const toolbarFocusSpy = sinon.spy( toolbar, 'focus' );
  76. const originFocusSpy = origin.focus = sinon.spy();
  77. const toolbarFocusTracker = toolbar.focusTracker;
  78. toolbar.render();
  79. enableToolbarKeyboardFocus( {
  80. origin,
  81. originFocusTracker,
  82. originKeystrokeHandler,
  83. toolbar,
  84. beforeFocus,
  85. afterBlur
  86. } );
  87. let keyEvtData = {
  88. keyCode: keyCodes.f10,
  89. altKey: true,
  90. preventDefault: sinon.spy(),
  91. stopPropagation: sinon.spy()
  92. };
  93. toolbarFocusTracker.isFocused = false;
  94. originFocusTracker.isFocused = true;
  95. originKeystrokeHandler.press( keyEvtData );
  96. sinon.assert.callOrder( beforeFocus, toolbarFocusSpy );
  97. keyEvtData = {
  98. keyCode: keyCodes.esc,
  99. preventDefault: sinon.spy(),
  100. stopPropagation: sinon.spy()
  101. };
  102. toolbarFocusTracker.isFocused = true;
  103. toolbar.keystrokes.press( keyEvtData );
  104. sinon.assert.callOrder( originFocusSpy, afterBlur );
  105. } );
  106. } );
  107. function viewCreator( name ) {
  108. return locale => {
  109. const view = new View( locale );
  110. view.name = name;
  111. view.element = document.createElement( 'a' );
  112. return view;
  113. };
  114. }