utils.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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 View from '../../src/view';
  7. import ComponentFactory from '../../src/componentfactory';
  8. import ToolbarView from '../../src/toolbar/toolbarview';
  9. import Editor from '@ckeditor/ckeditor5-core/src/editor/editor';
  10. import Collection from '@ckeditor/ckeditor5-utils/src/collection';
  11. import FocusTracker from '@ckeditor/ckeditor5-utils/src/focustracker';
  12. import KeystrokeHandler from '@ckeditor/ckeditor5-utils/src/keystrokehandler';
  13. import { keyCodes } from '@ckeditor/ckeditor5-utils/src/keyboard';
  14. import {
  15. getItemsFromConfig,
  16. enableToolbarKeyboardFocus
  17. } from '../../src/toolbar/utils';
  18. describe( 'utils', () => {
  19. describe( 'getItemsFromConfig()', () => {
  20. let factory;
  21. beforeEach( () => {
  22. factory = new ComponentFactory( new Editor() );
  23. factory.add( 'foo', viewCreator( 'foo' ) );
  24. factory.add( 'bar', viewCreator( 'bar' ) );
  25. } );
  26. it( 'returns a promise', () => {
  27. expect( getItemsFromConfig() ).to.be.instanceOf( Promise );
  28. } );
  29. it( 'expands the config into collection', () => {
  30. const collection = new Collection();
  31. return getItemsFromConfig( [ 'foo', 'bar', 'foo' ], collection, factory )
  32. .then( () => {
  33. expect( collection ).to.have.length( 3 );
  34. expect( collection.get( 0 ).name ).to.equal( 'foo' );
  35. expect( collection.get( 1 ).name ).to.equal( 'bar' );
  36. expect( collection.get( 2 ).name ).to.equal( 'foo' );
  37. } );
  38. } );
  39. } );
  40. describe( 'enableToolbarKeyboardFocus()', () => {
  41. let origin, originFocusTracker, originKeystrokeHandler, toolbar;
  42. beforeEach( () => {
  43. origin = viewCreator();
  44. originFocusTracker = new FocusTracker();
  45. originKeystrokeHandler = new KeystrokeHandler();
  46. toolbar = new ToolbarView();
  47. enableToolbarKeyboardFocus( {
  48. origin: origin,
  49. originFocusTracker: originFocusTracker,
  50. originKeystrokeHandler: originKeystrokeHandler,
  51. toolbar: toolbar
  52. } );
  53. return toolbar.init();
  54. } );
  55. it( 'focuses the toolbar on Alt+F10', () => {
  56. const spy = sinon.spy( toolbar, 'focus' );
  57. const toolbarFocusTracker = toolbar.focusTracker;
  58. const keyEvtData = {
  59. keyCode: keyCodes.f10,
  60. altKey: true,
  61. preventDefault: sinon.spy(),
  62. stopPropagation: sinon.spy()
  63. };
  64. toolbarFocusTracker.isFocused = false;
  65. originFocusTracker.isFocused = false;
  66. originKeystrokeHandler.press( keyEvtData );
  67. sinon.assert.notCalled( spy );
  68. toolbarFocusTracker.isFocused = true;
  69. originFocusTracker.isFocused = true;
  70. originKeystrokeHandler.press( keyEvtData );
  71. sinon.assert.notCalled( spy );
  72. toolbarFocusTracker.isFocused = false;
  73. originFocusTracker.isFocused = true;
  74. originKeystrokeHandler.press( keyEvtData );
  75. sinon.assert.calledOnce( spy );
  76. sinon.assert.calledOnce( keyEvtData.preventDefault );
  77. sinon.assert.calledOnce( keyEvtData.stopPropagation );
  78. } );
  79. it( 're–foucuses origin on Esc', () => {
  80. const spy = origin.focus = sinon.spy();
  81. const toolbarFocusTracker = toolbar.focusTracker;
  82. const keyEvtData = { keyCode: keyCodes.esc,
  83. preventDefault: sinon.spy(),
  84. stopPropagation: sinon.spy()
  85. };
  86. toolbarFocusTracker.isFocused = false;
  87. toolbar.keystrokes.press( keyEvtData );
  88. sinon.assert.notCalled( spy );
  89. toolbarFocusTracker.isFocused = true;
  90. toolbar.keystrokes.press( keyEvtData );
  91. sinon.assert.calledOnce( spy );
  92. sinon.assert.calledOnce( keyEvtData.preventDefault );
  93. sinon.assert.calledOnce( keyEvtData.stopPropagation );
  94. } );
  95. } );
  96. } );
  97. function viewCreator( name ) {
  98. return ( locale ) => {
  99. const view = new View( locale );
  100. view.name = name;
  101. view.element = document.createElement( 'a' );
  102. return view;
  103. };
  104. }